Changeset 3747 for trunk/LMDZ.GENERIC/libf/phystd
- Timestamp:
- Apr 29, 2025, 4:26:22 PM (2 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/phystd/iostart.F90
r3708 r3747 6 6 ! INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file 7 7 !$OMP THREADPRIVATE(nid_start) 8 8 9 9 ! restartfi.nc file dimension identifiers: (see open_restartphy()) 10 10 INTEGER,SAVE :: idim1 ! "index" dimension … … 24 24 INTEGER,PARAMETER :: ldscrpt = 35 ! size of dscrpt_tab_cntrl array 25 25 INTEGER,PARAMETER :: ndscrpt = 50 ! size of characters in dscrpt_tab_cntrl array 26 26 27 27 INTERFACE get_field 28 28 MODULE PROCEDURE Get_field_r1,Get_field_r2,Get_field_r3 29 29 END INTERFACE get_field 30 30 31 31 INTERFACE get_var 32 32 MODULE PROCEDURE get_var_r0,Get_var_r1,Get_var_r2,Get_var_r3 … … 46 46 PUBLIC inquire_field, inquire_field_ndims 47 47 PUBLIC open_startphy,close_startphy,create_restartphy,open_restartphy,close_restartphy 48 48 49 49 CONTAINS 50 50 … … 65 65 ENDIF 66 66 ENDIF 67 67 68 68 CALL bcast(nid_start) ! tell all procs about nid_start 69 69 70 70 END SUBROUTINE open_startphy 71 71 … … 94 94 INTEGER :: varid 95 95 INTEGER :: ierr 96 96 97 97 IF (is_master) THEN 98 98 ierr=NF90_INQ_VARID(nid_start,Field_name,varid) … … 110 110 111 111 FUNCTION inquire_field_ndims(nid_start,Field_name) 112 ! give the number of dimensions of "Field_name" stored in the input file 112 ! give the number of dimensions of "Field_name" stored in the input file 113 113 USE netcdf, only: nf90_inq_varid, nf90_inquire_variable, & 114 114 NF90_NOERR, nf90_strerror … … 120 120 INTEGER :: varid 121 121 INTEGER :: ierr 122 122 123 123 IF (is_master) THEN 124 124 ierr=nf90_inq_varid(nid_start,Field_name,varid) … … 148 148 INTEGER :: varid 149 149 INTEGER :: ierr 150 150 151 151 IF (is_master) THEN 152 152 ierr=NF90_INQ_DIMID(nid_start,Field_name,varid) … … 173 173 INTEGER :: varid 174 174 INTEGER :: ierr 175 175 176 176 IF (is_master) THEN 177 177 ierr=nf90_inq_dimid(nid_start,Field_name,varid) … … 199 199 CHARACTER(LEN=*),INTENT(IN) :: Field_name 200 200 REAL,INTENT(INOUT) :: Field(:) 201 LOGICAL,INTENT(OUT),OPTIONAL :: found 201 LOGICAL,INTENT(OUT),OPTIONAL :: found 202 202 INTEGER,INTENT(IN),OPTIONAL :: timeindex ! time index of sought data 203 203 … … 216 216 CALL Get_field_rgen(nid_start,field_name,field,1,corners,edges) 217 217 ENDIF 218 218 219 219 END SUBROUTINE Get_Field_r1 220 220 221 221 SUBROUTINE Get_Field_r2(nid_start,field_name,field,found,timeindex) 222 222 ! For a "3D" horizontal-vertical field … … 226 226 CHARACTER(LEN=*),INTENT(IN) :: Field_name 227 227 REAL,INTENT(INOUT) :: Field(:,:) 228 LOGICAL,INTENT(OUT),OPTIONAL :: found 228 LOGICAL,INTENT(OUT),OPTIONAL :: found 229 229 INTEGER,INTENT(IN),OPTIONAL :: timeindex ! time index of sought data 230 230 … … 238 238 corners(3)=timeindex 239 239 endif 240 240 241 241 IF (PRESENT(found)) THEN 242 242 CALL Get_field_rgen(nid_start,field_name,field,size(field,2),& … … 247 247 ENDIF 248 248 249 249 250 250 END SUBROUTINE Get_Field_r2 251 251 252 252 SUBROUTINE Get_Field_r3(nid_start,field_name,field,found,timeindex) 253 253 ! for a "4D" field surf/alt/?? … … 257 257 CHARACTER(LEN=*),INTENT(IN) :: Field_name 258 258 REAL,INTENT(INOUT) :: Field(:,:,:) 259 LOGICAL,INTENT(OUT),OPTIONAL :: found 259 LOGICAL,INTENT(OUT),OPTIONAL :: found 260 260 INTEGER,INTENT(IN),OPTIONAL :: timeindex ! time index of sought data 261 261 … … 270 270 corners(4)=timeindex 271 271 endif 272 272 273 273 IF (PRESENT(found)) THEN 274 274 CALL Get_field_rgen(nid_start,field_name,field,size(field,2)*size(field,3),& … … 278 278 corners,edges) 279 279 ENDIF 280 280 281 281 END SUBROUTINE Get_Field_r3 282 282 283 283 SUBROUTINE Get_field_rgen(nid_start,field_name,field,field_size, & 284 284 corners,edges,found) … … 296 296 INTEGER,INTENT(IN) :: edges(4) 297 297 LOGICAL,OPTIONAL,INTENT(OUT) :: found 298 298 299 299 REAL :: field_glo(klon_glo,field_size) ! field on global grid 300 300 REAL :: field_glo_tmp(klon_glo,field_size) … … 303 303 INTEGER :: varid 304 304 INTEGER :: ierr, i 305 305 306 306 ! gather columns indexes on global grid 307 307 CALL gather(ind_cell_glo,ind_cell_glo_glo) 308 308 309 309 IF (is_master) THEN 310 310 311 311 ierr=NF90_INQ_VARID(nid_start,Field_name,varid) 312 312 313 313 IF (ierr==NF90_NOERR) THEN 314 314 CALL body(field_glo_tmp,nid_start) … … 317 317 tmp_found=.FALSE. 318 318 ENDIF 319 319 320 320 ENDIF ! of IF (is_master) 321 321 322 322 CALL bcast(tmp_found) 323 323 … … 331 331 CALL scatter(field_glo,field) 332 332 ENDIF 333 333 334 334 IF (PRESENT(found)) THEN 335 335 found=tmp_found … … 340 340 ENDIF 341 341 ENDIF 342 343 342 343 344 344 CONTAINS 345 345 346 346 SUBROUTINE body(field_glo,nid_start) 347 347 REAL :: field_glo(klon_glo*field_size) … … 349 349 ierr=NF90_GET_VAR(nid_start,varid,field_glo,corners,edges) 350 350 IF (ierr/=NF90_NOERR) THEN 351 ! La variable exist dans le fichier mais la lecture a echouee. 351 ! La variable exist dans le fichier mais la lecture a echouee. 352 352 PRINT*, 'get_field_rgen: Failed reading <'//field_name//'>' 353 353 … … 362 362 SUBROUTINE get_var_r0(nid_start,var_name,var,found) 363 363 ! Get a scalar from input file 364 IMPLICIT NONE 364 IMPLICIT NONE 365 365 INTEGER,INTENT(IN) :: nid_start 366 366 CHARACTER(LEN=*),INTENT(IN) :: var_name … … 369 369 370 370 REAL :: varout(1) 371 371 372 372 IF (PRESENT(found)) THEN 373 373 CALL Get_var_rgen(nid_start,var_name,varout,size(varout),found) … … 376 376 ENDIF 377 377 var=varout(1) 378 378 379 379 END SUBROUTINE get_var_r0 380 380 381 381 SUBROUTINE get_var_r1(nid_start,var_name,var,found) 382 382 ! Get a vector from input file 383 IMPLICIT NONE 383 IMPLICIT NONE 384 384 CHARACTER(LEN=*),INTENT(IN) :: var_name 385 385 REAL,INTENT(INOUT) :: var(:) 386 386 LOGICAL,OPTIONAL,INTENT(OUT) :: found 387 387 INTEGER,INTENT(IN) :: nid_start 388 388 389 389 IF (PRESENT(found)) THEN 390 390 CALL Get_var_rgen(nid_start,var_name,var,size(var),found) … … 392 392 CALL Get_var_rgen(nid_start,var_name,var,size(var)) 393 393 ENDIF 394 394 395 395 END SUBROUTINE get_var_r1 396 396 397 397 SUBROUTINE get_var_r2(nid_start,var_name,var,found) 398 398 ! Get a 2D field from input file 399 IMPLICIT NONE 399 IMPLICIT NONE 400 400 CHARACTER(LEN=*),INTENT(IN) :: var_name 401 401 REAL,INTENT(OUT) :: var(:,:) 402 402 LOGICAL,OPTIONAL,INTENT(OUT) :: found 403 403 INTEGER,INTENT(IN) :: nid_start 404 404 405 405 IF (PRESENT(found)) THEN 406 406 CALL Get_var_rgen(nid_start,var_name,var,size(var),found) … … 408 408 CALL Get_var_rgen(nid_start,var_name,var,size(var)) 409 409 ENDIF 410 410 411 411 END SUBROUTINE get_var_r2 412 412 413 413 SUBROUTINE get_var_r3(nid_start,var_name,var,found) 414 414 ! Get a 3D field frominput file 415 IMPLICIT NONE 415 IMPLICIT NONE 416 416 CHARACTER(LEN=*),INTENT(IN) :: var_name 417 417 REAL,INTENT(INOUT) :: var(:,:,:) 418 418 LOGICAL,OPTIONAL,INTENT(OUT) :: found 419 419 INTEGER,INTENT(IN) :: nid_start 420 420 421 421 IF (PRESENT(found)) THEN 422 422 CALL Get_var_rgen(nid_start,var_name,var,size(var),found) … … 424 424 CALL Get_var_rgen(nid_start,var_name,var,size(var)) 425 425 ENDIF 426 426 427 427 END SUBROUTINE get_var_r3 428 428 … … 436 436 REAL,INTENT(OUT) :: var(var_size) 437 437 LOGICAL,OPTIONAL,INTENT(OUT) :: found 438 438 439 439 LOGICAL :: tmp_found 440 440 INTEGER :: varid 441 441 INTEGER :: ierr 442 443 IF (is_master) THEN 444 442 443 IF (is_master) THEN 444 445 445 ierr=NF90_INQ_VARID(nid_start,var_name,varid) 446 446 447 447 IF (ierr==NF90_NOERR) THEN 448 448 ierr=NF90_GET_VAR(nid_start,varid,var) … … 455 455 tmp_found=.FALSE. 456 456 ENDIF 457 458 ENDIF 459 457 458 ENDIF 459 460 460 CALL bcast(tmp_found) 461 461 … … 463 463 CALL bcast(var) 464 464 ENDIF 465 465 466 466 IF (PRESENT(found)) THEN 467 467 found=tmp_found … … 494 494 INTEGER,INTENT(INOUT) :: nid_restart 495 495 INTEGER :: ierr 496 497 IF (is_master) THEN 498 496 497 IF (is_master) THEN 498 499 499 ierr=NF90_CREATE(filename,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), & 500 500 nid_restart) … … 518 518 CALL abort_physic("create_restartphy","Failed defining index",1) 519 519 ENDIF 520 520 521 521 ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2) 522 522 IF (ierr/=NF90_NOERR) THEN … … 525 525 CALL abort_physic("create_restartphy","Failed defining physical_points",1) 526 526 ENDIF 527 527 528 528 ierr=NF90_DEF_DIM(nid_restart,"subsurface_layers",nsoilmx,idim3) 529 529 IF (ierr/=NF90_NOERR) THEN … … 532 532 CALL abort_physic("create_restartphy","Failed defining subsurface_layers",1) 533 533 ENDIF 534 534 535 535 ierr=NF90_DEF_DIM(nid_restart,"nlayer_plus_1",klevp1,idim4) 536 536 IF (ierr/=NF90_NOERR) THEN … … 539 539 CALL abort_physic("create_restartphy","Failed defining nlayer_plus_1",1) 540 540 ENDIF 541 541 542 542 if (nqtot>0) then 543 543 ! only define a tracer dimension if there are tracers … … 556 556 CALL abort_physic("create_restartphy","Failed defining nlayer",1) 557 557 ENDIF 558 558 559 559 ierr=NF90_DEF_DIM(nid_restart,"Time",NF90_UNLIMITED,idim7) 560 560 IF (ierr/=NF90_NOERR) THEN … … 577 577 CALL abort_physic("create_restartphy","Failed defining descriptor",1) 578 578 ENDIF 579 579 580 580 ierr=NF90_DEF_DIM(nid_restart,"description_size",ndscrpt,idim11) 581 581 IF (ierr/=NF90_NOERR) THEN … … 603 603 INTEGER,INTENT(INOUT) :: nid_restart 604 604 INTEGER :: ierr 605 605 606 606 IF (is_master) THEN 607 607 ierr=NF90_OPEN(filename,NF90_WRITE,nid_restart) 608 608 IF (ierr/=NF90_NOERR) THEN 609 if (ierr.eq.2) then ! file does not exist 610 call create_restartphy(filename,nid_restart) 611 return 612 endif 609 613 write(*,*)'open_restartphy: problem opening file '//trim(filename) 610 614 write(*,*)trim(nf90_strerror(ierr)) … … 625 629 ierr = NF90_CLOSE (nid_restart) 626 630 ENDIF 627 631 628 632 END SUBROUTINE close_restartphy 629 633 … … 636 640 REAL,INTENT(IN) :: field(:) 637 641 REAL,OPTIONAL,INTENT(IN) :: time 638 642 639 643 IF (present(time)) THEN 640 644 ! if timeindex is present, it is a time-dependent variable … … 643 647 CALL put_field_rgen(nid_restart,field_name,title,field,1) 644 648 ENDIF 645 649 646 650 END SUBROUTINE put_field_r1 647 651 … … 654 658 REAL,INTENT(IN) :: field(:,:) 655 659 REAL,OPTIONAL,INTENT(IN) :: time 656 660 657 661 IF (present(time)) THEN 658 662 ! if timeindex is present, it is a time-dependent variable … … 661 665 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)) 662 666 ENDIF 663 667 664 668 END SUBROUTINE put_field_r2 665 669 … … 672 676 REAL,INTENT(IN) :: field(:,:,:) 673 677 REAL,OPTIONAL,INTENT(IN) :: time 674 678 675 679 IF (present(time)) THEN 676 680 ! if timeindex is present, it is a time-dependent variable 677 681 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)*size(field,3),& 678 682 time) 679 ELSE 683 ELSE 680 684 CALL put_field_rgen(nid_restart,field_name,title,field,size(field,2)*size(field,3)) 681 685 ENDIF 682 686 683 687 END SUBROUTINE put_field_r3 684 688 685 689 SUBROUTINE put_field_rgen(nid_restart,field_name,title,field,field_size,time) 686 690 USE netcdf, ONLY: NF90_REDEF, NF90_ENDDEF, NF90_DEF_VAR, NF90_PUT_ATT, & … … 702 706 REAL,INTENT(IN) :: field(klon,field_size) 703 707 REAL,OPTIONAL,INTENT(IN) :: time 704 708 705 709 REAL :: field_glo(klon_glo,field_size) 706 710 REAL :: field_glo_tmp(klon_glo,field_size) 707 711 INTEGER :: ind_cell_glo_glo(klon_glo) ! cell indexes on global grid 708 712 709 713 INTEGER :: ierr 710 714 INTEGER :: nvarid 711 715 INTEGER :: idim 712 716 INTEGER :: i 713 717 714 718 ! gather indexes on global grid 715 719 CALL gather(ind_cell_glo,ind_cell_glo_glo) 716 720 ! gather field on master 717 721 CALL gather(field,field_glo_tmp) 718 722 719 723 IF (is_master) THEN 720 724 ! reorder columns … … 722 726 field_glo(ind_cell_glo_glo(i),:)=field_glo_tmp(i,:) 723 727 ENDDO 724 728 725 729 IF (field_size==1) THEN 726 730 ! input is a 1D "surface field" array … … 950 954 951 955 ENDIF ! of IF (is_master) 952 953 END SUBROUTINE put_field_rgen 954 956 957 END SUBROUTINE put_field_rgen 958 955 959 SUBROUTINE put_var_r0(nid_restart,var_name,title,var) 956 960 ! Put a scalar in file … … 961 965 REAL,INTENT(IN) :: var 962 966 REAL :: varin(1) 963 967 964 968 varin(1)=var 965 969 966 970 CALL put_var_rgen(nid_restart,var_name,title,varin,size(varin)) 967 971 … … 976 980 CHARACTER(LEN=*),INTENT(IN) :: title 977 981 REAL,INTENT(IN) :: var(:) 978 982 979 983 CALL put_var_rgen(nid_restart,var_name,title,var,size(var)) 980 984 981 985 END SUBROUTINE put_var_r1 982 986 983 987 SUBROUTINE put_var_r2(nid_restart,var_name,title,var) 984 988 ! Put a 2D field in file … … 988 992 CHARACTER(LEN=*),INTENT(IN) :: title 989 993 REAL,INTENT(IN) :: var(:,:) 990 994 991 995 CALL put_var_rgen(nid_restart,var_name,title,var,size(var)) 992 996 993 END SUBROUTINE put_var_r2 994 997 END SUBROUTINE put_var_r2 998 995 999 SUBROUTINE put_var_r3(nid_restart,var_name,title,var) 996 1000 ! Put a 3D field in file … … 1000 1004 CHARACTER(LEN=*),INTENT(IN) :: title 1001 1005 REAL,INTENT(IN) :: var(:,:,:) 1002 1006 1003 1007 CALL put_var_rgen(nid_restart,var_name,title,var,size(var)) 1004 1008 … … 1020 1024 INTEGER,INTENT(IN) :: var_size 1021 1025 REAL,INTENT(IN) :: var(var_size) 1022 1026 1023 1027 INTEGER :: ierr 1024 1028 INTEGER :: nvarid … … 1026 1030 logical,save :: firsttime=.true. 1027 1031 !$OMP THREADPRIVATE(firsttime) 1028 1032 1029 1033 IF (is_master) THEN 1030 1034 … … 1043 1047 IF (LEN_TRIM(title) > 0) ierr=NF90_PUT_ATT(nid_restart,nvarid,"title",title) 1044 1048 ierr=NF90_ENDDEF(nid_restart) 1045 1049 1046 1050 firsttime=.false. 1047 1051 endif … … 1069 1073 ! We know it is an "mlayer" kind of 1D array 1070 1074 idim1d=idim8 1071 ELSE 1075 ELSE 1072 1076 PRINT *, "put_var_rgen error : wrong dimension" 1073 1077 write(*,*) " var_size =",var_size … … 1096 1100 ENDIF 1097 1101 ENDIF ! of IF (is_master) 1098 1099 END SUBROUTINE put_var_rgen 1102 1103 END SUBROUTINE put_var_rgen 1100 1104 1101 1105 SUBROUTINE put_var_c1(nid_restart,var_name,title,var) … … 1126 1130 idim1d_1=idim11 1127 1131 idim1d_2=idim10 1128 ELSE 1132 ELSE 1129 1133 PRINT *, "put_var_cgen error : wrong dimension" 1130 1134 write(*,*) " var_size =",var_size … … 1166 1170 ! USE slab_ice_h, only: noceanmx 1167 1171 USE ocean_slab_mod, ONLY: nslay 1168 1172 1169 1173 IMPLICIT NONE 1170 1174 CHARACTER(LEN=*),INTENT(IN) :: filename 1171 1175 INTEGER,INTENT(INOUT) :: nid_restart 1172 1176 INTEGER :: ierr 1173 1177 1174 1178 IF (is_master) THEN 1175 1179 1176 1180 ierr=NF90_CREATE(filename,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), & 1177 1181 nid_restart) … … 1181 1185 CALL abort_physic("create_restart1D","Failed creating file",1) 1182 1186 ENDIF 1183 1187 1184 1188 ierr=NF90_PUT_ATT(nid_restart,NF90_GLOBAL,"title",& 1185 1189 "Physics start file") … … 1188 1192 write(*,*)trim(nf90_strerror(ierr)) 1189 1193 ENDIF 1190 1194 1191 1195 ierr=NF90_DEF_DIM(nid_restart,"physical_points",klon_glo,idim2) 1192 1196 IF (ierr/=NF90_NOERR) THEN … … 1195 1199 CALL abort_physic("create_restart1D","Failed defining physical_points",1) 1196 1200 ENDIF 1197 1201 1198 1202 ierr=NF90_DEF_DIM(nid_restart,"nlayer",klev,idim6) 1199 1203 IF (ierr/=NF90_NOERR) THEN … … 1202 1206 CALL abort_physic("create_restart1D","Failed defining nlayer",1) 1203 1207 ENDIF 1204 1208 1205 1209 ierr=NF90_ENDDEF(nid_restart) 1206 1210 IF (ierr/=NF90_NOERR) THEN … … 1210 1214 ENDIF 1211 1215 ENDIF 1212 1216 1213 1217 END SUBROUTINE create_restart1D 1214 1218
Note: See TracChangeset
for help on using the changeset viewer.