- Timestamp:
- 2020-05-14T21:46:00+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Property svn:externals
-
old new 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@HEAD sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/IOM/iom_nf90.F90
r12178 r12928 19 19 !!---------------------------------------------------------------------- 20 20 USE dom_oce ! ocean space and time domain 21 USE sbc_oce, ONLY: ght_abl ! abl vertical level number and height 21 22 USE lbclnk ! lateal boundary condition / mpp exchanges 22 23 USE iom_def ! iom variables definitions … … 45 46 CONTAINS 46 47 47 SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev )48 SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev, cdcomp ) 48 49 !!--------------------------------------------------------------------- 49 50 !! *** SUBROUTINE iom_open *** … … 56 57 LOGICAL , INTENT(in ) :: ldok ! check the existence 57 58 INTEGER, DIMENSION(2,5), INTENT(in ), OPTIONAL :: kdompar ! domain parameters: 58 INTEGER , INTENT(in ), OPTIONAL :: kdlev ! size of the third dimension 59 INTEGER , INTENT(in ), OPTIONAL :: kdlev ! size of the ice/abl third dimension 60 CHARACTER(len=3) , INTENT(in ), OPTIONAL :: cdcomp ! name of component calling iom_nf90_open 59 61 60 62 CHARACTER(LEN=256) :: clinfo ! info character 61 63 CHARACTER(LEN=256) :: cltmp ! temporary character 64 CHARACTER(LEN=3 ) :: clcomp ! name of component calling iom_nf90_open 62 65 INTEGER :: iln ! lengths of character 63 66 INTEGER :: istop ! temporary storage of nstop … … 69 72 INTEGER :: ihdf5 ! local variable for retrieval of value for NF90_HDF5 70 73 LOGICAL :: llclobber ! local definition of ln_clobber 71 INTEGER :: ilevels ! vertical levels72 74 !--------------------------------------------------------------------- 73 75 ! … … 76 78 ! 77 79 ! !number of vertical levels 78 IF( PRESENT(kdlev) ) THEN ; ilevels = kdlev ! use input value (useful for sea-ice) 79 ELSE ; ilevels = jpk ! by default jpk 80 IF( PRESENT(cdcomp) ) THEN 81 IF( .NOT. PRESENT(kdlev) ) CALL ctl_stop( 'iom_nf90_open: cdcomp and kdlev must both be present' ) 82 clcomp = cdcomp ! use input value 83 ELSE 84 clcomp = 'OCE' ! by default 80 85 ENDIF 81 86 ! … … 124 129 CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy ), clinfo) 125 130 ! define dimensions 126 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'x', kdompar(1,1), idmy ), clinfo) 127 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'y', kdompar(2,1), idmy ), clinfo) 128 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', jpk, idmy ), clinfo) 129 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 130 IF( PRESENT(kdlev) ) & 131 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numcat', kdlev, idmy ), clinfo) 131 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'x', kdompar(1,1), idmy ), clinfo) 132 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'y', kdompar(2,1), idmy ), clinfo) 133 SELECT CASE (clcomp) 134 CASE ('OCE') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', jpk, idmy ), clinfo) 135 CASE ('ICE') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numcat', kdlev, idmy ), clinfo) 136 CASE ('ABL') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', kdlev, idmy ), clinfo) 137 CASE ('SED') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numsed', kdlev, idmy ), clinfo) 138 CASE DEFAULT ; CALL ctl_stop( 'iom_nf90_open unknown component type' ) 139 END SELECT 140 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 132 141 ! global attributes 133 142 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total' , jpnij ), clinfo) … … 155 164 ENDDO 156 165 iom_file(kiomid)%name = TRIM(cdname) 166 iom_file(kiomid)%comp = clcomp 157 167 iom_file(kiomid)%nfid = if90id 158 168 iom_file(kiomid)%nvars = 0 159 169 iom_file(kiomid)%irec = -1 ! useless for NetCDF files, used to know if the file is in define mode 160 iom_file(kiomid)%nlev = ilevels161 170 CALL iom_nf90_check(NF90_Inquire(if90id, unlimitedDimId = iom_file(kiomid)%iduld), clinfo) 162 171 IF( iom_file(kiomid)%iduld .GE. 0 ) THEN … … 196 205 CHARACTER(len=*) , INTENT(in ) :: cdvar ! name of the variable 197 206 INTEGER , INTENT(in ) :: kiv ! 198 INTEGER, DIMENSION(:), INTENT( out), OPTIONAL :: kdimsz ! size of the dimensions199 INTEGER , INTENT( out), OPTIONAL :: kndims ! size of thedimensions207 INTEGER, DIMENSION(:), INTENT( out), OPTIONAL :: kdimsz ! size of each dimension 208 INTEGER , INTENT( out), OPTIONAL :: kndims ! number of dimensions 200 209 LOGICAL , INTENT( out), OPTIONAL :: lduld ! true if the last dimension is unlimited (time) 201 210 ! … … 519 528 INTEGER, DIMENSION(4) :: idimid ! dimensions id 520 529 CHARACTER(LEN=256) :: clinfo ! info character 521 CHARACTER(LEN= 12), DIMENSION(5) :: cltmp ! temporary character522 530 INTEGER :: if90id ! nf90 file identifier 523 INTEGER :: idmy ! dummy variable524 531 INTEGER :: itype ! variable type 525 532 INTEGER, DIMENSION(4) :: ichunksz ! NetCDF4 chunk sizes. Will be computed using … … 530 537 ! ! when appropriate (currently chunking is applied to 4d fields only) 531 538 INTEGER :: idlv ! local variable 532 INTEGER :: idim3 ! id of the third dimension533 539 !--------------------------------------------------------------------- 534 540 ! … … 544 550 ENDIF 545 551 ! define the dimension variables if it is not already done 546 ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) 547 cltmp = (/ 'nav_lon ', 'nav_lat ', 'nav_lev ', 'time_counter', 'numcat ' /) 548 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(1)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(1) ), clinfo) 549 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(2)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(2) ), clinfo) 550 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(3)), NF90_FLOAT , (/ 3 /), iom_file(kiomid)%nvid(3) ), clinfo) 551 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(4)), NF90_DOUBLE, (/ 4 /), iom_file(kiomid)%nvid(4) ), clinfo) 552 DO jd = 1, 2 553 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(jd,jd)),clinfo) 554 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ 1, 2 /), & 555 & iom_file(kiomid)%nvid(jd) ), clinfo) 556 END DO 557 iom_file(kiomid)%dimsz(2,1) = iom_file(kiomid)%dimsz(2,2) ! second dim of first variable 558 iom_file(kiomid)%dimsz(1,2) = iom_file(kiomid)%dimsz(1,1) ! first dim of second variable 559 DO jd = 3, 4 560 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(1,jd)), clinfo) 561 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ jd /), & 562 & iom_file(kiomid)%nvid(jd) ), clinfo) 563 END DO 552 564 ! update informations structure related the dimension variable we just added... 553 565 iom_file(kiomid)%nvars = 4 554 566 iom_file(kiomid)%luld(1:4) = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 555 iom_file(kiomid)%cn_var(1:4) = cltmp(1:4)556 567 iom_file(kiomid)%ndims(1:4) = (/ 2, 2, 1, 1 /) 557 IF( NF90_INQ_DIMID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN ! add a 5th variable corresponding to the 5th dimension558 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(5)), NF90_FLOAT , (/ 5 /), iom_file(kiomid)%nvid(5) ), clinfo)559 iom_file(kiomid)%nvars = 5560 iom_file(kiomid)%luld(5) = .FALSE.561 iom_file(kiomid)%cn_var(5) = cltmp(5)562 iom_file(kiomid)%ndims(5) = 1563 ENDIF564 ! trick: defined to 0 to say that dimension variables are defined but not yet written565 iom_file(kiomid)%dimsz(1, 1) = 0566 568 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 567 569 ENDIF … … 584 586 IF( PRESENT(pv_r0d) ) THEN ; idims = 0 585 587 ELSEIF( PRESENT(pv_r1d) ) THEN 586 IF( SIZE(pv_r1d,1) == jpk ) THEN ; idim3 = 3 587 ELSE ; idim3 = 5 588 ENDIF 589 idims = 2 ; idimid(1:idims) = (/idim3,4/) 590 ELSEIF( PRESENT(pv_r2d) ) THEN ; idims = 3 ; idimid(1:idims) = (/1,2 ,4/) 588 idims = 2 ; idimid(1:idims) = (/3,4/) 589 ELSEIF( PRESENT(pv_r2d) ) THEN ; idims = 3 ; idimid(1:idims) = (/1,2,4/) 591 590 ELSEIF( PRESENT(pv_r3d) ) THEN 592 IF( SIZE(pv_r3d,3) == jpk ) THEN ; idim3 = 3 593 ELSE ; idim3 = 5 594 ENDIF 595 idims = 4 ; idimid(1:idims) = (/1,2,idim3,4/) 591 idims = 4 ; idimid(1:idims) = (/1,2,3,4/) 596 592 ENDIF 597 593 IF( PRESENT(ktype) ) THEN ! variable external type … … 668 664 ! ============= 669 665 ! trick: is defined to 0 => dimension variable are defined but not yet written 670 IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 671 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lon' , idmy ) , clinfo ) 672 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 673 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lat' , idmy ) , clinfo ) 674 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 675 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev' , idmy ), clinfo ) 676 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, gdept_1d ), clinfo ) 677 IF( NF90_INQ_VARID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN 678 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, (/ (idlv, idlv = 1,iom_file(kiomid)%nlev) /)), clinfo ) 679 ENDIF 680 ! +++ WRONG VALUE: to be improved but not really useful... 681 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'time_counter', idmy ), clinfo ) 682 CALL iom_nf90_check( NF90_PUT_VAR( if90id, idmy, kt ), clinfo ) 683 ! update the values of the variables dimensions size 684 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo ) 685 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo ) 686 iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 687 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo ) 688 iom_file(kiomid)%dimsz(1 , 4) = 1 ! unlimited dimension 666 IF( iom_file(kiomid)%dimsz(1, 4) == 0 ) THEN ! time_counter = 0 667 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 1, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 668 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 2, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 669 SELECT CASE (iom_file(kiomid)%comp) 670 CASE ('OCE') 671 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, gdept_1d ), clinfo ) 672 CASE ('ABL') 673 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, ght_abl ), clinfo ) 674 CASE DEFAULT 675 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, (/ (idlv, idlv = 1,iom_file(kiomid)%dimsz(1,3)) /) ), clinfo ) 676 END SELECT 677 ! "wrong" value: to be improved but not really useful... 678 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 4, kt ), clinfo ) 679 ! update the size of the variable corresponding to the unlimited dimension 680 iom_file(kiomid)%dimsz(1, 4) = 1 ! so we don't enter this IF case any more... 689 681 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 690 682 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.