Changeset 550
- Timestamp:
- 2006-10-25T15:43:58+02:00 (18 years ago)
- Location:
- trunk/NEMO/OPA_SRC/IOM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/IOM/in_out_manager.F90
r548 r550 16 16 USE par_oce 17 17 USE lib_print ! formated print library 18 USE iom_def ! iom variables definitions 18 19 19 20 IMPLICIT NONE … … 33 34 INTEGER :: nleapy = 0 !: Leap year calendar flag (0/1 or 30) 34 35 INTEGER :: ninist = 0 !: initial state output flag (0/1) 36 INTEGER :: nbench = 0 !: benchmark parameter (0/1) 35 37 36 38 !!---------------------------------------------------------------------- … … 47 49 INTEGER :: jsplt = 1 !: number of processors following j 48 50 INTEGER :: ijsplt = 1 !: nb of local domain = nb of processors 49 INTEGER :: nbench = 0 !: benchmark parameter (0/1)50 INTEGER :: nbit_cmp = 0 !: bit reproducibility (0/1)51 51 52 52 !!---------------------------------------------------------------------- -
trunk/NEMO/OPA_SRC/IOM/iom.F90
r547 r550 13 13 !! iom_close : close a file or all files opened by iom 14 14 !! iom_get : read a field (interfaced to several routines) 15 !! iom_gettime : read the time axis cdvar in the file !!gm : never call ??????15 !! iom_gettime : read the time axis cdvar in the file 16 16 !! iom_varid : get the id of a variable in a file 17 17 !! iom_rstput : write a field in a restart file (interfaced to several routines) … … 25 25 26 26 IMPLICIT NONE 27 P UBLIC ! must be PUBLIC to pass the variables through the modules28 27 PRIVATE 28 29 29 PUBLIC iom_open, iom_close, iom_varid, iom_get, iom_gettime, iom_rstput 30 PRIVATE iom_get_0d, iom_get_1d, iom_get_2d, iom_get_3d, iom_get_123d31 PRIVATE iom_rstput_0d, iom_rstput_1d, iom_rstput_2d, iom_rstput_3d32 30 33 31 INTERFACE iom_get 34 MODULE PROCEDURE iom_g et_0d, iom_get_1d, iom_get_2d, iom_get_3d32 MODULE PROCEDURE iom_g0d, iom_g1d, iom_g2d, iom_g3d 35 33 END INTERFACE 36 34 INTERFACE iom_rstput 37 MODULE PROCEDURE iom_r stput_0d, iom_rstput_1d, iom_rstput_2d, iom_rstput_3d35 MODULE PROCEDURE iom_rp0d, iom_rp1d, iom_rp2d, iom_rp3d 38 36 END INTERFACE 39 37 40 INTEGER , PRIVATE:: iom_init = 0 !38 INTEGER :: iom_init = 0 ! 41 39 !!---------------------------------------------------------------------- 42 40 !! OPA 9.0 , LOCEAN-IPSL (2006) … … 62 60 CHARACTER(LEN=100) :: cltmpn ! tempory name to store clname (in writting mode) 63 61 CHARACTER(LEN=10) :: clsuffix ! ".nc" or ".dimg" 64 CHARACTER(LEN=1 0) :: clcpu ! the cpu number (max jpmax_digits digits)62 CHARACTER(LEN=15) :: clcpu ! the cpu number (max jpmax_digits digits) 65 63 CHARACTER(LEN=100) :: clinfo ! info character 66 64 LOGICAL :: llok ! check the existence … … 290 288 !! INTERFACE iom_get 291 289 !!---------------------------------------------------------------------- 292 SUBROUTINE iom_g et_0d( kiomid, cdvar, pvar )290 SUBROUTINE iom_g0d( kiomid, cdvar, pvar ) 293 291 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 294 292 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable … … 304 302 CASE (jprstdimg) ; CALL iom_rstdimg_get( kiomid, idvar, pvar ) 305 303 CASE DEFAULT 306 CALL ctl_stop( 'iom_g et_0d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' )304 CALL ctl_stop( 'iom_g0d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' ) 307 305 END SELECT 308 306 END IF 309 END SUBROUTINE iom_g et_0d310 311 SUBROUTINE iom_g et_1d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount )307 END SUBROUTINE iom_g0d 308 309 SUBROUTINE iom_g1d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 312 310 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 313 311 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read … … 320 318 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom , cdvar , pv_r1d=pvar, & 321 319 & ktime=ktime, kstart=kstart, kcount=kcount ) 322 END SUBROUTINE iom_g et_1d323 324 SUBROUTINE iom_g et_2d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount )320 END SUBROUTINE iom_g1d 321 322 SUBROUTINE iom_g2d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 325 323 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 326 324 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read … … 333 331 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom , cdvar , pv_r2d=pvar, & 334 332 & ktime=ktime, kstart=kstart, kcount=kcount ) 335 END SUBROUTINE iom_g et_2d336 337 SUBROUTINE iom_g et_3d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount )333 END SUBROUTINE iom_g2d 334 335 SUBROUTINE iom_g3d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 338 336 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 339 337 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read … … 346 344 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom , cdvar , pv_r3d=pvar, & 347 345 & ktime=ktime, kstart=kstart, kcount=kcount ) 348 END SUBROUTINE iom_g et_3d346 END SUBROUTINE iom_g3d 349 347 !!---------------------------------------------------------------------- 350 348 … … 607 605 IF( zofs /= 0. ) pv_r1d(:) = pv_r1d(:) + zofs 608 606 ELSEIF( PRESENT(pv_r2d) ) THEN 609 607 !CDIR COLLAPSE 610 608 IF( zscf /= 1.) pv_r2d(:,:) = pv_r2d(:,:) * zscf 611 609 !CDIR COLLAPSE 612 610 IF( zofs /= 0.) pv_r2d(:,:) = pv_r2d(:,:) + zofs 613 611 ELSEIF( PRESENT(pv_r3d) ) THEN 614 612 !CDIR COLLAPSE 615 613 IF( zscf /= 1.) pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf 616 614 !CDIR COLLAPSE 617 615 IF( zofs /= 0.) pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs 618 616 ENDIF … … 672 670 !! INTERFACE iom_rstput 673 671 !!---------------------------------------------------------------------- 674 SUBROUTINE iom_r stput_0d( kt, kwrite, kiomid, cdvar, pvar, ktype )672 SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 675 673 INTEGER , INTENT(in) :: kt ! ocean time-step 676 674 INTEGER , INTENT(in) :: kwrite ! writing time-step … … 687 685 CASE (jprstdimg) ; IF( kt == kwrite ) CALL iom_rstdimg_rstput( kiomid, cdvar, pvar ) 688 686 CASE DEFAULT 689 CALL ctl_stop( 'iom_r stput_0d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' )687 CALL ctl_stop( 'iom_rp0d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' ) 690 688 END SELECT 691 689 END IF 692 END SUBROUTINE iom_r stput_0d693 694 SUBROUTINE iom_r stput_1d( kt, kwrite, kiomid, cdvar, pvar, ktype )690 END SUBROUTINE iom_rp0d 691 692 SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 695 693 INTEGER , INTENT(in) :: kt ! ocean time-step 696 694 INTEGER , INTENT(in) :: kwrite ! writing time-step … … 707 705 CASE (jprstdimg) ; IF( kt == kwrite ) CALL iom_rstdimg_rstput( kiomid, cdvar, pv_r1d = pvar ) 708 706 CASE DEFAULT 709 CALL ctl_stop( 'iom_r stput_1d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' )707 CALL ctl_stop( 'iom_rp1d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' ) 710 708 END SELECT 711 709 END IF 712 END SUBROUTINE iom_r stput_1d713 714 SUBROUTINE iom_r stput_2d( kt, kwrite, kiomid, cdvar, pvar, ktype )710 END SUBROUTINE iom_rp1d 711 712 SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 715 713 INTEGER , INTENT(in) :: kt ! ocean time-step 716 714 INTEGER , INTENT(in) :: kwrite ! writing time-step … … 727 725 CASE (jprstdimg) ; IF( kt == kwrite ) CALL iom_rstdimg_rstput( kiomid, cdvar, pv_r2d = pvar ) 728 726 CASE DEFAULT 729 CALL ctl_stop( 'iom_r stput_2d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' )727 CALL ctl_stop( 'iom_rp2d: accepted IO library are only jpioipsl, jpnf90 and jprstdimg' ) 730 728 END SELECT 731 729 END IF 732 END SUBROUTINE iom_r stput_2d733 734 SUBROUTINE iom_r stput_3d( kt, kwrite, kiomid, cdvar, pvar, ktype )730 END SUBROUTINE iom_rp2d 731 732 SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 735 733 INTEGER , INTENT(in) :: kt ! ocean time-step 736 734 INTEGER , INTENT(in) :: kwrite ! writing time-step … … 747 745 CASE (jprstdimg) ; IF( kt == kwrite ) CALL iom_rstdimg_rstput( kiomid, cdvar, pv_r3d = pvar ) 748 746 CASE DEFAULT 749 CALL ctl_stop( 'iom_r stput_3d: accepted IO library are only jpioipsl and jprstdimg' )747 CALL ctl_stop( 'iom_rp3d: accepted IO library are only jpioipsl and jprstdimg' ) 750 748 END SELECT 751 749 END IF 752 END SUBROUTINE iom_r stput_3d750 END SUBROUTINE iom_rp3d 753 751 !!---------------------------------------------------------------------- 754 752 -
trunk/NEMO/OPA_SRC/IOM/iom_def.F90
r547 r550 39 39 INTEGER, PARAMETER, PUBLIC :: jpmax_digits = 5 !: maximum number of digits for the cpu number in the file name 40 40 41 41 !$AGRIF_DO_NOT_TREAT 42 42 TYPE, PUBLIC :: flio_file 43 43 CHARACTER(LEN=240) :: name !: name of the file … … 56 56 END TYPE flio_file 57 57 TYPE(flio_file), DIMENSION(jpmax_files), PUBLIC :: iom_file !: array containing the info for all opened files 58 58 !$AGRIF_END_DO_NOT_TREAT 59 59 60 60 !!===================================================================== -
trunk/NEMO/OPA_SRC/IOM/iom_ioipsl.F90
r547 r550 20 20 USE dom_oce ! ocean space and time domain 21 21 USE lbclnk ! lateal boundary condition / mpp exchanges 22 23 24 22 USE ioipsl ! IOIPSL library 25 USE iom_def !26 23 27 24 IMPLICIT NONE … … 31 28 32 29 INTERFACE iom_ioipsl_get 33 MODULE PROCEDURE iom_ioipsl_g et_0d, iom_ioipsl_get_123d30 MODULE PROCEDURE iom_ioipsl_g0d, iom_ioipsl_g123d 34 31 END INTERFACE 35 32 INTERFACE iom_ioipsl_rstput 36 MODULE PROCEDURE iom_ioipsl_r stput_0123d33 MODULE PROCEDURE iom_ioipsl_rp0123d 37 34 END INTERFACE 38 35 !!---------------------------------------------------------------------- … … 79 76 iln = INDEX( cdname, '.nc' ) 80 77 IF( ldwrt ) THEN ! the file should be open in write mode so we create it... 81 ! define the domain position regarding to the global domain (mainly useful in mpp) 82 CALL flio_dom_set( jpnij, narea-1, (/1, 2/), (/jpiglo, jpjglo/) & 83 & , kdompar(:,1), kdompar(:,2), kdompar(:,3), kdompar(:,4), kdompar(:,5) & 84 & , 'BOX', ifliodom ) 85 ! Note that fliocrfd may change the value of cdname (add the cpu number...) 86 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' create new file: '//cdname(1:iln-1)//'... in WRITE mode' 87 CALL fliocrfd( cdname, (/'x' , 'y' , 'z', 't'/) & 88 & , (/kdompar(1,1), kdompar(2,1), jpk, -1 /) & 89 & , ioipslid, ifliodom ) 78 IF( jpnij > 1 ) THEN 79 ! define the domain position regarding to the global domain (mainly useful in mpp) 80 CALL flio_dom_set( jpnij, narea-1, (/1, 2/), (/jpiglo, jpjglo/) & 81 & , kdompar(:,1), kdompar(:,2), kdompar(:,3), kdompar(:,4), kdompar(:,5) & 82 & , 'BOX', ifliodom ) 83 ! Note that fliocrfd may change the value of cdname (add the cpu number...) 84 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' create new file: '//cdname(1:iln-1)//'... in WRITE mode' 85 CALL fliocrfd( cdname, (/'x' , 'y' , 'z', 't'/) & 86 & , (/kdompar(1,1), kdompar(2,1), jpk, -1 /), ioipslid, ifliodom ) 87 ELSE ! the file should be open for read mode so it must exist... 88 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' create new file: '//cdname//' in WRITE mode' 89 CALL fliocrfd( cdname, (/'x' , 'y' , 'z', 't'/) & 90 & , (/kdompar(1,1), kdompar(2,1), jpk, -1 /), ioipslid ) 91 ENDIF 90 92 ELSE ! the file should be open for read mode so it must exist... 91 93 CALL ctl_stop( TRIM(clinfo), 'File '//cdname(1:iln-1)//'* not found' ) … … 195 197 196 198 197 SUBROUTINE iom_ioipsl_g et_0d( kiomid, kvid, pvar )198 !!----------------------------------------------------------------------- 199 !! *** ROUTINE iom_ioipsl_g et_0d ***199 SUBROUTINE iom_ioipsl_g0d( kiomid, kvid, pvar ) 200 !!----------------------------------------------------------------------- 201 !! *** ROUTINE iom_ioipsl_g0d *** 200 202 !! 201 203 !! ** Purpose : read a scalar with IOIPSL (only fliocom module) … … 207 209 CALL fliogetv( iom_file(kiomid)%nfid, TRIM(iom_file(kiomid)%cn_var(kvid)), pvar ) 208 210 ! 209 END SUBROUTINE iom_ioipsl_g et_0d210 211 212 SUBROUTINE iom_ioipsl_g et_123d( kiomid, kdom, kvid, knbdim, kstart, kcount, &211 END SUBROUTINE iom_ioipsl_g0d 212 213 214 SUBROUTINE iom_ioipsl_g123d( kiomid, kdom, kvid, knbdim, kstart, kcount, & 213 215 & pv_r1d, pv_r2d, pv_r3d) 214 216 !!----------------------------------------------------------------------- 215 !! *** ROUTINE iom_ioipsl_g et_123d ***217 !! *** ROUTINE iom_ioipsl_g123d *** 216 218 !! 217 219 !! ** Purpose : read a 1D/2D/3D variable with IOIPSL (only fliocom module) … … 263 265 ! 264 266 ! 265 END SUBROUTINE iom_ioipsl_g et_123d267 END SUBROUTINE iom_ioipsl_g123d 266 268 267 269 … … 283 285 284 286 285 SUBROUTINE iom_ioipsl_r stput_0123d( kt, kwrite, kiomid, cdvar , kvid , ktype, &287 SUBROUTINE iom_ioipsl_rp0123d( kt, kwrite, kiomid, cdvar , kvid , ktype, & 286 288 & pv_r0d, pv_r1d, pv_r2d, pv_r3d ) 287 289 !!-------------------------------------------------------------------- … … 311 313 !--------------------------------------------------------------------- 312 314 ! 313 clinfo = ' iom_ioipsl_r stput_0123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar)315 clinfo = ' iom_ioipsl_rp0123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar) 314 316 ioipslid = iom_file(kiomid)%nfid 315 317 ! … … 395 397 ix1 = 1 ; ix2 = jpi ; iy1 = 1 ; iy2 = jpj 396 398 ELSE 397 CALL ctl_stop( 'iom_ioipsl_r stput_0123d: should have been an impossible case...' )399 CALL ctl_stop( 'iom_ioipsl_rp0123d: should have been an impossible case...' ) 398 400 ENDIF 399 401 … … 423 425 ENDIF 424 426 ! 425 END SUBROUTINE iom_ioipsl_r stput_0123d427 END SUBROUTINE iom_ioipsl_rp0123d 426 428 427 429 -
trunk/NEMO/OPA_SRC/IOM/iom_nf90.F90
r547 r550 20 20 USE dom_oce ! ocean space and time domain 21 21 USE lbclnk ! lateal boundary condition / mpp exchanges 22 23 24 22 USE netcdf ! NetCDF library 25 USE iom_def !26 23 27 24 IMPLICIT NONE … … 31 28 32 29 INTERFACE iom_nf90_get 33 MODULE PROCEDURE iom_nf90_g et_0d, iom_nf90_get_123d30 MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 34 31 END INTERFACE 35 32 INTERFACE iom_nf90_rstput 36 MODULE PROCEDURE iom_nf90_r stput_0123d33 MODULE PROCEDURE iom_nf90_rp0123d 37 34 END INTERFACE 38 35 !!---------------------------------------------------------------------- … … 81 78 iln = INDEX( cdname, '.nc' ) 82 79 IF( ldwrt ) THEN ! the file should be open in write mode so we create it... 83 WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.nc' 84 cdname = TRIM(cltmp) 80 IF( jpnij > 1 ) THEN 81 WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.nc' 82 cdname = TRIM(cltmp) 83 ENDIF 85 84 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' create new file: '//TRIM(cdname)//' in WRITE mode' 86 85 CALL iom_nf90_check(NF90_CREATE( TRIM(cdname), NF90_NOCLOBBER, if90id ), clinfo) … … 208 207 209 208 210 SUBROUTINE iom_nf90_g et_0d( kiomid, kvid, pvar )211 !!----------------------------------------------------------------------- 212 !! *** ROUTINE iom_nf90_g et_0d ***209 SUBROUTINE iom_nf90_g0d( kiomid, kvid, pvar ) 210 !!----------------------------------------------------------------------- 211 !! *** ROUTINE iom_nf90_g0d *** 213 212 !! 214 213 !! ** Purpose : read a scalar with NF90 … … 220 219 CHARACTER(LEN=100) :: clinfo ! info character 221 220 !--------------------------------------------------------------------- 222 clinfo = 'iom_nf90_g et_0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid))221 clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 223 222 CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar), clinfo ) 224 223 ! 225 END SUBROUTINE iom_nf90_g et_0d226 227 228 SUBROUTINE iom_nf90_g et_123d( kiomid, kdom, kvid, knbdim, kstart, kcount, &224 END SUBROUTINE iom_nf90_g0d 225 226 227 SUBROUTINE iom_nf90_g123d( kiomid, kdom, kvid, knbdim, kstart, kcount, & 229 228 & pv_r1d, pv_r2d, pv_r3d) 230 229 !!----------------------------------------------------------------------- 231 !! *** ROUTINE iom_nf90_g et_123d ***230 !! *** ROUTINE iom_nf90_g123d *** 232 231 !! 233 232 !! ** Purpose : read a 1D/2D/3D variable with NF90 … … 249 248 INTEGER :: ivid ! nf90 variable id 250 249 !--------------------------------------------------------------------- 251 clinfo = 'iom_nf90_g et_123d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid))250 clinfo = 'iom_nf90_g123d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 252 251 if90id = iom_file(kiomid)%nfid ! get back NetCDF file id 253 252 ivid = iom_file(kiomid)%nvid(kvid) ! get back NetCDF var id … … 281 280 ENDIF 282 281 ! 283 END SUBROUTINE iom_nf90_g et_123d282 END SUBROUTINE iom_nf90_g123d 284 283 285 284 … … 303 302 304 303 305 SUBROUTINE iom_nf90_r stput_0123d( kt, kwrite, kiomid, cdvar , kvid , ktype, &304 SUBROUTINE iom_nf90_rp0123d( kt, kwrite, kiomid, cdvar , kvid , ktype, & 306 305 & pv_r0d, pv_r1d, pv_r2d, pv_r3d ) 307 306 !!-------------------------------------------------------------------- … … 334 333 !--------------------------------------------------------------------- 335 334 ! 336 clinfo = ' iom_nf90_r stput_0123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar)335 clinfo = ' iom_nf90_rp0123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar) 337 336 if90id = iom_file(kiomid)%nfid 338 337 ! … … 428 427 ix1 = 1 ; ix2 = jpi ; iy1 = 1 ; iy2 = jpj 429 428 ELSE 430 CALL ctl_stop( 'iom_nf90_r stput_0123d: should have been an impossible case...' )429 CALL ctl_stop( 'iom_nf90_rp0123d: should have been an impossible case...' ) 431 430 ENDIF 432 431 … … 464 463 ENDIF 465 464 ! 466 END SUBROUTINE iom_nf90_r stput_0123d465 END SUBROUTINE iom_nf90_rp0123d 467 466 468 467 -
trunk/NEMO/OPA_SRC/IOM/iom_rstdimg.F90
r547 r550 19 19 USE lbclnk ! lateal boundary condition / mpp exchanges 20 20 21 USE iom_def !22 23 21 IMPLICIT NONE 24 22 PRIVATE … … 27 25 28 26 INTERFACE iom_rstdimg_get 29 MODULE PROCEDURE iom_rstdimg_g et_0d, iom_rstdimg_get_123d27 MODULE PROCEDURE iom_rstdimg_g0d, iom_rstdimg_g123d 30 28 END INTERFACE 31 29 INTERFACE iom_rstdimg_rstput 32 MODULE PROCEDURE iom_rstdimg_r stput_0d, iom_rstdimg_rstput_123d30 MODULE PROCEDURE iom_rstdimg_rp0d, iom_rstdimg_rp123d 33 31 END INTERFACE 34 32 !!---------------------------------------------------------------------- … … 61 59 INTEGER :: ios ! IO status 62 60 INTEGER :: ivnum ! number of variables 61 INTEGER :: ishft ! counter shift 63 62 INTEGER :: inx, iny, inz ! x,y,z dimension of the variable 64 INTEGER :: in0d, in 2d, in3d ! number of 0/2/3D variables63 INTEGER :: in0d, in1d, in2d, in3d ! number of 0/1/2/3D variables 65 64 INTEGER :: ipni, ipnj, ipnij, iarea ! domain decomposition 66 CHARACTER(LEN=8), DIMENSION(jpmax_vars) :: clna0d, clna 2d, clna3d ! name of 0/2/3D variables67 REAL(wp), DIMENSION(jpmax_vars) :: zval0d, zval 2d, zval3d ! value of 0d variables or68 ! ! record position for2/3D variables65 CHARACTER(LEN=8), DIMENSION(jpmax_vars) :: clna0d, clna1d, clna2d, clna3d ! name of 0/1/2/3D variables 66 REAL(wp), DIMENSION(jpmax_vars) :: zval0d, zval1d, zval2d, zval3d ! value of 0d variables or record 67 ! ! position for 1/2/3D variables 69 68 !--------------------------------------------------------------------- 70 69 … … 83 82 ! find the record length 84 83 OPEN( idrst, FILE = TRIM(cdname), FORM = 'unformatted', ACCESS = 'direct' & 85 &, RECL = 8, STATUS = 'old', ACTION = 'read', IOSTAT = ios, ERR = 987 )84 & , RECL = 8, STATUS = 'old', ACTION = 'read', IOSTAT = ios, ERR = 987 ) 86 85 READ( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8 87 86 CLOSE( idrst ) … … 90 89 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' open existing file: '//TRIM(cdname)//' in READWRITE mode' 91 90 OPEN( idrst, FILE = TRIM(cdname), FORM = 'unformatted', ACCESS = 'direct' & 92 &, RECL = irecl8, STATUS = 'old', ACTION = 'readwrite', IOSTAT = ios, ERR = 987 )91 & , RECL = irecl8, STATUS = 'old', ACTION = 'readwrite', IOSTAT = ios, ERR = 987 ) 93 92 ELSE ! ... in read mode 94 93 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' open existing file: '//TRIM(cdname)//' in READ mode' 95 94 OPEN( idrst, FILE = TRIM(cdname), FORM = 'unformatted', ACCESS = 'direct' & 96 &, RECL = irecl8, STATUS = 'old', ACTION = 'read' , IOSTAT = ios, ERR = 987 )95 & , RECL = irecl8, STATUS = 'old', ACTION = 'read' , IOSTAT = ios, ERR = 987 ) 97 96 ENDIF 98 97 ELSE ! the file does not exist … … 100 99 IF( ldwrt ) THEN ! the file should be open in readwrite mode so we create it... 101 100 irecl8= kdompar(1,1) * kdompar(2,1) * wp 102 WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.dimg' 103 cdname = TRIM(cltmp) 101 IF( jpnij > 1 ) THEN 102 WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.dimg' 103 cdname = TRIM(cltmp) 104 ENDIF 104 105 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' create new file: '//TRIM(cdname)//' in READWRITE mode' 105 106 OPEN( idrst, FILE = TRIM(cdname), FORM = 'UNFORMATTED', ACCESS = 'DIRECT' & 106 &, RECL = irecl8, STATUS = 'new', ACTION = 'readwrite', IOSTAT = ios, ERR = 987 )107 & , RECL = irecl8, STATUS = 'new', ACTION = 'readwrite', IOSTAT = ios, ERR = 987 ) 107 108 ELSE ! the file should be open for read mode so it must exist... 108 109 CALL ctl_stop( TRIM(clinfo), 'File '//cdname(1:iln-1)//'* not found' ) … … 112 113 ! ============= 113 114 IF( ldok ) THEN ! old file 114 READ( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz, in0d, in2d, in3d 115 READ( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz, in0d, in2d, in3d, & 116 & clna0d(1:in0d), zval0d(1:in0d), clna2d(1:in2d), zval2d(1:in2d), clna3d(1:in3d), zval3d(1:in3d), & 117 & ipni, ipnj, ipnij, iarea 115 READ( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz, in0d, in1d, in2d, in3d 116 READ( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz, in0d, in1d, in2d, in3d, & 117 & clna0d(1:in0d), zval0d(1:in0d), clna1d(1:in1d), zval1d(1:in1d), & 118 & clna2d(1:in2d), zval2d(1:in2d), clna3d(1:in3d), zval3d(1:in3d), & 119 & ipni, ipnj, ipnij, iarea 118 120 clinfo = TRIM(clinfo)//' file '//TRIM(cdname) 119 121 IF( inx /= kdompar(1,1) ) CALL ctl_stop( TRIM(clinfo), 'Mismatch in domain size in i direction' ) … … 135 137 IF( ldok ) THEN ! old file 136 138 ! read variables informations from the file header 137 ivnum = in0d + in2d + in3d 139 IF( TRIM(clna0d(1)) == 'no0d' ) in0d = 0 140 IF( TRIM(clna1d(1)) == 'no1d' ) in1d = 0 141 IF( TRIM(clna2d(1)) == 'no2d' ) in2d = 0 142 IF( TRIM(clna3d(1)) == 'no3d' ) in3d = 0 143 ivnum = in0d + in1d + in2d + in3d 138 144 iom_file(kiomid)%nvars = ivnum 139 iom_file(kiomid)%irec = 2 + in 2d + inz * in3d145 iom_file(kiomid)%irec = 2 + in1d + in2d + inz * in3d 140 146 iom_file(kiomid)%luld( 1:ivnum) = .FALSE. 141 147 iom_file(kiomid)%scf( 1:ivnum) = 1. … … 147 153 iom_file(kiomid)%ofs( jv) = zval0d(jv) ! warning: trick... we use ofs to store the value 148 154 END DO 155 ! 1d variable 156 ishft = in0d 157 DO jv = 1, in1d 158 iom_file(kiomid)%cn_var( ishft + jv) = TRIM(clna1d(jv)) 159 iom_file(kiomid)%nvid( ishft + jv) = zval1d(jv) 160 iom_file(kiomid)%ndims( ishft + jv) = 1 161 iom_file(kiomid)%dimsz(1 , ishft + jv) = jpk 162 iom_file(kiomid)%ofs( ishft + jv) = 0. 163 END DO 149 164 ! 2d variable 165 ishft = in0d + in1d 150 166 DO jv = 1, in2d 151 iom_file(kiomid)%cn_var( i n0d+ jv) = TRIM(clna2d(jv))152 iom_file(kiomid)%nvid( i n0d+ jv) = zval2d(jv)153 iom_file(kiomid)%ndims( i n0d+ jv) = 2154 iom_file(kiomid)%dimsz(1:2, i n0d+ jv) = (/ inx, iny /)155 iom_file(kiomid)%ofs( i n0d+ jv) = 0.167 iom_file(kiomid)%cn_var( ishft + jv) = TRIM(clna2d(jv)) 168 iom_file(kiomid)%nvid( ishft + jv) = zval2d(jv) 169 iom_file(kiomid)%ndims( ishft + jv) = 2 170 iom_file(kiomid)%dimsz(1:2, ishft + jv) = (/ inx, iny /) 171 iom_file(kiomid)%ofs( ishft + jv) = 0. 156 172 END DO 157 173 ! 3d variable 174 ishft = in0d + in1d + in2d 158 175 DO jv = 1, in3d 159 iom_file(kiomid)%cn_var( i n0d + in2d+ jv) = TRIM(clna3d(jv))160 iom_file(kiomid)%nvid( i n0d + in2d+ jv) = zval3d(jv)161 iom_file(kiomid)%ndims( i n0d + in2d+ jv) = 3162 iom_file(kiomid)%dimsz(1:3, i n0d + in2d+ jv) = (/ inx, iny, jpk /)163 iom_file(kiomid)%ofs( i n0d + in2d+ jv) = 0.176 iom_file(kiomid)%cn_var( ishft + jv) = TRIM(clna3d(jv)) 177 iom_file(kiomid)%nvid( ishft + jv) = zval3d(jv) 178 iom_file(kiomid)%ndims( ishft + jv) = 3 179 iom_file(kiomid)%dimsz(1:3, ishft + jv) = (/ inx, iny, jpk /) 180 iom_file(kiomid)%ofs( ishft + jv) = 0. 164 181 END DO 165 182 ELSE ! new file … … 171 188 ENDIF 172 189 987 CONTINUE 173 IF( ios /= 0 ) CALL ctl_stop( TRIM(clinfo), 'error in opening file '//TRIM(cdname) ) 190 IF( ios /= 0 ) THEN 191 WRITE(ctmp1,*) ' iostat = ', ios 192 CALL ctl_stop( TRIM(clinfo), ' error in opening file '//TRIM(cdname), ctmp1 ) 193 ENDIF 174 194 ! 175 195 END SUBROUTINE iom_rstdimg_open … … 191 211 INTEGER :: idrst ! file logical unit 192 212 INTEGER :: inx, iny, inz ! x,y,z dimension of the variable 193 INTEGER :: in0d, in 2d, in3d ! number of 0/2/3D variables194 CHARACTER(LEN=8), DIMENSION(jpmax_vars) :: clna0d, clna 2d, clna3d ! name of 0/2/3D variables195 REAL(wp), DIMENSION(jpmax_vars) :: zval0d, zval 2d, zval3d ! value of 0d variables or196 ! ! record position for2/3D variables213 INTEGER :: in0d, in1d, in2d, in3d ! number of 0/1/2/3D variables 214 CHARACTER(LEN=8), DIMENSION(jpmax_vars) :: clna0d, clna1d, clna2d, clna3d ! name of 0/1/2/3D variables 215 REAL(wp), DIMENSION(jpmax_vars) :: zval0d, zval1d, zval2d, zval3d ! value of 0d variables or record 216 ! ! position for 1/2/3D variables 197 217 !--------------------------------------------------------------------- 198 218 ! … … 206 226 READ( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz ! get back domain size 207 227 ivnum = iom_file(kiomid)%nvars 208 in0d = 0 ; in 2d = 0 ; in3d = 0228 in0d = 0 ; in1d = 0 ; in2d = 0 ; in3d = 0 209 229 DO jv = 1, ivnum ! loop on each variable to get its name and value/record position 210 230 SELECT CASE (iom_file(kiomid)%ndims(jv)) … … 213 233 clna0d(in0d) = TRIM(iom_file(kiomid)%cn_var(jv)) 214 234 zval0d(in0d) = iom_file(kiomid)%ofs(jv) ! warning: trick... we use ofs to store the value 235 CASE (1) ! 1d variable 236 in1d = in1d + 1 237 clna1d(in1d) = TRIM(iom_file(kiomid)%cn_var(jv)) 238 zval1d(in1d) = iom_file(kiomid)%nvid(jv) 215 239 CASE (2) ! 2d variable 216 240 in2d = in2d + 1 … … 221 245 clna3d(in3d) = TRIM(iom_file(kiomid)%cn_var(jv)) 222 246 zval3d(in3d) = iom_file(kiomid)%nvid(jv) 247 CASE DEFAULT ; CALL ctl_stop( TRIM(clinfo), 'Should not ne there...' ) 223 248 END SELECT 224 249 END DO 225 ! update teh file header before closing it 226 WRITE( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz, in0d, in2d, in3d, & 227 & clna0d(1:in0d), zval0d(1:in0d), clna2d(1:in2d), zval2d(1:in2d), clna3d(1:in3d), zval3d(1:in3d), & 228 & jpni, jpnj, jpnij, narea, jpiglo, jpjglo, & 229 & nlcit, nlcjt, nldit, nldjt, nleit, nlejt, nimppt, njmppt 250 ! force to have at least 1 valriable in each list (not necessary (?), but safer) 251 IF( in0d == 0 ) THEN ; in0d = 1 ; clna0d(1) = 'no0d' ; zval0d(1) = -1. ; ENDIF 252 IF( in1d == 0 ) THEN ; in1d = 1 ; clna1d(1) = 'no1d' ; zval1d(1) = -1. ; ENDIF 253 IF( in2d == 0 ) THEN ; in2d = 1 ; clna2d(1) = 'no2d' ; zval2d(1) = -1. ; ENDIF 254 IF( in3d == 0 ) THEN ; in3d = 1 ; clna3d(1) = 'no3d' ; zval3d(1) = -1. ; ENDIF 255 ! update the file header before closing it 256 WRITE( idrst, REC = 1, IOSTAT = ios, ERR = 987 ) irecl8, inx, iny, inz, in0d, in1d, in2d, in3d, & 257 & clna0d(1:in0d), zval0d(1:in0d), clna1d(1:in1d), zval1d(1:in1d), & 258 & clna2d(1:in2d), zval2d(1:in2d), clna3d(1:in3d), zval3d(1:in3d), & 259 & jpni, jpnj, jpnij, narea, jpiglo, jpjglo, nlcit, nlcjt, nldit, nldjt, nleit, nlejt, nimppt, njmppt 230 260 ELSE 231 261 ios = 0 ! we cannot write in the file … … 234 264 CLOSE( idrst, IOSTAT = ios, ERR = 987 ) 235 265 987 CONTINUE 236 IF( ios /= 0 ) CALL ctl_stop( TRIM(clinfo), 'error when updating the header of '//TRIM(iom_file(kiomid)%name) ) 266 IF( ios /= 0 ) THEN 267 WRITE(ctmp1,*) ' iostat = ', ios 268 CALL ctl_stop( TRIM(clinfo), & 269 & ' error when updating the header of '//TRIM(iom_file(kiomid)%name), ctmp1 ) 270 ENDIF 237 271 ! 238 272 END SUBROUTINE iom_rstdimg_close 239 273 240 274 241 SUBROUTINE iom_rstdimg_g et_0d( kiomid, kvid, pvar )275 SUBROUTINE iom_rstdimg_g0d( kiomid, kvid, pvar ) 242 276 !!----------------------------------------------------------------------- 243 !! *** ROUTINE iom_rstdimg_g et_0d ***277 !! *** ROUTINE iom_rstdimg_g0d *** 244 278 !! 245 279 !! ** Purpose : read a scalar with RSTDIMG … … 252 286 pvar = iom_file(kiomid)%ofs(kvid) ! warning: trick... we use ofs to store the value 253 287 ! 254 END SUBROUTINE iom_rstdimg_g et_0d255 256 257 SUBROUTINE iom_rstdimg_r stput_0d( kiomid, cdvar, pv_r0d )288 END SUBROUTINE iom_rstdimg_g0d 289 290 291 SUBROUTINE iom_rstdimg_rp0d( kiomid, cdvar, pv_r0d ) 258 292 !!-------------------------------------------------------------------- 259 293 !! *** SUBROUTINE iom_rstdimg_rstput *** … … 269 303 !--------------------------------------------------------------------- 270 304 ! 271 clinfo = ' iom_rstdimg_r stput_0d ~~~ '305 clinfo = ' iom_rstdimg_rp0d ~~~ ' 272 306 idvar = iom_file(kiomid)%nvars + 1 273 307 IF( idvar <= jpmax_vars ) THEN … … 282 316 CALL ctl_stop( TRIM(clinfo), 'increase the value of jpmax_vars' ) 283 317 ENDIF 284 END SUBROUTINE iom_rstdimg_r stput_0d285 286 287 SUBROUTINE iom_rstdimg_g et_123d( kiomid, kdom , kvid , kstart, kcount, &288 & 318 END SUBROUTINE iom_rstdimg_rp0d 319 320 321 SUBROUTINE iom_rstdimg_g123d( kiomid, kdom , kvid , kstart, kcount, & 322 & pv_r1d, pv_r2d, pv_r3d ) 289 323 !!----------------------------------------------------------------------- 290 !! *** ROUTINE iom_rstdimg_g et_123d ***324 !! *** ROUTINE iom_rstdimg_g123d *** 291 325 !! 292 326 !! ** Purpose : read a 1D/2D/3D variable with RSTDIMG … … 310 344 INTEGER :: ix1, ix2, iy1, iy2 ! subdomain indexes 311 345 !--------------------------------------------------------------------- 312 clinfo = ' iom_rstdimg_g et_123d ~~~ '346 clinfo = ' iom_rstdimg_g123d ~~~ ' 313 347 ! 314 348 istop = nstop ! store the actual value of nstop … … 341 375 DO jk = 1, iom_file(kiomid)%dimsz(3,kvid) ! do loop on each level 342 376 READ( idrst, REC = iom_file(kiomid)%nvid(kvid) + jk - 1, IOSTAT = ios, ERR = 987 ) & 343 & 377 & pv_r3d( ix1:ix2, iy1:iy2, jk ) 344 378 END DO 345 379 SELECT CASE (kdom) … … 360 394 ENDIF 361 395 987 CONTINUE 362 IF( ios /= 0 ) CALL ctl_stop( TRIM(clinfo) ) 363 ! 364 END SUBROUTINE iom_rstdimg_get_123d 365 366 367 SUBROUTINE iom_rstdimg_rstput_123d( kiomid, cdvar, pv_r1d, pv_r2d, pv_r3d ) 396 IF( ios /= 0 ) THEN 397 WRITE(ctmp1,*) ' iostat = ', ios 398 CALL ctl_stop( TRIM(clinfo), ' IO error with file '//TRIM(iom_file(kiomid)%name), ctmp1 ) 399 ENDIF 400 ! 401 END SUBROUTINE iom_rstdimg_g123d 402 403 404 SUBROUTINE iom_rstdimg_rp123d( kiomid, cdvar, pv_r1d, pv_r2d, pv_r3d ) 368 405 !!-------------------------------------------------------------------- 369 406 !! *** SUBROUTINE iom_rstdimg_rstput *** … … 389 426 !--------------------------------------------------------------------- 390 427 ! 391 clinfo = ' iom_rstdimg_r stput_123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar)428 clinfo = ' iom_rstdimg_rp123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar) 392 429 istop = nstop ! store the actual value of nstop 393 430 irec = iom_file(kiomid)%irec ! get back the record number of the variable … … 424 461 iom_file(kiomid)%irec = irec + 1 425 462 iom_file(kiomid)%ndims( idvar) = 1 426 iom_file(kiomid)%dimsz(1 :2, idvar) = inz463 iom_file(kiomid)%dimsz(1 , idvar) = inz 427 464 ELSEIF( PRESENT(pv_r2d) ) THEN 428 465 iom_file(kiomid)%irec = irec + 1 … … 441 478 ENDIF 442 479 987 CONTINUE 443 IF( ios /= 0 ) THEN ; CALL ctl_stop( TRIM(clinfo) ) 444 ELSE ; IF(lwp) WRITE(numout,*) TRIM(clinfo)//' written ok' 480 IF( ios /= 0 ) THEN 481 WRITE(ctmp1,*) ' iostat = ', ios 482 CALL ctl_stop( TRIM(clinfo), ' IO error with file '//TRIM(iom_file(kiomid)%name), ctmp1 ) 483 ELSE 484 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' written ok' 445 485 ENDIF 446 486 ! 447 END SUBROUTINE iom_rstdimg_r stput_123d487 END SUBROUTINE iom_rstdimg_rp123d 448 488 449 489
Note: See TracChangeset
for help on using the changeset viewer.