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 8001 for branches/UKMO/dev_r5518_GO6_package_XIOS_read/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90 – NEMO

Ignore:
Timestamp:
2017-05-08T17:00:32+02:00 (7 years ago)
Author:
andmirek
Message:

Reading restart with XIOS works and is bit comparable with NEMO default restart. Tested in MO GO6 eORCA25 configuration - suite u-al584

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_package_XIOS_read/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90

    r7924 r8001  
    4141   USE dianam          ! build name of file 
    4242   USE xios 
     43   USE iom_def, ONLY : max_rst_fields, rst_fields 
    4344# endif 
    4445   USE ioipsl, ONLY :  ju2ymds    ! for calendar 
    4546   USE crs             ! Grid coarsening 
     47   USE lib_fortran  
    4648 
    4749   IMPLICIT NONE 
     
    5355   LOGICAL, PUBLIC, PARAMETER ::   lk_iomput = .FALSE.       !: iom_put flag 
    5456#endif 
    55    INTEGER, PRIVATE, PARAMETER :: max_rst_fields = 85        ! maximum number of variables in a restart file 
    5657   PUBLIC iom_init, iom_swap, iom_open, iom_close, iom_setkt, iom_varid, iom_get, iom_gettime, iom_rstput, iom_put 
    5758   PUBLIC iom_getatt, iom_use, iom_context_finalize 
     
    6364   PRIVATE iom_set_domain_attr, iom_set_axis_attr, iom_set_field_attr, iom_set_file_attr, iom_get_file_attr, iom_set_grid_attr 
    6465   PRIVATE set_grid, set_grid_bounds, set_scalar, set_xmlatt, set_mooring, iom_update_file_name, iom_sdate 
    65    PRIVATE set_active_rst_fields 
     66   PRIVATE set_rst_vars, set_rstr_active 
    6667# endif 
    6768 
     
    138139          &                                    start_date = xios_date(nyear,nmonth,nday,0,0,0) ) 
    139140      END SELECT 
     141 
    140142#endif 
    141143      ! horizontal grid definition 
     
    144146 
    145147      IF( TRIM(cdname) == TRIM(cxios_context) .OR. TRIM(cdname) == TRIM(rxios_context)) THEN   
    146          CALL set_grid( "T", glamt, gphit )  
    147          CALL set_grid( "U", glamu, gphiu ) 
    148          CALL set_grid( "V", glamv, gphiv ) 
    149          CALL set_grid( "W", glamt, gphit ) 
     148         CALL set_grid( "T", glamt, gphit, ln_mskland )  
     149         CALL set_grid( "U", glamu, gphiu, ln_mskland ) 
     150         CALL set_grid( "V", glamv, gphiv, ln_mskland ) 
     151         CALL set_grid( "W", glamt, gphit, ln_mskland ) 
    150152         CALL set_grid_znl( gphit ) 
     153         CALL set_grid("N",glamt, gphit, .FALSE.)        ! not masked values 
    151154         ! 
    152          IF( ln_cfmeta ) THEN   ! Add additional grid metadata 
     155         IF( ln_cfmeta .AND. TRIM(cdname) .NE. TRIM(rxios_context)) THEN   ! Add additional grid metadata 
    153156            CALL iom_set_domain_attr("grid_T", area = e12t(nldi:nlei, nldj:nlej)) 
    154157            CALL iom_set_domain_attr("grid_U", area = e12u(nldi:nlei, nldj:nlej)) 
     
    165168         CALL dom_grid_crs   ! Save the parent grid information  & Switch to coarse grid domain 
    166169         ! 
    167          CALL set_grid( "T", glamt_crs, gphit_crs )  
    168          CALL set_grid( "U", glamu_crs, gphiu_crs )  
    169          CALL set_grid( "V", glamv_crs, gphiv_crs )  
    170          CALL set_grid( "W", glamt_crs, gphit_crs )  
     170         CALL set_grid( "T", glamt_crs, gphit_crs, ln_mskland )  
     171         CALL set_grid( "U", glamu_crs, gphiu_crs, ln_mskland )  
     172         CALL set_grid( "V", glamv_crs, gphiv_crs, ln_mskland )  
     173         CALL set_grid( "W", glamt_crs, gphit_crs, ln_mskland )  
    171174         CALL set_grid_znl( gphit_crs ) 
    172175          ! 
    173176         CALL dom_grid_glo   ! Return to parent grid domain 
    174177         ! 
    175          IF( ln_cfmeta ) THEN   ! Add additional grid metadata 
     178         IF( ln_cfmeta .AND. TRIM(cdname) .NE. TRIM(rxios_context)) THEN   ! Add additional grid metadata 
    176179            CALL iom_set_domain_attr("grid_T", area = e1e2t_crs(nldi:nlei, nldj:nlej)) 
    177180            CALL iom_set_domain_attr("grid_U", area = e1u_crs(nldi:nlei, nldj:nlej) * e2u_crs(nldi:nlei, nldj:nlej)) 
     
    230233      ! automatic definitions of some of the xml attributs 
    231234      IF( TRIM(cdname) == TRIM(rxios_context)) THEN 
    232        CALL set_active_rst_fields 
     235!set names of the fields in restart file IF using XIOS to read/write data 
     236       CALL set_rst_vars() 
     237!set which fields are to be read from restart file 
     238       CALL set_rstr_active() 
    233239      ELSE 
    234240       CALL set_xmlatt 
     
    250256   END SUBROUTINE iom_init 
    251257 
    252    SUBROUTINE set_active_rst_fields 
    253 !sets enabled = .TRUE. for each field in restart file 
    254         CHARACTER(len=30),DIMENSION(max_rst_fields)    :: rst_fields 
    255         INTEGER :: i 
     258    
     259   SUBROUTINE set_rst_vars() 
     260!set names for variables in restart file 
    256261 
    257262        rst_fields(:)="NO_NAME" 
     
    343348        rst_fields(85)="avtb" 
    344349 
     350   END SUBROUTINE set_rst_vars 
     351 
     352 
     353   SUBROUTINE set_rstr_active() 
     354!sets enabled = .TRUE. for each field in restart file 
     355        CHARACTER(len=512) :: rst_file 
     356        INTEGER :: i 
     357        TYPE(xios_file) :: file_hdl 
     358 
     359        rst_file = TRIM(cn_ocerst_outdir)//TRIM(cn_ocerst_out)//'.nc' 
     360!set name of the restart file and enable processing 
     361!       if(lwp) WRITE(numout,*) 'Setting restart filename for XIOS to: ',rst_file 
     362!       CALL xios_get_handle("restart", file_hdl) 
     363!       CALL xios_set_attr(file_hdl , name = trim(rst_file))  
     364!       CALL xios_set_attr(file_hdl , enabled = .TRUE.) 
     365!eneble fields in restart file  
    345366        DO i = 1, max_rst_fields 
    346367         IF( TRIM(rst_fields(i)) /= "NO_NAME") THEN 
     
    348369             IF ( xios_is_valid_field( TRIM(rst_fields(i)) ) ) & 
    349370      &         CALL xios_set_field_attr ( TRIM(rst_fields(i)), enabled = .TRUE. )  
     371             IF ( xios_is_valid_field( TRIM(rst_fields(i)) ) ) THEN 
     372              if(lwp) WRITE(numout,*) TRIM(rst_fields(i)), ' enabled' 
     373             ENDIF 
    350374           ENDIF 
    351375         ENDIF 
    352376        END DO 
    353377 
    354    END SUBROUTINE set_active_rst_fields 
     378   END SUBROUTINE set_rstr_active 
    355379 
    356380   SUBROUTINE iom_swap( cdname ) 
     
    728752#endif 
    729753      ENDIF    
     754      IF(lwp) WRITE(numout,*) 'Value ',pvar 
    730755   END SUBROUTINE iom_g0d 
    731756 
     
    816841      LOGICAL                    , INTENT(in   ), OPTIONAL ::   lrxios     ! use XIOS to read restart 
    817842      ! 
    818       LOGICAL                                              ::   lxios 
     843      LOGICAL                        ::   lxios       ! local definition for XIOS read 
    819844      LOGICAL                        ::   llnoov      ! local definition to read overlap 
    820845      LOGICAL                        ::   luse_jattr  ! local definition to read open_ocean_jstart file attribute 
     
    843868      !--------------------------------------------------------------------- 
    844869      ! 
     870      REAL(wp)                       :: gma, gmi 
    845871      lxios = .FALSE. 
    846872      if(PRESENT(lrxios)) lxios = lrxios 
    847873      idvar = iom_varid( kiomid, cdvar )  
     874      idom = kdom 
     875 
    848876      IF(.NOT.lxios) THEN 
    849877          clname = iom_file(kiomid)%name   !   esier to read 
    850878          clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar) 
    851879          ! local definition of the domain ? 
    852           idom = kdom 
    853880          ! do we read the overlap  
    854881          ! ugly patch SM+JMM+RB to overwrite global definition in some cases 
     
    10611088                IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown ) THEN 
    10621089                   CALL lbc_lnk( pv_r2d,'Z',-999.,'no0' ) 
     1090                   if(lwp) write(numout,*) trim(cdvar),'UPDATE' 
    10631091                ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown ) THEN 
    10641092                   ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 
    10651093                   IF( icnt(3) == jpk ) THEN 
    10661094                      CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
     1095                      if(lwp) write(numout,*) trim(cdvar),'UPDATE' 
    10671096                   ELSE   ! put some arbitrary value (a call to lbc_lnk will be done later...) 
    10681097                      DO jj = nlcj+1, jpj   ;   pv_r3d(1:nlci, jj, :) = pv_r3d(1:nlci, nlej, :)   ;   END DO 
    10691098                      DO ji = nlci+1, jpi   ;   pv_r3d(ji    , : , :) = pv_r3d(nlei  , :   , :)   ;   END DO 
     1099                      if(lwp) write(numout,*) trim(cdvar),' NO UPDATE' 
    10701100                   ENDIF 
    10711101                ENDIF 
     
    10801110          ENDIF 
    10811111          ! 
    1082        ELSE        ! read using XIOS. Only if key_iomput is defined 
     1112       ELSE        ! read using XIOS. Only if KEY_IOMPUT is defined 
    10831113#if defined key_iomput 
    1084                    ! will not handle scale factor and offset 
    10851114!would be good to be able to check which context is active and swap only if current is not restart 
    10861115          CALL iom_swap( TRIM(rxios_context) )  
     
    10881117             if(lwp) write(numout,*) 'XIOS RST READ (3D): ',trim(cdvar) 
    10891118             CALL xios_recv_field( trim(cdvar), pv_r3d) 
    1090              IF(idom /= jpdom_unknown ) CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
     1119             IF(idom /= jpdom_unknown ) then 
     1120                 CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
     1121             ENDIF 
    10911122          ELSEIF( PRESENT(pv_r2d) ) THEN 
    10921123             if(lwp) write(numout,*) 'XIOS RST READ (2D): ', trim(cdvar) 
    10931124             CALL xios_recv_field( trim(cdvar), pv_r2d) 
    1094              IF(idom /= jpdom_unknown ) CALL lbc_lnk(pv_r2d,'Z',-999.,'no0') 
     1125             IF(idom /= jpdom_unknown ) THEN 
     1126                 CALL lbc_lnk(pv_r2d,'Z',-999.,'no0') 
     1127             ENDIF 
    10951128          ELSEIF( PRESENT(pv_r1d) ) THEN 
    10961129             if(lwp) write(numout,*) 'XIOS RST READ (1D): ', trim(cdvar) 
    10971130             CALL xios_recv_field( trim(cdvar), pv_r1d) 
    10981131          ENDIF 
    1099           if(lwp) write(numout,*) 'XIOS RST READ END: ',trim(cdvar) 
    11001132          CALL iom_swap( TRIM(cxios_context) ) 
    11011133#else 
     
    11261158          IF( zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs 
    11271159       ENDIF 
    1128  
    11291160   END SUBROUTINE iom_get_123d 
    11301161 
     
    15301561 
    15311562 
    1532    SUBROUTINE set_grid( cdgrd, plon, plat ) 
     1563   SUBROUTINE set_grid( cdgrd, plon, plat, lmask ) 
    15331564      !!---------------------------------------------------------------------- 
    15341565      !!                     ***  ROUTINE set_grid  *** 
     
    15431574      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmask 
    15441575      INTEGER  :: ni,nj 
     1576      LOGICAL :: lmask 
    15451577       
    15461578      ni=nlei-nldi+1 ; nj=nlej-nldj+1 
     
    15551587         &                                     latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
    15561588 
    1557       IF ( ln_mskland ) THEN 
     1589      IF ( lmask ) THEN 
    15581590         ! mask land points, keep values on coast line -> specific mask for U, V and W points 
    15591591         SELECT CASE ( cdgrd ) 
     
    15991631      ! Offset of coordinate representing bottom-left corner 
    16001632      SELECT CASE ( TRIM(cdgrd) ) 
    1601          CASE ('T', 'W') 
     1633         CASE ('T', 'W', 'N') 
    16021634            icnr = -1 ; jcnr = -1 
    16031635         CASE ('U') 
Note: See TracChangeset for help on using the changeset viewer.