New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 975 for trunk/NEMO/OFF_SRC/IOM/iom_ioipsl.F90 – NEMO

Ignore:
Timestamp:
2008-05-15T16:10:33+02:00 (16 years ago)
Author:
cetlod
Message:

Update IOM modules, see ticket 150

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OFF_SRC/IOM/iom_ioipsl.F90

    r719 r975  
    66   !! History :  9.0  ! 05 12  (J. Belier) Original code 
    77   !!            9.0  ! 06 02  (S. Masson) Adaptation to NEMO 
     8   !!             "   ! 07 07  (D. Storkey) Changes to iom_ioipsl_gettime 
    89   !!-------------------------------------------------------------------- 
    910   !!gm  caution add !DIR nec: improved performance to be checked as well as no result changes 
     
    1920   USE in_out_manager  ! I/O manager 
    2021   USE dom_oce         ! ocean space and time domain 
    21    USE lbclnk          ! lateal boundary condition / mpp exchanges 
    2222   USE iom_def         ! iom variables definitions 
    2323   USE ioipsl          ! IOIPSL library 
     
    3636   !!---------------------------------------------------------------------- 
    3737   !!  OPA 9.0 , LOCEAN-IPSL (2006) 
    38    !! $Header$ 
     38   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/OPA_SRC/IOM/iom_ioipsl.F90,v 1.8 2007/06/29 14:10:50 opalod Exp $ 
    3939   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    4040   !!---------------------------------------------------------------------- 
     
    4848      !! ** Purpose :  open an input file with IOIPSL (only fliocom module) 
    4949      !!--------------------------------------------------------------------- 
    50       CHARACTER(len=*)       , INTENT(inout) ::   cdname    ! File name 
    51       INTEGER                , INTENT(  out) ::   kiomid    ! ioipsl identifier of the opened file 
    52       LOGICAL                , INTENT(in   ) ::   ldwrt     ! read or write the file? 
    53       LOGICAL                , INTENT(in   ) ::   ldok      ! check the existence  
    54       INTEGER, DIMENSION(2,5), INTENT(in   ) ::   kdompar   ! domain parameters:  
     50      CHARACTER(len=*)       , INTENT(inout)           ::   cdname    ! File name 
     51      INTEGER                , INTENT(  out)           ::   kiomid    ! ioipsl identifier of the opened file 
     52      LOGICAL                , INTENT(in   )           ::   ldwrt     ! read or write the file? 
     53      LOGICAL                , INTENT(in   )           ::   ldok      ! check the existence  
     54      INTEGER, DIMENSION(2,5), INTENT(in   ), OPTIONAL ::   kdompar   ! domain parameters:  
    5555 
    5656      CHARACTER(LEN=100) ::   clinfo     ! info character 
     
    5959      INTEGER            ::   ifliodom   ! model domain identifier (see flio_dom_set) 
    6060      INTEGER            ::   ioipslid   ! ioipsl identifier of the opened file 
     61      INTEGER            ::   jl         ! loop variable 
    6162      !--------------------------------------------------------------------- 
    6263 
     
    9293            ENDIF 
    9394         ELSE              ! the file should be open for read mode so it must exist... 
    94             CALL ctl_stop( TRIM(clinfo), 'File '//cdname(1:iln-1)//'* not found' ) 
     95            CALL ctl_stop( TRIM(clinfo), ' should be impossible case...' ) 
    9596         ENDIF 
    9697      ENDIF 
     
    9899      ! ============= 
    99100      IF( istop == nstop ) THEN   ! no error within this routine 
    100          kiomid = MINLOC(iom_file(:)%nfid, dim = 1) 
     101!does not work with some compilers         kiomid = MINLOC(iom_file(:)%nfid, dim = 1) 
     102         kiomid = 0 
     103         DO jl = jpmax_files, 1, -1 
     104            IF( iom_file(jl)%nfid == 0 )   kiomid = jl 
     105         ENDDO 
    101106         iom_file(kiomid)%name   = TRIM(cdname) 
    102107         iom_file(kiomid)%nfid   = ioipslid 
     
    161166                  &           len_dims = iom_file(kiomid)%dimsz(1:i_nvd,kiv), &   ! dimensions size 
    162167                  &           id_dims  = idimid(1:i_nvd) )                        ! dimensions ids 
    163             DO ji = 1, i_nvd   ! find the unlimited dimension 
     168            iom_file(kiomid)%luld(kiv) = .FALSE.   ! default value 
     169            DO ji = 1, i_nvd                       ! find the unlimited dimension 
    164170               IF( idimid(ji) == iom_file(kiomid)%iduld ) iom_file(kiomid)%luld(kiv) = .TRUE. 
    165171            END DO 
    166             !---------- Deal with scale_factor and offset 
     172            !---------- Deal with scale_factor and add_offset 
    167173            CALL flioinqa( ioipslid, cdvar, 'scale_factor', ll_fnd ) 
    168174            IF( ll_fnd) THEN 
     
    171177               iom_file(kiomid)%scf(kiv) = 1. 
    172178            END IF 
    173             CALL flioinqa( ioipslid, cdvar, 'offset', ll_fnd ) 
     179            CALL flioinqa( ioipslid, cdvar, 'add_offset', ll_fnd ) 
    174180            IF( ll_fnd ) THEN 
    175                CALL fliogeta( ioipslid, cdvar, 'offset', iom_file(kiomid)%ofs(kiv) ) 
     181               CALL fliogeta( ioipslid, cdvar, 'add_offset', iom_file(kiomid)%ofs(kiv) ) 
    176182            ELSE 
    177183               iom_file(kiomid)%ofs(kiv) = 0. 
     
    190196                  &                       'increase the parameter jpmax_vars') 
    191197         ENDIF 
    192 !!$                  ELSE   
    193 !!$                     CALL ctl_warn( trim(clinfo), 'Variable '//trim(cdvar)// & 
    194 !!$                        &                         ' is not found in the file '//trim(iom_file(kiomid)%name) ) 
     198      ELSE   
     199         iom_ioipsl_varid = -1   !   variable not found, return error code: -1 
    195200      ENDIF 
    196201      ! 
     
    213218 
    214219 
    215    SUBROUTINE iom_ioipsl_g123d( kiomid, kdom, kvid, knbdim, kstart, kcount,    & 
    216          &                          pv_r1d, pv_r2d, pv_r3d) 
     220   SUBROUTINE iom_ioipsl_g123d( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2,   & 
     221         &                      pv_r1d, pv_r2d, pv_r3d) 
    217222      !!----------------------------------------------------------------------- 
    218223      !!                  ***  ROUTINE  iom_ioipsl_g123d  *** 
     
    223228      !!----------------------------------------------------------------------- 
    224229      INTEGER                    , INTENT(in   )           ::   kiomid     ! iom identifier of the file 
    225       INTEGER                    , INTENT(in   )           ::   kdom       ! Type of domain to be read 
    226230      INTEGER                    , INTENT(in   )           ::   kvid       ! Name of the variable 
    227231      INTEGER                    , INTENT(in   )           ::   knbdim     ! number of dimensions of the variable 
    228232      INTEGER , DIMENSION(:)     , INTENT(in   )           ::   kstart     ! start position of the reading in each axis  
    229233      INTEGER , DIMENSION(:)     , INTENT(in   )           ::   kcount     ! number of points to be read in each axis 
     234      INTEGER ,                    INTENT(in   )           ::   kx1, kx2, ky1, ky2   ! subdomain indexes 
    230235      REAL(wp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pv_r1d     ! read field (1D case) 
    231236      REAL(wp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pv_r2d     ! read field (2D case) 
     
    235240      CHARACTER(LEN=100)    ::   clvn       ! variable name 
    236241      !--------------------------------------------------------------------- 
    237       clvn = TRIM(iom_file(kiomid)%cn_var(kvid)) 
    238       ioipslid = iom_file(kiomid)%nfid 
     242      clvn = TRIM(iom_file(kiomid)%cn_var(kvid))   ! get back variable name  
     243      ioipslid = iom_file(kiomid)%nfid             ! get back IPIPSL file id 
    239244      ! 
    240245      IF( PRESENT(pv_r1d) ) THEN 
    241          CALL fliogetv( ioipslid, clvn, pv_r1d(:), start=kstart(1:knbdim), count=kcount(1:knbdim) ) 
     246         CALL fliogetv( ioipslid, clvn, pv_r1d(:                ), start = kstart(1:knbdim), count = kcount(1:knbdim) ) 
    242247      ELSEIF( PRESENT(pv_r2d) ) THEN 
    243          IF( kdom /= jpdom_unknown ) THEN 
    244             CALL fliogetv( ioipslid, clvn, pv_r2d(nldi:nlei,nldj:nlej), start=kstart(1:knbdim), count=kcount(1:knbdim) ) 
    245             !--- Fill the overlap areas and extra hallows (mpp) 
    246             CALL lbc_lnk (pv_r2d,'Z',-999.,'no0') 
    247          ELSE 
    248             CALL fliogetv( ioipslid, clvn, pv_r2d(:,:), start=kstart(1:knbdim), count=kcount(1:knbdim) ) 
    249          ENDIF 
     248         CALL fliogetv( ioipslid, clvn, pv_r2d(kx1:kx2,ky1:ky2  ), start = kstart(1:knbdim), count = kcount(1:knbdim) ) 
    250249      ELSEIF( PRESENT(pv_r3d) ) THEN 
    251          IF( kdom /= jpdom_unknown ) THEN 
    252             CALL fliogetv( ioipslid, clvn, pv_r3d(nldi:nlei,nldj:nlej,:), start=kstart(1:knbdim),   & 
    253                   &                                                         count=kcount  (1:knbdim) ) 
    254             !--- Fill the overlap areas and extra hallows (mpp) 
    255             ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 
    256             IF( kcount(3) == jpk ) THEN 
    257                CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
    258             ELSE   ! put some arbitrary value (a call to lbc_lnk will be done later...) 
    259                pv_r3d(nlei+1:jpi,      :   ,:) = 1.             
    260                pv_r3d(      :   ,nlej+1:jpj,:) = 1.             
    261             ENDIF 
    262          ELSE 
    263             CALL fliogetv( ioipslid, clvn, pv_r3d(:,:,:), start=kstart(1:knbdim), count=kcount(1:knbdim) ) 
    264          ENDIF 
     250         CALL fliogetv( ioipslid, clvn, pv_r3d(kx1:kx2,ky1:ky2,:), start = kstart(1:knbdim), count = kcount(1:knbdim) ) 
    265251      ENDIF 
    266252      ! 
     
    269255 
    270256 
    271    SUBROUTINE iom_ioipsl_gettime( kiomid, kvid, ptime ) 
     257   SUBROUTINE iom_ioipsl_gettime( kiomid, kvid, ptime, cdunits, cdcalendar ) 
    272258      !!-------------------------------------------------------------------- 
    273259      !!                   ***  SUBROUTINE iom_gettime  *** 
     
    275261      !! ** Purpose : read the time axis kvid in the file with IOIPSL (only fliocom module) 
    276262      !!-------------------------------------------------------------------- 
    277       INTEGER               , INTENT(in   ) ::   kiomid   ! file Identifier 
    278       INTEGER               , INTENT(in   ) ::   kvid     ! variable id 
    279       REAL(wp), DIMENSION(:), INTENT(  out) ::   ptime    ! the time axis 
     263      INTEGER                   , INTENT(in   ) ::   kiomid     ! file Identifier 
     264      INTEGER                   , INTENT(in   ) ::   kvid       ! variable id 
     265      REAL(wp), DIMENSION(:)    , INTENT(  out) ::   ptime      ! the time axis 
     266      CHARACTER(len=*), OPTIONAL, INTENT(  out) ::   cdunits    ! units attribute 
     267      CHARACTER(len=*), OPTIONAL, INTENT(  out) ::   cdcalendar ! calendar attribute 
    280268      !--------------------------------------------------------------------- 
    281269      ! 
    282270      CALL fliogetv( iom_file(kiomid)%nfid, TRIM(iom_file(kiomid)%cn_var(kvid)), ptime(:),   & 
    283271            &         start=(/ 1 /), count=(/ iom_file(kiomid)%dimsz(1, kvid) /) ) 
     272      IF ( PRESENT(cdunits) ) THEN  
     273         CALL fliogeta( iom_file(kiomid)%nfid, TRIM(iom_file(kiomid)%cn_var(kvid)), "units", cdunits ) 
     274      ENDIF 
     275      IF ( PRESENT(cdcalendar) ) THEN  
     276         CALL fliogeta( iom_file(kiomid)%nfid, TRIM(iom_file(kiomid)%cn_var(kvid)), "calendar", cdcalendar ) 
     277      ENDIF 
    284278      ! 
    285279   END SUBROUTINE iom_ioipsl_gettime 
     
    330324               &                  long_name="Time axis", units='seconds since 0001-01-01 00:00:00' ) 
    331325         ! update informations structure related the dimension variable we just added... 
    332          iom_file(kiomid)%nvars         = 4 
    333          iom_file(kiomid)%luld(1:4)     = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 
    334          iom_file(kiomid)%cn_var(1:3)   = (/ 'nav_lon', 'nav_lat', 'nav_lev' /) 
    335          iom_file(kiomid)%cn_var(4)     = 'time_counter' 
    336          iom_file(kiomid)%ndims(1:4)    = (/ 2, 2, 1, 1 /)   
    337          CALL flioinqf( ioipslid, ln_dim = idimsz ) 
    338          iom_file(kiomid)%dimsz(1:2, 1) = idimsz(1:2) 
    339          iom_file(kiomid)%dimsz(1:2, 2) = idimsz(1:2) 
    340          iom_file(kiomid)%dimsz(1, 3:4) = (/idimsz(3), 1/) 
     326         iom_file(kiomid)%nvars       = 4 
     327         iom_file(kiomid)%luld(1:4)   = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 
     328         iom_file(kiomid)%cn_var(1:3) = (/ 'nav_lon', 'nav_lat', 'nav_lev' /) 
     329         iom_file(kiomid)%cn_var(4)   = 'time_counter' 
     330         iom_file(kiomid)%ndims(1:4)  = (/ 2, 2, 1, 1 /) 
     331         ! trick: defined to 0 to say that dimension variables are defined but not yet written 
     332         iom_file(kiomid)%dimsz(1, 1) = 0    
    341333         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 
    342334      ENDIF 
     
    403395            ! write dimension variables if it is not already done 
    404396            ! ============= 
     397            ! trick: is defined to 0 => dimension variable are defined but not yet written 
    405398            IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 
    406399               CALL flioputv( ioipslid, 'nav_lon'     , glamt(ix1:ix2, iy1:iy2) ) 
     
    408401               CALL flioputv( ioipslid, 'nav_lev'     , gdept_0 ) 
    409402               ! +++ WRONG VALUE: to be improved but not really useful... 
    410                CALL flioputv( ioipslid, 'time_counter', kt )    
     403               CALL flioputv( ioipslid, 'time_counter', kt ) 
     404               ! update the values of the variables dimensions size 
     405               CALL flioinqf( ioipslid, ln_dim = idimsz ) 
     406               iom_file(kiomid)%dimsz(1:2, 1) = idimsz(1:2) 
     407               iom_file(kiomid)%dimsz(1:2, 2) = idimsz(1:2) 
     408               iom_file(kiomid)%dimsz(1, 3:4) = (/idimsz(3), 1/) 
    411409               IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 
    412410            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.