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 5260 for branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM – NEMO

Ignore:
Timestamp:
2015-05-12T12:37:15+02:00 (9 years ago)
Author:
deazer
Message:

Merged branch with Trunk at revision 5253.
Checked with SETTE, passes modified iodef.xml for AMM12 experiment

Location:
branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/daymod.F90

    r4162 r5260  
    123123 
    124124      ! control print 
    125       IF(lwp) WRITE(numout,'(a,i6,a,i2,a,i2,a,i6)')' ==============>> 1/2 time step before the start of the run DATE Y/M/D = ',   & 
     125      IF(lwp) WRITE(numout,'(a,i6,a,i2,a,i2,a,i8,a,i8)')' =======>> 1/2 time step before the start of the run DATE Y/M/D = ',   & 
    126126           &                   nyear, '/', nmonth, '/', nday, '  nsec_day:', nsec_day, '  nsec_week:', nsec_week 
    127127 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90

    r4488 r5260  
    153153   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   nldit , nldjt    !: first, last indoor index for each i-domain 
    154154   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   nleit , nlejt    !: first, last indoor index for each j-domain 
     155   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: nfiimpp, nfipproc, nfilcit 
    155156 
    156157   !!---------------------------------------------------------------------- 
     
    161162   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  gphit, gphiu   !: latitude  of t-, u-, v- and f-points (degre) 
    162163   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  gphiv, gphif   !: 
    163    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1t, e2t       !: horizontal scale factors at t-point (m) 
    164    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1u, e2u       !: horizontal scale factors at u-point (m) 
    165    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1v, e2v       !: horizontal scale factors at v-point (m) 
    166    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1f, e2f       !: horizontal scale factors at f-point (m) 
     164   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1t, e2t, r1_e1t, r1_e2t   !: horizontal scale factors and inverse at t-point (m) 
     165   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1u, e2u, r1_e1u, r1_e2u   !: horizontal scale factors and inverse at u-point (m) 
     166   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1v, e2v, r1_e1v, r1_e2v   !: horizontal scale factors and inverse at v-point (m) 
     167   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::  e1f, e2f, r1_e1f, r1_e2f   !: horizontal scale factors and inverse at f-point (m) 
    167168   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  e1e2t          !: surface at t-point (m2) 
    168169   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ff             !: coriolis factor (2.*omega*sin(yphi) ) (s-1) 
     
    175176   LOGICAL, PUBLIC ::   ln_zps        !: z-coordinate - partial step 
    176177   LOGICAL, PUBLIC ::   ln_sco        !: s-coordinate or hybrid z-s coordinate 
     178   LOGICAL, PUBLIC ::   ln_isfcav     !: presence of ISF  
    177179 
    178180   !! All coordinates 
     
    250252   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbkt               !: vertical index of the bottom last T- ocean level 
    251253   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbku, mbkv         !: vertical index of the bottom last U- and W- ocean level 
    252    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   bathy              !: ocean depth (meters) 
    253    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_i            !: interior domain T-point mask 
    254    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   bmask              !: land/ocean mask of barotropic stream function 
     254   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   bathy                              !: ocean depth (meters) 
     255   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_i, umask_i, vmask_i, fmask_i !: interior domain T-point mask 
     256   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   bmask                              !: land/ocean mask of barotropic stream function 
     257 
     258   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   misfdep                 !: top first ocean level                (ISF) 
     259   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mikt, miku, mikv, mikf  !: first wet T-, U-, V-, F- ocean level (ISF) 
     260   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   risfdep                 !: Iceshelf draft                       (ISF) 
     261   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssmask                   !: surface domain T-point mask  
    255262 
    256263   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: tmask, umask, vmask, fmask   !: land/ocean mask at T-, U-, V- and F-pts 
     264   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: wmask, wumask, wvmask        !: land/ocean mask at WT-, WU- and WV-pts 
    257265 
    258266   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   tpol, fpol          !: north fold mask (jperio= 3 or 4) 
     
    325333   INTEGER FUNCTION dom_oce_alloc() 
    326334      !!---------------------------------------------------------------------- 
    327       INTEGER, DIMENSION(11) :: ierr 
     335      INTEGER, DIMENSION(12) :: ierr 
    328336      !!---------------------------------------------------------------------- 
    329337      ierr(:) = 0 
    330338      ! 
    331       ALLOCATE( rdttra(jpk), r2dtra(jpk), mig(jpi), mjg(jpj), STAT=ierr(1) ) 
     339      ALLOCATE( rdttra(jpk), r2dtra(jpk), mig(jpi), mjg(jpj), nfiimpp(jpni,jpnj),  & 
     340         &      nfipproc(jpni,jpnj), nfilcit(jpni,jpnj), STAT=ierr(1) ) 
    332341         ! 
    333342      ALLOCATE( nimppt(jpnij) , ibonit(jpnij) , nlcit(jpnij) , nlcjt(jpnij) ,     & 
     
    337346         &      tpol(jpiglo)  , fpol(jpiglo)                               , STAT=ierr(2) ) 
    338347         ! 
    339       ALLOCATE( glamt(jpi,jpj) , gphit(jpi,jpj) , e1t(jpi,jpj) , e2t(jpi,jpj) ,                      &  
    340          &      glamu(jpi,jpj) , gphiu(jpi,jpj) , e1u(jpi,jpj) , e2u(jpi,jpj) ,                      &   
    341          &      glamv(jpi,jpj) , gphiv(jpi,jpj) , e1v(jpi,jpj) , e2v(jpi,jpj) , e1e2t(jpi,jpj) ,     &   
    342          &      glamf(jpi,jpj) , gphif(jpi,jpj) , e1f(jpi,jpj) , e2f(jpi,jpj) , ff   (jpi,jpj) , STAT=ierr(3) )      
     348      ALLOCATE( glamt(jpi,jpj) , gphit(jpi,jpj) , e1t(jpi,jpj) , e2t(jpi,jpj) , r1_e1t(jpi,jpj) , r1_e2t(jpi,jpj) ,   &  
     349         &      glamu(jpi,jpj) , gphiu(jpi,jpj) , e1u(jpi,jpj) , e2u(jpi,jpj) , r1_e1u(jpi,jpj) , r1_e2u(jpi,jpj) ,   &   
     350         &      glamv(jpi,jpj) , gphiv(jpi,jpj) , e1v(jpi,jpj) , e2v(jpi,jpj) , r1_e1v(jpi,jpj) , r1_e2v(jpi,jpj) ,   &   
     351         &      glamf(jpi,jpj) , gphif(jpi,jpj) , e1f(jpi,jpj) , e2f(jpi,jpj) , r1_e1f(jpi,jpj) , r1_e2f(jpi,jpj) ,   & 
     352         &      e1e2t(jpi,jpj) , ff   (jpi,jpj) , STAT=ierr(3) )      
    343353         ! 
    344354      ALLOCATE( gdep3w_0(jpi,jpj,jpk) , e3v_0(jpi,jpj,jpk) , e3f_0 (jpi,jpj,jpk) ,                         & 
     
    379389         &      hift  (jpi,jpj) , hifu  (jpi,jpj) , rx1 (jpi,jpj) , STAT=ierr(8) ) 
    380390 
    381       ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) ,                     & 
    382          &     tmask_i(jpi,jpj) , bmask(jpi,jpj) ,                     & 
     391      ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) ,                                      & 
     392         &     tmask_i(jpi,jpj) , umask_i(jpi,jpj), vmask_i(jpi,jpj), fmask_i(jpi,jpj), & 
     393         &     bmask(jpi,jpj)   ,                                                       & 
    383394         &     mbkt   (jpi,jpj) , mbku (jpi,jpj) , mbkv(jpi,jpj) , STAT=ierr(9) ) 
    384395 
     396! (ISF) Allocation of basic array    
     397      ALLOCATE( misfdep(jpi,jpj) , risfdep(jpi,jpj),     & 
     398         &     mikt(jpi,jpj), miku(jpi,jpj), mikv(jpi,jpj) ,           & 
     399         &     mikf(jpi,jpj), ssmask(jpi,jpj), STAT=ierr(10) ) 
     400 
    385401      ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk),     &  
    386          &      vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(10) ) 
     402         &      vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(11) ) 
     403 
     404      ALLOCATE( wmask(jpi,jpj,jpk) , wumask(jpi,jpj,jpk), wvmask(jpi,jpj,jpk) , STAT=ierr(12) ) 
    387405 
    388406#if defined key_noslip_accurate 
    389       ALLOCATE( npcoa(4,jpk), nicoa(2*(jpi+jpj),4,jpk), njcoa(2*(jpi+jpj),4,jpk), STAT=ierr(11) ) 
     407      ALLOCATE( npcoa(4,jpk), nicoa(2*(jpi+jpj),4,jpk), njcoa(2*(jpi+jpj),4,jpk), STAT=ierr(12) ) 
    390408#endif 
    391409      ! 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90

    r4624 r5260  
    111111      END DO 
    112112      !                                        ! Inverse of the local depth 
    113       hur(:,:) = 1._wp / ( hu(:,:) + 1._wp - umask(:,:,1) ) * umask(:,:,1) 
    114       hvr(:,:) = 1._wp / ( hv(:,:) + 1._wp - vmask(:,:,1) ) * vmask(:,:,1) 
     113      hur(:,:) = 1._wp / ( hu(:,:) + 1._wp - umask_i(:,:) ) * umask_i(:,:) 
     114      hvr(:,:) = 1._wp / ( hv(:,:) + 1._wp - vmask_i(:,:) ) * vmask_i(:,:) 
    115115 
    116116                             CALL dom_stp      ! time step 
     
    365365      ! 
    366366      IF(lk_mpp) THEN 
    367          CALL mpp_minloc( e1t(:,:), tmask(:,:,1), ze1min, iimi1,ijmi1 ) 
    368          CALL mpp_minloc( e2t(:,:), tmask(:,:,1), ze2min, iimi2,ijmi2 ) 
    369          CALL mpp_maxloc( e1t(:,:), tmask(:,:,1), ze1max, iima1,ijma1 ) 
    370          CALL mpp_maxloc( e2t(:,:), tmask(:,:,1), ze2max, iima2,ijma2 ) 
     367         CALL mpp_minloc( e1t(:,:), tmask_i(:,:), ze1min, iimi1,ijmi1 ) 
     368         CALL mpp_minloc( e2t(:,:), tmask_i(:,:), ze2min, iimi2,ijmi2 ) 
     369         CALL mpp_maxloc( e1t(:,:), tmask_i(:,:), ze1max, iima1,ijma1 ) 
     370         CALL mpp_maxloc( e2t(:,:), tmask_i(:,:), ze2max, iima2,ijma2 ) 
    371371      ELSE 
    372          ze1min = MINVAL( e1t(:,:), mask = tmask(:,:,1) == 1._wp )     
    373          ze2min = MINVAL( e2t(:,:), mask = tmask(:,:,1) == 1._wp )     
    374          ze1max = MAXVAL( e1t(:,:), mask = tmask(:,:,1) == 1._wp )     
    375          ze2max = MAXVAL( e2t(:,:), mask = tmask(:,:,1) == 1._wp )     
    376  
    377          iloc  = MINLOC( e1t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     372         ze1min = MINVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )     
     373         ze2min = MINVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )     
     374         ze1max = MAXVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )     
     375         ze2max = MAXVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )     
     376 
     377         iloc  = MINLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    378378         iimi1 = iloc(1) + nimpp - 1 
    379379         ijmi1 = iloc(2) + njmpp - 1 
    380          iloc  = MINLOC( e2t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     380         iloc  = MINLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    381381         iimi2 = iloc(1) + nimpp - 1 
    382382         ijmi2 = iloc(2) + njmpp - 1 
    383          iloc  = MAXLOC( e1t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     383         iloc  = MAXLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    384384         iima1 = iloc(1) + nimpp - 1 
    385385         ijma1 = iloc(2) + njmpp - 1 
    386          iloc  = MAXLOC( e2t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     386         iloc  = MAXLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    387387         iima2 = iloc(1) + nimpp - 1 
    388388         ijma2 = iloc(2) + njmpp - 1 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/domcfg.F90

    r4245 r5260  
    8282      !!---------------------------------------------------------------------- 
    8383      !                              ! recalculate jpizoom/jpjzoom given lat/lon 
    84       IF( lk_c1d )  CALL dom_c1d( rn_lat1d, rn_lon1d ) 
     84      IF( lk_c1d .AND. ln_c1d_locpt )  CALL dom_c1d( rn_lat1d, rn_lon1d ) 
    8585      ! 
    8686      !                        ! ============== ! 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90

    r4366 r5260  
    471471      re2u_e1u(:,:) = e2u(:,:) / e1u(:,:) 
    472472      re1v_e2v(:,:) = e1v(:,:) / e2v(:,:) 
     473      r1_e1t  (:,:) = 1._wp    / e1t(:,:) 
     474      r1_e1u  (:,:) = 1._wp    / e1u(:,:) 
     475      r1_e1v  (:,:) = 1._wp    / e1v(:,:) 
     476      r1_e1f  (:,:) = 1._wp    / e1f(:,:) 
     477      r1_e2t  (:,:) = 1._wp    / e2t(:,:) 
     478      r1_e2u  (:,:) = 1._wp    / e2u(:,:) 
     479      r1_e2v  (:,:) = 1._wp    / e2v(:,:) 
     480      r1_e2f  (:,:) = 1._wp    / e2f(:,:) 
    473481 
    474482      ! Control printing : Grid informations (if not restart) 
     
    616624      CALL iom_open( 'coordinates', inum ) 
    617625       
    618       CALL iom_get( inum, jpdom_data, 'glamt', glamt ) 
    619       CALL iom_get( inum, jpdom_data, 'glamu', glamu ) 
    620       CALL iom_get( inum, jpdom_data, 'glamv', glamv ) 
    621       CALL iom_get( inum, jpdom_data, 'glamf', glamf ) 
    622        
    623       CALL iom_get( inum, jpdom_data, 'gphit', gphit ) 
    624       CALL iom_get( inum, jpdom_data, 'gphiu', gphiu ) 
    625       CALL iom_get( inum, jpdom_data, 'gphiv', gphiv ) 
    626       CALL iom_get( inum, jpdom_data, 'gphif', gphif ) 
    627        
    628       CALL iom_get( inum, jpdom_data, 'e1t', e1t ) 
    629       CALL iom_get( inum, jpdom_data, 'e1u', e1u ) 
    630       CALL iom_get( inum, jpdom_data, 'e1v', e1v ) 
    631       CALL iom_get( inum, jpdom_data, 'e1f', e1f ) 
    632        
    633       CALL iom_get( inum, jpdom_data, 'e2t', e2t ) 
    634       CALL iom_get( inum, jpdom_data, 'e2u', e2u ) 
    635       CALL iom_get( inum, jpdom_data, 'e2v', e2v ) 
    636       CALL iom_get( inum, jpdom_data, 'e2f', e2f ) 
     626      CALL iom_get( inum, jpdom_data, 'glamt', glamt, lrowattr=ln_use_jattr ) 
     627      CALL iom_get( inum, jpdom_data, 'glamu', glamu, lrowattr=ln_use_jattr ) 
     628      CALL iom_get( inum, jpdom_data, 'glamv', glamv, lrowattr=ln_use_jattr ) 
     629      CALL iom_get( inum, jpdom_data, 'glamf', glamf, lrowattr=ln_use_jattr ) 
     630       
     631      CALL iom_get( inum, jpdom_data, 'gphit', gphit, lrowattr=ln_use_jattr ) 
     632      CALL iom_get( inum, jpdom_data, 'gphiu', gphiu, lrowattr=ln_use_jattr ) 
     633      CALL iom_get( inum, jpdom_data, 'gphiv', gphiv, lrowattr=ln_use_jattr ) 
     634      CALL iom_get( inum, jpdom_data, 'gphif', gphif, lrowattr=ln_use_jattr ) 
     635       
     636      CALL iom_get( inum, jpdom_data, 'e1t', e1t, lrowattr=ln_use_jattr ) 
     637      CALL iom_get( inum, jpdom_data, 'e1u', e1u, lrowattr=ln_use_jattr ) 
     638      CALL iom_get( inum, jpdom_data, 'e1v', e1v, lrowattr=ln_use_jattr ) 
     639      CALL iom_get( inum, jpdom_data, 'e1f', e1f, lrowattr=ln_use_jattr ) 
     640       
     641      CALL iom_get( inum, jpdom_data, 'e2t', e2t, lrowattr=ln_use_jattr ) 
     642      CALL iom_get( inum, jpdom_data, 'e2u', e2u, lrowattr=ln_use_jattr ) 
     643      CALL iom_get( inum, jpdom_data, 'e2v', e2v, lrowattr=ln_use_jattr ) 
     644      CALL iom_get( inum, jpdom_data, 'e2f', e2f, lrowattr=ln_use_jattr ) 
    637645       
    638646      CALL iom_close( inum ) 
    639647       
     648! need to be define for the extended grid south of -80S 
     649! some point are undefined but you need to have e1 and e2 .NE. 0 
     650      WHERE (e1t==0.0_wp) 
     651         e1t=1.0e2 
     652      END WHERE 
     653      WHERE (e1v==0.0_wp) 
     654         e1v=1.0e2 
     655      END WHERE 
     656      WHERE (e1u==0.0_wp) 
     657         e1u=1.0e2 
     658      END WHERE 
     659      WHERE (e1f==0.0_wp) 
     660         e1f=1.0e2 
     661      END WHERE 
     662      WHERE (e2t==0.0_wp) 
     663         e2t=1.0e2 
     664      END WHERE 
     665      WHERE (e2v==0.0_wp) 
     666         e2v=1.0e2 
     667      END WHERE 
     668      WHERE (e2u==0.0_wp) 
     669         e2u=1.0e2 
     670      END WHERE 
     671      WHERE (e2f==0.0_wp) 
     672         e2f=1.0e2 
     673      END WHERE 
     674        
    640675    END SUBROUTINE hgr_read 
    641676     
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90

    r4624 r5260  
    184184         END DO   
    185185      END DO   
     186       
     187      ! (ISF) define barotropic mask and mask the ice shelf point 
     188      ssmask(:,:)=tmask(:,:,1) ! at this stage ice shelf is not masked 
     189       
     190      DO jk = 1, jpk 
     191         DO jj = 1, jpj 
     192            DO ji = 1, jpi 
     193               IF( REAL( misfdep(ji,jj) - jk, wp ) - 0.1_wp >= 0._wp )   THEN 
     194                  tmask(ji,jj,jk) = 0._wp 
     195               END IF 
     196            END DO   
     197         END DO   
     198      END DO   
    186199 
    187200!!gm  ???? 
     
    207220      ! Interior domain mask (used for global sum) 
    208221      ! -------------------- 
    209       tmask_i(:,:) = tmask(:,:,1) 
     222      tmask_i(:,:) = ssmask(:,:)            ! (ISH) tmask_i = 1 even on the ice shelf 
    210223      iif = jpreci                         ! ??? 
    211224      iil = nlci - jpreci + 1 
     
    250263         END DO 
    251264      END DO 
     265      ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at least 1 wet u point 
     266      DO jj = 1, jpjm1 
     267         DO ji = 1, fs_jpim1   ! vector loop 
     268            umask_i(ji,jj)  = ssmask(ji,jj) * ssmask(ji+1,jj  )  * MIN(1._wp,SUM(umask(ji,jj,:))) 
     269            vmask_i(ji,jj)  = ssmask(ji,jj) * ssmask(ji  ,jj+1)  * MIN(1._wp,SUM(vmask(ji,jj,:))) 
     270         END DO 
     271         DO ji = 1, jpim1      ! NO vector opt. 
     272            fmask_i(ji,jj) =  ssmask(ji,jj  ) * ssmask(ji+1,jj  )   & 
     273               &            * ssmask(ji,jj+1) * ssmask(ji+1,jj+1) * MIN(1._wp,SUM(fmask(ji,jj,:))) 
     274         END DO 
     275      END DO 
    252276      CALL lbc_lnk( umask, 'U', 1._wp )      ! Lateral boundary conditions 
    253277      CALL lbc_lnk( vmask, 'V', 1._wp ) 
    254278      CALL lbc_lnk( fmask, 'F', 1._wp ) 
    255  
     279      CALL lbc_lnk( umask_i, 'U', 1._wp )      ! Lateral boundary conditions 
     280      CALL lbc_lnk( vmask_i, 'V', 1._wp ) 
     281      CALL lbc_lnk( fmask_i, 'F', 1._wp ) 
     282 
     283      ! 3. Ocean/land mask at wu-, wv- and w points  
     284      !---------------------------------------------- 
     285      wmask (:,:,1) = tmask(:,:,1) ! ???????? 
     286      wumask(:,:,1) = umask(:,:,1) ! ???????? 
     287      wvmask(:,:,1) = vmask(:,:,1) ! ???????? 
     288      DO jk=2,jpk 
     289         wmask (:,:,jk)=tmask(:,:,jk) * tmask(:,:,jk-1) 
     290         wumask(:,:,jk)=umask(:,:,jk) * umask(:,:,jk-1)    
     291         wvmask(:,:,jk)=vmask(:,:,jk) * vmask(:,:,jk-1) 
     292      END DO 
    256293 
    257294      ! 4. ocean/land mask for the elliptic equation 
    258295      ! -------------------------------------------- 
    259       bmask(:,:) = tmask(:,:,1)       ! elliptic equation is written at t-point 
     296      bmask(:,:) = ssmask(:,:)       ! elliptic equation is written at t-point 
    260297      ! 
    261298      !                               ! Boundary conditions 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r4624 r5260  
    88   !!            3.3  !  2011-10  (M. Leclair) totally rewrote domvvl: 
    99   !!                                          vvl option includes z_star and z_tilde coordinates 
     10   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    1011   !!---------------------------------------------------------------------- 
    1112   !!   'key_vvl'                              variable volume 
     
    4445 
    4546   !!* Namelist nam_vvl 
    46    LOGICAL , PUBLIC                                      :: ln_vvl_zstar              ! zstar  vertical coordinate 
    47    LOGICAL , PUBLIC                                      :: ln_vvl_ztilde             ! ztilde vertical coordinate 
    48    LOGICAL , PUBLIC                                      :: ln_vvl_layer              ! level  vertical coordinate 
    49    LOGICAL , PUBLIC                                      :: ln_vvl_ztilde_as_zstar    ! ztilde vertical coordinate 
    50    LOGICAL , PUBLIC                                      :: ln_vvl_zstar_at_eqtor     ! ztilde vertical coordinate 
    51    LOGICAL , PUBLIC                                      :: ln_vvl_kepe               ! kinetic/potential energy transfer 
    52    !                                                                                           ! conservation: not used yet 
     47   LOGICAL , PUBLIC                                      :: ln_vvl_zstar = .FALSE.              ! zstar  vertical coordinate 
     48   LOGICAL , PUBLIC                                      :: ln_vvl_ztilde = .FALSE.             ! ztilde vertical coordinate 
     49   LOGICAL , PUBLIC                                      :: ln_vvl_layer = .FALSE.              ! level  vertical coordinate 
     50   LOGICAL , PUBLIC                                      :: ln_vvl_ztilde_as_zstar = .FALSE.    ! ztilde vertical coordinate 
     51   LOGICAL , PUBLIC                                      :: ln_vvl_zstar_at_eqtor = .FALSE.     ! ztilde vertical coordinate 
     52   LOGICAL , PUBLIC                                      :: ln_vvl_kepe = .FALSE.               ! kinetic/potential energy transfer 
     53   !                                                                                            ! conservation: not used yet 
    5354   REAL(wp)                                              :: rn_ahe3                   ! thickness diffusion coefficient 
    5455   REAL(wp)                                              :: rn_rst_e3t                ! ztilde to zstar restoration timescale [days] 
    5556   REAL(wp)                                              :: rn_lf_cutoff              ! cutoff frequency for low-pass filter  [days] 
    5657   REAL(wp)                                              :: rn_zdef_max               ! maximum fractional e3t deformation 
    57    LOGICAL , PUBLIC                                      :: ln_vvl_dbg                ! debug control prints 
     58   LOGICAL , PUBLIC                                      :: ln_vvl_dbg = .FALSE.      ! debug control prints 
    5859 
    5960   !! * Module variables 
     
    125126      INTEGER ::   ji,jj,jk 
    126127      INTEGER ::   ii0, ii1, ij0, ij1 
     128      REAL(wp)::   zcoef 
    127129      !!---------------------------------------------------------------------- 
    128130      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_init') 
     
    164166      ! t- and w- points depth 
    165167      ! ---------------------- 
     168      ! set the isf depth as it is in the initial step 
    166169      fsdept_n(:,:,1) = 0.5_wp * fse3w_n(:,:,1) 
    167170      fsdepw_n(:,:,1) = 0.0_wp 
     
    169172      fsdept_b(:,:,1) = 0.5_wp * fse3w_b(:,:,1) 
    170173      fsdepw_b(:,:,1) = 0.0_wp 
     174 
    171175      DO jk = 2, jpk 
    172          fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 
    173          fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 
    174          fsde3w_n(:,:,jk) = fsdept_n(:,:,jk  ) - sshn   (:,:) 
    175          fsdept_b(:,:,jk) = fsdept_b(:,:,jk-1) + fse3w_b(:,:,jk) 
    176          fsdepw_b(:,:,jk) = fsdepw_b(:,:,jk-1) + fse3t_b(:,:,jk-1) 
     176         DO jj = 1,jpj 
     177            DO ji = 1,jpi 
     178              !    zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))   ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
     179                                                     ! 1 everywhere from mbkt to mikt + 1 or 1 (if no isf) 
     180                                                     ! 0.5 where jk = mikt   
     181               zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk)) 
     182               fsdepw_n(ji,jj,jk) = fsdepw_n(ji,jj,jk-1) + fse3t_n(ji,jj,jk-1) 
     183               fsdept_n(ji,jj,jk) =      zcoef  * ( fsdepw_n(ji,jj,jk  ) + 0.5 * fse3w_n(ji,jj,jk))  & 
     184                   &                + (1-zcoef) * ( fsdept_n(ji,jj,jk-1) +       fse3w_n(ji,jj,jk))  
     185               fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk) - sshn(ji,jj) 
     186               fsdepw_b(ji,jj,jk) = fsdepw_b(ji,jj,jk-1) + fse3t_b(ji,jj,jk-1) 
     187               fsdept_b(ji,jj,jk) =      zcoef  * ( fsdepw_b(ji,jj,jk  ) + 0.5 * fse3w_b(ji,jj,jk))  & 
     188                   &                + (1-zcoef) * ( fsdept_b(ji,jj,jk-1) +       fse3w_b(ji,jj,jk))  
     189            END DO 
     190         END DO 
    177191      END DO 
    178192 
     
    185199         hv_b(:,:) = hv_b(:,:) + fse3v_b(:,:,jk) * vmask(:,:,jk) 
    186200      END DO 
    187       hur_b(:,:) = umask(:,:,1) / ( hu_b(:,:) + 1. - umask(:,:,1) ) 
    188       hvr_b(:,:) = vmask(:,:,1) / ( hv_b(:,:) + 1. - vmask(:,:,1) ) 
     201      hur_b(:,:) = umask_i(:,:) / ( hu_b(:,:) + 1. - umask_i(:,:) ) 
     202      hvr_b(:,:) = vmask_i(:,:) / ( hv_b(:,:) + 1. - vmask_i(:,:) ) 
    189203 
    190204      ! Restoring frequencies for z_tilde coordinate 
     
    293307      !                                                ! --------------------------------------------- ! 
    294308 
    295       z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * tmask(:,:,1) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) ) 
     309      z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * ssmask(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - ssmask(:,:) ) 
    296310      DO jk = 1, jpkm1 
    297311         ! formally this is the same as fse3t_a = e3t_0*(1+ssha/ht_0) 
     
    313327            zht  (:,:) = zht  (:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
    314328         END DO 
    315          zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask(:,:,1) ) 
     329         zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask_i(:,:) ) 
    316330 
    317331         ! 2 - Low frequency baroclinic horizontal divergence  (z-tilde case only) 
     
    338352         ELSE                         ! layer case 
    339353            DO jk = 1, jpkm1 
    340                tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) 
     354               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) * tmask(:,:,jk) 
    341355            END DO 
    342356         END IF 
     
    386400         ! d - thickness diffusion transport: boundary conditions 
    387401         !     (stored for tracer advction and continuity equation) 
    388          CALL lbc_lnk( un_td , 'U' , -1.) 
    389          CALL lbc_lnk( vn_td , 'V' , -1.) 
     402         CALL lbc_lnk( un_td , 'U' , -1._wp) 
     403         CALL lbc_lnk( vn_td , 'V' , -1._wp) 
    390404 
    391405         ! 4 - Time stepping of baroclinic scale factors 
     
    398412            z2dt = 2.0_wp * rdt 
    399413         ENDIF 
    400          CALL lbc_lnk( tilde_e3t_a(:,:,:), 'T', 1. ) 
     414         CALL lbc_lnk( tilde_e3t_a(:,:,:), 'T', 1._wp ) 
    401415         tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + z2dt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 
    402416 
     
    453467            zht(:,:)  = zht(:,:) + tilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
    454468         END DO 
    455          z_scale(:,:) =  - zht(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) ) 
     469         z_scale(:,:) =  - zht(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - ssmask(:,:) ) 
    456470         DO jk = 1, jpkm1 
    457471            dtilde_e3t_a(:,:,jk) = dtilde_e3t_a(:,:,jk) + fse3t_n(:,:,jk) * z_scale(:,:) * tmask(:,:,jk) 
     
    463477      !                                           ! ---baroclinic part--------- ! 
    464478         DO jk = 1, jpkm1 
    465             fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) 
     479            fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
    466480         END DO 
    467481      ENDIF 
     
    531545      END DO 
    532546      !                                        ! Inverse of the local depth 
    533       hur_a(:,:) = 1._wp / ( hu_a(:,:) + 1._wp - umask(:,:,1) ) * umask(:,:,1) 
    534       hvr_a(:,:) = 1._wp / ( hv_a(:,:) + 1._wp - vmask(:,:,1) ) * vmask(:,:,1) 
     547      hur_a(:,:) = 1._wp / ( hu_a(:,:) + 1._wp - umask_i(:,:) ) * umask_i(:,:) 
     548      hvr_a(:,:) = 1._wp / ( hv_a(:,:) + 1._wp - vmask_i(:,:) ) * vmask_i(:,:) 
    535549 
    536550      CALL wrk_dealloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
     
    569583      INTEGER, INTENT( in )               :: kt       ! time step 
    570584      !! * Local declarations 
    571       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_e3t_def 
    572       INTEGER                             :: jk       ! dummy loop indices 
     585      INTEGER                             :: ji,jj,jk       ! dummy loop indices 
     586      REAL(wp)                            :: zcoef 
    573587      !!---------------------------------------------------------------------- 
    574588 
    575589      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_sf_swp') 
    576       ! 
    577       CALL wrk_alloc( jpi, jpj, jpk, z_e3t_def                ) 
    578590      ! 
    579591      IF( kt == nit000 )   THEN 
     
    619631      ! t- and w- points depth 
    620632      ! ---------------------- 
     633      ! set the isf depth as it is in the initial step 
    621634      fsdept_n(:,:,1) = 0.5_wp * fse3w_n(:,:,1) 
    622635      fsdepw_n(:,:,1) = 0.0_wp 
    623636      fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 
     637 
    624638      DO jk = 2, jpk 
    625          fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 
    626          fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 
    627          fsde3w_n(:,:,jk) = fsdept_n(:,:,jk  ) - sshn   (:,:) 
     639         DO jj = 1,jpj 
     640            DO ji = 1,jpi 
     641              !    zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))   ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 
     642                                                                 ! 1 for jk = mikt 
     643               zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk)) 
     644               fsdepw_n(ji,jj,jk) = fsdepw_n(ji,jj,jk-1) + fse3t_n(ji,jj,jk-1) 
     645               fsdept_n(ji,jj,jk) =      zcoef  * ( fsdepw_n(ji,jj,jk  ) + 0.5 * fse3w_n(ji,jj,jk))  & 
     646                   &                + (1-zcoef) * ( fsdept_n(ji,jj,jk-1) +       fse3w_n(ji,jj,jk))  
     647               fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk) - sshn(ji,jj) 
     648            END DO 
     649         END DO 
    628650      END DO 
     651 
    629652      ! Local depth and Inverse of the local depth of the water column at u- and v- points 
    630653      ! ---------------------------------------------------------------------------------- 
     
    645668      ! Write outputs 
    646669      ! ============= 
    647       z_e3t_def(:,:,:) = ( ( fse3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 
    648       CALL iom_put( "cellthc" , fse3t_n  (:,:,:) ) 
     670      CALL iom_put(     "e3t" , fse3t_n  (:,:,:) ) 
     671      CALL iom_put(     "e3u" , fse3u_n  (:,:,:) ) 
     672      CALL iom_put(     "e3v" , fse3v_n  (:,:,:) ) 
     673      CALL iom_put(     "e3w" , fse3w_n  (:,:,:) ) 
    649674      CALL iom_put( "tpt_dep" , fsde3w_n (:,:,:) ) 
    650       CALL iom_put( "e3tdef"  , z_e3t_def(:,:,:) ) 
     675      IF( iom_use("e3tdef") )   & 
     676         CALL iom_put( "e3tdef"  , ( ( fse3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 ) 
    651677 
    652678      ! write restart file 
    653679      ! ================== 
    654680      IF( lrst_oce ) CALL dom_vvl_rst( kt, 'WRITE' ) 
    655       ! 
    656       CALL wrk_dealloc( jpi, jpj, jpk, z_e3t_def ) 
    657681      ! 
    658682      IF( nn_timing == 1 )  CALL timing_stop('dom_vvl_sf_swp') 
     
    702726         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
    703727         ! boundary conditions 
    704          CALL lbc_lnk( pe3_out(:,:,:), 'U', 1. ) 
     728         CALL lbc_lnk( pe3_out(:,:,:), 'U', 1._wp ) 
    705729         pe3_out(:,:,:) = pe3_out(:,:,:) + e3u_0(:,:,:) 
    706730         !               ! ------------------------------------- ! 
     
    720744         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
    721745         ! boundary conditions 
    722          CALL lbc_lnk( pe3_out(:,:,:), 'V', 1. ) 
     746         CALL lbc_lnk( pe3_out(:,:,:), 'V', 1._wp ) 
    723747         pe3_out(:,:,:) = pe3_out(:,:,:) + e3v_0(:,:,:) 
    724748         !               ! ------------------------------------- ! 
     
    738762         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
    739763         ! boundary conditions 
    740          CALL lbc_lnk( pe3_out(:,:,:), 'F', 1. ) 
     764         CALL lbc_lnk( pe3_out(:,:,:), 'F', 1._wp ) 
    741765         pe3_out(:,:,:) = pe3_out(:,:,:) + e3f_0(:,:,:) 
    742766         !               ! ------------------------------------- ! 
     
    808832            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. ) 
    809833            id4 = iom_varid( numror, 'tilde_e3t_n', ldstop = .FALSE. ) 
    810             id5 = iom_varid( numror, 'hdif_lf', ldstop = .FALSE. ) 
     834            id5 = iom_varid( numror, 'hdiv_lf', ldstop = .FALSE. ) 
    811835            !                             ! --------- ! 
    812836            !                             ! all cases ! 
     
    815839               CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
    816840               CALL iom_get( numror, jpdom_autoglo, 'fse3t_n', fse3t_n(:,:,:) ) 
     841               ! needed to restart if land processor not computed  
     842               IF(lwp) write(numout,*) 'dom_vvl_rst : fse3t_b and fse3t_n found in restart files' 
     843               WHERE ( tmask(:,:,:) == 0.0_wp )  
     844                  fse3t_n(:,:,:) = e3t_0(:,:,:) 
     845                  fse3t_b(:,:,:) = e3t_0(:,:,:) 
     846               END WHERE 
    817847               IF( neuler == 0 ) THEN 
    818848                  fse3t_b(:,:,:) = fse3t_n(:,:,:) 
    819849               ENDIF 
    820850            ELSE IF( id1 > 0 ) THEN 
     851               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : fse3t_n not found in restart files' 
     852               IF(lwp) write(numout,*) 'fse3t_n set equal to fse3t_b.' 
     853               IF(lwp) write(numout,*) 'neuler is forced to 0' 
     854               CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
     855               fse3t_n(:,:,:) = fse3t_b(:,:,:) 
     856               neuler = 0 
     857            ELSE IF( id2 > 0 ) THEN 
    821858               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : fse3t_b not found in restart files' 
    822859               IF(lwp) write(numout,*) 'fse3t_b set equal to fse3t_n.' 
    823860               IF(lwp) write(numout,*) 'neuler is forced to 0' 
     861               CALL iom_get( numror, jpdom_autoglo, 'fse3t_n', fse3t_n(:,:,:) ) 
    824862               fse3t_b(:,:,:) = fse3t_n(:,:,:) 
    825863               neuler = 0 
     
    830868               DO jk=1,jpk 
    831869                  fse3t_n(:,:,jk) =  e3t_0(:,:,jk) * ( ht_0(:,:) + sshn(:,:) ) & 
    832                       &                            / ( ht_0(:,:) + 1._wp - tmask(:,:,1) ) * tmask(:,:,jk) & 
     870                      &                            / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk) & 
    833871                      &            + e3t_0(:,:,jk) * (1._wp -tmask(:,:,jk)) 
    834872               END DO 
     
    9641002 
    9651003      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE vertical coordinate in namelist nam_vvl' ) 
     1004      IF( .NOT. ln_vvl_zstar .AND. nn_isf .NE. 0) CALL ctl_stop( 'Only vvl_zstar has been tested with ice shelf cavity' ) 
    9661005 
    9671006      IF(lwp) THEN                   ! Print the choice 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90

    r4292 r5260  
    132132       
    133133      CALL dom_uniq( zprw, 'T' ) 
    134       zprt = tmask(:,:,1) * zprw                               !    ! unique point mask 
     134      DO jj = 1, jpj 
     135         DO ji = 1, jpi 
     136            jk=mikt(ji,jj)  
     137            zprt(ji,jj) = tmask(ji,jj,jk) * zprw(ji,jj)                        !    ! unique point mask 
     138         END DO 
     139      END DO                             !    ! unique point mask 
    135140      CALL iom_rstput( 0, 0, inum2, 'tmaskutil', zprt, ktype = jp_i1 )   
    136141      CALL dom_uniq( zprw, 'U' ) 
    137       zprt = umask(:,:,1) * zprw 
     142      DO jj = 1, jpj 
     143         DO ji = 1, jpi 
     144            jk=miku(ji,jj)  
     145            zprt(ji,jj) = umask(ji,jj,jk) * zprw(ji,jj)                        !    ! unique point mask 
     146         END DO 
     147      END DO 
    138148      CALL iom_rstput( 0, 0, inum2, 'umaskutil', zprt, ktype = jp_i1 )   
    139149      CALL dom_uniq( zprw, 'V' ) 
    140       zprt = vmask(:,:,1) * zprw 
     150      DO jj = 1, jpj 
     151         DO ji = 1, jpi 
     152            jk=mikv(ji,jj)  
     153            zprt(ji,jj) = vmask(ji,jj,jk) * zprw(ji,jj)                        !    ! unique point mask 
     154         END DO 
     155      END DO 
    141156      CALL iom_rstput( 0, 0, inum2, 'vmaskutil', zprt, ktype = jp_i1 )   
    142157      CALL dom_uniq( zprw, 'F' ) 
    143       zprt = fmask(:,:,1) * zprw 
     158      DO jj = 1, jpj 
     159         DO ji = 1, jpi 
     160            jk=mikf(ji,jj)  
     161            zprt(ji,jj) = fmask(ji,jj,jk) * zprw(ji,jj)                        !    ! unique point mask 
     162         END DO 
     163      END DO 
    144164      CALL iom_rstput( 0, 0, inum2, 'fmaskutil', zprt, ktype = jp_i1 )   
    145165 
     
    168188       
    169189      ! note that mbkt is set to 1 over land ==> use surface tmask 
    170       zprt(:,:) = tmask(:,:,1) * REAL( mbkt(:,:) , wp ) 
     190      zprt(:,:) = ssmask(:,:) * REAL( mbkt(:,:) , wp ) 
    171191      CALL iom_rstput( 0, 0, inum4, 'mbathy', zprt, ktype = jp_i2 )     !    ! nb of ocean T-points 
     192      zprt(:,:) = ssmask(:,:) * REAL( mikt(:,:) , wp ) 
     193      CALL iom_rstput( 0, 0, inum4, 'misf', zprt, ktype = jp_i2 )       !    ! nb of ocean T-points 
     194      zprt(:,:) = ssmask(:,:) * REAL( risfdep(:,:) , wp ) 
     195      CALL iom_rstput( 0, 0, inum4, 'isfdraft', zprt, ktype = jp_r4 )       !    ! nb of ocean T-points 
    172196             
    173197      IF( ln_sco ) THEN                                         ! s-coordinate 
     
    203227            DO jj = 1,jpj    
    204228               DO ji = 1,jpi 
    205                   e3tp(ji,jj) = e3t_0(ji,jj,mbkt(ji,jj)) * tmask(ji,jj,1) 
    206                   e3wp(ji,jj) = e3w_0(ji,jj,mbkt(ji,jj)) * tmask(ji,jj,1) 
     229                  e3tp(ji,jj) = e3t_0(ji,jj,mbkt(ji,jj)) * ssmask(ji,jj) 
     230                  e3wp(ji,jj) = e3w_0(ji,jj,mbkt(ji,jj)) * ssmask(ji,jj) 
    207231               END DO 
    208232            END DO 
     
    228252            DO jj = 1,jpj    
    229253               DO ji = 1,jpi 
    230                   zprt(ji,jj) = gdept_0(ji,jj,mbkt(ji,jj)  ) * tmask(ji,jj,1) 
    231                   zprw(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) * tmask(ji,jj,1) 
     254                  zprt(ji,jj) = gdept_0(ji,jj,mbkt(ji,jj)  ) * ssmask(ji,jj) 
     255                  zprw(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) * ssmask(ji,jj) 
    232256               END DO 
    233257            END DO 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r4624 r5260  
    1717   !!            3.4  ! 2012-08  (J. Siddorn) added Siddorn and Furner stretching function 
    1818   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  modify C1D case   
     19   !!            3.6  ! 2014-11  (P. Mathiot and C. Harris) add ice shelf capabilitye   
    1920   !!---------------------------------------------------------------------- 
    2021 
     
    101102      INTEGER ::   ios 
    102103      ! 
    103       NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
     104      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav 
    104105      !!---------------------------------------------------------------------- 
    105106      ! 
     
    120121         WRITE(numout,*) '~~~~~~~' 
    121122         WRITE(numout,*) '          Namelist namzgr : set vertical coordinate' 
    122          WRITE(numout,*) '             z-coordinate - full steps      ln_zco = ', ln_zco 
    123          WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps 
    124          WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco = ', ln_sco 
     123         WRITE(numout,*) '             z-coordinate - full steps      ln_zco    = ', ln_zco 
     124         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps    = ', ln_zps 
     125         WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco    = ', ln_sco 
     126         WRITE(numout,*) '             ice shelf cavities             ln_isfcav = ', ln_isfcav 
    125127      ENDIF 
    126128 
     
    145147      IF( .NOT.lk_c1d )   CALL zgr_bat_ctl      ! check bathymetry (mbathy) and suppress isolated ocean points 
    146148                          CALL zgr_bot_level    ! deepest ocean level for t-, u- and v-points 
     149                          CALL zgr_top_level    ! shallowest ocean level for T-, U-, V- points 
    147150      ! 
    148151      IF( lk_c1d ) THEN                         ! 1D config.: same mbathy value over the 3x3 domain 
     
    295298      ENDIF 
    296299 
     300      IF ( ln_isfcav ) THEN 
     301! need to be like this to compute the pressure gradient with ISF. If not, level beneath the ISF are not aligned (sum(e3t) /= depth) 
     302! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively 
     303         DO jk = 1, jpkm1 
     304            e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk)  
     305         END DO 
     306         e3t_1d(jpk) = e3t_1d(jpk-1)   ! we don't care because this level is masked in NEMO 
     307 
     308         DO jk = 2, jpk 
     309            e3w_1d(jk) = gdept_1d(jk) - gdept_1d(jk-1)  
     310         END DO 
     311         e3w_1d(1  ) = 2._wp * (gdept_1d(1) - gdepw_1d(1))  
     312      END IF 
     313 
    297314!!gm BUG in s-coordinate this does not work! 
    298315      ! deepest/shallowest W level Above/Below ~10m 
     
    350367      INTEGER  ::   ji, jj, jl, jk            ! dummy loop indices 
    351368      INTEGER  ::   inum                      ! temporary logical unit 
     369      INTEGER  ::   ierror                    ! error flag 
    352370      INTEGER  ::   ii_bump, ij_bump, ih      ! bump center position 
    353371      INTEGER  ::   ii0, ii1, ij0, ij1, ik    ! local indices 
    354372      REAL(wp) ::   r_bump , h_bump , h_oce   ! bump characteristics  
    355373      REAL(wp) ::   zi, zj, zh, zhmin         ! local scalars 
    356       INTEGER , POINTER, DIMENSION(:,:) ::   idta   ! global domain integer data 
    357       REAL(wp), POINTER, DIMENSION(:,:) ::   zdta   ! global domain scalar data 
     374      INTEGER , ALLOCATABLE, DIMENSION(:,:) ::   idta   ! global domain integer data 
     375      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdta   ! global domain scalar data 
    358376      !!---------------------------------------------------------------------- 
    359377      ! 
    360378      IF( nn_timing == 1 )  CALL timing_start('zgr_bat') 
    361       ! 
    362       CALL wrk_alloc( jpidta, jpjdta, idta ) 
    363       CALL wrk_alloc( jpidta, jpjdta, zdta ) 
    364379      ! 
    365380      IF(lwp) WRITE(numout,*) 
     
    370385         !                                            ! ================== ! 
    371386         !                                            ! global domain level and meter bathymetry (idta,zdta) 
     387         ! 
     388         ALLOCATE( idta(jpidta,jpjdta), STAT=ierror ) 
     389         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate idta array' ) 
     390         ALLOCATE( zdta(jpidta,jpjdta), STAT=ierror ) 
     391         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate zdta array' ) 
    372392         ! 
    373393         IF( ntopo == 0 ) THEN                        ! flat basin 
     
    450470            END DO 
    451471         END DO 
     472         risfdep(:,:)=0.e0 
     473         misfdep(:,:)=1 
     474         ! 
     475         ! (ISF) TODO build ice draft netcdf file for isomip and build the corresponding part of code 
     476         IF( cp_cfg == "isomip" .AND. ln_isfcav ) THEN  
     477            risfdep(:,:)=200.e0  
     478            misfdep(:,:)=1  
     479            ij0 = 1 ; ij1 = 40  
     480            DO jj = mj0(ij0), mj1(ij1)  
     481               risfdep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp  
     482            END DO  
     483            WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp  
     484         !  
     485         ELSEIF ( cp_cfg == "isomip2" .AND. ln_isfcav ) THEN 
     486         !  
     487            risfdep(:,:)=0.e0 
     488            misfdep(:,:)=1 
     489            ij0 = 1 ; ij1 = 40 
     490            DO jj = mj0(ij0), mj1(ij1) 
     491               risfdep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp 
     492            END DO 
     493            WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp 
     494         END IF 
     495         ! 
     496         DEALLOCATE( idta, zdta ) 
    452497         ! 
    453498         !                                            ! ================ ! 
     
    490535         IF( ln_zps .OR. ln_sco )   THEN              ! zps or sco : read meter bathymetry 
    491536            CALL iom_open ( 'bathy_meter.nc', inum )  
    492             CALL iom_get  ( inum, jpdom_data, 'Bathymetry', bathy ) 
     537            IF ( ln_isfcav ) THEN 
     538               CALL iom_get  ( inum, jpdom_data, 'Bathymetry_isf', bathy, lrowattr=.false. ) 
     539            ELSE 
     540               CALL iom_get  ( inum, jpdom_data, 'Bathymetry'    , bathy, lrowattr=ln_use_jattr  ) 
     541            END IF 
    493542            CALL iom_close( inum ) 
    494543            !                                                 
     544            risfdep(:,:)=0._wp          
     545            misfdep(:,:)=1              
     546            IF ( ln_isfcav ) THEN 
     547               CALL iom_open ( 'isf_draft_meter.nc', inum )  
     548               CALL iom_get  ( inum, jpdom_data, 'isf_draft', risfdep ) 
     549               CALL iom_close( inum ) 
     550               WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp 
     551            END IF 
     552            !        
    495553            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
    496554               ! 
     
    530588      !                        
    531589      IF ( .not. ln_sco ) THEN                                !==  set a minimum depth  ==! 
     590         ! patch to avoid case bathy = ice shelf draft and bathy between 0 and zhmin 
     591         IF ( ln_isfcav ) THEN 
     592            WHERE (bathy == risfdep) 
     593               bathy   = 0.0_wp ; risfdep = 0.0_wp 
     594            END WHERE 
     595         END IF 
     596         ! end patch 
    532597         IF( rn_hmin < 0._wp ) THEN    ;   ik = - INT( rn_hmin )                                      ! from a nb of level 
    533598         ELSE                          ;   ik = MINLOC( gdepw_1d, mask = gdepw_1d > rn_hmin, dim = 1 )  ! from a depth 
     
    539604         IF(lwp) write(numout,*) 'Minimum ocean depth: ', zhmin, ' minimum number of ocean levels : ', ik 
    540605      ENDIF 
    541       ! 
    542       CALL wrk_dealloc( jpidta, jpjdta, idta ) 
    543       CALL wrk_dealloc( jpidta, jpjdta, zdta ) 
    544606      ! 
    545607      IF( nn_timing == 1 )  CALL timing_stop('zgr_bat') 
     
    783845   END SUBROUTINE zgr_bot_level 
    784846 
     847      SUBROUTINE zgr_top_level 
     848      !!---------------------------------------------------------------------- 
     849      !!                    ***  ROUTINE zgr_bot_level  *** 
     850      !! 
     851      !! ** Purpose :   defines the vertical index of ocean top (mik. arrays) 
     852      !! 
     853      !! ** Method  :   computes from misfdep with a minimum value of 1 
     854      !! 
     855      !! ** Action  :   mikt, miku, mikv :   vertical indices of the shallowest  
     856      !!                                     ocean level at t-, u- & v-points 
     857      !!                                     (min value = 1) 
     858      !!---------------------------------------------------------------------- 
     859      !! 
     860      INTEGER ::   ji, jj   ! dummy loop indices 
     861      REAL(wp), POINTER, DIMENSION(:,:) ::  zmik 
     862      !!---------------------------------------------------------------------- 
     863      ! 
     864      IF( nn_timing == 1 )  CALL timing_start('zgr_top_level') 
     865      ! 
     866      CALL wrk_alloc( jpi, jpj, zmik ) 
     867      ! 
     868      IF(lwp) WRITE(numout,*) 
     869      IF(lwp) WRITE(numout,*) '    zgr_top_level : ocean top k-index of T-, U-, V- and W-levels ' 
     870      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~' 
     871      ! 
     872      mikt(:,:) = MAX( misfdep(:,:) , 1 )    ! top k-index of T-level (=1) 
     873      !                                      ! top k-index of W-level (=mikt) 
     874      DO jj = 1, jpjm1                       ! top k-index of U- (U-) level 
     875         DO ji = 1, jpim1 
     876            miku(ji,jj) = MAX(  mikt(ji+1,jj  ) , mikt(ji,jj)  ) 
     877            mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
     878            mikf(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj), mikt(ji+1,jj  ), mikt(ji+1,jj+1)  ) 
     879         END DO 
     880      END DO 
     881 
     882      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     883      zmik(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk(zmik,'U',1.)   ;   miku  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     884      zmik(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk(zmik,'V',1.)   ;   mikv  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     885      zmik(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk(zmik,'F',1.)   ;   mikf  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     886      ! 
     887      CALL wrk_dealloc( jpi, jpj, zmik ) 
     888      ! 
     889      IF( nn_timing == 1 )  CALL timing_stop('zgr_top_level') 
     890      ! 
     891   END SUBROUTINE zgr_top_level 
    785892 
    786893   SUBROUTINE zgr_zco 
     
    9061013         WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
    9071014      END DO 
     1015 
     1016      IF ( ln_isfcav ) CALL zgr_isf 
    9081017 
    9091018      ! Scale factors and depth at T- and W-points 
     
    9381047!gm Bug?  check the gdepw_1d 
    9391048                  !       ... on ik 
    940                   gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0   (ji,jj,ik+1) - gdepw_1d(ik) )   & 
    941                      &                           * ((gdept_1d(      ik  ) - gdepw_1d(ik) )   & 
    942                      &                           / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )) 
    943                   e3t_0(ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
    944                      &                          / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
     1049                  gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) )   & 
     1050                     &                             * ((gdept_1d(     ik  ) - gdepw_1d(ik) )   & 
     1051                     &                             / ( gdepw_1d(     ik+1) - gdepw_1d(ik) )) 
     1052                  e3t_0  (ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
     1053                     &                             / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
    9451054                  e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) )   & 
    9461055                     &                     * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) ) 
     
    9731082         END DO 
    9741083      END DO 
     1084      ! 
     1085      IF ( ln_isfcav ) THEN 
     1086      ! (ISF) Definition of e3t, u, v, w for ISF case 
     1087         DO jj = 1, jpj  
     1088            DO ji = 1, jpi  
     1089               ik = misfdep(ji,jj)  
     1090               IF( ik > 1 ) THEN               ! ice shelf point only  
     1091                  IF( risfdep(ji,jj) < gdepw_1d(ik) )  risfdep(ji,jj)= gdepw_1d(ik)  
     1092                  gdepw_0(ji,jj,ik) = risfdep(ji,jj)  
     1093!gm Bug?  check the gdepw_0  
     1094               !       ... on ik  
     1095                  gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) )   &  
     1096                     &                               * ( gdepw_1d(ik+1) - gdept_1d(ik)      )   &  
     1097                     &                               / ( gdepw_1d(ik+1) - gdepw_1d(ik)      )  
     1098                  e3t_0  (ji,jj,ik  ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik)  
     1099                  e3w_0  (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 
     1100 
     1101                  IF( ik + 1 == mbathy(ji,jj) ) THEN               ! ice shelf point only (2 cell water column)  
     1102                     e3w_0  (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik)  
     1103                  ENDIF  
     1104               !       ... on ik / ik-1  
     1105                  e3w_0  (ji,jj,ik  ) = 2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik))  
     1106                  e3t_0  (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 
     1107! The next line isn't required and doesn't affect results - included for consistency with bathymetry code  
     1108                  gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 
     1109               ENDIF  
     1110            END DO  
     1111         END DO  
     1112      !  
     1113         it = 0  
     1114         DO jj = 1, jpj  
     1115            DO ji = 1, jpi  
     1116               ik = misfdep(ji,jj)  
     1117               IF( ik > 1 ) THEN               ! ice shelf point only  
     1118                  e3tp (ji,jj) = e3t_0(ji,jj,ik  )  
     1119                  e3wp (ji,jj) = e3w_0(ji,jj,ik+1 )  
     1120               ! test  
     1121                  zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik  )  
     1122                  IF( zdiff <= 0. .AND. lwp ) THEN   
     1123                     it = it + 1  
     1124                     WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj  
     1125                     WRITE(numout,*) ' risfdep = ', risfdep(ji,jj)  
     1126                     WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff  
     1127                     WRITE(numout,*) ' e3tp  = ', e3tp(ji,jj), ' e3wp  = ', e3wp(ji,jj)  
     1128                  ENDIF  
     1129               ENDIF  
     1130            END DO  
     1131         END DO  
     1132      END IF 
     1133      ! END (ISF) 
    9751134 
    9761135      ! Scale factors and depth at U-, V-, UW and VW-points 
     
    9911150         END DO 
    9921151      END DO 
     1152      IF ( ln_isfcav ) THEN 
     1153      ! (ISF) define e3uw (adapted for 2 cells in the water column) 
     1154      ! Need to test if the modification of only mikt and mbkt levels is enough 
     1155         DO jk = 2,jpk                           
     1156            DO jj = 1, jpjm1  
     1157               DO ji = 1, fs_jpim1   ! vector opt.  
     1158                  e3uw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji+1,jj  ,jk) ) & 
     1159                    &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji+1,jj  ,jk-1) ) 
     1160                  e3vw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji  ,jj+1,jk) ) & 
     1161                    &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji  ,jj+1,jk-1) ) 
     1162               END DO  
     1163            END DO  
     1164         END DO 
     1165      END IF 
     1166       
    9931167      CALL lbc_lnk( e3u_0 , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw_0, 'U', 1._wp )   ! lateral boundary conditions 
    9941168      CALL lbc_lnk( e3v_0 , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 
     
    10321206      
    10331207      ! Compute gdep3w_0 (vertical sum of e3w) 
    1034       gdep3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
    1035       DO jk = 2, jpk 
    1036          gdep3w_0(:,:,jk) = gdep3w_0(:,:,jk-1) + e3w_0(:,:,jk)  
    1037       END DO 
    1038          
     1208      IF ( ln_isfcav ) THEN ! if cavity 
     1209         WHERE (misfdep == 0) misfdep = 1 
     1210         DO jj = 1,jpj 
     1211            DO ji = 1,jpi 
     1212               gdep3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 
     1213               DO jk = 2, misfdep(ji,jj) 
     1214                  gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1215               END DO 
     1216               IF (misfdep(ji,jj) .GE. 2) gdep3w_0(ji,jj,misfdep(ji,jj)) = risfdep(ji,jj) + 0.5_wp * e3w_0(ji,jj,misfdep(ji,jj)) 
     1217               DO jk = misfdep(ji,jj) + 1, jpk 
     1218                  gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1219               END DO 
     1220            END DO 
     1221         END DO 
     1222      ELSE ! no cavity 
     1223         gdep3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
     1224         DO jk = 2, jpk 
     1225            gdep3w_0(:,:,jk) = gdep3w_0(:,:,jk-1) + e3w_0(:,:,jk) 
     1226         END DO 
     1227      END IF 
    10391228      !                                               ! ================= ! 
    10401229      IF(lwp .AND. ll_print) THEN                     !   Control print   ! 
     
    10701259      ! 
    10711260   END SUBROUTINE zgr_zps 
     1261 
     1262   SUBROUTINE zgr_isf 
     1263      !!---------------------------------------------------------------------- 
     1264      !!                    ***  ROUTINE zgr_isf  *** 
     1265      !!    
     1266      !! ** Purpose :   check the bathymetry in levels 
     1267      !!    
     1268      !! ** Method  :   THe water column have to contained at least 2 cells 
     1269      !!                Bathymetry and isfdraft are modified (dig/close) to respect 
     1270      !!                this criterion. 
     1271      !!                  
     1272      !!    
     1273      !! ** Action  : - test compatibility between isfdraft and bathy  
     1274      !!              - bathy and isfdraft are modified 
     1275      !!---------------------------------------------------------------------- 
     1276      !!    
     1277      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
     1278      INTEGER  ::   ik, it           ! temporary integers 
     1279      INTEGER  ::   id, jd, nprocd 
     1280      INTEGER  ::   icompt, ibtest, ibtestim1, ibtestip1, ibtestjm1, ibtestjp1   ! (ISF) 
     1281      LOGICAL  ::   ll_print         ! Allow  control print for debugging 
     1282      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points 
     1283      REAL(wp) ::   zdepwp, zdepth   ! Ajusted ocean depth to avoid too small e3t 
     1284      REAL(wp) ::   zmax, zmin       ! Maximum and minimum depth 
     1285      REAL(wp) ::   zdiff            ! temporary scalar 
     1286      REAL(wp) ::   zrefdep          ! temporary scalar 
     1287      REAL(wp) ::   zbathydiff, zrisfdepdiff  ! isf temporary scalar 
     1288      REAL(wp), POINTER, DIMENSION(:,:)   ::   zrisfdep, zbathy, zmask   ! 2D workspace (ISH) 
     1289      INTEGER , POINTER, DIMENSION(:,:)   ::   zmbathy, zmisfdep         ! 2D workspace (ISH) 
     1290      !!--------------------------------------------------------------------- 
     1291      ! 
     1292      IF( nn_timing == 1 )  CALL timing_start('zgr_isf') 
     1293      ! 
     1294      CALL wrk_alloc( jpi, jpj, zbathy, zmask, zrisfdep) 
     1295      CALL wrk_alloc( jpi, jpj, zmisfdep, zmbathy ) 
     1296 
     1297 
     1298      ! (ISF) compute misfdep 
     1299      WHERE( risfdep(:,:) == 0._wp .AND. bathy(:,:) .NE. 0) ;   misfdep(:,:) = 1   ! open water : set misfdep to 1   
     1300      ELSEWHERE                      ;                          misfdep(:,:) = 2   ! iceshelf : initialize misfdep to second level  
     1301      END WHERE   
     1302 
     1303      ! Compute misfdep for ocean points (i.e. first wet level)  
     1304      ! find the first ocean level such that the first level thickness  
     1305      ! is larger than the bot_level of e3zps_min and e3zps_rat * e3t_0 (where  
     1306      ! e3t_0 is the reference level thickness  
     1307      DO jk = 2, jpkm1  
     1308         zdepth = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat )  
     1309         WHERE( 0._wp < risfdep(:,:) .AND. risfdep(:,:) >= zdepth )   misfdep(:,:) = jk+1  
     1310      END DO  
     1311      WHERE (risfdep(:,:) <= e3t_1d(1) .AND. risfdep(:,:) .GT. 0._wp) 
     1312         risfdep(:,:) = 0. ; misfdep(:,:) = 1 
     1313      END WHERE 
     1314  
     1315! basic check for the compatibility of bathy and risfdep. I think it should be offline because it is not perfect and cannot solved all the situation 
     1316      icompt = 0  
     1317! run the bathy check 10 times to be sure all the modif in the bathy or iceshelf draft are compatible together 
     1318      DO jl = 1, 10      
     1319         WHERE (bathy(:,:) .EQ. risfdep(:,:) ) 
     1320            misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp 
     1321            mbathy (:,:) = 0 ; bathy  (:,:) = 0._wp 
     1322         END WHERE 
     1323         WHERE (mbathy(:,:) <= 0)  
     1324            misfdep(:,:) = 0; risfdep(:,:) = 0._wp  
     1325            mbathy (:,:) = 0; bathy  (:,:) = 0._wp 
     1326         ENDWHERE 
     1327         IF( lk_mpp ) THEN 
     1328            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1329            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1330            misfdep(:,:) = INT( zbathy(:,:) ) 
     1331            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1332            CALL lbc_lnk( bathy, 'T', 1. ) 
     1333            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1334            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1335            mbathy(:,:) = INT( zbathy(:,:) ) 
     1336         ENDIF 
     1337         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN  
     1338            misfdep( 1 ,:) = misfdep(jpim1,:)           ! local domain is cyclic east-west  
     1339            misfdep(jpi,:) = misfdep(  2  ,:)  
     1340         ENDIF 
     1341 
     1342         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN 
     1343            mbathy( 1 ,:) = mbathy(jpim1,:)             ! local domain is cyclic east-west 
     1344            mbathy(jpi,:) = mbathy(  2  ,:) 
     1345         ENDIF 
     1346 
     1347         ! split last cell if possible (only where water column is 2 cell or less) 
     1348         DO jk = jpkm1, 1, -1 
     1349            zmax = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1350            WHERE( gdepw_1d(jk) < bathy(:,:) .AND. bathy(:,:) <= zmax .AND. misfdep + 1 >= mbathy) 
     1351               mbathy(:,:) = jk 
     1352               bathy(:,:)  = zmax 
     1353            END WHERE 
     1354         END DO 
     1355  
     1356         ! split top cell if possible (only where water column is 2 cell or less) 
     1357         DO jk = 2, jpkm1 
     1358            zmax = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1359            WHERE( gdepw_1d(jk+1) > risfdep(:,:) .AND. risfdep(:,:) >= zmax .AND. misfdep + 1 >= mbathy) 
     1360               misfdep(:,:) = jk 
     1361               risfdep(:,:) = zmax 
     1362            END WHERE 
     1363         END DO 
     1364 
     1365  
     1366 ! Case where bathy and risfdep compatible but not the level variable mbathy/misfdep because of partial cell condition 
     1367         DO jj = 1, jpj 
     1368            DO ji = 1, jpi 
     1369               ! find the minimum change option: 
     1370               ! test bathy 
     1371               IF (risfdep(ji,jj) .GT. 1) THEN 
     1372               zbathydiff =ABS(bathy(ji,jj)   - (gdepw_1d(mbathy (ji,jj)+1) & 
     1373                 &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 
     1374               zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj)  ) & 
     1375                 &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 
     1376  
     1377                  IF (bathy(ji,jj) .GT. risfdep(ji,jj) .AND. mbathy(ji,jj) .LT. misfdep(ji,jj)) THEN 
     1378                     IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1379                        bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj)+1)*e3zps_rat ) 
     1380                        mbathy(ji,jj)= mbathy(ji,jj) + 1 
     1381                     ELSE 
     1382                        risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ) 
     1383                        misfdep(ji,jj) = misfdep(ji,jj) - 1 
     1384                     END IF 
     1385                  END IF 
     1386               END IF 
     1387            END DO 
     1388         END DO 
     1389  
     1390          ! At least 2 levels for water thickness at T, U, and V point. 
     1391         DO jj = 1, jpj 
     1392            DO ji = 1, jpi 
     1393               ! find the minimum change option: 
     1394               ! test bathy 
     1395               IF( misfdep(ji,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1396                  zbathydiff  =ABS(bathy(ji,jj)  - (gdepw_1d(mbathy (ji,jj)+1)& 
     1397                    & + MIN( e3zps_min,e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 
     1398                  zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj)  )  & 
     1399                    & - MIN( e3zps_min,e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 
     1400                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1401                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1402                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 
     1403                  ELSE 
     1404                     misfdep(ji,jj)= misfdep(ji,jj) - 1 
     1405                     risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat ) 
     1406                  END IF 
     1407               ENDIF 
     1408            END DO 
     1409         END DO 
     1410  
     1411 ! point V mbathy(ji,jj) EQ misfdep(ji,jj+1)  
     1412         DO jj = 1, jpjm1 
     1413            DO ji = 1, jpim1 
     1414               IF( misfdep(ji,jj+1) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1415                  zbathydiff =ABS(bathy(ji,jj    ) - (gdepw_1d(mbathy (ji,jj)+1)   & 
     1416                    &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj  )+1)*e3zps_rat ))) 
     1417                  zrisfdepdiff=ABS(risfdep(ji,jj+1) - (gdepw_1d(misfdep(ji,jj+1))  & 
     1418                    &  - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1)-1)*e3zps_rat ))) 
     1419                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1420                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1421                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj  )) & 
     1422                   &    + MIN( e3zps_min, e3t_1d(mbathy(ji,jj   )+1)*e3zps_rat ) 
     1423                  ELSE 
     1424                     misfdep(ji,jj+1)  = misfdep(ji,jj+1) - 1 
     1425                     risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) & 
     1426                   &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat ) 
     1427                  END IF 
     1428               ENDIF 
     1429            END DO 
     1430         END DO 
     1431  
     1432         IF( lk_mpp ) THEN 
     1433            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1434            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1435            misfdep(:,:) = INT( zbathy(:,:) ) 
     1436            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1437            CALL lbc_lnk( bathy, 'T', 1. ) 
     1438            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1439            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1440            mbathy(:,:) = INT( zbathy(:,:) ) 
     1441         ENDIF 
     1442 ! point V misdep(ji,jj) EQ mbathy(ji,jj+1)  
     1443         DO jj = 1, jpjm1 
     1444            DO ji = 1, jpim1 
     1445               IF( misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1446                  zbathydiff =ABS(  bathy(ji,jj+1) - (gdepw_1d(mbathy (ji,jj+1)+1) & 
     1447                   &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ))) 
     1448                  zrisfdepdiff=ABS(risfdep(ji,jj  ) - (gdepw_1d(misfdep(ji,jj  )  )  & 
     1449                   &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj  )-1)*e3zps_rat ))) 
     1450                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1451                     mbathy (ji,jj+1) = mbathy(ji,jj+1) + 1 
     1452                     bathy  (ji,jj+1) = gdepw_1d(mbathy (ji,jj+1)  ) + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ) 
     1453                  ELSE 
     1454                     misfdep(ji,jj)   = misfdep(ji,jj) - 1 
     1455                     risfdep(ji,jj)   = gdepw_1d(misfdep(ji,jj  )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj  )  )*e3zps_rat ) 
     1456                  END IF 
     1457               ENDIF 
     1458            END DO 
     1459         END DO 
     1460  
     1461  
     1462         IF( lk_mpp ) THEN  
     1463            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1464            CALL lbc_lnk( zbathy, 'T', 1. )  
     1465            misfdep(:,:) = INT( zbathy(:,:) )  
     1466            CALL lbc_lnk( risfdep, 'T', 1. )  
     1467            CALL lbc_lnk( bathy, 'T', 1. ) 
     1468            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1469            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1470            mbathy(:,:) = INT( zbathy(:,:) ) 
     1471         ENDIF  
     1472  
     1473 ! point U mbathy(ji,jj) EQ misfdep(ji,jj+1)  
     1474         DO jj = 1, jpjm1 
     1475            DO ji = 1, jpim1 
     1476               IF( misfdep(ji+1,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1477                  zbathydiff =ABS(  bathy(ji  ,jj) - (gdepw_1d(mbathy (ji,jj)+1) & 
     1478                    &   + MIN( e3zps_min, e3t_1d(mbathy (ji  ,jj)+1)*e3zps_rat ))) 
     1479                  zrisfdepdiff=ABS(risfdep(ji+1,jj) - (gdepw_1d(misfdep(ji+1,jj)) & 
     1480                    &  - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj)-1)*e3zps_rat ))) 
     1481                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1482                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1483                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 
     1484                  ELSE 
     1485                     misfdep(ji+1,jj)= misfdep(ji+1,jj) - 1 
     1486                     risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat ) 
     1487                  END IF 
     1488               ENDIF 
     1489            ENDDO 
     1490         ENDDO 
     1491  
     1492         IF( lk_mpp ) THEN  
     1493            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1494            CALL lbc_lnk( zbathy, 'T', 1. )  
     1495            misfdep(:,:) = INT( zbathy(:,:) )  
     1496            CALL lbc_lnk( risfdep, 'T', 1. )  
     1497            CALL lbc_lnk( bathy, 'T', 1. ) 
     1498            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1499            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1500            mbathy(:,:) = INT( zbathy(:,:) ) 
     1501         ENDIF  
     1502  
     1503 ! point U misfdep(ji,jj) EQ bathy(ji,jj+1)  
     1504         DO jj = 1, jpjm1 
     1505            DO ji = 1, jpim1 
     1506               IF( misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1507                  zbathydiff =ABS(  bathy(ji+1,jj) - (gdepw_1d(mbathy (ji+1,jj)+1) & 
     1508                      &   + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj)+1)*e3zps_rat ))) 
     1509                  zrisfdepdiff=ABS(risfdep(ji  ,jj) - (gdepw_1d(misfdep(ji  ,jj)  )  & 
     1510                      &  - MIN( e3zps_min, e3t_1d(misfdep(ji  ,jj)-1)*e3zps_rat ))) 
     1511                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1512                     mbathy(ji+1,jj)  = mbathy (ji+1,jj) + 1 
     1513                     bathy (ji+1,jj)  = gdepw_1d(mbathy (ji+1,jj)  )  & 
     1514                      &   + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj) +1)*e3zps_rat ) 
     1515                  ELSE 
     1516                     misfdep(ji,jj)   = misfdep(ji  ,jj) - 1 
     1517                     risfdep(ji,jj)   = gdepw_1d(misfdep(ji  ,jj)+1) & 
     1518                      &   - MIN( e3zps_min, e3t_1d(misfdep(ji  ,jj)   )*e3zps_rat ) 
     1519                  END IF 
     1520               ENDIF 
     1521            ENDDO 
     1522         ENDDO 
     1523  
     1524         IF( lk_mpp ) THEN 
     1525            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1526            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1527            misfdep(:,:) = INT( zbathy(:,:) ) 
     1528            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1529            CALL lbc_lnk( bathy, 'T', 1. ) 
     1530            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1531            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1532            mbathy(:,:) = INT( zbathy(:,:) ) 
     1533         ENDIF 
     1534      END DO 
     1535      ! end dig bathy/ice shelf to be compatible 
     1536      ! now fill single point in "coastline" of ice shelf, bathy, hole, and test again one cell tickness 
     1537      DO jl = 1,20 
     1538  
     1539 ! remove single point "bay" on isf coast line in the ice shelf draft' 
     1540         DO jk = 1, jpk 
     1541            WHERE (misfdep==0) misfdep=jpk 
     1542            zmask=0 
     1543            WHERE (misfdep .LE. jk) zmask=1 
     1544            DO jj = 2, jpjm1 
     1545               DO ji = 2, jpim1 
     1546                  IF (misfdep(ji,jj) .EQ. jk) THEN 
     1547                     ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 
     1548                     IF (ibtest .LE. 1) THEN 
     1549                        risfdep(ji,jj)=gdepw_1d(jk+1) ; misfdep(ji,jj)=jk+1 
     1550                        IF (misfdep(ji,jj) .GT. mbathy(ji,jj)) misfdep(ji,jj) = jpk 
     1551                     END IF 
     1552                  END IF 
     1553               END DO 
     1554            END DO 
     1555         END DO 
     1556         WHERE (misfdep==jpk) 
     1557             misfdep=0 ; risfdep=0. ; mbathy=0 ; bathy=0. 
     1558         END WHERE 
     1559         IF( lk_mpp ) THEN 
     1560            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1561            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1562            misfdep(:,:) = INT( zbathy(:,:) ) 
     1563            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1564            CALL lbc_lnk( bathy, 'T', 1. ) 
     1565            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1566            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1567            mbathy(:,:) = INT( zbathy(:,:) ) 
     1568         ENDIF 
     1569  
     1570 ! remove single point "bay" on bathy coast line beneath an ice shelf' 
     1571         DO jk = jpk,1,-1 
     1572            zmask=0 
     1573            WHERE (mbathy .GE. jk ) zmask=1 
     1574            DO jj = 2, jpjm1 
     1575               DO ji = 2, jpim1 
     1576                  IF (mbathy(ji,jj) .EQ. jk .AND. misfdep(ji,jj) .GE. 2) THEN 
     1577                     ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 
     1578                     IF (ibtest .LE. 1) THEN 
     1579                        bathy(ji,jj)=gdepw_1d(jk) ; mbathy(ji,jj)=jk-1 
     1580                        IF (misfdep(ji,jj) .GT. mbathy(ji,jj)) mbathy(ji,jj) = 0 
     1581                     END IF 
     1582                  END IF 
     1583               END DO 
     1584            END DO 
     1585         END DO 
     1586         WHERE (mbathy==0) 
     1587             misfdep=0 ; risfdep=0. ; mbathy=0 ; bathy=0. 
     1588         END WHERE 
     1589         IF( lk_mpp ) THEN 
     1590            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1591            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1592            misfdep(:,:) = INT( zbathy(:,:) ) 
     1593            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1594            CALL lbc_lnk( bathy, 'T', 1. ) 
     1595            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1596            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1597            mbathy(:,:) = INT( zbathy(:,:) ) 
     1598         ENDIF 
     1599  
     1600 ! fill hole in ice shelf 
     1601         zmisfdep = misfdep 
     1602         zrisfdep = risfdep 
     1603         WHERE (zmisfdep .LE. 1) zmisfdep=jpk 
     1604         DO jj = 2, jpjm1 
     1605            DO ji = 2, jpim1 
     1606               ibtestim1 = zmisfdep(ji-1,jj  ) ; ibtestip1 = zmisfdep(ji+1,jj  ) 
     1607               ibtestjm1 = zmisfdep(ji  ,jj-1) ; ibtestjp1 = zmisfdep(ji  ,jj+1) 
     1608               IF( zmisfdep(ji,jj) .GE. mbathy(ji-1,jj  ) ) ibtestim1 = jpk!MAX(0, mbathy(ji-1,jj  ) - 1) 
     1609               IF( zmisfdep(ji,jj) .GE. mbathy(ji+1,jj  ) ) ibtestip1 = jpk!MAX(0, mbathy(ji+1,jj  ) - 1) 
     1610               IF( zmisfdep(ji,jj) .GE. mbathy(ji  ,jj-1) ) ibtestjm1 = jpk!MAX(0, mbathy(ji  ,jj-1) - 1) 
     1611               IF( zmisfdep(ji,jj) .GE. mbathy(ji  ,jj+1) ) ibtestjp1 = jpk!MAX(0, mbathy(ji  ,jj+1) - 1) 
     1612               ibtest=MIN(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 
     1613               IF( ibtest == jpk .AND. misfdep(ji,jj) .GE. 2) THEN 
     1614                  mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp 
     1615               END IF 
     1616               IF( zmisfdep(ji,jj) < ibtest .AND. misfdep(ji,jj) .GE. 2) THEN 
     1617                  misfdep(ji,jj) = ibtest 
     1618                  risfdep(ji,jj) = gdepw_1d(ibtest) 
     1619               ENDIF 
     1620            ENDDO 
     1621         ENDDO 
     1622  
     1623         IF( lk_mpp ) THEN  
     1624            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1625            CALL lbc_lnk( zbathy, 'T', 1. )  
     1626            misfdep(:,:) = INT( zbathy(:,:) )  
     1627            CALL lbc_lnk( risfdep, 'T', 1. )  
     1628            CALL lbc_lnk( bathy, 'T', 1. ) 
     1629            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1630            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1631            mbathy(:,:) = INT( zbathy(:,:) ) 
     1632         ENDIF  
     1633 ! 
     1634 !! fill hole in bathymetry 
     1635         zmbathy (:,:)=mbathy (:,:) 
     1636         DO jj = 2, jpjm1 
     1637            DO ji = 2, jpim1 
     1638               ibtestim1 = zmbathy(ji-1,jj  ) ; ibtestip1 = zmbathy(ji+1,jj  ) 
     1639               ibtestjm1 = zmbathy(ji  ,jj-1) ; ibtestjp1 = zmbathy(ji  ,jj+1) 
     1640               IF( zmbathy(ji,jj) .LT. misfdep(ji-1,jj  ) ) ibtestim1 = 0!MIN(jpk-1, misfdep(ji-1,jj  ) + 1) 
     1641               IF( zmbathy(ji,jj) .LT. misfdep(ji+1,jj  ) ) ibtestip1 = 0 
     1642               IF( zmbathy(ji,jj) .LT. misfdep(ji  ,jj-1) ) ibtestjm1 = 0 
     1643               IF( zmbathy(ji,jj) .LT. misfdep(ji  ,jj+1) ) ibtestjp1 = 0 
     1644               ibtest=MAX(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 
     1645               IF( ibtest == 0 .AND. misfdep(ji,jj) .GE. 2) THEN 
     1646                  mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp ; 
     1647               END IF 
     1648               IF( ibtest < zmbathy(ji,jj) .AND. misfdep(ji,jj) .GE. 2) THEN 
     1649                  mbathy(ji,jj) = ibtest 
     1650                  bathy(ji,jj)  = gdepw_1d(ibtest+1)  
     1651               ENDIF 
     1652            END DO 
     1653         END DO 
     1654         IF( lk_mpp ) THEN  
     1655            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1656            CALL lbc_lnk( zbathy, 'T', 1. )  
     1657            misfdep(:,:) = INT( zbathy(:,:) )  
     1658            CALL lbc_lnk( risfdep, 'T', 1. )  
     1659            CALL lbc_lnk( bathy, 'T', 1. ) 
     1660            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1661            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1662            mbathy(:,:) = INT( zbathy(:,:) ) 
     1663         ENDIF  
     1664 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 
     1665         DO jj = 1, jpjm1 
     1666            DO ji = 1, jpim1 
     1667               IF (mbathy(ji,jj) == misfdep(ji+1,jj) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji+1,jj) .GE. 1) THEN 
     1668                  mbathy(ji,jj)  = mbathy(ji,jj) - 1 ; bathy(ji,jj)   = gdepw_1d(mbathy(ji,jj)+1) ; 
     1669               END IF 
     1670            END DO 
     1671         END DO 
     1672         IF( lk_mpp ) THEN  
     1673            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1674            CALL lbc_lnk( zbathy, 'T', 1. )  
     1675            misfdep(:,:) = INT( zbathy(:,:) )  
     1676            CALL lbc_lnk( risfdep, 'T', 1. )  
     1677            CALL lbc_lnk( bathy, 'T', 1. ) 
     1678            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1679            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1680            mbathy(:,:) = INT( zbathy(:,:) ) 
     1681         ENDIF  
     1682 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 
     1683         DO jj = 1, jpjm1 
     1684            DO ji = 1, jpim1 
     1685               IF (misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji+1,jj) .GE. 1) THEN 
     1686                  mbathy(ji+1,jj)  = mbathy(ji+1,jj) - 1;   bathy(ji+1,jj)   = gdepw_1d(mbathy(ji+1,jj)+1) ; 
     1687               END IF 
     1688            END DO 
     1689         END DO 
     1690         IF( lk_mpp ) THEN  
     1691            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1692            CALL lbc_lnk( zbathy, 'T', 1. )  
     1693            misfdep(:,:) = INT( zbathy(:,:) )  
     1694            CALL lbc_lnk( risfdep, 'T', 1. )  
     1695            CALL lbc_lnk( bathy, 'T', 1. ) 
     1696            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1697            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1698            mbathy(:,:) = INT( zbathy(:,:) ) 
     1699         ENDIF  
     1700 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 
     1701         DO jj = 1, jpjm1 
     1702            DO ji = 1, jpi 
     1703               IF (mbathy(ji,jj) == misfdep(ji,jj+1) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji,jj+1) .GE. 1) THEN 
     1704                  mbathy(ji,jj)  = mbathy(ji,jj) - 1 ; bathy(ji,jj)   = gdepw_1d(mbathy(ji,jj)+1) ; 
     1705               END IF 
     1706            END DO 
     1707         END DO 
     1708         IF( lk_mpp ) THEN  
     1709            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1710            CALL lbc_lnk( zbathy, 'T', 1. )  
     1711            misfdep(:,:) = INT( zbathy(:,:) )  
     1712            CALL lbc_lnk( risfdep, 'T', 1. )  
     1713            CALL lbc_lnk( bathy, 'T', 1. ) 
     1714            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1715            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1716            mbathy(:,:) = INT( zbathy(:,:) ) 
     1717         ENDIF  
     1718 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 
     1719         DO jj = 1, jpjm1 
     1720            DO ji = 1, jpi 
     1721               IF (misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji,jj+1) .GE. 1) THEN 
     1722                  mbathy(ji,jj+1)  = mbathy(ji,jj+1) - 1 ; bathy(ji,jj+1)   = gdepw_1d(mbathy(ji,jj+1)+1) ; 
     1723               END IF 
     1724            END DO 
     1725         END DO 
     1726         IF( lk_mpp ) THEN  
     1727            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1728            CALL lbc_lnk( zbathy, 'T', 1. )  
     1729            misfdep(:,:) = INT( zbathy(:,:) )  
     1730            CALL lbc_lnk( risfdep, 'T', 1. )  
     1731            CALL lbc_lnk( bathy, 'T', 1. ) 
     1732            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1733            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1734            mbathy(:,:) = INT( zbathy(:,:) ) 
     1735         ENDIF  
     1736 ! if not compatible after all check, mask T 
     1737         DO jj = 1, jpj 
     1738            DO ji = 1, jpi 
     1739               IF (mbathy(ji,jj) <= misfdep(ji,jj)) THEN 
     1740                  misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0._wp ; mbathy(ji,jj)  = 0 ; bathy(ji,jj)   = 0._wp ; 
     1741               END IF 
     1742            END DO 
     1743         END DO 
     1744  
     1745         WHERE (mbathy(:,:) == 1) 
     1746            mbathy = 0; bathy = 0.0_wp ; misfdep = 0 ; risfdep = 0.0_wp 
     1747         END WHERE 
     1748      END DO  
     1749! end check compatibility ice shelf/bathy 
     1750      ! remove very shallow ice shelf (less than ~ 10m if 75L) 
     1751      WHERE (misfdep(:,:) <= 5) 
     1752         misfdep = 1; risfdep = 0.0_wp; 
     1753      END WHERE 
     1754 
     1755      IF( icompt == 0 ) THEN  
     1756         IF(lwp) WRITE(numout,*)'     no points with ice shelf too close to bathymetry'  
     1757      ELSE  
     1758         IF(lwp) WRITE(numout,*)'    ',icompt,' ocean grid points with ice shelf thickness reduced to avoid bathymetry'  
     1759      ENDIF  
     1760 
     1761      CALL wrk_dealloc( jpi, jpj, zmask, zbathy, zrisfdep ) 
     1762      CALL wrk_dealloc( jpi, jpj, zmisfdep, zmbathy ) 
     1763 
     1764      IF( nn_timing == 1 )  CALL timing_stop('zgr_isf') 
     1765       
     1766   END SUBROUTINE 
    10721767 
    10731768   SUBROUTINE zgr_sco 
     
    14452140            DO jk = 1, jpkm1 
    14462141               IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX( 2, jk ) 
    1447                IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0 
    1448             END DO 
     2142            END DO 
     2143            IF( scobot(ji,jj) == 0._wp               )   mbathy(ji,jj) = 0 
    14492144         END DO 
    14502145      END DO 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90

    • Property svn:keywords set to Id
    r4624 r5260  
    3939   !!---------------------------------------------------------------------- 
    4040   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    41    !! $Id: dtatem.F90 2392 2010-11-15 21:20:05Z gm $  
     41   !! $Id$  
    4242   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4343   !!---------------------------------------------------------------------- 
     
    263263                     ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik-1,jp_sal) 
    264264                  ENDIF 
     265                  ik = mikt(ji,jj) 
     266                  IF( ik > 1 ) THEN 
     267                     zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) )  
     268                     ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik+1,jp_tem) 
     269                     ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik+1,jp_sal) 
     270                  END IF 
    265271               END DO 
    266272            END DO 
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90

    r4370 r5260  
    3434   USE dtatsd          ! data temperature and salinity   (dta_tsd routine) 
    3535   USE dtauvd          ! data: U & V current             (dta_uvd routine) 
    36    USE in_out_manager  ! I/O manager 
    37    USE iom             ! I/O library 
    3836   USE zpshde          ! partial step: hor. derivative (zps_hde routine) 
    3937   USE eosbn2          ! equation of state            (eos bn2 routine) 
     
    4240   USE dynspg_flt      ! filtered free surface 
    4341   USE sol_oce         ! ocean solver variables 
     42   ! 
     43   USE in_out_manager  ! I/O manager 
     44   USE iom             ! I/O library 
    4445   USE lib_mpp         ! MPP library 
    4546   USE restart         ! restart 
     
    5657#  include "vectopt_loop_substitute.h90" 
    5758   !!---------------------------------------------------------------------- 
    58    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     59   !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
    5960   !! $Id$ 
    6061   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6869      !! ** Purpose :   Initialization of the dynamics and tracer fields. 
    6970      !!---------------------------------------------------------------------- 
    70       ! - ML - needed for initialization of e3t_b 
    71       INTEGER  ::  ji,jj,jk     ! dummy loop indices 
    72       REAL(wp), POINTER, DIMENSION(:,:,:,:)  ::  zuvd    ! U & V data workspace 
    73       !!---------------------------------------------------------------------- 
    74       ! 
    75       IF( nn_timing == 1 )  CALL timing_start('istate_init') 
    76       ! 
    77  
    78       IF(lwp) WRITE(numout,*) 
     71      INTEGER ::   ji, jj, jk   ! dummy loop indices 
     72      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   zuvd    ! U & V data workspace 
     73      !!---------------------------------------------------------------------- 
     74      ! 
     75      IF( nn_timing == 1 )   CALL timing_start('istate_init') 
     76      ! 
     77 
     78      IF(lwp) WRITE(numout,*) ' ' 
    7979      IF(lwp) WRITE(numout,*) 'istate_ini : Initialization of the dynamics and tracers' 
    8080      IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
     
    8383      IF( lk_c1d ) CALL dta_uvd_init          ! Initialization of U & V input data 
    8484 
    85       rhd  (:,:,:  ) = 0.e0 
    86       rhop (:,:,:  ) = 0.e0 
    87       rn2  (:,:,:  ) = 0.e0  
    88       tsa  (:,:,:,:) = 0.e0     
     85      rhd  (:,:,:  ) = 0._wp   ;   rhop (:,:,:  ) = 0._wp      ! set one for all to 0 at level jpk 
     86      rn2b (:,:,:  ) = 0._wp   ;   rn2  (:,:,:  ) = 0._wp      ! set one for all to 0 at levels 1 and jpk 
     87      tsa  (:,:,:,:) = 0._wp                                   ! set one for all to 0 at level jpk 
     88      rab_b(:,:,:,:) = 0._wp   ;   rab_n(:,:,:,:) = 0._wp      ! set one for all to 0 at level jpk 
    8989 
    9090      IF( ln_rstart ) THEN                    ! Restart from a file 
     
    110110         ELSEIF( cp_cfg == 'gyre' ) THEN          
    111111            CALL istate_gyre                     ! GYRE  configuration : start from pre-defined T-S fields 
     112        ELSEIF( cp_cfg == 'isomip' .OR. cp_cfg == 'isomip2') THEN 
     113            IF(lwp) WRITE(numout,*) 'Initialization of T+S for ISOMIP domain'  
     114            tsn(:,:,:,jp_tem)=-1.9*tmask(:,:,:)          ! ISOMIP configuration : start from constant T+S fields  
     115            tsn(:,:,:,jp_sal)=34.4*tmask(:,:,:) 
     116            tsb(:,:,:,:)=tsn(:,:,:,:)   
    112117         ELSE                                    ! Initial T-S, U-V fields read in files 
    113118            IF ( ln_tsd_init ) THEN              ! read 3D T and S data at nit000 
     
    129134         CALL eos( tsb, rhd, rhop, gdept_0(:,:,:) )        ! before potential and in situ densities 
    130135#if ! defined key_c1d 
    131          IF( ln_zps )   CALL zps_hde( nit000, jpts, tsb, gtsu, gtsv,  & ! zps: before hor. gradient 
    132             &                                       rhd, gru , grv  )   ! of t,s,rd at ocean bottom 
     136         IF( ln_zps .AND. .NOT. ln_isfcav)                                 & 
     137            &            CALL zps_hde    ( nit000, jpts, tsb, gtsu, gtsv,  &    ! Partial steps: before horizontal gradient 
     138            &                                            rhd, gru , grv    )  ! of t, s, rd at the last ocean level 
     139         IF( ln_zps .AND.       ln_isfcav)                                 & 
     140            &            CALL zps_hde_isf( nit000, jpts, tsb, gtsu, gtsv,  &    ! Partial steps for top cell (ISF) 
     141            &                                            rhd, gru , grv , aru , arv , gzu , gzv , ge3ru , ge3rv ,   & 
     142            &                                     gtui, gtvi, grui, grvi, arui, arvi, gzui, gzvi, ge3rui, ge3rvi    ) ! of t, s, rd at the last ocean level 
    133143#endif 
    134144         !    
     
    162172      ! 
    163173      DO jk = 1, jpkm1 
    164 #if defined key_vectopt_loop 
    165          DO jj = 1, 1         !Vector opt. => forced unrolling 
    166             DO ji = 1, jpij 
    167 #else  
    168174         DO jj = 1, jpj 
    169175            DO ji = 1, jpi 
    170 #endif                   
    171176               un_b(ji,jj) = un_b(ji,jj) + fse3u_n(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk) 
    172177               vn_b(ji,jj) = vn_b(ji,jj) + fse3v_n(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk) 
     
    185190      ! 
    186191      ! 
    187       IF( nn_timing == 1 )  CALL timing_stop('istate_init') 
     192      IF( nn_timing == 1 )   CALL timing_stop('istate_init') 
    188193      ! 
    189194   END SUBROUTINE istate_init 
     195 
    190196 
    191197   SUBROUTINE istate_t_s 
     
    219225   END SUBROUTINE istate_t_s 
    220226 
     227 
    221228   SUBROUTINE istate_eel 
    222229      !!---------------------------------------------------------------------- 
     
    233240      USE divcur     ! hor. divergence & rel. vorticity      (div_cur routine) 
    234241      USE iom 
    235   
     242      ! 
    236243      INTEGER  ::   inum              ! temporary logical unit 
    237244      INTEGER  ::   ji, jj, jk        ! dummy loop indices 
     
    244251      REAL(wp), DIMENSION(jpiglo,jpjglo) ::   zssh  ! initial ssh over the global domain 
    245252      !!---------------------------------------------------------------------- 
    246  
     253      ! 
    247254      SELECT CASE ( jp_cfg )  
    248255         !                                              ! ==================== 
     
    375382      INTEGER, PARAMETER ::   ntsinit = 0   ! (0/1) (analytical/input data files) T&S initialization 
    376383      !!---------------------------------------------------------------------- 
    377  
     384      ! 
    378385      SELECT CASE ( ntsinit) 
    379  
     386      ! 
    380387      CASE ( 0 )                  ! analytical T/S profil deduced from LEVITUS 
    381388         IF(lwp) WRITE(numout,*) 
    382389         IF(lwp) WRITE(numout,*) 'istate_gyre : initial analytical T and S profil deduced from LEVITUS ' 
    383390         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    384  
     391         ! 
    385392         DO jk = 1, jpk 
    386393            DO jj = 1, jpj 
     
    407414            END DO 
    408415         END DO 
    409  
     416         ! 
    410417      CASE ( 1 )                  ! T/S data fields read in dta_tem.nc/data_sal.nc files 
    411418         IF(lwp) WRITE(numout,*) 
     
    431438         tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * tmask(:,:,:)  
    432439         tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
    433  
     440         ! 
    434441      END SELECT 
    435  
     442      ! 
    436443      IF(lwp) THEN 
    437444         WRITE(numout,*) 
     
    440447         WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept_1d(jk), tsn(2,2,jk,jp_tem), tsn(2,2,jk,jp_sal), jk = 1, jpk ) 
    441448      ENDIF 
    442  
     449      ! 
    443450   END SUBROUTINE istate_gyre 
     451 
    444452 
    445453   SUBROUTINE istate_uvg 
     
    457465      USE divcur          ! hor. divergence & rel. vorticity      (div_cur routine) 
    458466      USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    459  
     467      ! 
    460468      INTEGER ::   ji, jj, jk        ! dummy loop indices 
    461469      INTEGER ::   indic             ! ??? 
     
    567575   !!===================================================================== 
    568576END MODULE istate 
    569  
  • branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90

    r3625 r5260  
    4141   REAL(wp), PUBLIC ::   rt0      = 273.15_wp        !: freezing point of fresh water [Kelvin] 
    4242#if defined key_lim3 
    43    REAL(wp), PUBLIC ::   rt0_snow = 273.16_wp        !: melting point of snow         [Kelvin] 
    44    REAL(wp), PUBLIC ::   rt0_ice  = 273.16_wp        !: melting point of ice          [Kelvin] 
     43   REAL(wp), PUBLIC ::   rt0_snow = 273.15_wp        !: melting point of snow         [Kelvin] 
     44   REAL(wp), PUBLIC ::   rt0_ice  = 273.15_wp        !: melting point of ice          [Kelvin] 
    4545#else 
    4646   REAL(wp), PUBLIC ::   rt0_snow = 273.15_wp        !: melting point of snow         [Kelvin] 
    4747   REAL(wp), PUBLIC ::   rt0_ice  = 273.05_wp        !: melting point of ice          [Kelvin] 
    4848#endif 
    49 #if defined key_cice 
    50    REAL(wp), PUBLIC ::   rau0     = 1026._wp         !: volumic mass of reference     [kg/m3] 
    51 #else 
    52    REAL(wp), PUBLIC ::   rau0     = 1035._wp         !: volumic mass of reference     [kg/m3] 
    53 #endif 
     49   REAL(wp), PUBLIC ::   rau0                        !: volumic mass of reference     [kg/m3] 
    5450   REAL(wp), PUBLIC ::   r1_rau0                     !: = 1. / rau0                   [m3/kg] 
    55    REAL(wp), PUBLIC ::   rauw     = 1000._wp         !: volumic mass of pure water    [m3/kg] 
    56    REAL(wp), PUBLIC ::   rcp      =    4.e3_wp       !: ocean specific heat           [J/Kelvin] 
     51   REAL(wp), PUBLIC ::   rcp                         !: ocean specific heat           [J/Kelvin] 
    5752   REAL(wp), PUBLIC ::   r1_rcp                      !: = 1. / rcp                    [Kelvin/J] 
     53   REAL(wp), PUBLIC ::   rau0_rcp                    !: = rau0 * rcp  
    5854   REAL(wp), PUBLIC ::   r1_rau0_rcp                 !: = 1. / ( rau0 * rcp ) 
    5955 
     
    8783   REAL(wp), PUBLIC ::   xlic     =  300.33e+6_wp    !: volumetric latent heat fusion of ice                  [J/m3] 
    8884   REAL(wp), PUBLIC ::   xsn      =    2.8e+6_wp     !: volumetric latent heat of sublimation of snow         [J/m3] 
     85#endif 
     86#if defined key_lim3 
     87   REAL(wp), PUBLIC ::   r1_rhoic                    !: 1 / rhoic 
     88   REAL(wp), PUBLIC ::   r1_rhosn                    !: 1 / rhosn 
    8989#endif 
    9090   !!---------------------------------------------------------------------- 
     
    163163      IF(lwp) WRITE(numout,*) '          melting point of ice             rt0_ice  = ', rt0_ice , ' K' 
    164164 
    165       r1_rau0     = 1._wp / rau0 
    166       r1_rcp      = 1._wp / rcp 
    167       r1_rau0_rcp = 1._wp / ( rau0 * rcp ) 
    168       IF(lwp) WRITE(numout,*) 
    169       IF(lwp) WRITE(numout,*) '          volumic mass of pure water          rauw  = ', rauw   , ' kg/m^3' 
    170       IF(lwp) WRITE(numout,*) '          volumic mass of reference           rau0  = ', rau0   , ' kg/m^3' 
    171       IF(lwp) WRITE(numout,*) '          1. / rau0                        r1_rau0  = ', r1_rau0, ' m^3/kg' 
    172       IF(lwp) WRITE(numout,*) '          ocean specific heat                 rcp   = ', rcp    , ' J/Kelvin' 
    173       IF(lwp) WRITE(numout,*) '          1. / ( rau0 * rcp )           r1_rau0_rcp = ', r1_rau0_rcp 
    174  
    175  
     165      IF(lwp) WRITE(numout,*) '          reference density and heat capacity now defined in eosbn2.f90' 
     166               
    176167#if defined key_lim3 || defined key_cice 
    177168      xlsn = lfus * rhosn        ! volumetric latent heat fusion of snow [J/m3] 
     
    180171      lfus = xlsn / rhosn        ! latent heat of fusion of fresh ice 
    181172#endif 
    182  
     173#if defined key_lim3 
     174      r1_rhoic = 1._wp / rhoic 
     175      r1_rhosn = 1._wp / rhosn 
     176#endif 
    183177      IF(lwp) THEN 
    184178         WRITE(numout,*) 
Note: See TracChangeset for help on using the changeset viewer.