Changeset 26
- Timestamp:
- 07/26/12 15:25:40 (13 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 5 added
- 1 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/caldyn_gcm.f90
r22 r26 401 401 402 402 !!! Compute mass flux 403 !! question à thomas : meilleure pondération de la masse sur les liens ?403 !! question ï¿œ thomas : meilleure pondï¿œration de la masse sur les liens ? 404 404 405 405 DO l = 1, llm -
codes/icosagcm/trunk/src/dissip_gcm.f90
r22 r26 2 2 USE icosa 3 3 4 TYPE(t_field),POINTER,SAVE :: f_gradrot(:) 5 TYPE(t_request),POINTER :: req_dissip(:) 6 TYPE(t_field),POINTER,SAVE :: f_due(:) 4 PRIVATE 5 6 TYPE(t_field),POINTER,SAVE :: f_due_diss1(:) 7 TYPE(t_field),POINTER,SAVE :: f_due_diss2(:) 8 9 TYPE(t_field),POINTER,SAVE :: f_theta(:) 10 TYPE(t_field),POINTER,SAVE :: f_dtheta_diss(:) 11 TYPE(t_field),POINTER,SAVE :: f_dtheta_rhodz_diss(:) 12 7 13 8 INTEGER, PARAMETER:: nitergdiv=19 INTEGER, PARAMETER:: nitergrot=110 INTEGER, PARAMETER:: niterdivgrad=114 INTEGER,SAVE :: nitergdiv=1 15 INTEGER,SAVE :: nitergrot=1 16 INTEGER,SAVE :: niterdivgrad=1 11 17 12 18 REAL,ALLOCATABLE,SAVE :: tau_graddiv(:) … … 18 24 REAL,SAVE :: cdivgrad 19 25 20 INTEGER :: idissip 21 REAL :: dtdissip 22 26 INTEGER,SAVE :: idissip 27 REAL,SAVE :: dtdissip 28 29 PUBLIC init_dissip, dissip 23 30 CONTAINS 24 31 … … 26 33 USE icosa 27 34 IMPLICIT NONE 28 CALL allocate_field(f_gradrot,field_u,type_real,llm) 29 CALL allocate_field(f_due,field_u,type_real,llm) 35 CALL allocate_field(f_due_diss1,field_u,type_real,llm) 36 CALL allocate_field(f_due_diss2,field_u,type_real,llm) 37 CALL allocate_field(f_theta,field_t,type_real,llm) 38 CALL allocate_field(f_dtheta_diss,field_t,type_real,llm) 39 CALL allocate_field(f_dtheta_rhodz_diss,field_t,type_real,llm) 40 30 41 ALLOCATE(tau_graddiv(llm)) 31 42 ALLOCATE(tau_gradrot(llm)) … … 36 47 USE icosa 37 48 USE disvert_mod 49 USE mpi_mod 50 USE mpipara 38 51 39 52 IMPLICIT NONE … … 56 69 57 70 58 INTEGER :: i,j,n,ind,it 71 INTEGER :: i,j,n,ind,it,iter 59 72 60 73 CALL allocate_dissip … … 67 80 CALL getin("tau_graddiv",tau) 68 81 tau_graddiv(:)=tau 82 83 CALL getin("nitergdiv",nitergdiv) 69 84 70 85 tau_gradrot(:)=5000 71 CALL getin("tau_gradrot",tau )86 CALL getin("tau_gradrot",tau_gradrot) 72 87 tau_gradrot(:)=tau 88 89 CALL getin("nitergrot",nitergrot) 73 90 74 91 … … 76 93 CALL getin("tau_divgrad",tau) 77 94 tau_divgrad(:)=tau 78 79 CALL create_request(field_u,req_dissip) 80 81 DO ind=1,ndomain 82 DO i=ii_begin,ii_end 83 CALL request_add_point(ind,i,jj_begin-1,req_dissip,rup) 84 CALL request_add_point(ind,i+1,jj_begin-1,req_dissip,lup) 85 ENDDO 86 87 DO j=jj_begin,jj_end 88 CALL request_add_point(ind,ii_end+1,j,req_dissip,left) 89 CALL request_add_point(ind,ii_end+1,j-1,req_dissip,lup) 90 ENDDO 91 92 DO i=ii_begin,ii_end 93 CALL request_add_point(ind,i,jj_end+1,req_dissip,ldown) 94 CALL request_add_point(ind,i-1,jj_end+1,req_dissip,rdown) 95 ENDDO 96 97 DO j=jj_begin,jj_end 98 CALL request_add_point(ind,ii_begin-1,j,req_dissip,right) 99 CALL request_add_point(ind,ii_begin-1,j+1,req_dissip,rdown) 100 ENDDO 101 102 DO i=ii_begin+1,ii_end-1 103 CALL request_add_point(ind,i,jj_begin,req_dissip,right) 104 CALL request_add_point(ind,i,jj_end,req_dissip,right) 105 ENDDO 106 107 DO j=jj_begin+1,jj_end-1 108 CALL request_add_point(ind,ii_begin,j,req_dissip,rup) 109 CALL request_add_point(ind,ii_end,j,req_dissip,rup) 110 ENDDO 111 112 CALL request_add_point(ind,ii_begin+1,jj_begin,req_dissip,left) 113 CALL request_add_point(ind,ii_begin,jj_begin+1,req_dissip,ldown) 114 CALL request_add_point(ind,ii_begin+1,jj_end,req_dissip,left) 115 CALL request_add_point(ind,ii_end,jj_begin+1,req_dissip,ldown) 116 117 ENDDO 95 96 CALL getin("niterdivgrad",niterdivgrad) 97 98 ! CALL create_request(field_u,req_dissip) 99 100 ! DO ind=1,ndomain 101 ! DO i=ii_begin,ii_end 102 ! CALL request_add_point(ind,i,jj_begin-1,req_dissip,rup) 103 ! CALL request_add_point(ind,i+1,jj_begin-1,req_dissip,lup) 104 ! ENDDO 105 106 ! DO j=jj_begin,jj_end 107 ! CALL request_add_point(ind,ii_end+1,j,req_dissip,left) 108 ! CALL request_add_point(ind,ii_end+1,j-1,req_dissip,lup) 109 ! ENDDO 110 ! 111 ! DO i=ii_begin,ii_end 112 ! CALL request_add_point(ind,i,jj_end+1,req_dissip,ldown) 113 ! CALL request_add_point(ind,i-1,jj_end+1,req_dissip,rdown) 114 ! ENDDO 115 116 ! DO j=jj_begin,jj_end 117 ! CALL request_add_point(ind,ii_begin-1,j,req_dissip,right) 118 ! CALL request_add_point(ind,ii_begin-1,j+1,req_dissip,rdown) 119 ! ENDDO 120 121 ! DO i=ii_begin+1,ii_end-1 122 ! CALL request_add_point(ind,i,jj_begin,req_dissip,right) 123 ! CALL request_add_point(ind,i,jj_end,req_dissip,right) 124 ! ENDDO 125 ! 126 ! DO j=jj_begin+1,jj_end-1 127 ! CALL request_add_point(ind,ii_begin,j,req_dissip,rup) 128 ! CALL request_add_point(ind,ii_end,j,req_dissip,rup) 129 ! ENDDO 130 131 ! CALL request_add_point(ind,ii_begin+1,jj_begin,req_dissip,left) 132 ! CALL request_add_point(ind,ii_begin,jj_begin+1,req_dissip,ldown) 133 ! CALL request_add_point(ind,ii_begin+1,jj_end,req_dissip,left) 134 ! CALL request_add_point(ind,ii_end,jj_begin+1,req_dissip,ldown) 135 ! 136 ! ENDDO 118 137 119 138 … … 145 164 146 165 147 DO it=1,20 148 149 CALL transfert_request(f_u,req_dissip) 150 CALL transfert_request(f_u,req_dissip) 151 166 DO it=1,500 167 152 168 dumax=0 153 DO ind=1,ndomain 154 CALL swap_dimensions(ind) 155 CALL swap_geometry(ind) 156 u=f_u(ind) 157 du=f_du(ind) 158 CALL gradiv(u,du,1) 159 ENDDO 160 CALL transfert_request(f_du,req_dissip) 161 CALL transfert_request(f_du,req_dissip) 169 DO iter=1,nitergdiv 170 CALL transfert_request(f_u,req_e1) 171 DO ind=1,ndomain 172 CALL swap_dimensions(ind) 173 CALL swap_geometry(ind) 174 u=f_u(ind) 175 du=f_du(ind) 176 CALL compute_gradiv(u,du,1) 177 u=du 178 ENDDO 179 ENDDO 180 181 CALL transfert_request(f_du,req_e1) 162 182 163 183 DO ind=1,ndomain … … 166 186 u=f_u(ind) 167 187 du=f_du(ind) 168 188 169 189 DO j=jj_begin,jj_end 170 190 DO i=ii_begin,ii_end … … 177 197 ENDDO 178 198 199 IF (using_mpi) CALL MPI_ALLREDUCE(dumax,dumax,1,MPI_REAL8,MPI_MAX,comm_icosa,ierr) 200 179 201 DO ind=1,ndomain 180 202 CALL swap_dimensions(ind) … … 212 234 213 235 214 DO it=1, 20236 DO it=1,500 215 237 216 CALL transfert_request(f_u,req_dissip)217 CALL transfert_request(f_u,req_dissip)218 219 238 dumax=0 220 DO ind=1,ndomain 221 CALL swap_dimensions(ind) 222 CALL swap_geometry(ind) 223 u=f_u(ind) 224 du=f_du(ind) 225 CALL gradrot(u,du,1) 226 ENDDO 227 228 CALL transfert_request(f_du,req_dissip) 229 CALL transfert_request(f_du,req_dissip) 239 DO iter=1,nitergrot 240 CALL transfert_request(f_u,req_e1) 241 DO ind=1,ndomain 242 CALL swap_dimensions(ind) 243 CALL swap_geometry(ind) 244 u=f_u(ind) 245 du=f_du(ind) 246 CALL compute_gradrot(u,du,1) 247 u=du 248 ENDDO 249 ENDDO 250 251 CALL transfert_request(f_du,req_e1) 230 252 231 253 DO ind=1,ndomain … … 244 266 ENDDO 245 267 ENDDO 268 269 IF (using_mpi) CALL MPI_ALLREDUCE(dumax,dumax,1,MPI_REAL8,MPI_MAX,comm_icosa,ierr) 246 270 247 271 DO ind=1,ndomain … … 253 277 ENDDO 254 278 255 ! PRINT *,"gradrot : it :",it ,": dumax",(dumax+dumaxm1)/2256 279 PRINT *,"gradrot : it :",it ,": dumax",dumax 257 280 … … 259 282 PRINT *,"gradrot : dumax",dumax 260 283 261 cgradrot=dumax**(-1 /nitergrot)284 cgradrot=dumax**(-1./nitergrot) 262 285 PRINT *,"cgradrot : ",cgradrot 263 286 … … 279 302 ENDDO 280 303 281 DO it=1,20 282 283 CALL transfert_request(f_theta,req_i1) 304 DO it=1,500 284 305 285 306 dthetamax=0 286 DO ind=1,ndomain 287 CALL swap_dimensions(ind) 288 CALL swap_geometry(ind) 289 theta=f_theta(ind) 290 dtheta=f_dtheta(ind) 291 CALL divgrad(theta,dtheta,1) 307 DO iter=1,niterdivgrad 308 CALL transfert_request(f_theta,req_i1) 309 DO ind=1,ndomain 310 CALL swap_dimensions(ind) 311 CALL swap_geometry(ind) 312 theta=f_theta(ind) 313 dtheta=f_dtheta(ind) 314 CALL compute_divgrad(theta,dtheta,1) 315 theta=dtheta 316 ENDDO 292 317 ENDDO 293 318 ! CALL writefield("divgrad",f_dtheta) … … 308 333 ENDDO 309 334 ENDDO 310 335 IF (using_mpi) CALL MPI_ALLREDUCE(dthetamax,dthetamax,1,MPI_REAL8,MPI_MAX,comm_icosa,ierr) 311 336 PRINT *,"divgrad : it :",it ,": dthetamax",dthetamax 312 337 … … 323 348 PRINT *,"divgrad : divgrad",dthetamax 324 349 325 cdivgrad=dthetamax**(-1 /niterdivgrad)350 cdivgrad=dthetamax**(-1./niterdivgrad) 326 351 PRINT *,"cdivgrad : ",cdivgrad 327 352 … … 358 383 TYPE(t_field),POINTER :: f_theta_rhodz(:) 359 384 TYPE(t_field),POINTER :: f_dtheta_rhodz(:) 360 REAL(rstd),POINTER :: ue(:,:) 385 361 386 REAL(rstd),POINTER :: due(:,:) 362 REAL(rstd),POINTER :: ps(:)363 REAL(rstd),POINTER :: theta_rhodz(:,:)387 REAL(rstd),POINTER :: due_diss1(:,:) 388 REAL(rstd),POINTER :: due_diss2(:,:) 364 389 REAL(rstd),POINTER :: dtheta_rhodz(:,:) 365 366 REAL(rstd) :: theta(iim*jjm,llm) 367 REAL(rstd) :: du_dissip(3*iim*jjm,llm) 368 REAL(rstd) :: dtheta_dissip(iim*jjm,llm) 369 REAL(rstd) :: dtheta_rhodz_dissip(iim*jjm,llm) 390 REAL(rstd),POINTER :: dtheta_rhodz_diss(:,:) 370 391 371 392 INTEGER :: ind 372 393 INTEGER :: l,i,j,n 373 394 374 CALL transfert_request(f_ue,req_e1) 375 CALL transfert_request(f_ue,req_e1) 376 CALL transfert_request(f_theta_rhodz,req_i1) 377 CALL transfert_request(f_ps,req_i1) 378 395 CALL gradiv(f_ue,f_due_diss1) 396 CALL gradrot(f_ue,f_due_diss2) 397 CALL theta_rhodz2theta(f_ps,f_theta_rhodz,f_theta) 398 CALL divgrad(f_theta,f_dtheta_diss) 399 CALL theta2theta_rhodz(f_ps,f_dtheta_diss,f_dtheta_rhodz_diss) 400 401 DO ind=1,ndomain 402 CALL swap_dimensions(ind) 403 CALL swap_geometry(ind) 404 due=f_due(ind) 405 due_diss1=f_due_diss1(ind) 406 due_diss2=f_due_diss2(ind) 407 dtheta_rhodz=f_dtheta_rhodz(ind) 408 dtheta_rhodz_diss=f_dtheta_rhodz_diss(ind) 409 410 DO l=1,llm 411 DO j=jj_begin,jj_end 412 DO i=ii_begin,ii_end 413 n=(j-1)*iim+i 414 415 due(n+u_right,l)=due(n+u_right,l)-0.5*(due_diss1(n+u_right,l)/tau_graddiv(l)+due_diss2(n+u_right,l)/tau_gradrot(l)) 416 due(n+u_lup,l)=due(n+u_lup,l) -0.5*(due_diss1(n+u_lup,l) /tau_graddiv(l)+due_diss2(n+u_lup,l) /tau_gradrot(l)) 417 due(n+u_ldown,l)=due(n+u_ldown,l)-0.5*(due_diss1(n+u_ldown,l)/tau_graddiv(l)+due_diss2(n+u_ldown,l)/tau_gradrot(l)) 418 419 dtheta_rhodz(n,l)=dtheta_rhodz(n,l)-0.5*dtheta_rhodz_diss(n,l)/tau_divgrad(l) 420 421 ENDDO 422 ENDDO 423 ENDDO 424 ENDDO 425 426 END SUBROUTINE dissip 427 428 SUBROUTINE gradiv(f_ue,f_due) 429 USE icosa 430 IMPLICIT NONE 431 TYPE(t_field),POINTER :: f_ue(:) 432 TYPE(t_field),POINTER :: f_due(:) 433 REAL(rstd),POINTER :: ue(:,:) 434 REAL(rstd),POINTER :: due(:,:) 435 INTEGER :: ind 436 INTEGER :: it 437 379 438 DO ind=1,ndomain 380 439 CALL swap_dimensions(ind) … … 382 441 ue=f_ue(ind) 383 442 due=f_due(ind) 384 ps=f_ps(ind) 385 theta_rhodz=f_theta_rhodz(ind) 386 dtheta_rhodz=f_dtheta_rhodz(ind) 387 388 !$OMP PARALLEL DEFAULT(SHARED) 389 CALL compute_dissip(ue,due,ps,theta_rhodz,dtheta_rhodz) 390 !$OMP END PARALLEL 391 392 ENDDO 393 394 END SUBROUTINE dissip 395 396 397 SUBROUTINE compute_dissip(ue,due,ps,theta_rhodz,dtheta_rhodz) 398 USE icosa 399 USE theta2theta_rhodz_mod 443 due=ue 444 ENDDO 445 446 DO it=1,nitergdiv 447 448 CALL transfert_request(f_due,req_e1) 449 450 DO ind=1,ndomain 451 CALL swap_dimensions(ind) 452 CALL swap_geometry(ind) 453 due=f_due(ind) 454 CALL compute_gradiv(due,due,llm) 455 ENDDO 456 ENDDO 457 458 END SUBROUTINE gradiv 459 460 461 SUBROUTINE gradrot(f_ue,f_due) 462 USE icosa 400 463 IMPLICIT NONE 401 REAL(rstd) :: ue(3*iim*jjm,llm) 402 REAL(rstd) :: due(3*iim*jjm,llm) 403 REAL(rstd) :: ps(iim*jjm) 404 REAL(rstd) :: theta_rhodz(iim*jjm,llm) 405 REAL(rstd) :: dtheta_rhodz(iim*jjm,llm) 406 407 REAL(rstd),SAVE,ALLOCATABLE :: theta(:,:) 408 REAL(rstd),SAVE,ALLOCATABLE :: du_dissip(:,:) 409 REAL(rstd),SAVE,ALLOCATABLE :: dtheta_dissip(:,:) 410 REAL(rstd),SAVE,ALLOCATABLE :: dtheta_rhodz_dissip(:,:) 411 464 TYPE(t_field),POINTER :: f_ue(:) 465 TYPE(t_field),POINTER :: f_due(:) 466 REAL(rstd),POINTER :: ue(:,:) 467 REAL(rstd),POINTER :: due(:,:) 412 468 INTEGER :: ind 413 INTEGER :: l,i,j,n 414 415 !$OMP BARRIER 416 !$OMP MASTER 417 ALLOCATE(theta(iim*jjm,llm)) 418 ALLOCATE(du_dissip(3*iim*jjm,llm)) 419 ALLOCATE(dtheta_dissip(iim*jjm,llm)) 420 ALLOCATE(dtheta_rhodz_dissip(iim*jjm,llm)) 421 !$OMP END MASTER 422 !$OMP BARRIER 423 424 CALL gradiv(ue,du_dissip,llm) 425 DO l=1,llm 426 !$OMP DO 427 DO j=jj_begin,jj_end 428 DO i=ii_begin,ii_end 429 n=(j-1)*iim+i 430 due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_graddiv(l)*0.5 431 due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_graddiv(l)*0.5 432 due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_graddiv(l)*0.5 433 ENDDO 434 ENDDO 435 ENDDO 436 437 CALL gradrot(ue,du_dissip,llm) 438 439 DO l=1,llm 440 !$OMP DO 441 DO j=jj_begin,jj_end 442 DO i=ii_begin,ii_end 443 n=(j-1)*iim+i 444 due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_gradrot(l)*0.5 445 due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_gradrot(l)*0.5 446 due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_gradrot(l)*0.5 447 ENDDO 448 ENDDO 449 ENDDO 450 451 CALL compute_theta_rhodz2theta(ps,theta_rhodz,theta,1) 452 CALL divgrad(theta,dtheta_dissip,llm) 453 CALL compute_theta2theta_rhodz(ps,dtheta_dissip,dtheta_rhodz_dissip,0) 454 455 DO l=1,llm 456 !$OMP DO 457 DO j=jj_begin,jj_end 458 DO i=ii_begin,ii_end 459 n=(j-1)*iim+i 460 dtheta_rhodz(n,l)=dtheta_rhodz(n,l)+dtheta_rhodz_dissip(n,l)/tau_divgrad(l)*0.5 461 ENDDO 462 ENDDO 463 ENDDO 464 465 !$OMP BARRIER 466 !$OMP MASTER 467 DEALLOCATE(theta) 468 DEALLOCATE(du_dissip) 469 DEALLOCATE(dtheta_dissip) 470 DEALLOCATE(dtheta_rhodz_dissip) 471 !$OMP END MASTER 472 !$OMP BARRIER 473 474 END SUBROUTINE compute_dissip 475 476 477 SUBROUTINE gradiv(ue,gradivu_e,ll) 469 INTEGER :: it 470 471 DO ind=1,ndomain 472 CALL swap_dimensions(ind) 473 CALL swap_geometry(ind) 474 ue=f_ue(ind) 475 due=f_due(ind) 476 due=ue 477 ENDDO 478 479 DO it=1,nitergrot 480 481 CALL transfert_request(f_due,req_e1) 482 483 DO ind=1,ndomain 484 CALL swap_dimensions(ind) 485 CALL swap_geometry(ind) 486 due=f_due(ind) 487 CALL compute_gradrot(due,due,llm) 488 ENDDO 489 490 ENDDO 491 492 END SUBROUTINE gradrot 493 494 SUBROUTINE divgrad(f_theta,f_dtheta) 495 USE icosa 496 IMPLICIT NONE 497 TYPE(t_field),POINTER :: f_theta(:) 498 TYPE(t_field),POINTER :: f_dtheta(:) 499 REAL(rstd),POINTER :: theta(:,:) 500 REAL(rstd),POINTER :: dtheta(:,:) 501 INTEGER :: ind 502 INTEGER :: it 503 504 DO ind=1,ndomain 505 CALL swap_dimensions(ind) 506 CALL swap_geometry(ind) 507 theta=f_theta(ind) 508 dtheta=f_dtheta(ind) 509 dtheta=theta 510 ENDDO 511 512 DO it=1,niterdivgrad 513 514 CALL transfert_request(f_dtheta,req_i1) 515 516 DO ind=1,ndomain 517 CALL swap_dimensions(ind) 518 CALL swap_geometry(ind) 519 dtheta=f_dtheta(ind) 520 CALL compute_divgrad(dtheta,dtheta,llm) 521 ENDDO 522 523 ENDDO 524 525 END SUBROUTINE divgrad 526 527 528 529 ! SUBROUTINE compute_dissip(ue,due,ps,theta_rhodz,dtheta_rhodz) 530 ! USE icosa 531 ! USE theta2theta_rhodz_mod 532 ! IMPLICIT NONE 533 ! REAL(rstd) :: ue(3*iim*jjm,llm) 534 ! REAL(rstd) :: due(3*iim*jjm,llm) 535 ! REAL(rstd) :: ps(iim*jjm) 536 ! REAL(rstd) :: theta_rhodz(iim*jjm,llm) 537 ! REAL(rstd) :: dtheta_rhodz(iim*jjm,llm) 538 ! 539 ! REAL(rstd),SAVE,ALLOCATABLE :: theta(:,:) 540 ! REAL(rstd),SAVE,ALLOCATABLE :: du_dissip(:,:) 541 ! REAL(rstd),SAVE,ALLOCATABLE :: dtheta_dissip(:,:) 542 ! REAL(rstd),SAVE,ALLOCATABLE :: dtheta_rhodz_dissip(:,:) 543 ! 544 ! INTEGER :: ind 545 ! INTEGER :: l,i,j,n 546 ! 547 !!$OMP BARRIER 548 !!$OMP MASTER 549 ! ALLOCATE(theta(iim*jjm,llm)) 550 ! ALLOCATE(du_dissip(3*iim*jjm,llm)) 551 ! ALLOCATE(dtheta_dissip(iim*jjm,llm)) 552 ! ALLOCATE(dtheta_rhodz_dissip(iim*jjm,llm)) 553 !!$OMP END MASTER 554 !!$OMP BARRIER 555 ! 556 ! CALL gradiv(ue,du_dissip,llm) 557 ! DO l=1,llm 558 !!$OMP DO 559 ! DO j=jj_begin,jj_end 560 ! DO i=ii_begin,ii_end 561 ! n=(j-1)*iim+i 562 ! due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_graddiv(l)*0.5 563 ! due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_graddiv(l)*0.5 564 ! due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_graddiv(l)*0.5 565 ! ENDDO 566 ! ENDDO 567 ! ENDDO 568 ! 569 ! CALL gradrot(ue,du_dissip,llm) 570 ! 571 ! DO l=1,llm 572 !!$OMP DO 573 ! DO j=jj_begin,jj_end 574 ! DO i=ii_begin,ii_end 575 ! n=(j-1)*iim+i 576 ! due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_gradrot(l)*0.5 577 ! due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_gradrot(l)*0.5 578 ! due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_gradrot(l)*0.5 579 ! ENDDO 580 ! ENDDO 581 ! ENDDO 582 ! 583 ! CALL compute_theta_rhodz2theta(ps,theta_rhodz,theta,1) 584 ! CALL divgrad(theta,dtheta_dissip,llm) 585 ! CALL compute_theta2theta_rhodz(ps,dtheta_dissip,dtheta_rhodz_dissip,0) 586 ! 587 ! DO l=1,llm 588 !!$OMP DO 589 ! DO j=jj_begin,jj_end 590 ! DO i=ii_begin,ii_end 591 ! n=(j-1)*iim+i 592 ! dtheta_rhodz(n,l)=dtheta_rhodz(n,l)+dtheta_rhodz_dissip(n,l)/tau_divgrad(l)*0.5 593 ! ENDDO 594 ! ENDDO 595 ! ENDDO 596 ! 597 !!$OMP BARRIER 598 !!$OMP MASTER 599 ! DEALLOCATE(theta) 600 ! DEALLOCATE(du_dissip) 601 ! DEALLOCATE(dtheta_dissip) 602 ! DEALLOCATE(dtheta_rhodz_dissip) 603 !!$OMP END MASTER 604 !!$OMP BARRIER 605 ! 606 ! END SUBROUTINE compute_dissip 607 608 609 SUBROUTINE compute_gradiv(ue,gradivu_e,ll) 478 610 USE icosa 479 611 IMPLICIT NONE … … 528 660 DO i=ii_begin,ii_end 529 661 n=(j-1)*iim+i 530 gradivu_e(n+u_right,l)= gradivu_e(n+u_right,l)*cgraddiv531 gradivu_e(n+u_lup,l)= gradivu_e(n+u_lup,l)*cgraddiv532 gradivu_e(n+u_ldown,l)= gradivu_e(n+u_ldown,l)*cgraddiv662 gradivu_e(n+u_right,l)=-gradivu_e(n+u_right,l)*cgraddiv 663 gradivu_e(n+u_lup,l)=-gradivu_e(n+u_lup,l)*cgraddiv 664 gradivu_e(n+u_ldown,l)=-gradivu_e(n+u_ldown,l)*cgraddiv 533 665 ENDDO 534 666 ENDDO … … 542 674 543 675 544 END SUBROUTINE gradiv545 546 SUBROUTINE divgrad(theta,divgrad_i,ll)676 END SUBROUTINE compute_gradiv 677 678 SUBROUTINE compute_divgrad(theta,divgrad_i,ll) 547 679 USE icosa 548 680 IMPLICIT NONE … … 598 730 DO i=ii_begin,ii_end 599 731 n=(j-1)*iim+i 600 divgrad_i(n,l)= divgrad_i(n,l)*cdivgrad732 divgrad_i(n,l)=-divgrad_i(n,l)*cdivgrad 601 733 ENDDO 602 734 ENDDO … … 609 741 !$OMP BARRIER 610 742 611 END SUBROUTINE divgrad612 613 614 SUBROUTINE gradrot(ue,gradrot_e,ll)743 END SUBROUTINE compute_divgrad 744 745 746 SUBROUTINE compute_gradrot(ue,gradrot_e,ll) 615 747 USE icosa 616 748 IMPLICIT NONE … … 668 800 n=(j-1)*iim+i 669 801 670 gradrot_e(n+u_right,l)= gradrot_e(n+u_right,l)*cgradrot671 gradrot_e(n+u_lup,l)= gradrot_e(n+u_lup,l)*cgradrot672 gradrot_e(n+u_ldown,l)= gradrot_e(n+u_ldown,l)*cgradrot802 gradrot_e(n+u_right,l)=-gradrot_e(n+u_right,l)*cgradrot 803 gradrot_e(n+u_lup,l)=-gradrot_e(n+u_lup,l)*cgradrot 804 gradrot_e(n+u_ldown,l)=-gradrot_e(n+u_ldown,l)*cgradrot 673 805 674 806 ENDDO … … 682 814 !$OMP BARRIER 683 815 684 END SUBROUTINE gradrot816 END SUBROUTINE compute_gradrot 685 817 686 818 -
codes/icosagcm/trunk/src/domain.f90
r21 r26 59 59 TYPE(t_domain),SAVE,ALLOCATABLE,TARGET :: domain(:) 60 60 INTEGER :: ndomain 61 62 61 TYPE(t_domain),SAVE,ALLOCATABLE,TARGET :: domain_glo(:) 62 INTEGER :: ndomain_glo 63 64 INTEGER,ALLOCATABLE,SAVE :: domglo_rank(:) 65 INTEGER,ALLOCATABLE,SAVE :: domglo_loc_ind(:) 66 INTEGER,ALLOCATABLE,SAVE :: domloc_glo_ind(:) 67 63 68 CONTAINS 64 69 … … 70 75 TYPE(t_domain),POINTER :: d 71 76 72 ndomain=nsplit_i*nsplit_j*nb_face 73 ALLOCATE(domain(ndomain)) 74 77 ndomain_glo=nsplit_i*nsplit_j*nb_face 78 ALLOCATE(domain_glo(ndomain_glo)) 79 ALLOCATE(domglo_rank(ndomain_glo)) 80 ALLOCATE(domglo_loc_ind(ndomain_glo)) 81 75 82 ind=0 76 83 DO nf=1,nb_face … … 78 85 DO ni=1,nsplit_i 79 86 ind=ind+1 80 d=>domain (ind)87 d=>domain_glo(ind) 81 88 quotient=(iim_glo/nsplit_i) 82 89 rest=MOD(iim_glo,nsplit_i) … … 139 146 END SUBROUTINE create_domain 140 147 148 SUBROUTINE copy_domain(d1,d2) 149 IMPLICIT NONE 150 INTEGER :: face 151 TYPE(t_domain),TARGET,INTENT(IN) :: d1 152 TYPE(t_domain), INTENT(OUT) :: d2 153 154 d2%iim = d1%iim 155 d2%jjm = d1%jjm 156 d2%ii_begin = d1%ii_begin 157 d2%jj_begin = d1%jj_begin 158 d2%ii_end = d1%ii_end 159 d2%jj_end = d1%jj_end 160 d2%ii_nb = d1%ii_nb 161 d2%jj_nb = d1%jj_nb 162 d2%ii_begin_glo = d1%ii_begin_glo 163 d2%jj_begin_glo = d1%jj_begin_glo 164 d2%ii_end_glo = d1%ii_end_glo 165 d2%jj_end_glo = d1%jj_end_glo 166 d2%assign_domain => d1%assign_domain 167 d2%assign_i => d1%assign_i 168 d2%assign_j => d1%assign_j 169 d2%edge_assign_domain => d1%edge_assign_domain 170 d2%edge_assign_i => d1%edge_assign_i 171 d2%edge_assign_j => d1%edge_assign_j 172 d2%edge_assign_pos => d1%edge_assign_pos 173 d2%xyz => d1%xyz 174 d2%neighbour => d1%neighbour 175 d2%delta => d1%delta 176 d2%vertex => d1%vertex 177 d2%own => d1%own 178 d2%ne => d1%ne 179 180 d2%t_right = d1%t_right 181 d2%t_rup = d1%t_rup 182 d2%t_lup = d1%t_lup 183 d2%t_left = d1%t_left 184 d2%t_ldown = d1%t_ldown 185 d2%t_rdown = d1%t_rdown 186 187 d2%u_right = d1%u_right 188 d2%u_rup = d1%u_rup 189 d2%u_lup = d1%u_lup 190 d2%u_left = d1%u_left 191 d2%u_ldown = d1%u_ldown 192 d2%u_rdown = d1%u_rdown 193 194 d2%z_rup = d1%z_rup 195 d2%z_up = d1%z_up 196 d2%z_lup = d1%z_lup 197 d2%z_ldown = d1%z_ldown 198 d2%z_down = d1%z_down 199 d2%z_rdown = d1%z_rdown 200 201 d2%t_pos = d1%t_pos 202 d2%u_pos = d1%u_pos 203 d2%z_pos = d1%z_pos 204 205 END SUBROUTINE copy_domain 206 141 207 142 208 SUBROUTINE assign_cell … … 150 216 151 217 152 DO ind_d=1,ndomain 153 d=>domain (ind_d)218 DO ind_d=1,ndomain_glo 219 d=>domain_glo(ind_d) 154 220 nf=d%face 155 221 DO j=d%jj_begin,d%jj_end … … 175 241 176 242 177 DO ind_d=1,ndomain 178 d=>domain (ind_d)243 DO ind_d=1,ndomain_glo 244 d=>domain_glo(ind_d) 179 245 nf=d%face 180 246 DO j=d%jj_begin-1,d%jj_end+1 … … 231 297 REAL(rstd) :: ng1(3),ng2(3) 232 298 233 DO ind_d=1,ndomain 234 d=>domain (ind_d)299 DO ind_d=1,ndomain_glo 300 d=>domain_glo(ind_d) 235 301 DO j=d%jj_begin-1,d%jj_end+1 236 302 DO i=d%ii_begin-1,d%ii_end+1 … … 252 318 TYPE(t_domain),POINTER :: d 253 319 254 DO ind_d=1,ndomain 255 d=>domain (ind_d)320 DO ind_d=1,ndomain_glo 321 d=>domain_glo(ind_d) 256 322 d%t_right=1 257 323 d%t_left=-1 … … 301 367 END SUBROUTINE set_neighbour_indice 302 368 303 369 SUBROUTINE assign_domain 370 USE mpipara 371 IMPLICIT NONE 372 INTEGER :: nb_domain(0:mpi_size-1) 373 INTEGER :: rank, ind,ind_glo 374 375 DO rank=0,mpi_size-1 376 nb_domain(rank)=ndomain_glo/mpi_size 377 IF ( rank < MOD(ndomain_glo,mpi_size) ) nb_domain(rank)=nb_domain(rank)+1 378 ENDDO 379 380 ndomain=nb_domain(mpi_rank) 381 ALLOCATE(domain(ndomain)) 382 ALLOCATE(domloc_glo_ind(ndomain)) 383 384 rank=0 385 ind=0 386 DO ind_glo=1,ndomain_glo 387 ind=ind+1 388 domglo_rank(ind_glo)=rank 389 domglo_loc_ind(ind_glo)=ind 390 IF (rank==mpi_rank) THEN 391 CALL copy_domain(domain_glo(ind_glo),domain(ind)) 392 domloc_glo_ind(ind)=ind_glo 393 ENDIF 394 395 IF (ind==nb_domain(rank)) THEN 396 rank=rank+1 397 ind=0 398 ENDIF 399 ENDDO 400 401 END SUBROUTINE assign_domain 402 304 403 305 404 SUBROUTINE compute_domain 306 405 IMPLICIT NONE 307 406 CALL init_domain_param 308 407 CALL create_domain 309 408 CALL assign_cell 310 409 CALL compute_boundary 311 410 CALL set_neighbour_indice 411 CALL assign_domain 312 412 313 413 END SUBROUTINE compute_domain -
codes/icosagcm/trunk/src/domain_param.f90
r12 r26 1 1 MODULE domain_param 2 2 3 INTEGER , PARAMETER :: nsplit_i=14 INTEGER , PARAMETER :: nsplit_j=15 INTEGER , PARAMETER:: halo=23 INTEGER :: nsplit_i 4 INTEGER :: nsplit_j 5 INTEGER :: halo=2 6 6 7 INTEGER, PARAMETER :: default_nsplit_i=1 8 INTEGER, PARAMETER :: default_nsplit_j=1 7 9 10 CONTAINS 11 12 SUBROUTINE init_domain_param 13 USE ioipsl 14 IMPLICIT NONE 15 nsplit_i=default_nsplit_i 16 nsplit_j=default_nsplit_j 17 CALL getin('nsplit_i',nsplit_i) 18 CALL getin('nsplit_j',nsplit_j) 19 END SUBROUTINE init_domain_param 20 8 21 END MODULE domain_param -
codes/icosagcm/trunk/src/field.f90
r12 r26 26 26 INTEGER :: field_type 27 27 INTEGER :: data_type 28 INTEGER :: dim3 29 INTEGER :: dim4 28 30 END TYPE t_field 29 31 … … 59 61 IF (PRESENT(dim2)) THEN 60 62 field(ind)%ndim=4 63 field(ind)%dim4=dim2 61 64 ELSE IF (PRESENT(dim1)) THEN 62 65 field(ind)%ndim=3 66 field(ind)%dim3=dim1 63 67 ELSE 64 68 field(ind)%ndim=2 … … 96 100 97 101 END SUBROUTINE allocate_field 98 102 103 SUBROUTINE allocate_field_glo(field,field_type,data_type,dim1,dim2) 104 USE domain_mod 105 IMPLICIT NONE 106 TYPE(t_field),POINTER :: field(:) 107 INTEGER,INTENT(IN) :: field_type 108 INTEGER,INTENT(IN) :: data_type 109 INTEGER,OPTIONAL :: dim1,dim2 110 INTEGER :: ind 111 INTEGER :: ii_size,jj_size 112 113 ALLOCATE(field(ndomain_glo)) 114 115 DO ind=1,ndomain_glo 116 117 IF (PRESENT(dim2)) THEN 118 field(ind)%ndim=4 119 field(ind)%dim4=dim2 120 ELSE IF (PRESENT(dim1)) THEN 121 field(ind)%ndim=3 122 field(ind)%dim3=dim1 123 ELSE 124 field(ind)%ndim=2 125 ENDIF 126 127 128 field(ind)%data_type=data_type 129 field(ind)%field_type=field_type 130 131 IF (field_type==field_T) THEN 132 jj_size=domain_glo(ind)%jjm 133 ELSE IF (field_type==field_U) THEN 134 jj_size=3*domain_glo(ind)%jjm 135 ELSE IF (field_type==field_Z) THEN 136 jj_size=2*domain_glo(ind)%jjm 137 ENDIF 138 139 ii_size=domain_glo(ind)%iim 140 141 IF (field(ind)%ndim==4) THEN 142 IF (data_type==type_integer) ALLOCATE(field(ind)%ival4d(ii_size*jj_size,dim1,dim2)) 143 IF (data_type==type_real) ALLOCATE(field(ind)%rval4d(ii_size*jj_size,dim1,dim2)) 144 IF (data_type==type_logical) ALLOCATE(field(ind)%lval4d(ii_size*jj_size,dim1,dim2)) 145 ELSE IF (field(ind)%ndim==3) THEN 146 IF (data_type==type_integer) ALLOCATE(field(ind)%ival3d(ii_size*jj_size,dim1)) 147 IF (data_type==type_real) ALLOCATE(field(ind)%rval3d(ii_size*jj_size,dim1)) 148 IF (data_type==type_logical) ALLOCATE(field(ind)%lval3d(ii_size*jj_size,dim1)) 149 ELSE IF (field(ind)%ndim==2) THEN 150 IF (data_type==type_integer) ALLOCATE(field(ind)%ival2d(ii_size*jj_size)) 151 IF (data_type==type_real) ALLOCATE(field(ind)%rval2d(ii_size*jj_size)) 152 IF (data_type==type_logical) ALLOCATE(field(ind)%lval2d(ii_size*jj_size)) 153 ENDIF 154 155 ENDDO 156 157 END SUBROUTINE allocate_field_glo 158 159 SUBROUTINE deallocate_field(field) 160 USE domain_mod 161 IMPLICIT NONE 162 TYPE(t_field),POINTER :: field(:) 163 INTEGER :: data_type 164 INTEGER :: ind 165 166 DO ind=1,ndomain 167 168 data_type=field(ind)%data_type 169 170 IF (field(ind)%ndim==4) THEN 171 IF (data_type==type_integer) DEALLOCATE(field(ind)%ival4d) 172 IF (data_type==type_real) DEALLOCATE(field(ind)%rval4d) 173 IF (data_type==type_logical) DEALLOCATE(field(ind)%lval4d) 174 ELSE IF (field(ind)%ndim==3) THEN 175 IF (data_type==type_integer) DEALLOCATE(field(ind)%ival3d) 176 IF (data_type==type_real) DEALLOCATE(field(ind)%rval3d) 177 IF (data_type==type_logical) DEALLOCATE(field(ind)%lval3d) 178 ELSE IF (field(ind)%ndim==2) THEN 179 IF (data_type==type_integer) DEALLOCATE(field(ind)%ival2d) 180 IF (data_type==type_real) DEALLOCATE(field(ind)%rval2d) 181 IF (data_type==type_logical) DEALLOCATE(field(ind)%lval2d) 182 ENDIF 183 184 ENDDO 185 DEALLOCATE(field) 186 187 END SUBROUTINE deallocate_field 188 189 SUBROUTINE deallocate_field_glo(field) 190 USE domain_mod 191 IMPLICIT NONE 192 TYPE(t_field),POINTER :: field(:) 193 INTEGER :: data_type 194 INTEGER :: ind 195 196 DO ind=1,ndomain_glo 197 198 data_type=field(ind)%data_type 199 200 IF (field(ind)%ndim==4) THEN 201 IF (data_type==type_integer) DEALLOCATE(field(ind)%ival4d) 202 IF (data_type==type_real) DEALLOCATE(field(ind)%rval4d) 203 IF (data_type==type_logical) DEALLOCATE(field(ind)%lval4d) 204 ELSE IF (field(ind)%ndim==3) THEN 205 IF (data_type==type_integer) DEALLOCATE(field(ind)%ival3d) 206 IF (data_type==type_real) DEALLOCATE(field(ind)%rval3d) 207 IF (data_type==type_logical) DEALLOCATE(field(ind)%lval3d) 208 ELSE IF (field(ind)%ndim==2) THEN 209 IF (data_type==type_integer) DEALLOCATE(field(ind)%ival2d) 210 IF (data_type==type_real) DEALLOCATE(field(ind)%rval2d) 211 IF (data_type==type_logical) DEALLOCATE(field(ind)%lval2d) 212 ENDIF 213 214 ENDDO 215 DEALLOCATE(field) 216 217 END SUBROUTINE deallocate_field_glo 218 99 219 SUBROUTINE getval_r2d(field_pt,field) 100 220 IMPLICIT NONE -
codes/icosagcm/trunk/src/icosa_gcm.f90
r19 r26 2 2 USE icosa 3 3 USE timeloop_gcm_mod 4 USE transfert_mod5 4 USE disvert_mod 6 5 USE etat0_mod 7 6 USE wind_mod 7 USE mpipara 8 8 IMPLICIT NONE 9 9 10 10 TYPE(t_field),POINTER :: sum_ne(:) 11 TYPE(t_field),POINTER :: sum_ne_glo(:) 11 12 REAL(rstd),POINTER :: pt_sum_ne(:) 12 13 … … 16 17 REAL(rstd) :: centr(3),dist 17 18 19 CALL init_mpipara 20 18 21 CALL init_grid_param 19 22 CALL compute_metric 20 23 CALL compute_domain 21 24 CALL init_transfert 25 ! CALL allocate_field(sum_ne,field_T,type_real) 26 ! CALL allocate_field_glo(sum_ne_glo,field_T,type_real) 27 ! 28 ! DO ind=1,ndomain 29 ! CALL swap_dimensions(ind) 30 ! pt_sum_ne=sum_ne(ind) 31 ! DO j=jj_begin,jj_end 32 ! DO i=ii_begin,ii_end 33 ! n=(j-1)*iim+i 34 ! pt_sum_ne(n)=domloc_glo_ind(ind) 35 ! ENDDO 36 ! ENDDO 37 ! ENDDO 38 39 ! CALL WriteField("domain",sum_ne) 40 ! CALL WriteField_mpi("domain",sum_ne) 41 ! CALL transfert_request(sum_ne,req_i1) 42 ! CALL WriteField_mpi("domain",sum_ne) 43 ! CALL close_files 44 ! CALL finalize_mpipara 45 ! STOP 46 22 47 CALL compute_geometry 23 48 CALL init_disvert … … 52 77 CALL WriteField("Ai",geom%Ai) 53 78 ! CALL WriteField("sum_ne",sum_ne) 54 55 79 CALL timeloop 80 81 CALL close_files 82 CALL finalize_mpipara 56 83 57 84 END PROGRAM ICOSA_gcm -
codes/icosagcm/trunk/src/icosa_sw.f90
r19 r26 2 2 USE icosa 3 3 USE timeloop_sw_mod 4 USE transfert_mod5 4 USE dissip_sw_mod 6 5 USE disvert_mod -
codes/icosagcm/trunk/src/write_field.f90
r21 r26 6 6 INTEGER :: size 7 7 INTEGER,POINTER :: nc_id(:) 8 INTEGER :: displ 8 9 END TYPE ncvar 9 10 … … 37 38 enddo 38 39 end function GetFieldIndex 39 40 41 42 subroutine WriteField_gen(name,Field,dimx,dimy,dimz) 43 implicit none 44 ! include 'netcdf.inc' 45 character(len=*) :: name 46 integer :: dimx,dimy,dimz 47 real,dimension(dimx,dimy,dimz) :: Field 48 integer,dimension(dimx*dimy*dimz) :: ndex 49 integer :: status 50 integer :: index 51 integer :: start(4) 52 integer :: count(4) 53 54 40 41 SUBROUTINE Writefield(name_in,field,nind) 42 USE domain_mod 43 USE field_mod 44 USE transfert_mpi_mod 45 USE dimensions 46 USE mpipara 47 IMPLICIT NONE 48 CHARACTER(LEN=*),INTENT(IN) :: name_in 49 TYPE(t_field),POINTER :: field(:) 50 INTEGER,OPTIONAL,INTENT(IN) :: nind 51 TYPE(t_field),POINTER :: field_glo(:) 52 53 IF (field(1)%ndim==2) THEN 54 CALL allocate_field_glo(field_glo,field(1)%field_type,field(1)%data_type) 55 ELSE IF (field(1)%ndim==3) THEN 56 CALL allocate_field_glo(field_glo,field(1)%field_type,field(1)%data_type,field(1)%dim3) 57 ELSE IF (field(1)%ndim==4) THEN 58 CALL allocate_field_glo(field_glo,field(1)%field_type,field(1)%data_type,field(1)%dim3,field(1)%dim4) 59 ENDIF 60 61 CALL gather_field(field,field_glo) 62 63 IF (mpi_rank==0) THEN 64 IF (PRESENT(nind)) THEN 65 CALL writefield_gen(name_in,field_glo,domain_glo,nind) 66 ELSE 67 CALL writefield_gen(name_in,field_glo,domain_glo,1,ndomain_glo) 68 ENDIF 69 ENDIF 70 71 CALL deallocate_field(field_glo) 72 73 END SUBROUTINE writefield 74 75 ! SUBROUTINE Writefield(name_in,field,nind) 76 ! USE netcdf 77 ! USE domain_mod 78 ! use field_mod 79 ! USE dimensions 80 ! USE geometry 81 ! IMPLICIT NONE 82 ! CHARACTER(LEN=*),INTENT(IN) :: name_in 83 ! TYPE(t_field),POINTER :: field(:) 84 ! INTEGER,OPTIONAL,INTENT(IN) :: nind 85 ! REAL(r8),ALLOCATABLE :: field_val2d(:) 86 ! REAL(r8),ALLOCATABLE :: field_val3d(:,:) 87 ! REAL(r8),ALLOCATABLE :: field_val4d(:,:,:) 88 ! TYPE(t_domain),POINTER :: d 89 ! INTEGER :: Index 90 ! INTEGER :: ind,i,j,k,n,ncell,q 91 ! INTEGER :: iie,jje,iin,jjn 92 ! INTEGER :: status 93 ! CHARACTER(len=255) :: name 94 ! CHARACTER(len=255) :: str_ind 95 ! INTEGER :: ind_b,ind_e 96 ! INTEGER :: halo_size 97 ! LOGICAL :: single 98 ! 99 ! 100 ! name=TRIM(ADJUSTL(name_in)) 101 102 ! IF (PRESENT(nind)) THEN 103 ! name=TRIM(name)//"_"//TRIM(int2str(nind)) 104 ! PRINT *,"NAME",nind,int2str(nind),name 105 ! ind_b=nind 106 ! ind_e=nind 107 ! halo_size=1 108 ! single=.TRUE. 109 ! ELSE 110 ! ind_b=1 111 ! ind_e=ndomain 112 ! halo_size=0 113 ! single=.FALSE. 114 ! ENDIF 115 116 ! Index=GetFieldIndex(name) 117 ! if (Index==-1) then 118 ! call create_header(name,field,nind) 119 ! Index=GetFieldIndex(name) 120 ! else 121 ! FieldIndex(Index)=FieldIndex(Index)+1. 122 ! endif 123 ! 124 ! IF (Field(ind_b)%field_type==field_T) THEN 125 ! ncell=1 126 ! DO ind=ind_b,ind_e 127 ! d=>domain(ind) 128 ! IF (Field(ind)%field_type/=field_T) THEN 129 ! PRINT *,"Writefield, grille non geree" 130 ! RETURN 131 ! ENDIF 132 133 ! n=0 134 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 135 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 136 ! IF (d%own(i,j) .OR. single) n=n+1 137 ! ENDDO 138 ! ENDDO 139 140 ! IF (field(ind)%ndim==2) THEN 141 ! ALLOCATE(Field_val2d(n)) 142 ! n=0 143 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 144 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 145 ! k=d%iim*(j-1)+i 146 ! IF (d%own(i,j) .OR. single) THEN 147 ! n=n+1 148 ! Field_val2d(n)=field(ind)%rval2d(k) 149 ! ENDIF 150 ! ENDDO 151 ! ENDDO 152 ! status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val2d, & 153 ! start=(/ ncell,FieldIndex(Index) /),count=(/n,1 /)) 154 ! DEALLOCATE(field_val2d) 155 ! ELSE IF (field(ind)%ndim==3) THEN 156 ! ALLOCATE(Field_val3d(n,size(field(ind)%rval3d,2))) 157 ! n=0 158 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 159 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 160 ! k=d%iim*(j-1)+i 161 ! IF (d%own(i,j) .OR. single) THEN 162 ! n=n+1 163 ! Field_val3d(n,:)=field(ind)%rval3d(k,:) 164 ! ENDIF 165 ! ENDDO 166 ! ENDDO 167 ! status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ ncell,1,FieldIndex(Index) /), & 168 ! count=(/n,size(field(1)%rval3d,2),1 /)) 169 ! DEALLOCATE(field_val3d) 170 ! ELSE IF (field(1)%ndim==4) THEN 171 172 ! DO q=1,FieldVarId(index)%size 173 ! 174 ! ALLOCATE(Field_val3d(n,size(field(ind)%rval4d,2))) 175 ! n=0 176 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 177 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 178 ! k=d%iim*(j-1)+i 179 ! IF (d%own(i,j) .OR. single) THEN 180 ! n=n+1 181 ! Field_val3d(n,:)=field(ind)%rval4d(k,:,q) 182 ! ENDIF 183 ! ENDDO 184 ! ENDDO 185 ! status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ ncell,1,FieldIndex(Index) /), & 186 ! count=(/n,size(field(1)%rval4d,2),1 /)) 187 ! DEALLOCATE(field_val3d) 188 ! ENDDO 189 ! ENDIF 190 ! 191 ! PRINT *,NF90_STRERROR(status) 192 ! ncell=ncell+n 193 194 ! ENDDO 195 ! 196 ! ELSE IF (Field(ind_b)%field_type==field_Z) THEN 197 ! ncell=1 198 ! n=0 199 ! DO ind=ind_b,ind_e 200 ! d=>domain(ind) 201 ! CALL swap_geometry(ind) 202 ! CALL swap_dimensions(ind) 203 ! 204 ! n=0 205 ! DO j=jj_begin+1,jj_end 206 ! DO i=ii_begin,ii_end-1 207 ! n=n+1 208 ! ENDDO 209 ! ENDDO 210 211 ! DO j=jj_begin,jj_end-1 212 ! DO i=ii_begin+1,ii_end 213 ! n=n+1 214 ! ENDDO 215 ! ENDDO 216 217 ! IF (field(ind)%ndim==2) THEN 218 ! ALLOCATE(Field_val2d(n)) 219 220 ! n=0 221 ! DO j=jj_begin+1,jj_end 222 ! DO i=ii_begin,ii_end-1 223 ! n=n+1 224 ! k=iim*(j-1)+i 225 ! Field_val2d(n)=field(ind)%rval2d(k+z_down) 226 ! ENDDO 227 ! ENDDO 228 229 ! DO j=jj_begin,jj_end-1 230 ! DO i=ii_begin+1,ii_end 231 ! n=n+1 232 ! k=iim*(j-1)+i 233 ! Field_val2d(n)=field(ind)%rval2d(k+z_up) 234 ! ENDDO 235 ! ENDDO 236 237 ! status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1), & 238 ! Field_val2d,start=(/ ncell,FieldIndex(Index) /),count=(/n,1 /)) 239 ! DEALLOCATE(field_val2d) 240 241 ! ELSE IF (field(ind)%ndim==3) THEN 242 ! ALLOCATE(Field_val3d(n,size(field(ind)%rval3d,2))) 243 ! n=0 244 ! DO j=jj_begin+1,jj_end 245 ! DO i=ii_begin,ii_end-1 246 ! n=n+1 247 ! k=iim*(j-1)+i 248 ! Field_val3d(n,:)=field(ind)%rval3d(k+z_down,:) 249 ! ENDDO 250 ! ENDDO 251 252 ! DO j=jj_begin,jj_end-1 253 ! DO i=ii_begin+1,ii_end 254 ! n=n+1 255 ! k=iim*(j-1)+i 256 ! Field_val3d(n,:)=field(ind)%rval3d(k+z_up,:) 257 ! ENDDO 258 ! ENDDO 259 ! status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ ncell,1,FieldIndex(Index) /), & 260 ! count=(/n,size(field(1)%rval3d,2),1 /)) 261 ! DEALLOCATE(field_val3d) 262 ! ELSE IF (field(1)%ndim==4) THEN 263 264 ! DO q=1,FieldVarId(index)%size 265 ! ALLOCATE(Field_val3d(n,size(field(ind)%rval4d,2))) 266 ! n=0 267 ! DO j=jj_begin+1,jj_end 268 ! DO i=ii_begin,ii_end-1 269 ! n=n+1 270 ! k=iim*(j-1)+i 271 ! Field_val3d(n,:)=field(ind)%rval4d(k+z_down,:,q) 272 ! ENDDO 273 ! ENDDO 274 275 ! DO j=jj_begin,jj_end-1 276 ! DO i=ii_begin+1,ii_end 277 ! n=n+1 278 ! k=iim*(j-1)+i 279 ! Field_val3d(n,:)=field(ind)%rval4d(k+z_up,:,q) 280 ! ENDDO 281 ! ENDDO 282 283 ! status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ ncell,1,1,FieldIndex(Index) /), & 284 ! count=(/n,size(field(1)%rval4d,2),1 /)) 285 ! DEALLOCATE(field_val3d) 286 ! ENDDO 287 ! ENDIF 288 ! 289 ! PRINT *,NF90_STRERROR(status) 290 ! ncell=ncell+n 291 292 ! ENDDO 293 ! 294 ! ENDIF 295 ! status=NF90_SYNC(FieldId(Index)) 296 ! 297 ! END SUBROUTINE Writefield 298 299 300 SUBROUTINE Writefield_gen(name_in, field, domain_type, ind_b_in, ind_e_in ) 301 USE netcdf_mod 302 USE domain_mod 303 USE field_mod 304 ! USE dimensions 305 ! USE geometry 306 IMPLICIT NONE 307 CHARACTER(LEN=*),INTENT(IN) :: name_in 308 TYPE(t_field), POINTER :: field(:) 309 TYPE(t_domain),INTENT(IN),TARGET :: domain_type(:) 310 INTEGER,OPTIONAL,INTENT(IN) :: ind_b_in 311 INTEGER,OPTIONAL,INTENT(IN) :: ind_e_in 312 REAL(r8),ALLOCATABLE :: field_val2d(:) 313 REAL(r8),ALLOCATABLE :: field_val3d(:,:) 314 REAL(r8),ALLOCATABLE :: field_val4d(:,:,:) 315 TYPE(t_domain),POINTER :: d 316 INTEGER :: Index 317 INTEGER :: ind,i,j,k,n,ncell,q 318 INTEGER :: iie,jje,iin,jjn 319 INTEGER :: status 320 CHARACTER(len=255) :: name 321 CHARACTER(len=255) :: str_ind 322 INTEGER :: ind_b,ind_e 323 INTEGER :: halo_size 324 LOGICAL :: single 325 326 327 name=TRIM(ADJUSTL(name_in)) 328 329 IF (PRESENT(ind_b_in) .AND. .NOT. PRESENT(ind_e_in)) THEN 330 name=TRIM(name)//"_"//TRIM(int2str(ind_b)) 331 ind_b=ind_b_in 332 ind_e=ind_b_in 333 halo_size=1 334 single=.TRUE. 335 ELSE IF (.NOT. PRESENT(ind_b_in) .AND. PRESENT(ind_e_in)) THEN 336 name=TRIM(name)//"_"//TRIM(int2str(ind_e)) 337 ind_b=ind_e_in 338 ind_e=ind_e_in 339 halo_size=1 340 single=.TRUE. 341 ELSE IF ( PRESENT(ind_b_in) .AND. PRESENT(ind_e_in)) THEN 342 ind_b=ind_b_in 343 ind_e=ind_e_in 344 halo_size=0 345 single=.FALSE. 346 ELSE 347 halo_size=0 348 ind_b=1 349 ind_e=ndomain 350 single=.FALSE. 351 ENDIF 352 55 353 Index=GetFieldIndex(name) 56 354 if (Index==-1) then 57 ! call CreateNewField(name,dimx,dimy,dimz)58 355 call create_header_gen(name_in,field,domain_type,ind_b_in,ind_e_in) 356 Index=GetFieldIndex(name) 59 357 else 60 358 FieldIndex(Index)=FieldIndex(Index)+1. 61 359 endif 62 360 63 start(1)=1 64 start(2)=1 65 start(3)=1 66 start(4)=FieldIndex(Index) 67 68 count(1)=dimx 69 count(2)=dimy 70 count(3)=dimz 71 count(4)=1 72 73 ! status = NF_PUT_VARA_DOUBLE(FieldId(Index),FieldVarId(Index),start,count,Field) 74 ! status = NF_SYNC(FieldId(Index)) 75 76 end subroutine WriteField_gen 77 78 79 SUBROUTINE Writefield(name_in,field,nind) 80 USE netcdf 361 IF (Field(ind_b)%field_type==field_T) THEN 362 363 ncell=0 364 DO ind=ind_b,ind_e 365 d=>domain_type(ind) 366 DO j=d%jj_begin-halo_size,d%jj_end+halo_size 367 DO i=d%ii_begin-halo_size,d%ii_end+halo_size 368 IF (d%assign_domain(i,j)==ind .OR. single) ncell=ncell+1 369 ENDDO 370 ENDDO 371 ENDDO 372 373 IF (field(1)%ndim==2) THEN 374 ALLOCATE(Field_val2d(ncell)) 375 n=0 376 DO ind=ind_b,ind_e 377 d=>domain_type(ind) 378 DO j=d%jj_begin-halo_size,d%jj_end+halo_size 379 DO i=d%ii_begin-halo_size,d%ii_end+halo_size 380 k=d%iim*(j-1)+i 381 IF (d%assign_domain(i,j)==ind .OR. single) THEN 382 n=n+1 383 Field_val2d(n)=field(ind)%rval2d(k) 384 ENDIF 385 ENDDO 386 ENDDO 387 ENDDO 388 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val2d, & 389 start=(/ 1,FieldIndex(Index) /),count=(/ncell,1 /)) 390 DEALLOCATE(field_val2d) 391 ELSE IF (field(1)%ndim==3) THEN 392 ALLOCATE(Field_val3d(ncell,size(field(1)%rval3d,2))) 393 n=0 394 DO ind=ind_b,ind_e 395 d=>domain_type(ind) 396 DO j=d%jj_begin-halo_size,d%jj_end+halo_size 397 DO i=d%ii_begin-halo_size,d%ii_end+halo_size 398 k=d%iim*(j-1)+i 399 IF (d%assign_domain(i,j)==ind .OR. single) THEN 400 n=n+1 401 Field_val3d(n,:)=field(ind)%rval3d(k,:) 402 ENDIF 403 ENDDO 404 ENDDO 405 ENDDO 406 407 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1,FieldIndex(Index) /), & 408 count=(/ncell,size(field(1)%rval3d,2),1 /)) 409 DEALLOCATE(field_val3d) 410 ELSE IF (field(1)%ndim==4) THEN 411 412 DO q=1,FieldVarId(index)%size 413 414 ALLOCATE(Field_val3d(n,size(field(1)%rval4d,2))) 415 n=0 416 DO ind=ind_b,ind_e 417 d=>domain_type(ind) 418 DO j=d%jj_begin-halo_size,d%jj_end+halo_size 419 DO i=d%ii_begin-halo_size,d%ii_end+halo_size 420 k=d%iim*(j-1)+i 421 IF (d%assign_domain(i,j)==ind .OR. single) THEN 422 n=n+1 423 Field_val3d(n,:)=field(ind)%rval4d(k,:,q) 424 ENDIF 425 ENDDO 426 ENDDO 427 ENDDO 428 429 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,FieldIndex(Index) /), & 430 count=(/ncell,size(field(1)%rval4d,2),1 /)) 431 DEALLOCATE(field_val3d) 432 ENDDO 433 ENDIF 434 435 ! PRINT *,NF90_STRERROR(status) 436 ! ncell=ncell+n 437 438 ! ENDDO 439 440 ELSE IF (Field(ind_b)%field_type==field_Z) THEN 441 442 ncell=0 443 DO ind=ind_b,ind_e 444 d=>domain_type(ind) 445 446 DO j=d%jj_begin+1,d%jj_end 447 DO i=d%ii_begin,d%ii_end-1 448 ncell=ncell+1 449 ENDDO 450 ENDDO 451 452 DO j=d%jj_begin,d%jj_end-1 453 DO i=d%ii_begin+1,d%ii_end 454 ncell=ncell+1 455 ENDDO 456 ENDDO 457 ENDDO 458 459 IF (field(1)%ndim==2) THEN 460 ALLOCATE(Field_val2d(ncell)) 461 462 n=0 463 464 DO ind=ind_b,ind_e 465 d=>domain_type(ind) 466 DO j=d%jj_begin+1,d%jj_end 467 DO i=d%ii_begin,d%ii_end-1 468 n=n+1 469 k=d%iim*(j-1)+i 470 Field_val2d(n)=field(ind)%rval2d(k+d%z_down) 471 ENDDO 472 ENDDO 473 474 DO j=d%jj_begin,d%jj_end-1 475 DO i=d%ii_begin+1,d%ii_end 476 n=n+1 477 k=d%iim*(j-1)+i 478 Field_val2d(n)=field(ind)%rval2d(k+d%z_up) 479 ENDDO 480 ENDDO 481 ENDDO 482 483 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1), & 484 Field_val2d,start=(/ 1,FieldIndex(Index) /),count=(/ncell,1 /)) 485 DEALLOCATE(field_val2d) 486 487 ELSE IF (field(1)%ndim==3) THEN 488 ALLOCATE(Field_val3d(ncell,size(field(1)%rval3d,2))) 489 n=0 490 DO ind=ind_b,ind_e 491 d=>domain_type(ind) 492 DO j=d%jj_begin+1,d%jj_end 493 DO i=d%ii_begin,d%ii_end-1 494 n=n+1 495 k=d%iim*(j-1)+i 496 Field_val3d(n,:)=field(ind)%rval3d(k+d%z_down,:) 497 ENDDO 498 ENDDO 499 500 DO j=d%jj_begin,d%jj_end-1 501 DO i=d%ii_begin+1,d%ii_end 502 n=n+1 503 k=d%iim*(j-1)+i 504 Field_val3d(n,:)=field(ind)%rval3d(k+d%z_up,:) 505 ENDDO 506 ENDDO 507 ENDDO 508 509 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1,FieldIndex(Index) /), & 510 count=(/ncell,size(field(1)%rval3d,2),1 /)) 511 DEALLOCATE(field_val3d) 512 513 ELSE IF (field(1)%ndim==4) THEN 514 515 DO q=1,FieldVarId(index)%size 516 ALLOCATE(Field_val3d(ncell,size(field(1)%rval4d,2))) 517 n=0 518 DO ind=ind_b,ind_e 519 d=>domain_type(ind) 520 DO j=d%jj_begin+1,d%jj_end 521 DO i=d%ii_begin,d%ii_end-1 522 n=n+1 523 k=d%iim*(j-1)+i 524 Field_val3d(n,:)=field(ind)%rval4d(k+d%z_down,:,q) 525 ENDDO 526 ENDDO 527 528 DO j=d%jj_begin,d%jj_end-1 529 DO i=d%ii_begin+1,d%ii_end 530 n=n+1 531 k=d%iim*(j-1)+i 532 Field_val3d(n,:)=field(ind)%rval4d(k+d%z_up,:,q) 533 ENDDO 534 ENDDO 535 ENDDO 536 537 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,1,FieldIndex(Index) /), & 538 count=(/ncell,size(field(1)%rval4d,2),1 /)) 539 DEALLOCATE(field_val3d) 540 ENDDO 541 ENDIF 542 543 ! PRINT *,NF90_STRERROR(status) 544 ! ncell=ncell+n 545 ! 546 ! ENDDO 547 548 ENDIF 549 status=NF90_SYNC(FieldId(Index)) 550 551 END SUBROUTINE Writefield_gen 552 553 554 555 SUBROUTINE Writefield_mpi(name_in,field,nind) 556 USE netcdf_mod 81 557 USE domain_mod 82 558 use field_mod … … 92 568 TYPE(t_domain),POINTER :: d 93 569 INTEGER :: Index 94 INTEGER :: ind,i,j, k,n,ncell,q570 INTEGER :: ind,i,j,l,k,n,ncell,q 95 571 INTEGER :: iie,jje,iin,jjn 96 572 INTEGER :: status … … 100 576 INTEGER :: halo_size 101 577 LOGICAL :: single 578 INTEGER :: displ 102 579 103 580 … … 120 597 Index=GetFieldIndex(name) 121 598 if (Index==-1) then 122 call create_header (name,field,nind)599 call create_header_mpi(name,field,nind) 123 600 Index=GetFieldIndex(name) 124 601 else … … 142 619 ENDDO 143 620 621 displ=FieldVarId(index)%displ 622 144 623 IF (field(ind)%ndim==2) THEN 145 624 ALLOCATE(Field_val2d(n)) … … 155 634 ENDDO 156 635 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val2d, & 157 start=(/ ncell,FieldIndex(Index) /),count=(/n,1 /))636 start=(/ displ+ncell,FieldIndex(Index) /),count=(/n,1 /)) 158 637 DEALLOCATE(field_val2d) 159 638 ELSE IF (field(ind)%ndim==3) THEN … … 169 648 ENDDO 170 649 ENDDO 171 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ ncell,1,FieldIndex(Index) /), & 172 count=(/n,size(field(1)%rval3d,2),1 /)) 650 ! DO l=1,size(field(ind)%rval3d,2) 651 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ displ+ncell,1,FieldIndex(Index) /), & 652 count=(/n,size(field(ind)%rval3d,2),1 /)) 653 ! ENDDO 173 654 DEALLOCATE(field_val3d) 174 655 ELSE IF (field(1)%ndim==4) THEN … … 186 667 ENDIF 187 668 ENDDO 188 ENDDO 189 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ ncell,1,FieldIndex(Index) /), & 190 count=(/n,size(field(1)%rval4d,2),1 /)) 669 ENDDO 670 ! DO l=1,size(field(ind)%rval4d,2) 671 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d(:,l),start=(/ displ+ncell,l,FieldIndex(Index) /), & 672 count=(/n,size(field(ind)%rval4d,2),1 /)) 673 ! ENDDO 191 674 DEALLOCATE(field_val3d) 192 675 ENDDO … … 219 702 ENDDO 220 703 704 displ=FieldVarId(index)%displ 705 221 706 IF (field(ind)%ndim==2) THEN 222 707 ALLOCATE(Field_val2d(n)) … … 240 725 241 726 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1), & 242 Field_val2d,start=(/ ncell,FieldIndex(Index) /),count=(/n,1 /))727 Field_val2d,start=(/ displ+ncell,FieldIndex(Index) /),count=(/n,1 /)) 243 728 DEALLOCATE(field_val2d) 244 729 … … 261 746 ENDDO 262 747 ENDDO 263 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ ncell,1,FieldIndex(Index) /), & 264 count=(/n,size(field(1)%rval3d,2),1 /)) 748 ! DO l=1,size(field(ind)%rval3d,2) 749 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ displ+ncell,1,FieldIndex(Index) /), & 750 count=(/n,size(field(ind)%rval3d,2),1 /)) 751 ! ENDDO 265 752 DEALLOCATE(field_val3d) 266 753 ELSE IF (field(1)%ndim==4) THEN … … 285 772 ENDDO 286 773 287 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ ncell,1,1,FieldIndex(Index) /), & 288 count=(/n,size(field(1)%rval4d,2),1 /)) 774 ! DO l=1,size(field(ind)%rval4d,2) 775 776 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ displ+ncell,1,FieldIndex(Index) /), & 777 count=(/n,size(field(ind)%rval4d,2),1 /)) 778 ! ENDDO 289 779 DEALLOCATE(field_val3d) 290 780 ENDDO … … 299 789 status=NF90_SYNC(FieldId(Index)) 300 790 301 END SUBROUTINE Writefield 302 791 END SUBROUTINE Writefield_mpi 792 793 303 794 304 SUBROUTINE Create_header(name,field,nind) 305 USE netcdf 795 ! SUBROUTINE Create_header(name,field,nind) 796 ! USE netcdf 797 ! USE field_mod 798 ! USE domain_mod 799 ! USE spherical_geom_mod 800 ! USE dimensions 801 ! USE geometry 802 ! IMPLICIT NONE 803 ! CHARACTER(LEN=*) :: name 804 ! TYPE(t_field),POINTER :: field(:) 805 ! INTEGER,OPTIONAL,INTENT(IN) :: nind 806 ! INTEGER :: ncell 807 ! INTEGER :: nvert 808 ! REAL(rstd),ALLOCATABLE :: lon(:),lat(:),bounds_lon(:,:),bounds_lat(:,:) 809 ! TYPE(t_domain),POINTER :: d 810 ! INTEGER :: nvertId,ncid,lonId,latId,bounds_lonId,bounds_latId,timeId,ncellId 811 ! INTEGER :: dim3id,dim4id 812 ! INTEGER :: status 813 ! INTEGER :: ind,i,j,k,n,q 814 ! INTEGER :: iie,jje,iin,jjn 815 ! INTEGER :: ind_b,ind_e 816 ! INTEGER :: halo_size 817 ! LOGICAL :: single 818 ! INTEGER :: nij 819 ! 820 ! NbField=NbField+1 821 ! FieldName(NbField)=TRIM(ADJUSTL(name)) 822 ! FieldIndex(NbField)=1 823 ! 824 ! IF (PRESENT(nind)) THEN 825 ! ind_b=nind 826 ! ind_e=nind 827 ! halo_size=1 828 ! single=.TRUE. 829 ! ELSE 830 ! ind_b=1 831 ! ind_e=ndomain 832 ! halo_size=0 833 ! single=.FALSE. 834 ! ENDIF 835 ! 836 ! ncell=0 837 ! 838 ! IF (Field(ind_b)%field_type==field_T) THEN 839 ! nvert=6 840 ! 841 ! DO ind=ind_b,ind_e 842 ! d=>domain(ind) 843 ! 844 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 845 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 846 ! IF (single .OR. domain(ind)%own(i,j)) ncell=ncell+1 847 ! ENDDO 848 ! ENDDO 849 850 ! END DO 851 ! 852 ! status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 853 ! FieldId(NbField)=ncid 854 ! status = NF90_DEF_DIM(ncid,'cell',ncell,ncellId) 855 ! status = NF90_DEF_DIM(ncid,'nvert',nvert,nvertid) 856 857 ! IF (Field(ind_b)%ndim==2) THEN 858 ! FieldVarId(NbField)%size=1 859 ! ALLOCATE(FieldVarId(NbField)%nc_id(1)) 860 ! ELSE IF (Field(ind_b)%ndim==3) THEN 861 ! FieldVarId(NbField)%size=1 862 ! ALLOCATE(FieldVarId(NbField)%nc_id(1)) 863 ! status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval3d,2),dim3id) 864 ! ELSE IF (Field(1)%ndim==4) THEN 865 ! FieldVarId(NbField)%size=size(field(ind_b)%rval4d,3) 866 ! ALLOCATE(FieldVarId(NbField)%nc_id(FieldVarId(NbField)%size)) 867 ! status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval4d,2),dim3id) 868 ! status = NF90_DEF_DIM(ncid,'Q',size(field(ind_b)%rval4d,3),dim4id) 869 ! ENDIF 870 ! 871 ! status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeId) 872 ! 873 ! status = NF90_DEF_VAR(ncid,'lon',NF90_DOUBLE,(/ ncellId /),lonId) 874 ! status = NF90_PUT_ATT(ncid,lonId,"long_name","longitude") 875 ! status = NF90_PUT_ATT(ncid,lonId,"units","degrees_east") 876 ! status = NF90_PUT_ATT(ncid,lonId,"bounds","bounds_lon") 877 ! status = NF90_DEF_VAR(ncid,'lat',NF90_DOUBLE,(/ ncellId /),latId) 878 ! status = NF90_PUT_ATT(ncid,latId,"long_name","latitude") 879 ! status = NF90_PUT_ATT(ncid,latId,"units","degrees_north") 880 ! status = NF90_PUT_ATT(ncid,latId,"bounds","bounds_lat") 881 ! status = NF90_DEF_VAR(ncid,'bounds_lon',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_lonId) 882 ! status = NF90_DEF_VAR(ncid,'bounds_lat',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_latId) 883 884 ! IF (Field(ind_b)%ndim==2) THEN 885 ! status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 886 ! status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 887 ! ELSE IF (Field(ind_b)%ndim==3) THEN 888 ! status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 889 ! status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 890 ! ELSE IF (Field(ind_b)%ndim==4) THEN 891 ! DO i=1,FieldVarId(NbField)%size 892 ! status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name))//int2str(i),NF90_DOUBLE,(/ ncellId,dim3id,timeId /), & 893 ! FieldVarId(NbField)%nc_id(i)) 894 ! status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(i),"coordinates","lon lat") 895 ! ENDDO 896 ! ENDIF 897 ! 898 ! 899 ! status = NF90_ENDDEF(ncid) 900 901 ! ncell=1 902 ! DO ind=ind_b,ind_e 903 ! d=>domain(ind) 904 ! 905 ! n=0 906 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 907 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 908 ! IF (single .OR. d%own(i,j)) n=n+1 909 ! ENDDO 910 ! ENDDO 911 ! 912 ! ALLOCATE(lon(n),lat(n),bounds_lon(0:nvert-1,n),bounds_lat(0:nvert-1,n)) 913 ! 914 ! n=0 915 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 916 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 917 ! IF (d%own(i,j) .OR. single) THEN 918 ! n=n+1 919 ! CALL xyz2lonlat(d%xyz(:,i,j),lon(n),lat(n)) 920 ! lon(n)=lon(n)*180/Pi 921 ! lat(n)=lat(n)*180/Pi 922 ! DO k=0,5 923 ! CALL xyz2lonlat(d%vertex(:,k,i,j),bounds_lon(k,n), bounds_lat(k,n)) 924 ! bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 925 ! bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 926 ! ENDDO 927 ! ENDIF 928 ! ENDDO 929 ! ENDDO 930 ! status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ ncell /),count=(/ n /)) 931 ! status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ ncell /),count=(/ n /)) 932 ! status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1,ncell /),count=(/ nvert,n /)) 933 ! status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,ncell /),count=(/ nvert,n /)) 934 ! 935 ! ncell=ncell+n 936 ! DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 937 ! END DO 938 939 ! ELSE IF (Field(ind_b)%field_type==field_Z) THEN 940 ! nvert=3 941 ! DO ind=ind_b,ind_e 942 ! d=>domain(ind) 943 ! 944 ! DO j=d%jj_begin+1,d%jj_end 945 ! DO i=d%ii_begin,d%ii_end-1 946 ! ncell=ncell+1 947 ! ENDDO 948 ! ENDDO 949 950 ! DO j=d%jj_begin,d%jj_end-1 951 ! DO i=d%ii_begin+1,d%ii_end 952 ! ncell=ncell+1 953 ! ENDDO 954 ! ENDDO 955 956 ! END DO 957 ! 958 ! status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 959 ! FieldId(NbField)=ncid 960 ! status = NF90_DEF_DIM(ncid,'cell',ncell,ncellId) 961 ! status = NF90_DEF_DIM(ncid,'nvert',nvert,nvertid) 962 963 ! IF (Field(ind_b)%ndim==2) THEN 964 ! FieldVarId(NbField)%size=1 965 ! ALLOCATE(FieldVarId(NbField)%nc_id(1)) 966 ! ELSE IF (Field(ind_b)%ndim==3) THEN 967 ! FieldVarId(NbField)%size=1 968 ! ALLOCATE(FieldVarId(NbField)%nc_id(1)) 969 ! status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval3d,2),dim3id) 970 ! ELSE IF (Field(1)%ndim==4) THEN 971 ! FieldVarId(NbField)%size=size(field(ind_b)%rval4d,3) 972 ! ALLOCATE(FieldVarId(NbField)%nc_id(FieldVarId(NbField)%size)) 973 ! status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval4d,2),dim3id) 974 ! ENDIF 975 976 977 ! 978 ! status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeId) 979 ! 980 ! status = NF90_DEF_VAR(ncid,'lon',NF90_DOUBLE,(/ ncellId /),lonId) 981 ! status = NF90_PUT_ATT(ncid,lonId,"long_name","longitude") 982 ! status = NF90_PUT_ATT(ncid,lonId,"units","degrees_east") 983 ! status = NF90_PUT_ATT(ncid,lonId,"bounds","bounds_lon") 984 ! status = NF90_DEF_VAR(ncid,'lat',NF90_DOUBLE,(/ ncellId /),latId) 985 ! status = NF90_PUT_ATT(ncid,latId,"long_name","latitude") 986 ! status = NF90_PUT_ATT(ncid,latId,"units","degrees_north") 987 ! status = NF90_PUT_ATT(ncid,latId,"bounds","bounds_lat") 988 ! status = NF90_DEF_VAR(ncid,'bounds_lon',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_lonId) 989 ! status = NF90_DEF_VAR(ncid,'bounds_lat',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_latId) 990 991 992 ! IF (Field(ind_b)%ndim==2) THEN 993 ! status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 994 ! status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 995 ! ELSE IF (Field(ind_b)%ndim==3) THEN 996 ! status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 997 ! status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 998 ! ELSE IF (Field(ind_b)%ndim==4) THEN 999 ! DO q=1,FieldVarId(NbField)%size 1000 ! status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)//int2str(q)),NF90_DOUBLE, & 1001 ! (/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(q)) 1002 ! status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(q),"coordinates","lon lat") 1003 ! ENDDO 1004 ! ENDIF 1005 ! 1006 ! status = NF90_ENDDEF(ncid) 1007 1008 ! ncell=1 1009 ! DO ind=ind_b,ind_e 1010 ! d=>domain(ind) 1011 ! CALL swap_geometry(ind) 1012 ! CALL swap_dimensions(ind) 1013 ! 1014 ! n=0 1015 ! DO j=jj_begin+1,jj_end 1016 ! DO i=ii_begin,ii_end-1 1017 ! n=n+1 1018 ! ENDDO 1019 ! ENDDO 1020 1021 ! DO j=jj_begin,jj_end-1 1022 ! DO i=ii_begin+1,ii_end 1023 ! n=n+1 1024 ! ENDDO 1025 ! ENDDO 1026 1027 ! ALLOCATE(lon(n),lat(n),bounds_lon(0:nvert-1,n),bounds_lat(0:nvert-1,n)) 1028 ! 1029 ! n=0 1030 ! 1031 ! DO j=jj_begin+1,jj_end 1032 ! DO i=ii_begin,ii_end-1 1033 ! nij=(j-1)*iim+i 1034 ! n=n+1 1035 ! CALL xyz2lonlat(xyz_v(nij+z_down,:)/radius,lon(n),lat(n)) 1036 ! lon(n)=lon(n)*180/Pi 1037 !! IF (lon(n)<0) lon(n)=lon(n)+360 1038 ! lat(n)=lat(n)*180/Pi 1039 ! CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 1040 ! CALL xyz2lonlat(xyz_i(nij+t_ldown,:)/radius,bounds_lon(1,n), bounds_lat(1,n)) 1041 ! CALL xyz2lonlat(xyz_i(nij+t_rdown,:)/radius,bounds_lon(2,n), bounds_lat(2,n)) 1042 1043 ! DO k=0,2 1044 ! bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1045 ! bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1046 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 1047 ! ENDDO 1048 ! ENDDO 1049 ! ENDDO 1050 1051 ! DO j=jj_begin,jj_end-1 1052 ! DO i=ii_begin+1,ii_end 1053 ! nij=(j-1)*iim+i 1054 ! n=n+1 1055 ! CALL xyz2lonlat(xyz_v(nij+z_up,:)/radius,lon(n),lat(n)) 1056 ! lon(n)=lon(n)*180/Pi 1057 ! IF (lon(n)<0) lon(n)=lon(n)+360 1058 ! lat(n)=lat(n)*180/Pi 1059 ! CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 1060 ! CALL xyz2lonlat(xyz_i(nij+t_rup,:)/radius,bounds_lon(1,n), bounds_lat(1,n)) 1061 ! CALL xyz2lonlat(xyz_i(nij+t_lup,:)/radius,bounds_lon(2,n), bounds_lat(2,n)) 1062 1063 ! DO k=0,2 1064 ! bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1065 ! bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1066 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 1067 ! ENDDO 1068 ! ENDDO 1069 ! ENDDO 1070 ! 1071 ! 1072 ! status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ ncell /),count=(/ n /)) 1073 ! status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ ncell /),count=(/ n /)) 1074 ! status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1,ncell /),count=(/ nvert,n /)) 1075 ! status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,ncell /),count=(/ nvert,n /)) 1076 ! 1077 ! ncell=ncell+n 1078 ! DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 1079 ! END DO 1080 ! ENDIF 1081 1082 1083 ! 1084 ! status = NF90_CLOSE(ncid) 1085 1086 ! END SUBROUTINE Create_Header 1087 1088 1089 1090 1091 SUBROUTINE Create_header_gen(name_in,field,domain_type,ind_b_in,ind_e_in) 1092 USE netcdf_mod 1093 USE field_mod 1094 USE domain_mod 1095 USE metric 1096 USE spherical_geom_mod 1097 ! USE dimensions 1098 ! USE geometry 1099 IMPLICIT NONE 1100 CHARACTER(LEN=*),INTENT(IN) :: name_in 1101 TYPE(t_field),POINTER :: field(:) 1102 TYPE(t_domain),INTENT(IN),TARGET :: domain_type(:) 1103 INTEGER,OPTIONAL,INTENT(IN) :: ind_b_in 1104 INTEGER,OPTIONAL,INTENT(IN) :: ind_e_in 1105 INTEGER :: ncell 1106 INTEGER :: nvert 1107 REAL(rstd),ALLOCATABLE :: lon(:),lat(:),bounds_lon(:,:),bounds_lat(:,:) 1108 TYPE(t_domain),POINTER :: d 1109 INTEGER :: nvertId,ncid,lonId,latId,bounds_lonId,bounds_latId,timeId,ncellId 1110 INTEGER :: dim3id,dim4id 1111 INTEGER :: status 1112 INTEGER :: ind,i,j,k,n,q 1113 INTEGER :: iie,jje,iin,jjn 1114 INTEGER :: ind_b,ind_e 1115 INTEGER :: halo_size 1116 LOGICAL :: single 1117 INTEGER :: nij 1118 CHARACTER(LEN=255) :: name 1119 1120 1121 name=TRIM(ADJUSTL(name_in)) 1122 1123 IF (PRESENT(ind_b_in) .AND. .NOT. PRESENT(ind_e_in)) THEN 1124 name=TRIM(name)//"_"//TRIM(int2str(ind_b)) 1125 ind_b=ind_b_in 1126 ind_e=ind_b_in 1127 halo_size=1 1128 single=.TRUE. 1129 ELSE IF (.NOT. PRESENT(ind_b_in) .AND. PRESENT(ind_e_in)) THEN 1130 name=TRIM(name)//"_"//TRIM(int2str(ind_e)) 1131 ind_b=ind_e_in 1132 ind_e=ind_e_in 1133 halo_size=1 1134 single=.TRUE. 1135 ELSE IF ( PRESENT(ind_b_in) .AND. PRESENT(ind_e_in)) THEN 1136 ind_b=ind_b_in 1137 ind_e=ind_e_in 1138 halo_size=0 1139 single=.FALSE. 1140 ELSE 1141 halo_size=0 1142 ind_b=1 1143 ind_e=ndomain 1144 single=.FALSE. 1145 ENDIF 1146 1147 NbField=NbField+1 1148 FieldName(NbField)=TRIM(ADJUSTL(name)) 1149 FieldIndex(NbField)=1 1150 1151 ncell=0 1152 1153 IF (Field(ind_b)%field_type==field_T) THEN 1154 nvert=6 1155 1156 DO ind=ind_b,ind_e 1157 d=>domain_type(ind) 1158 1159 DO j=d%jj_begin-halo_size,d%jj_end+halo_size 1160 DO i=d%ii_begin-halo_size,d%ii_end+halo_size 1161 IF (single .OR. d%assign_domain(i,j)==ind) ncell=ncell+1 1162 ENDDO 1163 ENDDO 1164 1165 END DO 1166 1167 status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 1168 FieldId(NbField)=ncid 1169 status = NF90_DEF_DIM(ncid,'cell',ncell,ncellId) 1170 status = NF90_DEF_DIM(ncid,'nvert',nvert,nvertid) 1171 1172 IF (Field(ind_b)%ndim==2) THEN 1173 FieldVarId(NbField)%size=1 1174 ALLOCATE(FieldVarId(NbField)%nc_id(1)) 1175 ELSE IF (Field(ind_b)%ndim==3) THEN 1176 FieldVarId(NbField)%size=1 1177 ALLOCATE(FieldVarId(NbField)%nc_id(1)) 1178 status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval3d,2),dim3id) 1179 ELSE IF (Field(1)%ndim==4) THEN 1180 FieldVarId(NbField)%size=size(field(ind_b)%rval4d,3) 1181 ALLOCATE(FieldVarId(NbField)%nc_id(FieldVarId(NbField)%size)) 1182 status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval4d,2),dim3id) 1183 ! status = NF90_DEF_DIM(ncid,'Q',size(field(ind_b)%rval4d,3),dim4id) 1184 ENDIF 1185 1186 status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeId) 1187 1188 status = NF90_DEF_VAR(ncid,'lon',NF90_DOUBLE,(/ ncellId /),lonId) 1189 status = NF90_PUT_ATT(ncid,lonId,"long_name","longitude") 1190 status = NF90_PUT_ATT(ncid,lonId,"units","degrees_east") 1191 status = NF90_PUT_ATT(ncid,lonId,"bounds","bounds_lon") 1192 status = NF90_DEF_VAR(ncid,'lat',NF90_DOUBLE,(/ ncellId /),latId) 1193 status = NF90_PUT_ATT(ncid,latId,"long_name","latitude") 1194 status = NF90_PUT_ATT(ncid,latId,"units","degrees_north") 1195 status = NF90_PUT_ATT(ncid,latId,"bounds","bounds_lat") 1196 status = NF90_DEF_VAR(ncid,'bounds_lon',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_lonId) 1197 status = NF90_DEF_VAR(ncid,'bounds_lat',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_latId) 1198 1199 IF (Field(ind_b)%ndim==2) THEN 1200 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 1201 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1202 ELSE IF (Field(ind_b)%ndim==3) THEN 1203 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 1204 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1205 ELSE IF (Field(ind_b)%ndim==4) THEN 1206 DO i=1,FieldVarId(NbField)%size 1207 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name))//int2str(i),NF90_DOUBLE,(/ ncellId,dim3id,timeId /), & 1208 FieldVarId(NbField)%nc_id(i)) 1209 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(i),"coordinates","lon lat") 1210 ENDDO 1211 ENDIF 1212 1213 1214 status = NF90_ENDDEF(ncid) 1215 1216 ! ncell=1 1217 ! DO ind=ind_b,ind_e 1218 ! d=>domain_type(ind) 1219 1220 ! n=0 1221 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 1222 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 1223 ! IF (single .OR. d%assign_domain(i,j)==ind) n=n+1 1224 ! ENDDO 1225 ! ENDDO 1226 1227 ALLOCATE(lon(ncell),lat(ncell),bounds_lon(0:nvert-1,ncell),bounds_lat(0:nvert-1,ncell)) 1228 1229 n=0 1230 DO ind=ind_b,ind_e 1231 d=>domain_type(ind) 1232 DO j=d%jj_begin-halo_size,d%jj_end+halo_size 1233 DO i=d%ii_begin-halo_size,d%ii_end+halo_size 1234 IF (d%assign_domain(i,j)==ind .OR. single) THEN 1235 n=n+1 1236 CALL xyz2lonlat(d%xyz(:,i,j),lon(n),lat(n)) 1237 lon(n)=lon(n)*180/Pi 1238 lat(n)=lat(n)*180/Pi 1239 DO k=0,5 1240 CALL xyz2lonlat(d%vertex(:,k,i,j),bounds_lon(k,n), bounds_lat(k,n)) 1241 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1242 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1243 ENDDO 1244 ENDIF 1245 ENDDO 1246 ENDDO 1247 ENDDO 1248 status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ 1 /),count=(/ ncell /)) 1249 status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ 1 /),count=(/ ncell /)) 1250 status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 1251 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 1252 1253 ! ncell=ncell+n 1254 DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 1255 ! END DO 1256 1257 ELSE IF (Field(ind_b)%field_type==field_Z) THEN 1258 nvert=3 1259 DO ind=ind_b,ind_e 1260 d=>domain_type(ind) 1261 1262 DO j=d%jj_begin+1,d%jj_end 1263 DO i=d%ii_begin,d%ii_end-1 1264 ncell=ncell+1 1265 ENDDO 1266 ENDDO 1267 1268 DO j=d%jj_begin,d%jj_end-1 1269 DO i=d%ii_begin+1,d%ii_end 1270 ncell=ncell+1 1271 ENDDO 1272 ENDDO 1273 1274 END DO 1275 1276 status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 1277 FieldId(NbField)=ncid 1278 status = NF90_DEF_DIM(ncid,'cell',ncell,ncellId) 1279 status = NF90_DEF_DIM(ncid,'nvert',nvert,nvertid) 1280 1281 IF (Field(ind_b)%ndim==2) THEN 1282 FieldVarId(NbField)%size=1 1283 ALLOCATE(FieldVarId(NbField)%nc_id(1)) 1284 ELSE IF (Field(ind_b)%ndim==3) THEN 1285 FieldVarId(NbField)%size=1 1286 ALLOCATE(FieldVarId(NbField)%nc_id(1)) 1287 status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval3d,2),dim3id) 1288 ELSE IF (Field(1)%ndim==4) THEN 1289 FieldVarId(NbField)%size=size(field(ind_b)%rval4d,3) 1290 ALLOCATE(FieldVarId(NbField)%nc_id(FieldVarId(NbField)%size)) 1291 status = NF90_DEF_DIM(ncid,'Z',size(field(ind_b)%rval4d,2),dim3id) 1292 ENDIF 1293 1294 1295 1296 status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeId) 1297 1298 status = NF90_DEF_VAR(ncid,'lon',NF90_DOUBLE,(/ ncellId /),lonId) 1299 status = NF90_PUT_ATT(ncid,lonId,"long_name","longitude") 1300 status = NF90_PUT_ATT(ncid,lonId,"units","degrees_east") 1301 status = NF90_PUT_ATT(ncid,lonId,"bounds","bounds_lon") 1302 status = NF90_DEF_VAR(ncid,'lat',NF90_DOUBLE,(/ ncellId /),latId) 1303 status = NF90_PUT_ATT(ncid,latId,"long_name","latitude") 1304 status = NF90_PUT_ATT(ncid,latId,"units","degrees_north") 1305 status = NF90_PUT_ATT(ncid,latId,"bounds","bounds_lat") 1306 status = NF90_DEF_VAR(ncid,'bounds_lon',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_lonId) 1307 status = NF90_DEF_VAR(ncid,'bounds_lat',NF90_DOUBLE,(/ nvertid,ncellId /),bounds_latId) 1308 1309 1310 IF (Field(ind_b)%ndim==2) THEN 1311 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 1312 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1313 ELSE IF (Field(ind_b)%ndim==3) THEN 1314 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 1315 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1316 ELSE IF (Field(ind_b)%ndim==4) THEN 1317 DO q=1,FieldVarId(NbField)%size 1318 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)//int2str(q)),NF90_DOUBLE, & 1319 (/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(q)) 1320 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(q),"coordinates","lon lat") 1321 ENDDO 1322 ENDIF 1323 1324 status = NF90_ENDDEF(ncid) 1325 1326 ! ncell=1 1327 ! DO ind=ind_b,ind_e 1328 ! d=>domain_type(ind) 1329 ! 1330 ! n=0 1331 ! DO j=d%jj_begin+1,d%jj_end 1332 ! DO i=d%ii_begin,d%ii_end-1 1333 ! n=n+1 1334 ! ENDDO 1335 ! ENDDO 1336 ! 1337 ! DO j=d%jj_begin,d%jj_end-1 1338 ! DO i=d%ii_begin+1,d%ii_end 1339 ! n=n+1 1340 ! ENDDO 1341 ! ENDDO 1342 1343 ! ALLOCATE(lon(n),lat(n),bounds_lon(0:nvert-1,n),bounds_lat(0:nvert-1,n)) 1344 ALLOCATE(lon(ncell),lat(ncell),bounds_lon(0:nvert-1,ncell),bounds_lat(0:nvert-1,ncell)) 1345 1346 n=0 1347 1348 DO ind=ind_b,ind_e 1349 d=>domain_type(ind) 1350 DO j=d%jj_begin+1,d%jj_end 1351 DO i=d%ii_begin,d%ii_end-1 1352 nij=(j-1)*d%iim+i 1353 n=n+1 1354 CALL xyz2lonlat(d%vertex(:,vdown,i,j),lon(n),lat(n)) 1355 lon(n)=lon(n)*180/Pi 1356 ! IF (lon(n)<0) lon(n)=lon(n)+360 1357 lat(n)=lat(n)*180/Pi 1358 ! CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 1359 ! CALL xyz2lonlat(xyz_i(nij+t_ldown,:)/radius,bounds_lon(1,n), bounds_lat(1,n)) 1360 ! CALL xyz2lonlat(xyz_i(nij+t_rdown,:)/radius,bounds_lon(2,n), bounds_lat(2,n)) 1361 1362 CALL xyz2lonlat(d%xyz(:,i,j),bounds_lon(0,n), bounds_lat(0,n)) 1363 CALL xyz2lonlat(d%xyz(:,i,j-1),bounds_lon(1,n), bounds_lat(1,n)) 1364 CALL xyz2lonlat(d%xyz(:,i+1,j-1),bounds_lon(2,n), bounds_lat(2,n)) 1365 1366 DO k=0,2 1367 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1368 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1369 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 1370 ENDDO 1371 ENDDO 1372 ENDDO 1373 1374 DO j=d%jj_begin,d%jj_end-1 1375 DO i=d%ii_begin+1,d%ii_end 1376 nij=(j-1)*d%iim+i 1377 n=n+1 1378 ! CALL xyz2lonlat(xyz_v(nij+z_up,:)/radius,lon(n),lat(n)) 1379 CALL xyz2lonlat(d%vertex(:,vup,i,j),lon(n),lat(n)) 1380 lon(n)=lon(n)*180/Pi 1381 ! IF (lon(n)<0) lon(n)=lon(n)+360 1382 lat(n)=lat(n)*180/Pi 1383 ! CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 1384 ! CALL xyz2lonlat(xyz_i(nij+t_rup,:)/radius,bounds_lon(1,n), bounds_lat(1,n)) 1385 ! CALL xyz2lonlat(xyz_i(nij+t_lup,:)/radius,bounds_lon(2,n), bounds_lat(2,n)) 1386 CALL xyz2lonlat(d%xyz(:,i,j),bounds_lon(0,n), bounds_lat(0,n)) 1387 CALL xyz2lonlat(d%xyz(:,i,j+1),bounds_lon(1,n), bounds_lat(1,n)) 1388 CALL xyz2lonlat(d%xyz(:,i-1,j+1),bounds_lon(2,n), bounds_lat(2,n)) 1389 1390 DO k=0,2 1391 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1392 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1393 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 1394 ENDDO 1395 ENDDO 1396 ENDDO 1397 ENDDO 1398 1399 status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ 1 /),count=(/ ncell /)) 1400 status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ 1 /),count=(/ ncell /)) 1401 status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 1402 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 1403 1404 ! ncell=ncell+n 1405 DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 1406 ! END DO 1407 ENDIF 1408 1409 1410 1411 ! status = NF90_CLOSE(ncid) 1412 1413 END SUBROUTINE Create_Header_gen 1414 1415 SUBROUTINE Create_header_mpi(name,field,nind) 1416 USE netcdf_mod 306 1417 USE field_mod 307 1418 USE domain_mod … … 309 1420 USE dimensions 310 1421 USE geometry 1422 USE mpi_mod 1423 USE mpipara 311 1424 IMPLICIT NONE 312 1425 CHARACTER(LEN=*) :: name … … 326 1439 LOGICAL :: single 327 1440 INTEGER :: nij 1441 INTEGER :: ncell_glo(0:mpi_size-1) 1442 INTEGER :: displ, ncell_tot 1443 328 1444 329 1445 NbField=NbField+1 … … 359 1475 END DO 360 1476 361 status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 1477 CALL MPI_ALLGATHER(ncell,1,MPI_INTEGER,ncell_glo,1,MPI_INTEGER,comm_icosa,ierr) 1478 1479 displ=0 1480 DO i=1,mpi_rank 1481 displ=displ+ncell_glo(i-1) 1482 ENDDO 1483 FieldVarId(NbField)%displ=displ 1484 ncell_tot=sum(ncell_glo(:)) 1485 1486 status = NF90_CREATE_PAR(TRIM(ADJUSTL(name))//'.nc', IOR(NF90_NETCDF4, NF90_MPIIO), comm_icosa, MPI_INFO_NULL, ncid) 362 1487 FieldId(NbField)=ncid 363 status = NF90_DEF_DIM(ncid,'cell',ncell ,ncellId)1488 status = NF90_DEF_DIM(ncid,'cell',ncell_tot,ncellId) 364 1489 status = NF90_DEF_DIM(ncid,'nvert',nvert,nvertid) 365 1490 … … 394 1519 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 395 1520 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1521 status = NF90_DEF_VAR_CHUNKING(ncid, FieldVarId(NbField)%nc_id(1), NF90_CHUNKED, (/ncell_tot,1/)) 396 1522 ELSE IF (Field(ind_b)%ndim==3) THEN 397 1523 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 398 1524 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1525 status = NF90_DEF_VAR_CHUNKING(ncid, FieldVarId(NbField)%nc_id(1), NF90_CHUNKED, (/ncell_tot,size(field(ind_b)%rval3d,2),1/)) 399 1526 ELSE IF (Field(ind_b)%ndim==4) THEN 400 1527 DO i=1,FieldVarId(NbField)%size … … 402 1529 FieldVarId(NbField)%nc_id(i)) 403 1530 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(i),"coordinates","lon lat") 1531 status = NF90_DEF_VAR_CHUNKING(ncid, FieldVarId(NbField)%nc_id(q), NF90_CHUNKED, (/ncell_tot,size(field(ind_b)%rval4d,2),1/)) 404 1532 ENDDO 405 1533 ENDIF … … 437 1565 ENDDO 438 1566 ENDDO 439 status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ ncell /),count=(/ n /))440 status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ ncell /),count=(/ n /))441 status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1, ncell /),count=(/ nvert,n /))442 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1, ncell /),count=(/ nvert,n /))1567 status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ displ+ncell /),count=(/ n /)) 1568 status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ displ+ncell /),count=(/ n /)) 1569 status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1,displ+ncell /),count=(/ nvert,n /)) 1570 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,displ+ncell /),count=(/ nvert,n /)) 443 1571 444 1572 ncell=ncell+n … … 464 1592 465 1593 END DO 466 467 status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 1594 1595 CALL MPI_ALLGATHER(ncell,1,MPI_INTEGER,ncell_glo,1,MPI_INTEGER,comm_icosa,ierr) 1596 1597 displ=0 1598 DO i=1,mpi_rank 1599 displ=displ+ncell_glo(i-1) 1600 ENDDO 1601 FieldVarId(NbField)%displ=displ 1602 ncell_tot=sum(ncell_glo(:)) 1603 1604 status = NF90_CREATE_PAR(TRIM(ADJUSTL(name))//'.nc',IOR(NF90_NETCDF4, NF90_MPIIO), comm_icosa, MPI_INFO_NULL, ncid) 1605 ! status = NF90_CREATE(TRIM(ADJUSTL(name))//'.nc', NF90_CLOBBER, ncid) 468 1606 FieldId(NbField)=ncid 469 status = NF90_DEF_DIM(ncid,'cell',ncell ,ncellId)1607 status = NF90_DEF_DIM(ncid,'cell',ncell_tot,ncellId) 470 1608 status = NF90_DEF_DIM(ncid,'nvert',nvert,nvertid) 471 1609 … … 502 1640 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 503 1641 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1642 status = NF90_DEF_VAR_CHUNKING(ncid, FieldVarId(NbField)%nc_id(1), NF90_CHUNKED, (/ncell_tot,1/)) 504 1643 ELSE IF (Field(ind_b)%ndim==3) THEN 505 1644 status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),NF90_DOUBLE,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 506 1645 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon lat") 1646 status = NF90_DEF_VAR_CHUNKING(ncid, FieldVarId(NbField)%nc_id(1), NF90_CHUNKED, (/ncell_tot,size(field(ind_b)%rval3d,2),1/)) 507 1647 ELSE IF (Field(ind_b)%ndim==4) THEN 508 1648 DO q=1,FieldVarId(NbField)%size … … 510 1650 (/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(q)) 511 1651 status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(q),"coordinates","lon lat") 1652 status = NF90_DEF_VAR_CHUNKING(ncid, FieldVarId(NbField)%nc_id(q), NF90_CHUNKED, (/ncell_tot,size(field(ind_b)%rval4d,2),1/)) 512 1653 ENDDO 513 1654 ENDIF … … 579 1720 580 1721 581 status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ ncell /),count=(/ n /))582 status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ ncell /),count=(/ n /))583 status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1, ncell /),count=(/ nvert,n /))584 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1, ncell /),count=(/ nvert,n /))1722 status=NF90_PUT_VAR(ncid,lonid,REAL(lon,r8),start=(/ displ+ncell /),count=(/ n /)) 1723 status=NF90_PUT_VAR(ncid,latid,REAL(lat,r8),start=(/ displ+ncell /),count=(/ n /)) 1724 status=NF90_PUT_VAR(ncid,bounds_lonId,REAL(bounds_lon,r8),start=(/ 1,displ+ncell /),count=(/ nvert,n /)) 1725 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,displ+ncell /),count=(/ nvert,n /)) 585 1726 586 1727 ncell=ncell+n … … 593 1734 ! status = NF90_CLOSE(ncid) 594 1735 595 end subroutine Create_Header 1736 end subroutine Create_Header_mpi 596 1737 597 1738 SUBROUTINE Close_files 1739 USE netcdf 1740 IMPLICIT NONE 1741 INTEGER :: i,k,status 1742 1743 DO i=1,NbField 1744 status=NF90_CLOSE(FieldId(i)) 1745 ENDDO 1746 END SUBROUTINE Close_files 1747 1748 598 1749 function int2str(int) 599 1750 implicit none
Note: See TracChangeset
for help on using the changeset viewer.