Changeset 951 for branches/dev_001_GM/NEMO/OFF_SRC/IOM/iom_nf90.F90
- Timestamp:
- 2008-05-14T18:42:10+02:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dev_001_GM/NEMO/OFF_SRC/IOM/iom_nf90.F90
r719 r951 6 6 !! History : 9.0 ! 05 12 (J. Belier) Original code 7 7 !! 9.0 ! 06 02 (S. Masson) Adaptation to NEMO 8 !! " ! 07 07 (D. Storkey) Changes to iom_nf90_gettime 8 9 !!-------------------------------------------------------------------- 9 10 !!gm caution add !DIR nec: improved performance to be checked as well as no result changes … … 36 37 !!---------------------------------------------------------------------- 37 38 !! OPA 9.0 , LOCEAN-IPSL (2006) 38 !! $Header $39 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/OPA_SRC/IOM/iom_nf90.F90,v 1.8 2007/06/29 14:10:50 opalod Exp $ 39 40 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 40 41 !!---------------------------------------------------------------------- … … 48 49 !! ** Purpose : open an input file with NF90 49 50 !!--------------------------------------------------------------------- 50 CHARACTER(len=*) , INTENT(inout) :: cdname ! File name51 INTEGER , INTENT( out) :: kiomid ! nf90 identifier of the opened file52 LOGICAL , INTENT(in ) :: ldwrt ! read or write the file?53 LOGICAL , INTENT(in ) :: ldok ! check the existence54 INTEGER, DIMENSION(2,5), INTENT(in ) :: kdompar ! domain parameters:51 CHARACTER(len=*) , INTENT(inout) :: cdname ! File name 52 INTEGER , INTENT( out) :: kiomid ! nf90 identifier of the opened file 53 LOGICAL , INTENT(in ) :: ldwrt ! read or write the file? 54 LOGICAL , INTENT(in ) :: ldok ! check the existence 55 INTEGER, DIMENSION(2,5), INTENT(in ), OPTIONAL :: kdompar ! domain parameters: 55 56 56 57 CHARACTER(LEN=100) :: clinfo ! info character … … 60 61 INTEGER :: if90id ! nf90 identifier of the opened file 61 62 INTEGER :: idmy ! dummy variable 63 INTEGER :: jl ! loop variable 62 64 !--------------------------------------------------------------------- 63 65 … … 103 105 CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type' , 'BOX' ), clinfo) 104 106 ELSE ! the file should be open for read mode so it must exist... 105 CALL ctl_stop( TRIM(clinfo), ' File '//cdname(1:iln-1)//'* not found' )107 CALL ctl_stop( TRIM(clinfo), ' should be impossible case...' ) 106 108 ENDIF 107 109 ENDIF … … 109 111 ! ============= 110 112 IF( istop == nstop ) THEN ! no error within this routine 111 kiomid = MINLOC(iom_file(:)%nfid, dim = 1) 113 !does not work with some compilers kiomid = MINLOC(iom_file(:)%nfid, dim = 1) 114 kiomid = 0 115 DO jl = jpmax_files, 1, -1 116 IF( iom_file(jl)%nfid == 0 ) kiomid = jl 117 ENDDO 112 118 iom_file(kiomid)%name = TRIM(cdname) 113 119 iom_file(kiomid)%nfid = if90id … … 116 122 iom_file(kiomid)%irec = -1 ! useless for NetCDF files, used to know if the file is in define mode 117 123 CALL iom_nf90_check(NF90_Inquire(if90id, unlimitedDimId = iom_file(kiomid)%iduld), clinfo) 124 IF ( iom_file(kiomid)%iduld .GE. 0 ) THEN 125 CALL iom_nf90_check(NF90_Inquire_Dimension(if90id, iom_file(kiomid)%iduld, & 126 & name = iom_file(kiomid)%uldname), clinfo) 127 ENDIF 118 128 IF(lwp) WRITE(numout,*) ' ---> '//TRIM(cdname)//' OK' 119 129 ELSE … … 174 184 iom_file(kiomid)%ndims(kiv) = i_nvd 175 185 CALL iom_nf90_check(NF90_Inquire_Variable(if90id, ivarid, dimids = idimid(1:i_nvd)), clinfo) ! dimensions ids 176 DO ji = 1, i_nvd ! dimensions size 186 iom_file(kiomid)%luld(kiv) = .FALSE. ! default value 187 DO ji = 1, i_nvd ! dimensions size 177 188 CALL iom_nf90_check(NF90_Inquire_Dimension(if90id, idimid(ji), len = iom_file(kiomid)%dimsz(ji,kiv)), clinfo) 178 189 IF( idimid(ji) == iom_file(kiomid)%iduld ) iom_file(kiomid)%luld(kiv) = .TRUE. ! unlimited dimension? 179 190 END DO 180 !---------- Deal with scale_factor and offset191 !---------- Deal with scale_factor and add_offset 181 192 llok = NF90_Inquire_attribute(if90id, ivarid, 'scale_factor') == nf90_noerr 182 193 IF( llok) THEN … … 185 196 iom_file(kiomid)%scf(kiv) = 1. 186 197 END IF 187 llok = NF90_Inquire_attribute(if90id, ivarid, ' offset') == nf90_noerr198 llok = NF90_Inquire_attribute(if90id, ivarid, 'add_offset') == nf90_noerr 188 199 IF( llok ) THEN 189 CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, ' offset', iom_file(kiomid)%ofs(kiv)), clinfo)200 CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, 'add_offset', iom_file(kiomid)%ofs(kiv)), clinfo) 190 201 ELSE 191 202 iom_file(kiomid)%ofs(kiv) = 0. … … 200 211 ENDIF 201 212 ENDIF 202 !!$ ELSE 203 !!$ CALL ctl_warn( trim(clinfo), 'Variable '//trim(cdvar)// & 204 !!$ & ' is not found in the file '//trim(iom_file(kiomid)%name) ) 213 ELSE 214 iom_nf90_varid = -1 ! variable not found, return error code: -1 205 215 ENDIF 206 216 ! … … 226 236 227 237 228 SUBROUTINE iom_nf90_g123d( kiomid, k dom, kvid, knbdim, kstart, kcount,&229 & pv_r1d, pv_r2d, pv_r3d)238 SUBROUTINE iom_nf90_g123d( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2, & 239 & pv_r1d, pv_r2d, pv_r3d ) 230 240 !!----------------------------------------------------------------------- 231 241 !! *** ROUTINE iom_nf90_g123d *** … … 236 246 !!----------------------------------------------------------------------- 237 247 INTEGER , INTENT(in ) :: kiomid ! iom identifier of the file 238 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read239 248 INTEGER , INTENT(in ) :: kvid ! Name of the variable 240 249 INTEGER , INTENT(in ) :: knbdim ! number of dimensions of the variable 241 250 INTEGER , DIMENSION(:) , INTENT(in ) :: kstart ! start position of the reading in each axis 242 251 INTEGER , DIMENSION(:) , INTENT(in ) :: kcount ! number of points to be read in each axis 252 INTEGER , INTENT(in ) :: kx1, kx2, ky1, ky2 ! subdomain indexes 243 253 REAL(wp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case) 244 254 REAL(wp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case) 245 255 REAL(wp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case) 246 256 ! 247 CHARACTER(LEN=100) :: clinfo ! info character248 INTEGER :: if90id ! nf90 identifier of the opened file249 INTEGER :: ivid ! nf90 variable id257 CHARACTER(LEN=100) :: clinfo ! info character 258 INTEGER :: if90id ! nf90 identifier of the opened file 259 INTEGER :: ivid ! nf90 variable id 250 260 !--------------------------------------------------------------------- 251 261 clinfo = 'iom_nf90_g123d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 252 262 if90id = iom_file(kiomid)%nfid ! get back NetCDF file id 253 263 ivid = iom_file(kiomid)%nvid(kvid) ! get back NetCDF var id 254 IF( PRESENT(pv_r1d) ) THEN 255 CALL iom_nf90_check(NF90_GET_VAR(if90id, ivid, pv_r1d(:), start=kstart(1:knbdim), count=kcount(1:knbdim)), clinfo ) 264 ! 265 IF( PRESENT(pv_r1d) ) THEN 266 CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pv_r1d(: ), start = kstart(1:knbdim), & 267 & count = kcount(1:knbdim)), clinfo ) 256 268 ELSEIF( PRESENT(pv_r2d) ) THEN 257 IF( kdom /= jpdom_unknown ) THEN 258 CALL iom_nf90_check(NF90_GET_VAR(if90id, ivid, pv_r2d(nldi:nlei,nldj:nlej), & 259 & start=kstart(1:knbdim), count=kcount(1:knbdim)), clinfo) 260 !--- Fill the overlap areas and extra hallows (mpp) 261 CALL lbc_lnk (pv_r2d,'Z',-999.,'no0') 262 ELSE 263 CALL iom_nf90_check(NF90_GET_VAR(if90id, ivid, pv_r2d(:,:), start=kstart(1:knbdim), count=kcount(1:knbdim)), clinfo) 264 ENDIF 269 CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pv_r2d(kx1:kx2,ky1:ky2 ), start = kstart(1:knbdim), & 270 & count = kcount(1:knbdim)), clinfo ) 265 271 ELSEIF( PRESENT(pv_r3d) ) THEN 266 IF( kdom /= jpdom_unknown ) THEN 267 CALL iom_nf90_check(NF90_GET_VAR(if90id, ivid, pv_r3d(nldi:nlei,nldj:nlej,:), & 268 & start=kstart(1:knbdim), count=kcount (1:knbdim)), clinfo) 269 !--- Fill the overlap areas and extra hallows (mpp) 270 ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 271 IF( kcount(3) == jpk ) THEN 272 CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 273 ELSE ! put some arbitrary value (a call to lbc_lnk will be done later...) 274 pv_r3d(nlei+1:jpi, : ,:) = 1. 275 pv_r3d( : ,nlej+1:jpj,:) = 1. 276 ENDIF 277 ELSE 278 CALL iom_nf90_check(NF90_GET_VAR(if90id, ivid, pv_r3d(:,:,:), & 279 & start=kstart(1:knbdim), count=kcount (1:knbdim)), clinfo) 280 ENDIF 272 CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pv_r3d(kx1:kx2,ky1:ky2,:), start = kstart(1:knbdim), & 273 & count = kcount(1:knbdim)), clinfo ) 281 274 ENDIF 282 275 ! … … 284 277 285 278 286 SUBROUTINE iom_nf90_gettime( kiomid, kvid, ptime )279 SUBROUTINE iom_nf90_gettime( kiomid, kvid, ptime, cdunits, cdcalendar ) 287 280 !!-------------------------------------------------------------------- 288 281 !! *** SUBROUTINE iom_gettime *** … … 290 283 !! ** Purpose : read the time axis kvid in the file with NF90 291 284 !!-------------------------------------------------------------------- 292 INTEGER , INTENT(in ) :: kiomid ! file Identifier 293 INTEGER , INTENT(in ) :: kvid ! variable id 294 REAL(wp), DIMENSION(:), INTENT( out) :: ptime ! the time axis 285 INTEGER , INTENT(in ) :: kiomid ! file Identifier 286 INTEGER , INTENT(in ) :: kvid ! variable id 287 REAL(wp), DIMENSION(:) , INTENT( out) :: ptime ! the time axis 288 CHARACTER(len=*), OPTIONAL, INTENT( out) :: cdunits ! units attribute 289 CHARACTER(len=*), OPTIONAL, INTENT( out) :: cdcalendar ! calendar attribute 295 290 ! 296 291 CHARACTER(LEN=100) :: clinfo ! info character … … 299 294 CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), ptime(:), & 300 295 & start=(/ 1 /), count=(/ iom_file(kiomid)%dimsz(1, kvid) /)), clinfo) 296 IF ( PRESENT(cdunits) ) THEN 297 CALL iom_nf90_check(NF90_GET_ATT(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), "units", & 298 & values=cdunits), clinfo) 299 ENDIF 300 IF ( PRESENT(cdcalendar) ) THEN 301 CALL iom_nf90_check(NF90_GET_ATT(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), "calendar", & 302 & values=cdcalendar), clinfo) 303 ENDIF 301 304 ! 302 305 END SUBROUTINE iom_nf90_gettime … … 355 358 iom_file(kiomid)%cn_var(1:4) = cltmp 356 359 iom_file(kiomid)%ndims(1:4) = (/ 2, 2, 1, 1 /) 357 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo) 358 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo) 359 iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 360 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo) 361 iom_file(kiomid)%dimsz(1 , 4) = 1 ! unlimited dimension 360 ! trick: defined to 0 to say that dimension variables are defined but not yet written 361 iom_file(kiomid)%dimsz(1, 1) = 0 362 362 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 363 363 ENDIF … … 433 433 ! write dimension variables if it is not already done 434 434 ! ============= 435 ! trick: is defined to 0 => dimension variable are defined but not yet written 435 436 IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 436 437 CALL iom_nf90_check(NF90_INQ_VARID( if90id, 'nav_lon' , idmy ), clinfo) … … 443 444 CALL iom_nf90_check(NF90_INQ_VARID( if90id, 'time_counter', idmy ), clinfo) 444 445 CALL iom_nf90_check(NF90_PUT_VAR( if90id, idmy, kt ), clinfo) 446 ! update the values of the variables dimensions size 447 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo) 448 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo) 449 iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 450 CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo) 451 iom_file(kiomid)%dimsz(1 , 4) = 1 ! unlimited dimension 445 452 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 446 453 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.