Changeset 3605 for LMDZ6/branches/Ocean_skin/libf/phylmd/iostart.F90
- Timestamp:
- Nov 21, 2019, 4:43:45 PM (4 years ago)
- Location:
- LMDZ6/branches/Ocean_skin
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Ocean_skin
-
LMDZ6/branches/Ocean_skin/libf/phylmd/iostart.F90
r3401 r3605 25 25 26 26 PUBLIC get_field,get_var,put_field,put_var 27 PUBLIC Open_startphy,close_startphy,open_restartphy,close_restartphy 27 PUBLIC Open_startphy,close_startphy,open_restartphy,close_restartphy, enddef_restartphy 28 28 29 29 CONTAINS … … 117 117 USE netcdf 118 118 USE dimphy 119 USE geometry_mod 119 120 USE mod_grid_phy_lmdz 120 121 USE mod_phys_lmdz_para … … 125 126 LOGICAL,OPTIONAL :: found 126 127 127 REAL :: field_glo(klon_glo,field_size) 128 REAL,ALLOCATABLE :: field_glo(:,:) 129 REAL,ALLOCATABLE :: field_glo_tmp(:,:) 130 INTEGER,ALLOCATABLE :: ind_cell_glo_glo(:) 128 131 LOGICAL :: tmp_found 129 132 INTEGER :: varid 130 INTEGER :: ierr 131 132 IF (is_mpi_root .AND. is_omp_root) THEN 133 INTEGER :: ierr,i 134 135 IF (is_master) THEN 136 ALLOCATE(ind_cell_glo_glo(klon_glo)) 137 ALLOCATE(field_glo(klon_glo,field_size)) 138 ALLOCATE(field_glo_tmp(klon_glo,field_size)) 139 ELSE 140 ALLOCATE(ind_cell_glo_glo(0)) 141 ALLOCATE(field_glo(0,0)) 142 ENDIF 143 144 CALL gather(ind_cell_glo,ind_cell_glo_glo) 145 146 IF (is_master) THEN 133 147 134 148 ierr=NF90_INQ_VARID(nid_start,Field_name,varid) 135 149 136 150 IF (ierr==NF90_NOERR) THEN 137 CALL body(field_glo )151 CALL body(field_glo_tmp) 138 152 tmp_found=.TRUE. 139 153 ELSE … … 146 160 147 161 IF (tmp_found) THEN 162 IF (is_master) THEN 163 DO i=1,klon_glo 164 field_glo(i,:)=field_glo_tmp(ind_cell_glo_glo(i),:) 165 ENDDO 166 ENDIF 148 167 CALL scatter(field_glo,field) 149 168 ENDIF … … 307 326 ierr = NF90_DEF_DIM (nid_restart, "horizon_klevp1", klon_glo*klevp1, idim4) 308 327 309 ierr = NF90_ENDDEF(nid_restart)328 ! ierr = NF90_ENDDEF(nid_restart) 310 329 ENDIF 311 330 312 331 END SUBROUTINE open_restartphy 313 332 333 SUBROUTINE enddef_restartphy 334 USE netcdf 335 USE mod_phys_lmdz_para 336 IMPLICIT NONE 337 INTEGER :: ierr 338 339 IF (is_master) ierr = NF90_ENDDEF(nid_restart) 340 341 END SUBROUTINE enddef_restartphy 342 314 343 SUBROUTINE close_restartphy 315 344 USE netcdf … … 318 347 INTEGER :: ierr 319 348 320 IF (is_mpi_root .AND. is_omp_root) THEN 321 ierr = NF90_CLOSE (nid_restart) 322 ENDIF 349 IF (is_master) ierr = NF90_CLOSE (nid_restart) 323 350 324 351 END SUBROUTINE close_restartphy 325 352 326 353 327 SUBROUTINE put_field_r1(field_name,title,field) 328 IMPLICIT NONE 354 SUBROUTINE put_field_r1(pass, field_name,title,field) 355 IMPLICIT NONE 356 INTEGER, INTENT(IN) :: pass 329 357 CHARACTER(LEN=*),INTENT(IN) :: field_name 330 358 CHARACTER(LEN=*),INTENT(IN) :: title 331 359 REAL,INTENT(IN) :: field(:) 332 333 CALL put_field_rgen(field_name,title,field,1) 360 CALL put_field_rgen(pass, field_name,title,field,1) 334 361 335 362 END SUBROUTINE put_field_r1 336 363 337 SUBROUTINE put_field_r2(field_name,title,field) 338 IMPLICIT NONE 364 SUBROUTINE put_field_r2(pass, field_name,title,field) 365 IMPLICIT NONE 366 INTEGER, INTENT(IN) :: pass 339 367 CHARACTER(LEN=*),INTENT(IN) :: field_name 340 368 CHARACTER(LEN=*),INTENT(IN) :: title 341 369 REAL,INTENT(IN) :: field(:,:) 342 370 343 CALL put_field_rgen( field_name,title,field,size(field,2))371 CALL put_field_rgen(pass, field_name,title,field,size(field,2)) 344 372 345 373 END SUBROUTINE put_field_r2 346 374 347 SUBROUTINE put_field_r3(field_name,title,field) 348 IMPLICIT NONE 375 SUBROUTINE put_field_r3(pass, field_name,title,field) 376 IMPLICIT NONE 377 INTEGER, INTENT(IN) :: pass 349 378 CHARACTER(LEN=*),INTENT(IN) :: field_name 350 379 CHARACTER(LEN=*),INTENT(IN) :: title 351 380 REAL,INTENT(IN) :: field(:,:,:) 352 381 353 CALL put_field_rgen( field_name,title,field,size(field,2)*size(field,3))382 CALL put_field_rgen(pass, field_name,title,field,size(field,2)*size(field,3)) 354 383 355 384 END SUBROUTINE put_field_r3 356 385 357 SUBROUTINE put_field_rgen( field_name,title,field,field_size)386 SUBROUTINE put_field_rgen(pass, field_name,title,field,field_size) 358 387 USE netcdf 359 388 USE dimphy 389 USE geometry_mod 360 390 USE mod_grid_phy_lmdz 361 391 USE mod_phys_lmdz_para 362 392 IMPLICIT NONE 393 INTEGER, INTENT(IN) :: pass 363 394 CHARACTER(LEN=*),INTENT(IN) :: field_name 364 395 CHARACTER(LEN=*),INTENT(IN) :: title … … 366 397 REAL,INTENT(IN) :: field(klon,field_size) 367 398 368 REAL :: field_glo(klon_glo,field_size) 369 INTEGER :: ierr 399 ! REAL :: field_glo(klon_glo,field_size) 400 ! REAL :: field_glo_tmp(klon_glo,field_size) 401 REAL ,ALLOCATABLE :: field_glo(:,:) 402 REAL ,ALLOCATABLE :: field_glo_tmp(:,:) 403 INTEGER,ALLOCATABLE :: ind_cell_glo_glo(:) 404 ! INTEGER :: ind_cell_glo_glo(klon_glo) 405 INTEGER :: ierr,i 370 406 INTEGER :: nvarid 371 407 INTEGER :: idim 372 408 373 374 CALL gather(field,field_glo)375 376 IF (is_m pi_root .AND. is_omp_root) THEN409 ! first pass : definition 410 IF (pass==1) THEN 411 412 IF (is_master) THEN 377 413 378 414 IF (field_size==1) THEN … … 387 423 ENDIF 388 424 389 ierr = NF90_REDEF (nid_restart)425 ! ierr = NF90_REDEF (nid_restart) 390 426 #ifdef NC_DOUBLE 391 427 ierr = NF90_DEF_VAR (nid_restart, field_name, NF90_DOUBLE,(/ idim /),nvarid) … … 394 430 #endif 395 431 IF (LEN_TRIM(title) > 0) ierr = NF90_PUT_ATT (nid_restart,nvarid,"title", title) 396 ierr = NF90_ENDDEF(nid_restart) 397 ierr = NF90_PUT_VAR(nid_restart,nvarid,RESHAPE(field_glo,(/klon_glo*field_size/))) 398 ENDIF 399 400 END SUBROUTINE put_field_rgen 401 402 SUBROUTINE put_var_r0(var_name,title,var) 432 ! ierr = NF90_ENDDEF(nid_restart) 433 ENDIF 434 435 ! second pass : write 436 ELSE IF (pass==2) THEN 437 438 IF (is_master) THEN 439 ALLOCATE(ind_cell_glo_glo(klon_glo)) 440 ALLOCATE(field_glo(klon_glo,field_size)) 441 ALLOCATE(field_glo_tmp(klon_glo,field_size)) 442 ELSE 443 ALLOCATE(ind_cell_glo_glo(0)) 444 ALLOCATE(field_glo_tmp(0,0)) 445 ENDIF 446 447 CALL gather(ind_cell_glo,ind_cell_glo_glo) 448 449 CALL gather(field,field_glo_tmp) 450 451 IF (is_master) THEN 452 453 DO i=1,klon_glo 454 field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:) 455 ENDDO 456 457 ierr = NF90_INQ_VARID(nid_restart, field_name, nvarid) 458 ierr = NF90_PUT_VAR(nid_restart,nvarid,RESHAPE(field_glo,(/klon_glo*field_size/))) 459 ENDIF 460 ENDIF 461 462 END SUBROUTINE put_field_rgen 463 464 465 SUBROUTINE put_var_r0(pass, var_name,title,var) 403 466 IMPLICIT NONE 467 INTEGER, INTENT(IN) :: pass 404 468 CHARACTER(LEN=*),INTENT(IN) :: var_name 405 469 CHARACTER(LEN=*),INTENT(IN) :: title … … 409 473 varin(1)=var 410 474 411 CALL put_var_rgen( var_name,title,varin,size(varin))475 CALL put_var_rgen(pass, var_name,title,varin,size(varin)) 412 476 413 477 END SUBROUTINE put_var_r0 414 478 415 479 416 SUBROUTINE put_var_r1( var_name,title,var)480 SUBROUTINE put_var_r1(pass, var_name,title,var) 417 481 IMPLICIT NONE 482 INTEGER, INTENT(IN) :: pass 418 483 CHARACTER(LEN=*),INTENT(IN) :: var_name 419 484 CHARACTER(LEN=*),INTENT(IN) :: title 420 485 REAL,INTENT(IN) :: var(:) 421 486 422 CALL put_var_rgen( var_name,title,var,size(var))487 CALL put_var_rgen(pass, var_name,title,var,size(var)) 423 488 424 489 END SUBROUTINE put_var_r1 425 490 426 SUBROUTINE put_var_r2( var_name,title,var)491 SUBROUTINE put_var_r2(pass, var_name,title,var) 427 492 IMPLICIT NONE 493 INTEGER, INTENT(IN) :: pass 428 494 CHARACTER(LEN=*),INTENT(IN) :: var_name 429 495 CHARACTER(LEN=*),INTENT(IN) :: title 430 496 REAL,INTENT(IN) :: var(:,:) 431 497 432 CALL put_var_rgen( var_name,title,var,size(var))498 CALL put_var_rgen(pass, var_name,title,var,size(var)) 433 499 434 500 END SUBROUTINE put_var_r2 435 501 436 SUBROUTINE put_var_r3( var_name,title,var)502 SUBROUTINE put_var_r3(pass, var_name,title,var) 437 503 IMPLICIT NONE 504 INTEGER, INTENT(IN) :: pass 438 505 CHARACTER(LEN=*),INTENT(IN) :: var_name 439 506 CHARACTER(LEN=*),INTENT(IN) :: title 440 507 REAL,INTENT(IN) :: var(:,:,:) 441 508 442 CALL put_var_rgen( var_name,title,var,size(var))509 CALL put_var_rgen(pass, var_name,title,var,size(var)) 443 510 444 511 END SUBROUTINE put_var_r3 445 512 446 SUBROUTINE put_var_rgen( var_name,title,var,var_size)513 SUBROUTINE put_var_rgen(pass, var_name,title,var,var_size) 447 514 USE netcdf 448 515 USE dimphy 449 516 USE mod_phys_lmdz_para 450 517 IMPLICIT NONE 451 CHARACTER(LEN=*),INTENT(IN) :: var_name 452 CHARACTER(LEN=*),INTENT(IN) :: title 453 INTEGER,INTENT(IN) :: var_size 454 REAL,INTENT(IN) :: var(var_size) 455 456 INTEGER :: ierr 457 INTEGER :: nvarid 518 INTEGER, INTENT(IN) :: pass 519 CHARACTER(LEN=*),INTENT(IN) :: var_name 520 CHARACTER(LEN=*),INTENT(IN) :: title 521 INTEGER,INTENT(IN) :: var_size 522 REAL,INTENT(IN) :: var(var_size) 523 524 INTEGER :: ierr 525 INTEGER :: nvarid 458 526 459 IF (is_m pi_root .AND. is_omp_root) THEN527 IF (is_master) THEN 460 528 461 529 IF (var_size/=length) THEN … … 463 531 call abort_physic("", "", 1) 464 532 ENDIF 465 466 ierr = NF90_REDEF (nid_restart) 533 534 ! first pass : definition 535 IF (pass==1) THEN 536 537 ! ierr = NF90_REDEF (nid_restart) 467 538 468 539 #ifdef NC_DOUBLE 469 ierr = NF90_DEF_VAR (nid_restart, var_name, NF90_DOUBLE,(/ idim1 /),nvarid)540 ierr = NF90_DEF_VAR (nid_restart, var_name, NF90_DOUBLE,(/ idim1 /),nvarid) 470 541 #else 471 ierr = NF90_DEF_VAR (nid_restart, var_name, NF90_FLOAT,(/ idim1 /),nvarid)542 ierr = NF90_DEF_VAR (nid_restart, var_name, NF90_FLOAT,(/ idim1 /),nvarid) 472 543 #endif 473 IF (LEN_TRIM(title)>0) ierr = NF90_PUT_ATT (nid_restart,nvarid,"title", title) 474 ierr = NF90_ENDDEF(nid_restart) 475 476 ierr = NF90_PUT_VAR(nid_restart,nvarid,var) 477 544 IF (LEN_TRIM(title)>0) ierr = NF90_PUT_ATT (nid_restart,nvarid,"title", title) 545 ! ierr = NF90_ENDDEF(nid_restart) 546 547 ! second pass : write 548 ELSE IF (pass==2) THEN 549 ierr = NF90_INQ_VARID(nid_restart, var_name, nvarid) 550 ierr = NF90_PUT_VAR(nid_restart,nvarid,var) 551 ENDIF 478 552 ENDIF 479 553
Note: See TracChangeset
for help on using the changeset viewer.