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 13899 for NEMO/branches/2020/tickets_icb_1900/src/OCE/DOM/domain.F90 – NEMO

Ignore:
Timestamp:
2020-11-27T17:26:33+01:00 (4 years ago)
Author:
mathiot
Message:

ticket #1900: update branch to trunk and add ICB test case

Location:
NEMO/branches/2020/tickets_icb_1900
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/tickets_icb_1900

    • Property svn:externals
      •  

        old new  
        22^/utils/build/makenemo@HEAD   makenemo 
        33^/utils/build/mk@HEAD         mk 
        4 ^/utils/tools/@HEAD           tools 
         4^/utils/tools@HEAD            tools 
        55^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
         
        88 
        99# SETTE 
        10 ^/utils/CI/sette@12931        sette 
         10^/utils/CI/sette@13559        sette 
  • NEMO/branches/2020/tickets_icb_1900/src/OCE/DOM/domain.F90

    r13237 r13899  
    120120         WRITE(numout,*)     '         cn_cfg = ', TRIM( cn_cfg ), '   nn_cfg = ', nn_cfg 
    121121      ENDIF 
    122       lwxios = .FALSE. 
    123       ln_xios_read = .FALSE. 
    124122      ! 
    125123      !           !==  Reference coordinate system  ==! 
     
    177175      ! 
    178176      IF( ln_linssh ) THEN       != Fix in time : set to the reference one for all 
    179       ! 
     177         ! 
    180178         DO jt = 1, jpt                         ! depth of t- and w-grid-points 
    181179            gdept(:,:,:,jt) = gdept_0(:,:,:) 
     
    204202      ELSE                       != time varying : initialize before/now/after variables 
    205203         ! 
    206          IF( .NOT.l_offline )  CALL dom_vvl_init( Kbb, Kmm, Kaa ) 
     204         IF( .NOT.l_offline )   CALL dom_vvl_init( Kbb, Kmm, Kaa ) 
    207205         ! 
    208206      ENDIF 
     
    240238      !! ** Method  :    
    241239      !! 
    242       !! ** Action  : - mig , mjg : local  domain indices ==> global domain indices 
     240      !! ** Action  : - mig , mjg : local  domain indices ==> global domain, including halos, indices 
     241      !!              - mig0, mjg0: local  domain indices ==> global domain, excluding halos, indices 
    243242      !!              - mi0 , mi1 : global domain indices ==> local  domain indices 
    244       !!              - mj0,, mj1   (global point not in the local domain ==> mi0>mi1 and/or mj0>mj1) 
     243      !!              - mj0 , mj1   (if global point not in the local domain ==> mi0>mi1 and/or mj0>mj1) 
    245244      !!---------------------------------------------------------------------- 
    246245      INTEGER ::   ji, jj   ! dummy loop argument 
    247246      !!---------------------------------------------------------------------- 
    248247      ! 
    249       DO ji = 1, jpi                 ! local domain indices ==> global domain indices 
     248      DO ji = 1, jpi                 ! local domain indices ==> global domain indices, including halos 
    250249        mig(ji) = ji + nimpp - 1 
    251250      END DO 
     
    253252        mjg(jj) = jj + njmpp - 1 
    254253      END DO 
    255       !                              ! global domain indices ==> local domain indices 
     254      !                              ! local domain indices ==> global domain indices, excluding halos 
     255      ! 
     256      mig0(:) = mig(:) - nn_hls 
     257      mjg0(:) = mjg(:) - nn_hls   
     258      ! WARNING: to keep compatibility with the trunk that was including periodocity into the input data,  
     259      ! we must define mig0 and mjg0 as bellow. 
     260      ! Once we decide to forget trunk compatibility, we must simply define mig0 and mjg0 as: 
     261      mig0_oldcmp(:) = mig0(:) + COUNT( (/ jperio == 1 .OR. jperio == 4 .OR. jperio == 6 .OR. jperio == 7 /) ) 
     262      mjg0_oldcmp(:) = mjg0(:) + COUNT( (/ jperio == 2 .OR. jperio == 7 /) ) 
     263      ! 
     264      !                              ! global domain, including halos, indices ==> local domain indices 
    256265      !                                   ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the  
    257266      !                                   ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.  
     
    271280         WRITE(numout,*) '   local  domain:   jpi    = ', jpi   , ' jpj    = ', jpj   , ' jpk    = ', jpk 
    272281         WRITE(numout,*) 
    273          WRITE(numout,*) '   conversion from local to global domain indices (and vise versa) done' 
    274          IF( nn_print >= 1 ) THEN 
    275             WRITE(numout,*) 
    276             WRITE(numout,*) '          conversion local  ==> global i-index domain (mig)' 
    277             WRITE(numout,25)              (mig(ji),ji = 1,jpi) 
    278             WRITE(numout,*) 
    279             WRITE(numout,*) '          conversion global ==> local  i-index domain' 
    280             WRITE(numout,*) '             starting index (mi0)' 
    281             WRITE(numout,25)              (mi0(ji),ji = 1,jpiglo) 
    282             WRITE(numout,*) '             ending index (mi1)' 
    283             WRITE(numout,25)              (mi1(ji),ji = 1,jpiglo) 
    284             WRITE(numout,*) 
    285             WRITE(numout,*) '          conversion local  ==> global j-index domain (mjg)' 
    286             WRITE(numout,25)              (mjg(jj),jj = 1,jpj) 
    287             WRITE(numout,*) 
    288             WRITE(numout,*) '          conversion global ==> local  j-index domain' 
    289             WRITE(numout,*) '             starting index (mj0)' 
    290             WRITE(numout,25)              (mj0(jj),jj = 1,jpjglo) 
    291             WRITE(numout,*) '             ending index (mj1)' 
    292             WRITE(numout,25)              (mj1(jj),jj = 1,jpjglo) 
    293          ENDIF 
    294       ENDIF 
    295  25   FORMAT( 100(10x,19i4,/) ) 
     282      ENDIF 
    296283      ! 
    297284   END SUBROUTINE dom_glo 
     
    413400#endif 
    414401 
    415 #if defined key_agrif 
    416402      IF( Agrif_Root() ) THEN 
    417 #endif 
    418       IF(lwp) WRITE(numout,*) 
    419       SELECT CASE ( nleapy )        ! Choose calendar for IOIPSL 
    420       CASE (  1 )  
    421          CALL ioconf_calendar('gregorian') 
    422          IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "gregorian", i.e. leap year' 
    423       CASE (  0 ) 
    424          CALL ioconf_calendar('noleap') 
    425          IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "noleap", i.e. no leap year' 
    426       CASE ( 30 ) 
    427          CALL ioconf_calendar('360d') 
    428          IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "360d", i.e. 360 days in a year' 
    429       END SELECT 
    430 #if defined key_agrif 
    431       ENDIF 
    432 #endif 
     403         IF(lwp) WRITE(numout,*) 
     404         SELECT CASE ( nleapy )        ! Choose calendar for IOIPSL 
     405         CASE (  1 )  
     406            CALL ioconf_calendar('gregorian') 
     407            IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "gregorian", i.e. leap year' 
     408         CASE (  0 ) 
     409            CALL ioconf_calendar('noleap') 
     410            IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "noleap", i.e. no leap year' 
     411         CASE ( 30 ) 
     412            CALL ioconf_calendar('360d') 
     413            IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "360d", i.e. 360 days in a year' 
     414         END SELECT 
     415      ENDIF 
    433416 
    434417      READ  ( numnam_ref, namdom, IOSTAT = ios, ERR = 903) 
     
    503486      !! ** Method  :   compute and print extrema of masked scale factors 
    504487      !!---------------------------------------------------------------------- 
    505       INTEGER, DIMENSION(2) ::   imi1, imi2, ima1, ima2 
    506       INTEGER, DIMENSION(2) ::   iloc   !  
    507       REAL(wp) ::   ze1min, ze1max, ze2min, ze2max 
    508       !!---------------------------------------------------------------------- 
    509       ! 
    510       IF(lk_mpp) THEN 
    511          CALL mpp_minloc( 'domain', e1t(:,:), tmask_i(:,:), ze1min, imi1 ) 
    512          CALL mpp_minloc( 'domain', e2t(:,:), tmask_i(:,:), ze2min, imi2 ) 
    513          CALL mpp_maxloc( 'domain', e1t(:,:), tmask_i(:,:), ze1max, ima1 ) 
    514          CALL mpp_maxloc( 'domain', e2t(:,:), tmask_i(:,:), ze2max, ima2 ) 
    515       ELSE 
    516          ze1min = MINVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )     
    517          ze2min = MINVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )     
    518          ze1max = MAXVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )     
    519          ze2max = MAXVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )     
    520          ! 
    521          iloc  = MINLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    522          imi1(1) = iloc(1) + nimpp - 1 
    523          imi1(2) = iloc(2) + njmpp - 1 
    524          iloc  = MINLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    525          imi2(1) = iloc(1) + nimpp - 1 
    526          imi2(2) = iloc(2) + njmpp - 1 
    527          iloc  = MAXLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    528          ima1(1) = iloc(1) + nimpp - 1 
    529          ima1(2) = iloc(2) + njmpp - 1 
    530          iloc  = MAXLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    531          ima2(1) = iloc(1) + nimpp - 1 
    532          ima2(2) = iloc(2) + njmpp - 1 
    533       ENDIF 
     488      LOGICAL, DIMENSION(jpi,jpj) ::   llmsk 
     489      INTEGER, DIMENSION(2)       ::   imil, imip, imi1, imi2, imal, imap, ima1, ima2 
     490      REAL(wp)                    ::   zglmin, zglmax, zgpmin, zgpmax, ze1min, ze1max, ze2min, ze2max 
     491      !!---------------------------------------------------------------------- 
     492      ! 
     493      llmsk = tmask_h(:,:) == 1._wp 
     494      ! 
     495      CALL mpp_minloc( 'domain', glamt(:,:), llmsk, zglmin, imil ) 
     496      CALL mpp_minloc( 'domain', gphit(:,:), llmsk, zgpmin, imip ) 
     497      CALL mpp_minloc( 'domain',   e1t(:,:), llmsk, ze1min, imi1 ) 
     498      CALL mpp_minloc( 'domain',   e2t(:,:), llmsk, ze2min, imi2 ) 
     499      CALL mpp_maxloc( 'domain', glamt(:,:), llmsk, zglmax, imal ) 
     500      CALL mpp_maxloc( 'domain', gphit(:,:), llmsk, zgpmax, imap ) 
     501      CALL mpp_maxloc( 'domain',   e1t(:,:), llmsk, ze1max, ima1 ) 
     502      CALL mpp_maxloc( 'domain',   e2t(:,:), llmsk, ze2max, ima2 ) 
     503      ! 
    534504      IF(lwp) THEN 
    535505         WRITE(numout,*) 
    536506         WRITE(numout,*) 'dom_ctl : extrema of the masked scale factors' 
    537507         WRITE(numout,*) '~~~~~~~' 
    538          WRITE(numout,"(14x,'e1t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1max, ima1(1), ima1(2) 
    539          WRITE(numout,"(14x,'e1t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1min, imi1(1), imi1(2) 
    540          WRITE(numout,"(14x,'e2t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2max, ima2(1), ima2(2) 
    541          WRITE(numout,"(14x,'e2t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2min, imi2(1), imi2(2) 
     508         WRITE(numout,"(14x,'glamt mini: ',1f10.2,' at i = ',i5,' j= ',i5)") zglmin, imil(1), imil(2) 
     509         WRITE(numout,"(14x,'glamt maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") zglmax, imal(1), imal(2) 
     510         WRITE(numout,"(14x,'gphit mini: ',1f10.2,' at i = ',i5,' j= ',i5)") zgpmin, imip(1), imip(2) 
     511         WRITE(numout,"(14x,'gphit maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") zgpmax, imap(1), imap(2) 
     512         WRITE(numout,"(14x,'  e1t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1min, imi1(1), imi1(2) 
     513         WRITE(numout,"(14x,'  e1t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1max, ima1(1), ima1(2) 
     514         WRITE(numout,"(14x,'  e2t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2min, imi2(1), imi2(2) 
     515         WRITE(numout,"(14x,'  e2t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2max, ima2(1), ima2(2) 
    542516      ENDIF 
    543517      ! 
     
    606580      IF(lwp) THEN 
    607581         WRITE(numout,*) '      cn_cfg = ', TRIM(cd_cfg), '   nn_cfg = ', kk_cfg 
    608          WRITE(numout,*) '      jpiglo = ', kpi 
    609          WRITE(numout,*) '      jpjglo = ', kpj 
     582         WRITE(numout,*) '      Ni0glo = ', kpi 
     583         WRITE(numout,*) '      Nj0glo = ', kpj 
    610584         WRITE(numout,*) '      jpkglo = ', kpk 
    611585         WRITE(numout,*) '      type of global domain lateral boundary   jperio = ', kperio 
     
    631605      !!---------------------------------------------------------------------- 
    632606      INTEGER           ::   ji, jj, jk   ! dummy loop indices 
    633       INTEGER           ::   izco, izps, isco, icav 
    634607      INTEGER           ::   inum     ! local units 
    635608      CHARACTER(len=21) ::   clnam    ! filename (mesh and mask informations) 
     
    646619      !          
    647620      clnam = cn_domcfg_out  ! filename (configuration information) 
    648       CALL iom_open( TRIM(clnam), inum, ldwrt = .TRUE. ) 
    649        
     621      CALL iom_open( TRIM(clnam), inum, ldwrt = .TRUE. )      
    650622      ! 
    651623      !                             !==  ORCA family specificities  ==! 
    652       IF( cn_cfg == "ORCA" ) THEN 
     624      IF( TRIM(cn_cfg) == "orca" .OR. TRIM(cn_cfg) == "ORCA" ) THEN 
    653625         CALL iom_rstput( 0, 0, inum, 'ORCA'      , 1._wp            , ktype = jp_i4 ) 
    654626         CALL iom_rstput( 0, 0, inum, 'ORCA_index', REAL( nn_cfg, wp), ktype = jp_i4 )          
    655627      ENDIF 
    656628      ! 
    657       !                             !==  global domain size  ==! 
    658       ! 
    659       CALL iom_rstput( 0, 0, inum, 'jpiglo', REAL( jpiglo, wp), ktype = jp_i4 ) 
    660       CALL iom_rstput( 0, 0, inum, 'jpjglo', REAL( jpjglo, wp), ktype = jp_i4 ) 
    661       CALL iom_rstput( 0, 0, inum, 'jpkglo', REAL( jpk   , wp), ktype = jp_i4 ) 
    662       ! 
    663629      !                             !==  domain characteristics  ==! 
    664630      ! 
     
    667633      ! 
    668634      !                                   ! type of vertical coordinate 
    669       IF( ln_zco    ) THEN   ;   izco = 1   ;   ELSE   ;   izco = 0   ;   ENDIF 
    670       IF( ln_zps    ) THEN   ;   izps = 1   ;   ELSE   ;   izps = 0   ;   ENDIF 
    671       IF( ln_sco    ) THEN   ;   isco = 1   ;   ELSE   ;   isco = 0   ;   ENDIF 
    672       CALL iom_rstput( 0, 0, inum, 'ln_zco'   , REAL( izco, wp), ktype = jp_i4 ) 
    673       CALL iom_rstput( 0, 0, inum, 'ln_zps'   , REAL( izps, wp), ktype = jp_i4 ) 
    674       CALL iom_rstput( 0, 0, inum, 'ln_sco'   , REAL( isco, wp), ktype = jp_i4 ) 
     635      CALL iom_rstput( 0, 0, inum, 'ln_zco', REAL(COUNT((/ln_zco/)), wp), ktype = jp_i4 ) 
     636      CALL iom_rstput( 0, 0, inum, 'ln_zps', REAL(COUNT((/ln_zps/)), wp), ktype = jp_i4 ) 
     637      CALL iom_rstput( 0, 0, inum, 'ln_sco', REAL(COUNT((/ln_sco/)), wp), ktype = jp_i4 ) 
    675638      ! 
    676639      !                                   ! ocean cavities under iceshelves 
    677       IF( ln_isfcav ) THEN   ;   icav = 1   ;   ELSE   ;   icav = 0   ;   ENDIF 
    678       CALL iom_rstput( 0, 0, inum, 'ln_isfcav', REAL( icav, wp), ktype = jp_i4 ) 
     640      CALL iom_rstput( 0, 0, inum, 'ln_isfcav', REAL(COUNT((/ln_isfcav/)), wp), ktype = jp_i4 ) 
    679641      ! 
    680642      !                             !==  horizontal mesh  ! 
Note: See TracChangeset for help on using the changeset viewer.