- Timestamp:
- 2020-09-14T17:40:34+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@13382 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/IOM/iom_nf90.F90
r10522 r13463 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 … … 32 33 33 34 INTERFACE iom_nf90_get 34 MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 35 MODULE PROCEDURE iom_nf90_g0d_sp 36 MODULE PROCEDURE iom_nf90_g0d_dp, iom_nf90_g123d_dp 35 37 END INTERFACE 36 38 INTERFACE iom_nf90_rstput 37 MODULE PROCEDURE iom_nf90_rp0123d 39 MODULE PROCEDURE iom_nf90_rp0123d_dp 38 40 END INTERFACE 39 41 … … 45 47 CONTAINS 46 48 47 SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kd ompar, kdlev)49 SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdlev, cdcomp ) 48 50 !!--------------------------------------------------------------------- 49 51 !! *** SUBROUTINE iom_open *** … … 55 57 LOGICAL , INTENT(in ) :: ldwrt ! read or write the file? 56 58 LOGICAL , INTENT(in ) :: ldok ! check the existence 57 INTEGER , DIMENSION(2,5), INTENT(in ), OPTIONAL :: kdompar ! domain parameters:58 INTEGER , INTENT(in ), OPTIONAL :: kdlev ! size of the third dimension59 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=12 ) :: clfmt ! writing format 65 CHARACTER(LEN=3 ) :: clcomp ! name of component calling iom_nf90_open 66 INTEGER :: idg ! number of digits 62 67 INTEGER :: iln ! lengths of character 63 68 INTEGER :: istop ! temporary storage of nstop … … 69 74 INTEGER :: ihdf5 ! local variable for retrieval of value for NF90_HDF5 70 75 LOGICAL :: llclobber ! local definition of ln_clobber 71 INTEGER :: ilevels ! vertical levels72 76 !--------------------------------------------------------------------- 73 77 ! … … 76 80 ! 77 81 ! !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 82 IF( PRESENT(cdcomp) ) THEN 83 IF( .NOT. PRESENT(kdlev) ) CALL ctl_stop( 'iom_nf90_open: cdcomp and kdlev must both be present' ) 84 clcomp = cdcomp ! use input value 85 ELSE 86 clcomp = 'OCE' ! by default 80 87 ENDIF 81 88 ! … … 104 111 IF( ldwrt ) THEN !* the file should be open in write mode so we create it... 105 112 IF( jpnij > 1 ) THEN 106 WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.nc' 113 idg = MAX( INT(LOG10(REAL(MAX(1,jpnij-1),wp))) + 1, 4 ) ! how many digits to we need to write? min=4, max=9 114 WRITE(clfmt, "('(a,a,i', i1, '.', i1, ',a)')") idg, idg ! '(a,a,ix.x,a)' 115 WRITE(cltmp,clfmt) cdname(1:iln-1), '_', narea-1, '.nc' 107 116 cdname = TRIM(cltmp) 108 117 ENDIF … … 124 133 CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy ), clinfo) 125 134 ! 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) 135 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'x', Ni_0, idmy ), clinfo) 136 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'y', Nj_0, idmy ), clinfo) 137 SELECT CASE (clcomp) 138 CASE ('OCE') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', jpk, idmy ), clinfo) 139 CASE ('ICE') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numcat', kdlev, idmy ), clinfo) 140 CASE ('ABL') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', kdlev, idmy ), clinfo) 141 CASE ('SED') ; CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numsed', kdlev, idmy ), clinfo) 142 CASE DEFAULT ; CALL ctl_stop( 'iom_nf90_open unknown component type' ) 143 END SELECT 144 CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 132 145 ! global attributes 133 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total' , jpnij ), clinfo)134 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number' , narea-1 ), clinfo)135 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1 , 2/) ), clinfo)136 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_global' , (/ jpiglo, jpjglo/) ), clinfo)137 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_local' , kdompar(:,1)), clinfo)138 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_first' , kdompar(:,2)), clinfo)139 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_last' , kdompar(:,3)), clinfo)140 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_start', kdompar(:,4)), clinfo)141 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_end' , kdompar(:,5)), clinfo)142 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type' , 'BOX' ), clinfo)146 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total' , jpnij ), clinfo) 147 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number' , narea-1 ), clinfo) 148 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1 , 2 /) ), clinfo) 149 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_global' , (/ Ni0glo , Nj0glo /) ), clinfo) 150 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_local' , (/ Ni_0 , Nj_0 /) ), clinfo) 151 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig0(Nis0), mjg0(Njs0) /) ), clinfo) 152 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_last' , (/ mig0(Nie0), mjg0(Nje0) /) ), clinfo) 153 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0 , 0 /) ), clinfo) 154 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_end' , (/ 0 , 0 /) ), clinfo) 155 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type' , 'BOX' ), clinfo) 143 156 ELSE !* the file should be open for read mode so it must exist... 144 157 CALL ctl_stop( TRIM(clinfo), ' should be impossible case...' ) … … 155 168 ENDDO 156 169 iom_file(kiomid)%name = TRIM(cdname) 170 iom_file(kiomid)%comp = clcomp 157 171 iom_file(kiomid)%nfid = if90id 158 172 iom_file(kiomid)%nvars = 0 159 173 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 174 CALL iom_nf90_check(NF90_Inquire(if90id, unlimitedDimId = iom_file(kiomid)%iduld), clinfo) 162 175 IF( iom_file(kiomid)%iduld .GE. 0 ) THEN … … 187 200 188 201 189 FUNCTION iom_nf90_varid ( kiomid, cdvar, kiv, kdimsz, kndims )202 FUNCTION iom_nf90_varid ( kiomid, cdvar, kiv, kdimsz, kndims, lduld ) 190 203 !!----------------------------------------------------------------------- 191 204 !! *** FUNCTION iom_varid *** … … 196 209 CHARACTER(len=*) , INTENT(in ) :: cdvar ! name of the variable 197 210 INTEGER , INTENT(in ) :: kiv ! 198 INTEGER, DIMENSION(:), INTENT( out), OPTIONAL :: kdimsz ! size of the dimensions 199 INTEGER, INTENT( out), OPTIONAL :: kndims ! size of the dimensions 211 INTEGER, DIMENSION(:), INTENT( out), OPTIONAL :: kdimsz ! size of each dimension 212 INTEGER , INTENT( out), OPTIONAL :: kndims ! number of dimensions 213 LOGICAL , INTENT( out), OPTIONAL :: lduld ! true if the last dimension is unlimited (time) 200 214 ! 201 215 INTEGER :: iom_nf90_varid ! iom variable Id … … 251 265 ENDIF 252 266 IF( PRESENT(kndims) ) kndims = iom_file(kiomid)%ndims(kiv) 267 IF( PRESENT( lduld) ) lduld = iom_file(kiomid)%luld(kiv) 253 268 ELSE 254 269 iom_nf90_varid = -1 ! variable not found, return error code: -1 … … 261 276 !!---------------------------------------------------------------------- 262 277 263 SUBROUTINE iom_nf90_g0d ( kiomid, kvid, pvar, kstart )278 SUBROUTINE iom_nf90_g0d_sp( kiomid, kvid, pvar, kstart ) 264 279 !!----------------------------------------------------------------------- 265 280 !! *** ROUTINE iom_nf90_g0d *** … … 269 284 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 270 285 INTEGER , INTENT(in ) :: kvid ! variable id 271 REAL( wp), INTENT( out) :: pvar ! read field286 REAL(sp), INTENT( out) :: pvar ! read field 272 287 INTEGER , DIMENSION(1), INTENT(in ), OPTIONAL :: kstart ! start position of the reading in each axis 273 288 ! … … 276 291 clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 277 292 CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo ) 278 END SUBROUTINE iom_nf90_g0d 279 280 281 SUBROUTINE iom_nf90_g123d( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2, & 293 END SUBROUTINE iom_nf90_g0d_sp 294 295 SUBROUTINE iom_nf90_g0d_dp( kiomid, kvid, pvar, kstart ) 296 !!----------------------------------------------------------------------- 297 !! *** ROUTINE iom_nf90_g0d *** 298 !! 299 !! ** Purpose : read a scalar with NF90 300 !!----------------------------------------------------------------------- 301 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 302 INTEGER , INTENT(in ) :: kvid ! variable id 303 REAL(dp), INTENT( out) :: pvar ! read field 304 INTEGER , DIMENSION(1), INTENT(in ), OPTIONAL :: kstart ! start position of the reading in each axis 305 ! 306 CHARACTER(LEN=100) :: clinfo ! info character 307 !--------------------------------------------------------------------- 308 clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 309 CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo ) 310 END SUBROUTINE iom_nf90_g0d_dp 311 312 SUBROUTINE iom_nf90_g123d_dp( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2, & 282 313 & pv_r1d, pv_r2d, pv_r3d ) 283 314 !!----------------------------------------------------------------------- … … 294 325 INTEGER , DIMENSION(:) , INTENT(in ) :: kcount ! number of points to be read in each axis 295 326 INTEGER , INTENT(in ) :: kx1, kx2, ky1, ky2 ! subdomain indexes 296 REAL( wp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case)297 REAL( wp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case)298 REAL( wp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case)327 REAL(dp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case) 328 REAL(dp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case) 329 REAL(dp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case) 299 330 ! 300 331 CHARACTER(LEN=100) :: clinfo ! info character … … 317 348 ENDIF 318 349 ! 319 END SUBROUTINE iom_nf90_g123d 350 END SUBROUTINE iom_nf90_g123d_dp 351 320 352 321 353 … … 491 523 END SUBROUTINE iom_nf90_putatt 492 524 493 494 SUBROUTINE iom_nf90_rp0123d( kt, kwrite, kiomid, cdvar , kvid , ktype, & 525 SUBROUTINE iom_nf90_rp0123d_dp( kt, kwrite, kiomid, cdvar , kvid , ktype, & 495 526 & pv_r0d, pv_r1d, pv_r2d, pv_r3d ) 496 527 !!-------------------------------------------------------------------- … … 505 536 INTEGER , INTENT(in) :: kvid ! variable id 506 537 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable type (default R8) 507 REAL( wp) , INTENT(in), OPTIONAL :: pv_r0d ! written Od field508 REAL( wp), DIMENSION( :), INTENT(in), OPTIONAL :: pv_r1d ! written 1d field509 REAL( wp), DIMENSION(:, : ), INTENT(in), OPTIONAL :: pv_r2d ! written 2d field510 REAL( wp), DIMENSION(:, :, :), INTENT(in), OPTIONAL :: pv_r3d ! written 3d field538 REAL(dp) , INTENT(in), OPTIONAL :: pv_r0d ! written Od field 539 REAL(dp), DIMENSION( :), INTENT(in), OPTIONAL :: pv_r1d ! written 1d field 540 REAL(dp), DIMENSION(:, : ), INTENT(in), OPTIONAL :: pv_r2d ! written 2d field 541 REAL(dp), DIMENSION(:, :, :), INTENT(in), OPTIONAL :: pv_r3d ! written 3d field 511 542 ! 512 543 INTEGER :: idims ! number of dimension … … 517 548 INTEGER, DIMENSION(4) :: idimid ! dimensions id 518 549 CHARACTER(LEN=256) :: clinfo ! info character 519 CHARACTER(LEN= 12), DIMENSION(5) :: cltmp ! temporary character520 550 INTEGER :: if90id ! nf90 file identifier 521 INTEGER :: idmy ! dummy variable522 551 INTEGER :: itype ! variable type 523 552 INTEGER, DIMENSION(4) :: ichunksz ! NetCDF4 chunk sizes. Will be computed using … … 528 557 ! ! when appropriate (currently chunking is applied to 4d fields only) 529 558 INTEGER :: idlv ! local variable 530 INTEGER :: idim3 ! id of the third dimension531 559 !--------------------------------------------------------------------- 532 560 ! … … 542 570 ENDIF 543 571 ! define the dimension variables if it is not already done 544 ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) 545 cltmp = (/ 'nav_lon ', 'nav_lat ', 'nav_lev ', 'time_counter', 'numcat ' /) 546 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(1)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(1) ), clinfo) 547 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(2)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(2) ), clinfo) 548 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(3)), NF90_FLOAT , (/ 3 /), iom_file(kiomid)%nvid(3) ), clinfo) 549 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(4)), NF90_DOUBLE, (/ 4 /), iom_file(kiomid)%nvid(4) ), clinfo) 572 DO jd = 1, 2 573 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(jd,jd)),clinfo) 574 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ 1, 2 /), & 575 & iom_file(kiomid)%nvid(jd) ), clinfo) 576 END DO 577 iom_file(kiomid)%dimsz(2,1) = iom_file(kiomid)%dimsz(2,2) ! second dim of first variable 578 iom_file(kiomid)%dimsz(1,2) = iom_file(kiomid)%dimsz(1,1) ! first dim of second variable 579 DO jd = 3, 4 580 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(1,jd)), clinfo) 581 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ jd /), & 582 & iom_file(kiomid)%nvid(jd) ), clinfo) 583 END DO 550 584 ! update informations structure related the dimension variable we just added... 551 585 iom_file(kiomid)%nvars = 4 552 586 iom_file(kiomid)%luld(1:4) = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 553 iom_file(kiomid)%cn_var(1:4) = cltmp(1:4)554 587 iom_file(kiomid)%ndims(1:4) = (/ 2, 2, 1, 1 /) 555 IF( NF90_INQ_DIMID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN ! add a 5th variable corresponding to the 5th dimension556 CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(5)), NF90_FLOAT , (/ 5 /), iom_file(kiomid)%nvid(5) ), clinfo)557 iom_file(kiomid)%nvars = 5558 iom_file(kiomid)%luld(5) = .FALSE.559 iom_file(kiomid)%cn_var(5) = cltmp(5)560 iom_file(kiomid)%ndims(5) = 1561 ENDIF562 ! trick: defined to 0 to say that dimension variables are defined but not yet written563 iom_file(kiomid)%dimsz(1, 1) = 0564 588 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 565 589 ENDIF … … 582 606 IF( PRESENT(pv_r0d) ) THEN ; idims = 0 583 607 ELSEIF( PRESENT(pv_r1d) ) THEN 584 IF( SIZE(pv_r1d,1) == jpk ) THEN ; idim3 = 3 585 ELSE ; idim3 = 5 586 ENDIF 587 idims = 2 ; idimid(1:idims) = (/idim3,4/) 588 ELSEIF( PRESENT(pv_r2d) ) THEN ; idims = 3 ; idimid(1:idims) = (/1,2 ,4/) 608 idims = 2 ; idimid(1:idims) = (/3,4/) 609 ELSEIF( PRESENT(pv_r2d) ) THEN ; idims = 3 ; idimid(1:idims) = (/1,2,4/) 589 610 ELSEIF( PRESENT(pv_r3d) ) THEN 590 IF( SIZE(pv_r3d,3) == jpk ) THEN ; idim3 = 3 591 ELSE ; idim3 = 5 592 ENDIF 593 idims = 4 ; idimid(1:idims) = (/1,2,idim3,4/) 611 idims = 4 ; idimid(1:idims) = (/1,2,3,4/) 594 612 ENDIF 595 613 IF( PRESENT(ktype) ) THEN ! variable external type … … 653 671 IF( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) THEN 654 672 idimsz(1:2) = iom_file(kiomid)%dimsz(1:2,idvar) 655 IF( idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1)) THEN656 ix1 = nldi ; ix2 = nlei ; iy1 = nldj ; iy2 = nlej657 ELSEIF( idimsz(1) == nlci .AND. idimsz(2) == nlcj) THEN658 ix1 = 1 ; ix2 = nlci ; iy1 = 1 ; iy2 = nlcj659 ELSEIF( idimsz(1) == jpi .AND. idimsz(2) == jpj) THEN673 IF( idimsz(1) == Ni_0 .AND. idimsz(2) == Nj_0 ) THEN 674 ix1 = Nis0 ; ix2 = Nie0 ; iy1 = Njs0 ; iy2 = Nje0 675 ELSEIF( idimsz(1) == jpi .AND. idimsz(2) == jpj ) THEN 676 ix1 = 1 ; ix2 = jpi ; iy1 = 1 ; iy2 = jpj 677 ELSEIF( idimsz(1) == jpi .AND. idimsz(2) == jpj ) THEN 660 678 ix1 = 1 ; ix2 = jpi ; iy1 = 1 ; iy2 = jpj 661 679 ELSE … … 666 684 ! ============= 667 685 ! trick: is defined to 0 => dimension variable are defined but not yet written 668 IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 669 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lon' , idmy ) , clinfo ) 670 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 671 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lat' , idmy ) , clinfo ) 672 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 673 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev' , idmy ), clinfo ) 674 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, gdept_1d ), clinfo ) 675 IF( NF90_INQ_VARID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN 676 CALL iom_nf90_check( NF90_PUT_VAR ( if90id, idmy, (/ (idlv, idlv = 1,iom_file(kiomid)%nlev) /)), clinfo ) 677 ENDIF 678 ! +++ WRONG VALUE: to be improved but not really useful... 679 CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'time_counter', idmy ), clinfo ) 680 CALL iom_nf90_check( NF90_PUT_VAR( if90id, idmy, kt ), clinfo ) 681 ! update the values of the variables dimensions size 682 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo ) 683 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo ) 684 iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 685 CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo ) 686 iom_file(kiomid)%dimsz(1 , 4) = 1 ! unlimited dimension 686 IF( iom_file(kiomid)%dimsz(1, 4) == 0 ) THEN ! time_counter = 0 687 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 1, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 688 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 2, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 689 SELECT CASE (iom_file(kiomid)%comp) 690 CASE ('OCE') 691 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, gdept_1d ), clinfo ) 692 CASE ('ABL') 693 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, ght_abl ), clinfo ) 694 CASE DEFAULT 695 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, (/ (idlv, idlv = 1,iom_file(kiomid)%dimsz(1,3)) /) ), clinfo ) 696 END SELECT 697 ! "wrong" value: to be improved but not really useful... 698 CALL iom_nf90_check( NF90_PUT_VAR( if90id, 4, kt ), clinfo ) 699 ! update the size of the variable corresponding to the unlimited dimension 700 iom_file(kiomid)%dimsz(1, 4) = 1 ! so we don't enter this IF case any more... 687 701 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 688 702 ENDIF … … 706 720 ENDIF 707 721 ! 708 END SUBROUTINE iom_nf90_rp0123d 722 END SUBROUTINE iom_nf90_rp0123d_dp 709 723 710 724
Note: See TracChangeset
for help on using the changeset viewer.