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

Ignore:
Timestamp:
2015-02-11T11:50:34+01:00 (9 years ago)
Author:
timgraham
Message:

Upgraded branch to current head of trunk (r5072) so it can be used with the trunk

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

Legend:

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

    r4813 r5075  
    124124       
    125125      ! control print 
    126       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 = ',   & 
     126      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 = ',   & 
    127127           &                   nyear, '/', nmonth, '/', nday, '  nsec_day:', nsec_day, '  nsec_week:', nsec_week 
    128128 
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90

    r4488 r5075  
    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   !!---------------------------------------------------------------------- 
     
    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 
     
    329336      ierr(:) = 0 
    330337      ! 
    331       ALLOCATE( rdttra(jpk), r2dtra(jpk), mig(jpi), mjg(jpj), STAT=ierr(1) ) 
     338      ALLOCATE( rdttra(jpk), r2dtra(jpk), mig(jpi), mjg(jpj), nfiimpp(jpni,jpnj),  & 
     339         &      nfipproc(jpni,jpnj), nfilcit(jpni,jpnj), STAT=ierr(1) ) 
    332340         ! 
    333341      ALLOCATE( nimppt(jpnij) , ibonit(jpnij) , nlcit(jpnij) , nlcjt(jpnij) ,     & 
     
    379387         &      hift  (jpi,jpj) , hifu  (jpi,jpj) , rx1 (jpi,jpj) , STAT=ierr(8) ) 
    380388 
    381       ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) ,                     & 
    382          &     tmask_i(jpi,jpj) , bmask(jpi,jpj) ,                     & 
     389      ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) ,                                      & 
     390         &     tmask_i(jpi,jpj) , umask_i(jpi,jpj), vmask_i(jpi,jpj), fmask_i(jpi,jpj), & 
     391         &     bmask(jpi,jpj)   ,                                                       & 
    383392         &     mbkt   (jpi,jpj) , mbku (jpi,jpj) , mbkv(jpi,jpj) , STAT=ierr(9) ) 
    384393 
     394! (ISF) Allocation of basic array    
     395      ALLOCATE( misfdep(jpi,jpj) , risfdep(jpi,jpj),     & 
     396         &     mikt(jpi,jpj), miku(jpi,jpj), mikv(jpi,jpj) ,           & 
     397         &     mikf(jpi,jpj), ssmask(jpi,jpj), STAT=ierr(10) ) 
     398 
    385399      ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk),     &  
    386          &      vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(10) ) 
     400         &      vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(11) ) 
    387401 
    388402#if defined key_noslip_accurate 
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90

    r4811 r5075  
    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 
     
    367367      ! 
    368368      IF(lk_mpp) THEN 
    369          CALL mpp_minloc( e1t(:,:), tmask(:,:,1), ze1min, iimi1,ijmi1 ) 
    370          CALL mpp_minloc( e2t(:,:), tmask(:,:,1), ze2min, iimi2,ijmi2 ) 
    371          CALL mpp_maxloc( e1t(:,:), tmask(:,:,1), ze1max, iima1,ijma1 ) 
    372          CALL mpp_maxloc( e2t(:,:), tmask(:,:,1), ze2max, iima2,ijma2 ) 
     369         CALL mpp_minloc( e1t(:,:), tmask_i(:,:), ze1min, iimi1,ijmi1 ) 
     370         CALL mpp_minloc( e2t(:,:), tmask_i(:,:), ze2min, iimi2,ijmi2 ) 
     371         CALL mpp_maxloc( e1t(:,:), tmask_i(:,:), ze1max, iima1,ijma1 ) 
     372         CALL mpp_maxloc( e2t(:,:), tmask_i(:,:), ze2max, iima2,ijma2 ) 
    373373      ELSE 
    374          ze1min = MINVAL( e1t(:,:), mask = tmask(:,:,1) == 1._wp )     
    375          ze2min = MINVAL( e2t(:,:), mask = tmask(:,:,1) == 1._wp )     
    376          ze1max = MAXVAL( e1t(:,:), mask = tmask(:,:,1) == 1._wp )     
    377          ze2max = MAXVAL( e2t(:,:), mask = tmask(:,:,1) == 1._wp )     
    378  
    379          iloc  = MINLOC( e1t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     374         ze1min = MINVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )     
     375         ze2min = MINVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )     
     376         ze1max = MAXVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )     
     377         ze2max = MAXVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )     
     378 
     379         iloc  = MINLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    380380         iimi1 = iloc(1) + nimpp - 1 
    381381         ijmi1 = iloc(2) + njmpp - 1 
    382          iloc  = MINLOC( e2t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     382         iloc  = MINLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    383383         iimi2 = iloc(1) + nimpp - 1 
    384384         ijmi2 = iloc(2) + njmpp - 1 
    385          iloc  = MAXLOC( e1t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     385         iloc  = MAXLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    386386         iima1 = iloc(1) + nimpp - 1 
    387387         ijma1 = iloc(2) + njmpp - 1 
    388          iloc  = MAXLOC( e2t(:,:), mask = tmask(:,:,1) == 1._wp ) 
     388         iloc  = MAXLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 
    389389         iima2 = iloc(1) + nimpp - 1 
    390390         ijma2 = iloc(2) + njmpp - 1 
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/domcfg.F90

    r4245 r5075  
    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_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90

    r4366 r5075  
    638638      CALL iom_close( inum ) 
    639639       
     640! need to be define for the extended grid south of -80S 
     641! some point are undefined but you need to have e1 and e2 .NE. 0 
     642      WHERE (e1t==0.0_wp) 
     643         e1t=1.0e2 
     644      END WHERE 
     645      WHERE (e1v==0.0_wp) 
     646         e1v=1.0e2 
     647      END WHERE 
     648      WHERE (e1u==0.0_wp) 
     649         e1u=1.0e2 
     650      END WHERE 
     651      WHERE (e1f==0.0_wp) 
     652         e1f=1.0e2 
     653      END WHERE 
     654      WHERE (e2t==0.0_wp) 
     655         e2t=1.0e2 
     656      END WHERE 
     657      WHERE (e2v==0.0_wp) 
     658         e2v=1.0e2 
     659      END WHERE 
     660      WHERE (e2u==0.0_wp) 
     661         e2u=1.0e2 
     662      END WHERE 
     663      WHERE (e2f==0.0_wp) 
     664         e2f=1.0e2 
     665      END WHERE 
     666        
    640667    END SUBROUTINE hgr_read 
    641668     
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90

    r4624 r5075  
    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 ) 
     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 ) 
    255282 
    256283 
    257284      ! 4. ocean/land mask for the elliptic equation 
    258285      ! -------------------------------------------- 
    259       bmask(:,:) = tmask(:,:,1)       ! elliptic equation is written at t-point 
     286      bmask(:,:) = ssmask(:,:)       ! elliptic equation is written at t-point 
    260287      ! 
    261288      !                               ! Boundary conditions 
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r4624 r5075  
    4444 
    4545   !!* 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 
     46   LOGICAL , PUBLIC                                      :: ln_vvl_zstar = .FALSE.              ! zstar  vertical coordinate 
     47   LOGICAL , PUBLIC                                      :: ln_vvl_ztilde = .FALSE.             ! ztilde vertical coordinate 
     48   LOGICAL , PUBLIC                                      :: ln_vvl_layer = .FALSE.              ! level  vertical coordinate 
     49   LOGICAL , PUBLIC                                      :: ln_vvl_ztilde_as_zstar = .FALSE.    ! ztilde vertical coordinate 
     50   LOGICAL , PUBLIC                                      :: ln_vvl_zstar_at_eqtor = .FALSE.     ! ztilde vertical coordinate 
     51   LOGICAL , PUBLIC                                      :: ln_vvl_kepe = .FALSE.               ! kinetic/potential energy transfer 
     52   !                                                                                            ! conservation: not used yet 
    5353   REAL(wp)                                              :: rn_ahe3                   ! thickness diffusion coefficient 
    5454   REAL(wp)                                              :: rn_rst_e3t                ! ztilde to zstar restoration timescale [days] 
    5555   REAL(wp)                                              :: rn_lf_cutoff              ! cutoff frequency for low-pass filter  [days] 
    5656   REAL(wp)                                              :: rn_zdef_max               ! maximum fractional e3t deformation 
    57    LOGICAL , PUBLIC                                      :: ln_vvl_dbg                ! debug control prints 
     57   LOGICAL , PUBLIC                                      :: ln_vvl_dbg = .FALSE.      ! debug control prints 
    5858 
    5959   !! * Module variables 
     
    169169      fsdept_b(:,:,1) = 0.5_wp * fse3w_b(:,:,1) 
    170170      fsdepw_b(:,:,1) = 0.0_wp 
    171       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) 
     171      DO jj = 1,jpj 
     172         DO ji = 1,jpi 
     173            DO jk = 2,mikt(ji,jj)-1 
     174               fsdept_n(ji,jj,jk) = gdept_0(ji,jj,jk) 
     175               fsdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk) 
     176               fsde3w_n(ji,jj,jk) = gdept_0(ji,jj,jk) - sshn(ji,jj) 
     177               fsdept_b(ji,jj,jk) = gdept_0(ji,jj,jk) 
     178               fsdepw_b(ji,jj,jk) = gdepw_0(ji,jj,jk) 
     179            END DO 
     180            IF (mikt(ji,jj) .GT. 1) THEN 
     181               jk = mikt(ji,jj) 
     182               fsdept_n(ji,jj,jk) = gdepw_0(ji,jj,jk) + 0.5_wp * fse3w_n(ji,jj,jk) 
     183               fsdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk) 
     184               fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk  ) - sshn   (ji,jj) 
     185               fsdept_b(ji,jj,jk) = gdepw_0(ji,jj,jk) + 0.5_wp * fse3w_b(ji,jj,jk) 
     186               fsdepw_b(ji,jj,jk) = gdepw_0(ji,jj,jk) 
     187            END IF 
     188            DO jk = mikt(ji,jj)+1, jpk 
     189               fsdept_n(ji,jj,jk) = fsdept_n(ji,jj,jk-1) + fse3w_n(ji,jj,jk) 
     190               fsdepw_n(ji,jj,jk) = fsdepw_n(ji,jj,jk-1) + fse3t_n(ji,jj,jk-1) 
     191               fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk  ) - sshn   (ji,jj) 
     192               fsdept_b(ji,jj,jk) = fsdept_b(ji,jj,jk-1) + fse3w_b(ji,jj,jk) 
     193               fsdepw_b(ji,jj,jk) = fsdepw_b(ji,jj,jk-1) + fse3t_b(ji,jj,jk-1) 
     194            END DO 
     195         END DO 
    177196      END DO 
    178197 
     
    185204         hv_b(:,:) = hv_b(:,:) + fse3v_b(:,:,jk) * vmask(:,:,jk) 
    186205      END DO 
    187       hur_b(:,:) = umask(:,:,1) / ( hu_b(:,:) + 1. - umask(:,:,1) ) 
    188       hvr_b(:,:) = vmask(:,:,1) / ( hv_b(:,:) + 1. - vmask(:,:,1) ) 
     206      hur_b(:,:) = umask_i(:,:) / ( hu_b(:,:) + 1. - umask_i(:,:) ) 
     207      hvr_b(:,:) = vmask_i(:,:) / ( hv_b(:,:) + 1. - vmask_i(:,:) ) 
    189208 
    190209      ! Restoring frequencies for z_tilde coordinate 
     
    293312      !                                                ! --------------------------------------------- ! 
    294313 
    295       z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * tmask(:,:,1) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) ) 
     314      z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * ssmask(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - ssmask(:,:) ) 
    296315      DO jk = 1, jpkm1 
    297316         ! formally this is the same as fse3t_a = e3t_0*(1+ssha/ht_0) 
     
    313332            zht  (:,:) = zht  (:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
    314333         END DO 
    315          zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask(:,:,1) ) 
     334         zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask_i(:,:) ) 
    316335 
    317336         ! 2 - Low frequency baroclinic horizontal divergence  (z-tilde case only) 
     
    338357         ELSE                         ! layer case 
    339358            DO jk = 1, jpkm1 
    340                tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) 
     359               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) * tmask(:,:,jk) 
    341360            END DO 
    342361         END IF 
     
    386405         ! d - thickness diffusion transport: boundary conditions 
    387406         !     (stored for tracer advction and continuity equation) 
    388          CALL lbc_lnk( un_td , 'U' , -1.) 
    389          CALL lbc_lnk( vn_td , 'V' , -1.) 
     407         CALL lbc_lnk( un_td , 'U' , -1._wp) 
     408         CALL lbc_lnk( vn_td , 'V' , -1._wp) 
    390409 
    391410         ! 4 - Time stepping of baroclinic scale factors 
     
    398417            z2dt = 2.0_wp * rdt 
    399418         ENDIF 
    400          CALL lbc_lnk( tilde_e3t_a(:,:,:), 'T', 1. ) 
     419         CALL lbc_lnk( tilde_e3t_a(:,:,:), 'T', 1._wp ) 
    401420         tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + z2dt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 
    402421 
     
    453472            zht(:,:)  = zht(:,:) + tilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
    454473         END DO 
    455          z_scale(:,:) =  - zht(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) ) 
     474         z_scale(:,:) =  - zht(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - ssmask(:,:) ) 
    456475         DO jk = 1, jpkm1 
    457476            dtilde_e3t_a(:,:,jk) = dtilde_e3t_a(:,:,jk) + fse3t_n(:,:,jk) * z_scale(:,:) * tmask(:,:,jk) 
     
    463482      !                                           ! ---baroclinic part--------- ! 
    464483         DO jk = 1, jpkm1 
    465             fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) 
     484            fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
    466485         END DO 
    467486      ENDIF 
     
    531550      END DO 
    532551      !                                        ! 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) 
     552      hur_a(:,:) = 1._wp / ( hu_a(:,:) + 1._wp - umask_i(:,:) ) * umask_i(:,:) 
     553      hvr_a(:,:) = 1._wp / ( hv_a(:,:) + 1._wp - vmask_i(:,:) ) * vmask_i(:,:) 
    535554 
    536555      CALL wrk_dealloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
     
    570589      !! * Local declarations 
    571590      REAL(wp), POINTER, DIMENSION(:,:,:) :: z_e3t_def 
    572       INTEGER                             :: jk       ! dummy loop indices 
     591      INTEGER                             :: ji,jj,jk       ! dummy loop indices 
    573592      !!---------------------------------------------------------------------- 
    574593 
     
    622641      fsdepw_n(:,:,1) = 0.0_wp 
    623642      fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 
    624       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   (:,:) 
     643      DO jj = 1,jpj 
     644         DO ji = 1,jpi 
     645            DO jk = 2,mikt(ji,jj)-1 
     646               fsdept_n(ji,jj,jk) = gdept_0(ji,jj,jk) 
     647               fsdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk) 
     648               fsde3w_n(ji,jj,jk) = gdept_0(ji,jj,jk) - sshn(ji,jj) 
     649            END DO 
     650            IF (mikt(ji,jj) .GT. 1) THEN 
     651               jk = mikt(ji,jj) 
     652               fsdept_n(ji,jj,jk) = gdepw_0(ji,jj,jk) + 0.5_wp * fse3w_n(ji,jj,jk) 
     653               fsdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk) 
     654               fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk  ) - sshn   (ji,jj) 
     655            END IF 
     656            DO jk = mikt(ji,jj)+1, jpk 
     657               fsdept_n(ji,jj,jk) = fsdept_n(ji,jj,jk-1) + fse3w_n(ji,jj,jk) 
     658               fsdepw_n(ji,jj,jk) = fsdepw_n(ji,jj,jk-1) + fse3t_n(ji,jj,jk-1) 
     659               fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk  ) - sshn   (ji,jj) 
     660            END DO 
     661         END DO 
    628662      END DO 
    629663      ! Local depth and Inverse of the local depth of the water column at u- and v- points 
     
    702736         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
    703737         ! boundary conditions 
    704          CALL lbc_lnk( pe3_out(:,:,:), 'U', 1. ) 
     738         CALL lbc_lnk( pe3_out(:,:,:), 'U', 1._wp ) 
    705739         pe3_out(:,:,:) = pe3_out(:,:,:) + e3u_0(:,:,:) 
    706740         !               ! ------------------------------------- ! 
     
    720754         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
    721755         ! boundary conditions 
    722          CALL lbc_lnk( pe3_out(:,:,:), 'V', 1. ) 
     756         CALL lbc_lnk( pe3_out(:,:,:), 'V', 1._wp ) 
    723757         pe3_out(:,:,:) = pe3_out(:,:,:) + e3v_0(:,:,:) 
    724758         !               ! ------------------------------------- ! 
     
    738772         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
    739773         ! boundary conditions 
    740          CALL lbc_lnk( pe3_out(:,:,:), 'F', 1. ) 
     774         CALL lbc_lnk( pe3_out(:,:,:), 'F', 1._wp ) 
    741775         pe3_out(:,:,:) = pe3_out(:,:,:) + e3f_0(:,:,:) 
    742776         !               ! ------------------------------------- ! 
     
    808842            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. ) 
    809843            id4 = iom_varid( numror, 'tilde_e3t_n', ldstop = .FALSE. ) 
    810             id5 = iom_varid( numror, 'hdif_lf', ldstop = .FALSE. ) 
     844            id5 = iom_varid( numror, 'hdiv_lf', ldstop = .FALSE. ) 
    811845            !                             ! --------- ! 
    812846            !                             ! all cases ! 
     
    815849               CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
    816850               CALL iom_get( numror, jpdom_autoglo, 'fse3t_n', fse3t_n(:,:,:) ) 
     851               ! needed to restart if land processor not computed  
     852               IF(lwp) write(numout,*) 'dom_vvl_rst : fse3t_b and fse3t_n found in restart files' 
     853               WHERE ( tmask(:,:,:) == 0.0_wp )  
     854                  fse3t_n(:,:,:) = e3t_0(:,:,:) 
     855                  fse3t_b(:,:,:) = e3t_0(:,:,:) 
     856               END WHERE 
    817857               IF( neuler == 0 ) THEN 
    818858                  fse3t_b(:,:,:) = fse3t_n(:,:,:) 
    819859               ENDIF 
    820860            ELSE IF( id1 > 0 ) THEN 
     861               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : fse3t_n not found in restart files' 
     862               IF(lwp) write(numout,*) 'fse3t_n set equal to fse3t_b.' 
     863               IF(lwp) write(numout,*) 'neuler is forced to 0' 
     864               CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
     865               fse3t_n(:,:,:) = fse3t_b(:,:,:) 
     866               neuler = 0 
     867            ELSE IF( id2 > 0 ) THEN 
    821868               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : fse3t_b not found in restart files' 
    822869               IF(lwp) write(numout,*) 'fse3t_b set equal to fse3t_n.' 
    823870               IF(lwp) write(numout,*) 'neuler is forced to 0' 
     871               CALL iom_get( numror, jpdom_autoglo, 'fse3t_n', fse3t_n(:,:,:) ) 
    824872               fse3t_b(:,:,:) = fse3t_n(:,:,:) 
    825873               neuler = 0 
     
    830878               DO jk=1,jpk 
    831879                  fse3t_n(:,:,jk) =  e3t_0(:,:,jk) * ( ht_0(:,:) + sshn(:,:) ) & 
    832                       &                            / ( ht_0(:,:) + 1._wp - tmask(:,:,1) ) * tmask(:,:,jk) & 
     880                      &                            / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk) & 
    833881                      &            + e3t_0(:,:,jk) * (1._wp -tmask(:,:,jk)) 
    834882               END DO 
     
    9641012 
    9651013      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE vertical coordinate in namelist nam_vvl' ) 
     1014      IF( .NOT. ln_vvl_zstar .AND. nn_isf .NE. 0) CALL ctl_stop( 'Only vvl_zstar has been tested with ice shelf cavity' ) 
    9661015 
    9671016      IF(lwp) THEN                   ! Print the choice 
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90

    r4292 r5075  
    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_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r4624 r5075  
    3535   USE oce               ! ocean variables 
    3636   USE dom_oce           ! ocean domain 
     37   USE sbc_oce           ! surface variable (isf) 
    3738   USE closea            ! closed seas 
    3839   USE c1d               ! 1D vertical configuration 
     
    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! need to be like this to compute the pressure gradient with ISF. If not, level beneath the ISF are not aligned (sum(e3t) /= depth) 
     301! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively 
     302      DO jk = 1, jpkm1 
     303         e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk)  
     304      END DO 
     305      e3t_1d(jpk) = e3t_1d(jpk-1)   ! we don't care because this level is masked in NEMO 
     306 
     307      DO jk = 2, jpk 
     308         e3w_1d(jk) = gdept_1d(jk) - gdept_1d(jk-1)  
     309      END DO 
     310      e3w_1d(1  ) = 2._wp * (gdept_1d(1) - gdepw_1d(1))  
     311 
    297312!!gm BUG in s-coordinate this does not work! 
    298313      ! deepest/shallowest W level Above/Below ~10m 
     
    350365      INTEGER  ::   ji, jj, jl, jk            ! dummy loop indices 
    351366      INTEGER  ::   inum                      ! temporary logical unit 
     367      INTEGER  ::   ierror                    ! error flag 
    352368      INTEGER  ::   ii_bump, ij_bump, ih      ! bump center position 
    353369      INTEGER  ::   ii0, ii1, ij0, ij1, ik    ! local indices 
    354370      REAL(wp) ::   r_bump , h_bump , h_oce   ! bump characteristics  
    355371      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 
     372      INTEGER , ALLOCATABLE, DIMENSION(:,:) ::   idta   ! global domain integer data 
     373      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdta   ! global domain scalar data 
    358374      !!---------------------------------------------------------------------- 
    359375      ! 
    360376      IF( nn_timing == 1 )  CALL timing_start('zgr_bat') 
    361       ! 
    362       CALL wrk_alloc( jpidta, jpjdta, idta ) 
    363       CALL wrk_alloc( jpidta, jpjdta, zdta ) 
    364377      ! 
    365378      IF(lwp) WRITE(numout,*) 
     
    370383         !                                            ! ================== ! 
    371384         !                                            ! global domain level and meter bathymetry (idta,zdta) 
     385         ! 
     386         ALLOCATE( idta(jpidta,jpjdta), STAT=ierror ) 
     387         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate idta array' ) 
     388         ALLOCATE( zdta(jpidta,jpjdta), STAT=ierror ) 
     389         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate zdta array' ) 
    372390         ! 
    373391         IF( ntopo == 0 ) THEN                        ! flat basin 
     
    450468            END DO 
    451469         END DO 
     470         risfdep(:,:)=0.e0 
     471         misfdep(:,:)=1 
     472         ! 
     473         ! (ISF) TODO build ice draft netcdf file for isomip and build the corresponding part of code 
     474         IF( cp_cfg == "isomip" ) THEN  
     475           !  
     476           risfdep(:,:)=200.e0  
     477           misfdep(:,:)=1  
     478           ij0 = 1 ; ij1 = 40  
     479           DO jj = mj0(ij0), mj1(ij1)  
     480              risfdep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp  
     481                END DO  
     482            WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp  
     483           !  
     484         ELSEIF ( cp_cfg == "isomip2" ) THEN 
     485         !  
     486            risfdep(:,:)=0.e0 
     487            misfdep(:,:)=1 
     488            ij0 = 1 ; ij1 = 40 
     489            DO jj = mj0(ij0), mj1(ij1) 
     490               risfdep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp 
     491            END DO 
     492            WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp 
     493         END IF 
     494         ! 
     495         DEALLOCATE( idta, zdta ) 
    452496         ! 
    453497         !                                            ! ================ ! 
     
    492536            CALL iom_get  ( inum, jpdom_data, 'Bathymetry', bathy ) 
    493537            CALL iom_close( inum ) 
    494             !                                                 
     538            !   
     539            risfdep(:,:)=0._wp          
     540            misfdep(:,:)=1              
     541            IF ( ln_isfcav ) THEN 
     542               CALL iom_open ( 'isf_draft_meter.nc', inum )  
     543               CALL iom_get  ( inum, jpdom_data, 'isf_draft', risfdep ) 
     544               CALL iom_close( inum ) 
     545               WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp 
     546            END IF 
     547            !        
    495548            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
    496549               ! 
     
    530583      !                        
    531584      IF ( .not. ln_sco ) THEN                                !==  set a minimum depth  ==! 
     585         ! patch to avoid case bathy = ice shelf draft and bathy between 0 and zhmin 
     586         WHERE (bathy == risfdep) 
     587            bathy   = 0.0_wp ; risfdep = 0.0_wp 
     588         END WHERE 
     589         ! end patch 
    532590         IF( rn_hmin < 0._wp ) THEN    ;   ik = - INT( rn_hmin )                                      ! from a nb of level 
    533591         ELSE                          ;   ik = MINLOC( gdepw_1d, mask = gdepw_1d > rn_hmin, dim = 1 )  ! from a depth 
     
    539597         IF(lwp) write(numout,*) 'Minimum ocean depth: ', zhmin, ' minimum number of ocean levels : ', ik 
    540598      ENDIF 
    541       ! 
    542       CALL wrk_dealloc( jpidta, jpjdta, idta ) 
    543       CALL wrk_dealloc( jpidta, jpjdta, zdta ) 
    544599      ! 
    545600      IF( nn_timing == 1 )  CALL timing_stop('zgr_bat') 
     
    783838   END SUBROUTINE zgr_bot_level 
    784839 
     840      SUBROUTINE zgr_top_level 
     841      !!---------------------------------------------------------------------- 
     842      !!                    ***  ROUTINE zgr_bot_level  *** 
     843      !! 
     844      !! ** Purpose :   defines the vertical index of ocean top (mik. arrays) 
     845      !! 
     846      !! ** Method  :   computes from misfdep with a minimum value of 1 
     847      !! 
     848      !! ** Action  :   mikt, miku, mikv :   vertical indices of the shallowest  
     849      !!                                     ocean level at t-, u- & v-points 
     850      !!                                     (min value = 1) 
     851      !!---------------------------------------------------------------------- 
     852      !! 
     853      INTEGER ::   ji, jj   ! dummy loop indices 
     854      REAL(wp), POINTER, DIMENSION(:,:) ::  zmik 
     855      !!---------------------------------------------------------------------- 
     856      ! 
     857      IF( nn_timing == 1 )  CALL timing_start('zgr_top_level') 
     858      ! 
     859      CALL wrk_alloc( jpi, jpj, zmik ) 
     860      ! 
     861      IF(lwp) WRITE(numout,*) 
     862      IF(lwp) WRITE(numout,*) '    zgr_top_level : ocean top k-index of T-, U-, V- and W-levels ' 
     863      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~' 
     864      ! 
     865      mikt(:,:) = MAX( misfdep(:,:) , 1 )    ! top k-index of T-level (=1) 
     866      !                                      ! top k-index of W-level (=mikt) 
     867      DO jj = 1, jpjm1                       ! top k-index of U- (U-) level 
     868         DO ji = 1, jpim1 
     869            miku(ji,jj) = MAX(  mikt(ji+1,jj  ) , mikt(ji,jj)  ) 
     870            mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
     871            mikf(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj), mikt(ji+1,jj  ), mikt(ji+1,jj+1)  ) 
     872         END DO 
     873      END DO 
     874 
     875      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     876      zmik(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk(zmik,'U',1.)   ;   miku  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     877      zmik(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk(zmik,'V',1.)   ;   mikv  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     878      zmik(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk(zmik,'F',1.)   ;   mikf  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     879      ! 
     880      CALL wrk_dealloc( jpi, jpj, zmik ) 
     881      ! 
     882      IF( nn_timing == 1 )  CALL timing_stop('zgr_top_level') 
     883      ! 
     884   END SUBROUTINE zgr_top_level 
    785885 
    786886   SUBROUTINE zgr_zco 
     
    861961      !!---------------------------------------------------------------------- 
    862962      !! 
    863       INTEGER  ::   ji, jj, jk       ! dummy loop indices 
     963      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    864964      INTEGER  ::   ik, it           ! temporary integers 
     965      INTEGER  ::   id, jd, nprocd 
     966      INTEGER  ::   icompt, ibtest, ibtestim1, ibtestip1, ibtestjm1, ibtestjp1   ! (ISF) 
    865967      LOGICAL  ::   ll_print         ! Allow  control print for debugging 
    866968      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points 
    867969      REAL(wp) ::   zdepwp, zdepth   ! Ajusted ocean depth to avoid too small e3t 
    868       REAL(wp) ::   zmax             ! Maximum depth 
     970      REAL(wp) ::   zmax, zmin       ! Maximum and minimum depth 
    869971      REAL(wp) ::   zdiff            ! temporary scalar 
    870972      REAL(wp) ::   zrefdep          ! temporary scalar 
     973      REAL(wp) ::   zbathydiff, zrisfdepdiff  
     974      REAL(wp), POINTER, DIMENSION(:,:)   ::   zrisfdep, zbathy, zmask   ! 3D workspace (ISH) 
     975      INTEGER , POINTER, DIMENSION(:,:)   ::   zmbathy, zmisfdep   ! 3D workspace (ISH) 
    871976      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zprt 
    872977      !!--------------------------------------------------------------------- 
     
    875980      ! 
    876981      CALL wrk_alloc( jpi, jpj, jpk, zprt ) 
     982      CALL wrk_alloc( jpi, jpj, zbathy, zmask, zrisfdep) 
     983      CALL wrk_alloc( jpi, jpj, zmbathy, zmisfdep) 
    877984      ! 
    878985      IF(lwp) WRITE(numout,*) 
     
    889996      ENDIF 
    890997 
    891  
    892998      ! bathymetry in level (from bathy_meter) 
    893999      ! =================== 
     
    9061012         WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
    9071013      END DO 
     1014      ! (ISF) compute misfdep 
     1015      WHERE( risfdep(:,:) == 0._wp .AND. bathy(:,:) .NE. 0) ;   misfdep(:,:) = 1   ! open water : set misfdep to 1   
     1016      ELSEWHERE                      ;                          misfdep(:,:) = 2   ! iceshelf : initialize misfdep to second level  
     1017      END WHERE   
     1018 
     1019      ! Compute misfdep for ocean points (i.e. first wet level)  
     1020      ! find the first ocean level such that the first level thickness  
     1021      ! is larger than the bot_level of e3zps_min and e3zps_rat * e3t_0 (where  
     1022      ! e3t_0 is the reference level thickness  
     1023      DO jk = 2, jpkm1  
     1024         zdepth = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat )  
     1025         WHERE( 0._wp < risfdep(:,:) .AND. risfdep(:,:) >= zdepth )   misfdep(:,:) = jk+1  
     1026      END DO  
     1027      WHERE (risfdep(:,:) <= e3t_1d(1) .AND. risfdep(:,:) .GT. 0._wp) 
     1028         risfdep(:,:) = 0. ; misfdep(:,:) = 1 
     1029      END WHERE 
     1030  
     1031! 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 
     1032      icompt = 0  
     1033! run the bathy check 10 times to be sure all the modif in the bathy or iceshelf draft are compatible together 
     1034      DO jl = 1, 10      
     1035         WHERE (bathy(:,:) .EQ. risfdep(:,:) ) 
     1036            misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp 
     1037            mbathy (:,:) = 0 ; bathy  (:,:) = 0._wp 
     1038         END WHERE 
     1039         WHERE (mbathy(:,:) <= 0)  
     1040            misfdep(:,:) = 0; risfdep(:,:) = 0._wp  
     1041            mbathy (:,:) = 0; bathy  (:,:) = 0._wp 
     1042         ENDWHERE 
     1043         IF( lk_mpp ) THEN 
     1044            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1045            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1046            misfdep(:,:) = INT( zbathy(:,:) ) 
     1047            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1048            CALL lbc_lnk( bathy, 'T', 1. ) 
     1049            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1050            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1051            mbathy(:,:) = INT( zbathy(:,:) ) 
     1052         ENDIF 
     1053         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN  
     1054            misfdep( 1 ,:) = misfdep(jpim1,:)           ! local domain is cyclic east-west  
     1055            misfdep(jpi,:) = misfdep(  2  ,:)  
     1056         ENDIF 
     1057  
     1058         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN 
     1059            mbathy( 1 ,:) = mbathy(jpim1,:)             ! local domain is cyclic east-west 
     1060            mbathy(jpi,:) = mbathy(  2  ,:) 
     1061         ENDIF 
     1062  
     1063         ! split last cell if possible (only where water column is 2 cell or less) 
     1064         DO jk = jpkm1, 1, -1 
     1065            zmax = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1066            WHERE( gdepw_1d(jk) < bathy(:,:) .AND. bathy(:,:) <= zmax .AND. misfdep + 1 >= mbathy) 
     1067               mbathy(:,:) = jk 
     1068               bathy(:,:)  = zmax 
     1069            END WHERE 
     1070         END DO 
     1071  
     1072         ! split top cell if possible (only where water column is 2 cell or less) 
     1073         DO jk = 2, jpkm1 
     1074            zmax = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1075            WHERE( gdepw_1d(jk+1) > risfdep(:,:) .AND. risfdep(:,:) >= zmax .AND. misfdep + 1 >= mbathy) 
     1076               misfdep(:,:) = jk 
     1077               risfdep(:,:) = zmax 
     1078            END WHERE 
     1079         END DO 
     1080  
     1081  
     1082 ! Case where bathy and risfdep compatible but not the level variable mbathy/misfdep because of partial cell condition 
     1083         DO jj = 1, jpj 
     1084            DO ji = 1, jpi 
     1085               ! find the minimum change option: 
     1086               ! test bathy 
     1087               IF (risfdep(ji,jj) .GT. 1) THEN 
     1088               zbathydiff =ABS(bathy(ji,jj)   - (gdepw_1d(mbathy (ji,jj)+1) & 
     1089                 &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 
     1090               zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj)  ) & 
     1091                 &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 
     1092  
     1093                  IF (bathy(ji,jj) .GT. risfdep(ji,jj) .AND. mbathy(ji,jj) .LT. misfdep(ji,jj)) THEN 
     1094                     IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1095                        bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj)+1)*e3zps_rat ) 
     1096                        mbathy(ji,jj)= mbathy(ji,jj) + 1 
     1097                     ELSE 
     1098                        risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ) 
     1099                        misfdep(ji,jj) = misfdep(ji,jj) - 1 
     1100                     END IF 
     1101                  END IF 
     1102               END IF 
     1103            END DO 
     1104         END DO 
     1105  
     1106          ! At least 2 levels for water thickness at T, U, and V point. 
     1107         DO jj = 1, jpj 
     1108            DO ji = 1, jpi 
     1109               ! find the minimum change option: 
     1110               ! test bathy 
     1111               IF( misfdep(ji,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1112                  zbathydiff  =ABS(bathy(ji,jj)  - (gdepw_1d(mbathy (ji,jj)+1)& 
     1113                    & + MIN( e3zps_min,e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 
     1114                  zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj)  )  & 
     1115                    & - MIN( e3zps_min,e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 
     1116                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1117                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1118                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 
     1119                  ELSE 
     1120                     misfdep(ji,jj)= misfdep(ji,jj) - 1 
     1121                     risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat ) 
     1122                  END IF 
     1123               ENDIF 
     1124            END DO 
     1125         END DO 
     1126  
     1127 ! point V mbathy(ji,jj) EQ misfdep(ji,jj+1)  
     1128         DO jj = 1, jpjm1 
     1129            DO ji = 1, jpim1 
     1130               IF( misfdep(ji,jj+1) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1131                  zbathydiff =ABS(bathy(ji,jj    ) - (gdepw_1d(mbathy (ji,jj)+1)   & 
     1132                    &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj  )+1)*e3zps_rat ))) 
     1133                  zrisfdepdiff=ABS(risfdep(ji,jj+1) - (gdepw_1d(misfdep(ji,jj+1))  & 
     1134                    &  - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1)-1)*e3zps_rat ))) 
     1135                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1136                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1137                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj  )) & 
     1138                   &    + MIN( e3zps_min, e3t_1d(mbathy(ji,jj   )+1)*e3zps_rat ) 
     1139                  ELSE 
     1140                     misfdep(ji,jj+1)  = misfdep(ji,jj+1) - 1 
     1141                     risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) & 
     1142                   &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat ) 
     1143                  END IF 
     1144               ENDIF 
     1145            END DO 
     1146         END DO 
     1147  
     1148         IF( lk_mpp ) THEN 
     1149            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1150            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1151            misfdep(:,:) = INT( zbathy(:,:) ) 
     1152            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1153            CALL lbc_lnk( bathy, 'T', 1. ) 
     1154            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1155            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1156            mbathy(:,:) = INT( zbathy(:,:) ) 
     1157         ENDIF 
     1158 ! point V misdep(ji,jj) EQ mbathy(ji,jj+1)  
     1159         DO jj = 1, jpjm1 
     1160            DO ji = 1, jpim1 
     1161               IF( misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1162                  zbathydiff =ABS(  bathy(ji,jj+1) - (gdepw_1d(mbathy (ji,jj+1)+1) & 
     1163                   &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ))) 
     1164                  zrisfdepdiff=ABS(risfdep(ji,jj  ) - (gdepw_1d(misfdep(ji,jj  )  )  & 
     1165                   &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj  )-1)*e3zps_rat ))) 
     1166                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1167                     mbathy (ji,jj+1) = mbathy(ji,jj+1) + 1 
     1168                     bathy  (ji,jj+1) = gdepw_1d(mbathy (ji,jj+1)  ) + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ) 
     1169                  ELSE 
     1170                     misfdep(ji,jj)   = misfdep(ji,jj) - 1 
     1171                     risfdep(ji,jj)   = gdepw_1d(misfdep(ji,jj  )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj  )  )*e3zps_rat ) 
     1172                  END IF 
     1173               ENDIF 
     1174            END DO 
     1175         END DO 
     1176  
     1177  
     1178         IF( lk_mpp ) THEN  
     1179            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1180            CALL lbc_lnk( zbathy, 'T', 1. )  
     1181            misfdep(:,:) = INT( zbathy(:,:) )  
     1182            CALL lbc_lnk( risfdep, 'T', 1. )  
     1183            CALL lbc_lnk( bathy, 'T', 1. ) 
     1184            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1185            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1186            mbathy(:,:) = INT( zbathy(:,:) ) 
     1187         ENDIF  
     1188  
     1189 ! point U mbathy(ji,jj) EQ misfdep(ji,jj+1)  
     1190         DO jj = 1, jpjm1 
     1191            DO ji = 1, jpim1 
     1192               IF( misfdep(ji+1,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1193                  zbathydiff =ABS(  bathy(ji  ,jj) - (gdepw_1d(mbathy (ji,jj)+1) & 
     1194                    &   + MIN( e3zps_min, e3t_1d(mbathy (ji  ,jj)+1)*e3zps_rat ))) 
     1195                  zrisfdepdiff=ABS(risfdep(ji+1,jj) - (gdepw_1d(misfdep(ji+1,jj)) & 
     1196                    &  - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj)-1)*e3zps_rat ))) 
     1197                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1198                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1199                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 
     1200                  ELSE 
     1201                     misfdep(ji+1,jj)= misfdep(ji+1,jj) - 1 
     1202                     risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat ) 
     1203                  END IF 
     1204               ENDIF 
     1205            ENDDO 
     1206         ENDDO 
     1207  
     1208         IF( lk_mpp ) THEN  
     1209            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1210            CALL lbc_lnk( zbathy, 'T', 1. )  
     1211            misfdep(:,:) = INT( zbathy(:,:) )  
     1212            CALL lbc_lnk( risfdep, 'T', 1. )  
     1213            CALL lbc_lnk( bathy, 'T', 1. ) 
     1214            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1215            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1216            mbathy(:,:) = INT( zbathy(:,:) ) 
     1217         ENDIF  
     1218  
     1219 ! point U misfdep(ji,jj) EQ bathy(ji,jj+1)  
     1220         DO jj = 1, jpjm1 
     1221            DO ji = 1, jpim1 
     1222               IF( misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1223                  zbathydiff =ABS(  bathy(ji+1,jj) - (gdepw_1d(mbathy (ji+1,jj)+1) & 
     1224                      &   + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj)+1)*e3zps_rat ))) 
     1225                  zrisfdepdiff=ABS(risfdep(ji  ,jj) - (gdepw_1d(misfdep(ji  ,jj)  )  & 
     1226                      &  - MIN( e3zps_min, e3t_1d(misfdep(ji  ,jj)-1)*e3zps_rat ))) 
     1227                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1228                     mbathy(ji+1,jj)  = mbathy (ji+1,jj) + 1 
     1229                     bathy (ji+1,jj)  = gdepw_1d(mbathy (ji+1,jj)  )  & 
     1230                      &   + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj) +1)*e3zps_rat ) 
     1231                  ELSE 
     1232                     misfdep(ji,jj)   = misfdep(ji  ,jj) - 1 
     1233                     risfdep(ji,jj)   = gdepw_1d(misfdep(ji  ,jj)+1) & 
     1234                      &   - MIN( e3zps_min, e3t_1d(misfdep(ji  ,jj)   )*e3zps_rat ) 
     1235                  END IF 
     1236               ENDIF 
     1237            ENDDO 
     1238         ENDDO 
     1239  
     1240         IF( lk_mpp ) THEN 
     1241            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1242            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1243            misfdep(:,:) = INT( zbathy(:,:) ) 
     1244            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1245            CALL lbc_lnk( bathy, 'T', 1. ) 
     1246            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1247            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1248            mbathy(:,:) = INT( zbathy(:,:) ) 
     1249         ENDIF 
     1250      END DO 
     1251      ! end dig bathy/ice shelf to be compatible 
     1252      ! now fill single point in "coastline" of ice shelf, bathy, hole, and test again one cell tickness 
     1253      DO jl = 1,20 
     1254  
     1255 ! remove single point "bay" on isf coast line in the ice shelf draft' 
     1256         DO jk = 1, jpk 
     1257            WHERE (misfdep==0) misfdep=jpk 
     1258            zmask=0 
     1259            WHERE (misfdep .LE. jk) zmask=1 
     1260            DO jj = 2, jpjm1 
     1261               DO ji = 2, jpim1 
     1262                  IF (misfdep(ji,jj) .EQ. jk) THEN 
     1263                     ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 
     1264                     IF (ibtest .LE. 1) THEN 
     1265                        risfdep(ji,jj)=gdepw_1d(jk+1) ; misfdep(ji,jj)=jk+1 
     1266                        IF (misfdep(ji,jj) .GT. mbathy(ji,jj)) misfdep(ji,jj) = jpk 
     1267                     END IF 
     1268                  END IF 
     1269               END DO 
     1270            END DO 
     1271         END DO 
     1272         WHERE (misfdep==jpk) 
     1273             misfdep=0 ; risfdep=0. ; mbathy=0 ; bathy=0. 
     1274         END WHERE 
     1275         IF( lk_mpp ) THEN 
     1276            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1277            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1278            misfdep(:,:) = INT( zbathy(:,:) ) 
     1279            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1280            CALL lbc_lnk( bathy, 'T', 1. ) 
     1281            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1282            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1283            mbathy(:,:) = INT( zbathy(:,:) ) 
     1284         ENDIF 
     1285  
     1286 ! remove single point "bay" on bathy coast line beneath an ice shelf' 
     1287         DO jk = jpk,1,-1 
     1288            zmask=0 
     1289            WHERE (mbathy .GE. jk ) zmask=1 
     1290            DO jj = 2, jpjm1 
     1291               DO ji = 2, jpim1 
     1292                  IF (mbathy(ji,jj) .EQ. jk .AND. misfdep(ji,jj) .GE. 2) THEN 
     1293                     ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 
     1294                     IF (ibtest .LE. 1) THEN 
     1295                        bathy(ji,jj)=gdepw_1d(jk) ; mbathy(ji,jj)=jk-1 
     1296                        IF (misfdep(ji,jj) .GT. mbathy(ji,jj)) mbathy(ji,jj) = 0 
     1297                     END IF 
     1298                  END IF 
     1299               END DO 
     1300            END DO 
     1301         END DO 
     1302         WHERE (mbathy==0) 
     1303             misfdep=0 ; risfdep=0. ; mbathy=0 ; bathy=0. 
     1304         END WHERE 
     1305         IF( lk_mpp ) THEN 
     1306            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1307            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1308            misfdep(:,:) = INT( zbathy(:,:) ) 
     1309            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1310            CALL lbc_lnk( bathy, 'T', 1. ) 
     1311            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1312            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1313            mbathy(:,:) = INT( zbathy(:,:) ) 
     1314         ENDIF 
     1315  
     1316 ! fill hole in ice shelf 
     1317         zmisfdep = misfdep 
     1318         zrisfdep = risfdep 
     1319         WHERE (zmisfdep .LE. 1) zmisfdep=jpk 
     1320         DO jj = 2, jpjm1 
     1321            DO ji = 2, jpim1 
     1322               ibtestim1 = zmisfdep(ji-1,jj  ) ; ibtestip1 = zmisfdep(ji+1,jj  ) 
     1323               ibtestjm1 = zmisfdep(ji  ,jj-1) ; ibtestjp1 = zmisfdep(ji  ,jj+1) 
     1324               IF( zmisfdep(ji,jj) .GE. mbathy(ji-1,jj  ) ) ibtestim1 = jpk!MAX(0, mbathy(ji-1,jj  ) - 1) 
     1325               IF( zmisfdep(ji,jj) .GE. mbathy(ji+1,jj  ) ) ibtestip1 = jpk!MAX(0, mbathy(ji+1,jj  ) - 1) 
     1326               IF( zmisfdep(ji,jj) .GE. mbathy(ji  ,jj-1) ) ibtestjm1 = jpk!MAX(0, mbathy(ji  ,jj-1) - 1) 
     1327               IF( zmisfdep(ji,jj) .GE. mbathy(ji  ,jj+1) ) ibtestjp1 = jpk!MAX(0, mbathy(ji  ,jj+1) - 1) 
     1328               ibtest=MIN(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 
     1329               IF( ibtest == jpk .AND. misfdep(ji,jj) .GE. 2) THEN 
     1330                  mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp 
     1331               END IF 
     1332               IF( zmisfdep(ji,jj) < ibtest .AND. misfdep(ji,jj) .GE. 2) THEN 
     1333                  misfdep(ji,jj) = ibtest 
     1334                  risfdep(ji,jj) = gdepw_1d(ibtest) 
     1335               ENDIF 
     1336            ENDDO 
     1337         ENDDO 
     1338  
     1339         IF( lk_mpp ) THEN  
     1340            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1341            CALL lbc_lnk( zbathy, 'T', 1. )  
     1342            misfdep(:,:) = INT( zbathy(:,:) )  
     1343            CALL lbc_lnk( risfdep, 'T', 1. )  
     1344            CALL lbc_lnk( bathy, 'T', 1. ) 
     1345            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1346            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1347            mbathy(:,:) = INT( zbathy(:,:) ) 
     1348         ENDIF  
     1349 ! 
     1350 !! fill hole in bathymetry 
     1351         zmbathy (:,:)=mbathy (:,:) 
     1352         DO jj = 2, jpjm1 
     1353            DO ji = 2, jpim1 
     1354               ibtestim1 = zmbathy(ji-1,jj  ) ; ibtestip1 = zmbathy(ji+1,jj  ) 
     1355               ibtestjm1 = zmbathy(ji  ,jj-1) ; ibtestjp1 = zmbathy(ji  ,jj+1) 
     1356               IF( zmbathy(ji,jj) .LT. misfdep(ji-1,jj  ) ) ibtestim1 = 0!MIN(jpk-1, misfdep(ji-1,jj  ) + 1) 
     1357               IF( zmbathy(ji,jj) .LT. misfdep(ji+1,jj  ) ) ibtestip1 = 0 
     1358               IF( zmbathy(ji,jj) .LT. misfdep(ji  ,jj-1) ) ibtestjm1 = 0 
     1359               IF( zmbathy(ji,jj) .LT. misfdep(ji  ,jj+1) ) ibtestjp1 = 0 
     1360               ibtest=MAX(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 
     1361               IF( ibtest == 0 ) THEN 
     1362                  mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp ; 
     1363               END IF 
     1364               IF( ibtest < zmbathy(ji,jj) .AND. misfdep(ji,jj) .GE. 2) THEN 
     1365                  mbathy(ji,jj) = ibtest 
     1366                  bathy(ji,jj)  = gdepw_1d(ibtest+1)  
     1367               ENDIF 
     1368            END DO 
     1369         END DO 
     1370         IF( lk_mpp ) THEN  
     1371            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1372            CALL lbc_lnk( zbathy, 'T', 1. )  
     1373            misfdep(:,:) = INT( zbathy(:,:) )  
     1374            CALL lbc_lnk( risfdep, 'T', 1. )  
     1375            CALL lbc_lnk( bathy, 'T', 1. ) 
     1376            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1377            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1378            mbathy(:,:) = INT( zbathy(:,:) ) 
     1379         ENDIF  
     1380 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 
     1381         DO jj = 1, jpjm1 
     1382            DO ji = 1, jpim1 
     1383               IF (mbathy(ji,jj) == misfdep(ji+1,jj) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji+1,jj) .GE. 1) THEN 
     1384                  mbathy(ji,jj)  = mbathy(ji,jj) - 1 ; bathy(ji,jj)   = gdepw_1d(mbathy(ji,jj)+1) ; 
     1385               END IF 
     1386            END DO 
     1387         END DO 
     1388         IF( lk_mpp ) THEN  
     1389            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1390            CALL lbc_lnk( zbathy, 'T', 1. )  
     1391            misfdep(:,:) = INT( zbathy(:,:) )  
     1392            CALL lbc_lnk( risfdep, 'T', 1. )  
     1393            CALL lbc_lnk( bathy, 'T', 1. ) 
     1394            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1395            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1396            mbathy(:,:) = INT( zbathy(:,:) ) 
     1397         ENDIF  
     1398 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 
     1399         DO jj = 1, jpjm1 
     1400            DO ji = 1, jpim1 
     1401               IF (misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji+1,jj) .GE. 1) THEN 
     1402                  mbathy(ji+1,jj)  = mbathy(ji+1,jj) - 1;   bathy(ji+1,jj)   = gdepw_1d(mbathy(ji+1,jj)+1) ; 
     1403               END IF 
     1404            END DO 
     1405         END DO 
     1406         IF( lk_mpp ) THEN  
     1407            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1408            CALL lbc_lnk( zbathy, 'T', 1. )  
     1409            misfdep(:,:) = INT( zbathy(:,:) )  
     1410            CALL lbc_lnk( risfdep, 'T', 1. )  
     1411            CALL lbc_lnk( bathy, 'T', 1. ) 
     1412            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1413            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1414            mbathy(:,:) = INT( zbathy(:,:) ) 
     1415         ENDIF  
     1416 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 
     1417         DO jj = 1, jpjm1 
     1418            DO ji = 1, jpi 
     1419               IF (mbathy(ji,jj) == misfdep(ji,jj+1) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji,jj+1) .GE. 1) THEN 
     1420                  mbathy(ji,jj)  = mbathy(ji,jj) - 1 ; bathy(ji,jj)   = gdepw_1d(mbathy(ji,jj)+1) ; 
     1421               END IF 
     1422            END DO 
     1423         END DO 
     1424         IF( lk_mpp ) THEN  
     1425            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1426            CALL lbc_lnk( zbathy, 'T', 1. )  
     1427            misfdep(:,:) = INT( zbathy(:,:) )  
     1428            CALL lbc_lnk( risfdep, 'T', 1. )  
     1429            CALL lbc_lnk( bathy, 'T', 1. ) 
     1430            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1431            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1432            mbathy(:,:) = INT( zbathy(:,:) ) 
     1433         ENDIF  
     1434 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 
     1435         DO jj = 1, jpjm1 
     1436            DO ji = 1, jpi 
     1437               IF (misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji,jj+1) .GE. 1) THEN 
     1438                  mbathy(ji,jj+1)  = mbathy(ji,jj+1) - 1 ; bathy(ji,jj+1)   = gdepw_1d(mbathy(ji,jj+1)+1) ; 
     1439               END IF 
     1440            END DO 
     1441         END DO 
     1442         IF( lk_mpp ) THEN  
     1443            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1444            CALL lbc_lnk( zbathy, 'T', 1. )  
     1445            misfdep(:,:) = INT( zbathy(:,:) )  
     1446            CALL lbc_lnk( risfdep, 'T', 1. )  
     1447            CALL lbc_lnk( bathy, 'T', 1. ) 
     1448            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1449            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1450            mbathy(:,:) = INT( zbathy(:,:) ) 
     1451         ENDIF  
     1452 ! if not compatible after all check, mask T 
     1453         DO jj = 1, jpj 
     1454            DO ji = 1, jpi 
     1455               IF (mbathy(ji,jj) <= misfdep(ji,jj)) THEN 
     1456                  misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0._wp ; mbathy(ji,jj)  = 0 ; bathy(ji,jj)   = 0._wp ; 
     1457               END IF 
     1458            END DO 
     1459         END DO 
     1460  
     1461         WHERE (mbathy(:,:) == 1) 
     1462            mbathy = 0; bathy = 0.0_wp ; misfdep = 0 ; risfdep = 0.0_wp 
     1463         END WHERE 
     1464      END DO  
     1465! end check compatibility ice shelf/bathy 
     1466      ! remove very shallow ice shelf (less than ~ 10m if 75L) 
     1467      WHERE (misfdep(:,:) <= 5) 
     1468         misfdep = 1; risfdep = 0.0_wp; 
     1469      END WHERE 
     1470 
     1471      IF( icompt == 0 ) THEN  
     1472         IF(lwp) WRITE(numout,*)'     no points with ice shelf too close to bathymetry'  
     1473      ELSE  
     1474         IF(lwp) WRITE(numout,*)'    ',icompt,' ocean grid points with ice shelf thickness reduced to avoid bathymetry'  
     1475      ENDIF  
    9081476 
    9091477      ! Scale factors and depth at T- and W-points 
     
    9381506!gm Bug?  check the gdepw_1d 
    9391507                  !       ... 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) )) 
     1508                  gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) )   & 
     1509                     &                             * ((gdept_1d(     ik  ) - gdepw_1d(ik) )   & 
     1510                     &                             / ( gdepw_1d(     ik+1) - gdepw_1d(ik) )) 
    9431511                  e3t_0(ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
    9441512                     &                          / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
     
    9731541         END DO 
    9741542      END DO 
     1543      ! 
     1544      ! (ISF) Definition of e3t, u, v, w for ISF case 
     1545      DO jj = 1, jpj  
     1546         DO ji = 1, jpi  
     1547            ik = misfdep(ji,jj)  
     1548            IF( ik > 1 ) THEN               ! ice shelf point only  
     1549               IF( risfdep(ji,jj) < gdepw_1d(ik) )  risfdep(ji,jj)= gdepw_1d(ik)  
     1550               gdepw_0(ji,jj,ik) = risfdep(ji,jj)  
     1551!gm Bug?  check the gdepw_0  
     1552               !       ... on ik  
     1553               gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) )   &  
     1554                  &                               * ( gdepw_1d(ik+1) - gdept_1d(ik)      )   &  
     1555                  &                               / ( gdepw_1d(ik+1) - gdepw_1d(ik)      )  
     1556               e3t_0  (ji,jj,ik  ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik)  
     1557               e3w_0  (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 
     1558 
     1559               IF( ik + 1 == mbathy(ji,jj) ) THEN               ! ice shelf point only (2 cell water column)  
     1560                  e3w_0  (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik)  
     1561                ENDIF  
     1562               !       ... on ik / ik-1  
     1563               e3w_0  (ji,jj,ik  ) = 2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik))  
     1564               e3t_0  (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 
     1565! The next line isn't required and doesn't affect results - included for consistency with bathymetry code  
     1566               gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 
     1567            ENDIF  
     1568         END DO  
     1569      END DO  
     1570      !  
     1571      it = 0  
     1572      DO jj = 1, jpj  
     1573         DO ji = 1, jpi  
     1574            ik = misfdep(ji,jj)  
     1575            IF( ik > 1 ) THEN               ! ice shelf point only  
     1576               e3tp (ji,jj) = e3t_0(ji,jj,ik  )  
     1577               e3wp (ji,jj) = e3w_0(ji,jj,ik+1 )  
     1578               ! test  
     1579               zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik  )  
     1580               IF( zdiff <= 0. .AND. lwp ) THEN   
     1581                  it = it + 1  
     1582                  WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj  
     1583                  WRITE(numout,*) ' risfdep = ', risfdep(ji,jj)  
     1584                  WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff  
     1585                  WRITE(numout,*) ' e3tp  = ', e3tp(ji,jj), ' e3wp  = ', e3wp(ji,jj)  
     1586               ENDIF  
     1587            ENDIF  
     1588         END DO  
     1589      END DO  
     1590      ! END (ISF) 
    9751591 
    9761592      ! Scale factors and depth at U-, V-, UW and VW-points 
     
    9911607         END DO 
    9921608      END DO 
     1609      ! (ISF) define e3uw 
     1610      DO jk = 2,jpk                           
     1611         DO jj = 1, jpjm1  
     1612            DO ji = 1, fs_jpim1   ! vector opt.  
     1613               e3uw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji+1,jj  ,jk) ) & 
     1614                 &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji+1,jj  ,jk-1) ) 
     1615               e3vw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji  ,jj+1,jk) ) & 
     1616                 &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji  ,jj+1,jk-1) ) 
     1617            END DO  
     1618         END DO  
     1619      END DO 
     1620      !End (ISF) 
     1621       
    9931622      CALL lbc_lnk( e3u_0 , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw_0, 'U', 1._wp )   ! lateral boundary conditions 
    9941623      CALL lbc_lnk( e3v_0 , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 
     
    10321661      
    10331662      ! 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          
     1663      WHERE (misfdep == 0) misfdep = 1 
     1664      DO jj = 1,jpj 
     1665         DO ji = 1,jpi 
     1666            gdep3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 
     1667            DO jk = 2, misfdep(ji,jj) 
     1668               gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1669            END DO 
     1670            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)) 
     1671            DO jk = misfdep(ji,jj) + 1, jpk 
     1672               gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1673            END DO 
     1674        END DO 
     1675      END DO 
    10391676      !                                               ! ================= ! 
    10401677      IF(lwp .AND. ll_print) THEN                     !   Control print   ! 
     
    10661703      ! 
    10671704      CALL wrk_dealloc( jpi, jpj, jpk, zprt ) 
     1705      CALL wrk_dealloc( jpi, jpj, zmask, zbathy, zrisfdep ) 
     1706      CALL wrk_dealloc( jpi, jpj, zmisfdep, zmbathy ) 
    10681707      ! 
    10691708      IF( nn_timing == 1 )  CALL timing_stop('zgr_zps') 
     
    14452084            DO jk = 1, jpkm1 
    14462085               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 
     2086            END DO 
     2087            IF( scobot(ji,jj) == 0._wp               )   mbathy(ji,jj) = 0 
    14492088         END DO 
    14502089      END DO 
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90

    r4624 r5075  
    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_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90

    r4370 r5075  
    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) 
     
    7374      !!---------------------------------------------------------------------- 
    7475      ! 
    75       IF( nn_timing == 1 )  CALL timing_start('istate_init') 
    76       ! 
    77  
    78       IF(lwp) WRITE(numout,*) 
     76      IF( nn_timing == 1 )   CALL timing_start('istate_init') 
     77      ! 
     78 
     79      IF(lwp) WRITE(numout,*) ' ' 
    7980      IF(lwp) WRITE(numout,*) 'istate_ini : Initialization of the dynamics and tracers' 
    8081      IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
     
    8384      IF( lk_c1d ) CALL dta_uvd_init          ! Initialization of U & V input data 
    8485 
    85       rhd  (:,:,:  ) = 0.e0 
    86       rhop (:,:,:  ) = 0.e0 
    87       rn2  (:,:,:  ) = 0.e0  
    88       tsa  (:,:,:,:) = 0.e0     
     86      rhd  (:,:,:  ) = 0._wp 
     87      rhop (:,:,:  ) = 0._wp 
     88      rn2  (:,:,:  ) = 0._wp 
     89      tsa  (:,:,:,:) = 0._wp    
     90      rab_b(:,:,:,:) = 0._wp 
     91      rab_n(:,:,:,:) = 0._wp 
    8992 
    9093      IF( ln_rstart ) THEN                    ! Restart from a file 
     
    110113         ELSEIF( cp_cfg == 'gyre' ) THEN          
    111114            CALL istate_gyre                     ! GYRE  configuration : start from pre-defined T-S fields 
     115        ELSEIF( cp_cfg == 'isomip' .OR. cp_cfg == 'isomip2') THEN 
     116            IF(lwp) WRITE(numout,*) 'Initialization of T+S for ISOMIP domain'  
     117            tsn(:,:,:,jp_tem)=-1.9*tmask(:,:,:)          ! ISOMIP configuration : start from constant T+S fields  
     118            tsn(:,:,:,jp_sal)=34.4*tmask(:,:,:) 
     119            tsb(:,:,:,:)=tsn(:,:,:,:)   
    112120         ELSE                                    ! Initial T-S, U-V fields read in files 
    113121            IF ( ln_tsd_init ) THEN              ! read 3D T and S data at nit000 
     
    129137         CALL eos( tsb, rhd, rhop, gdept_0(:,:,:) )        ! before potential and in situ densities 
    130138#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 
     139         IF( ln_zps )    CALL zps_hde( nit000, jpts, tsb, gtsu, gtsv,  &        ! Partial steps: before horizontal gradient 
     140            &                                      rhd, gru , grv, aru, arv, gzu, gzv, ge3ru, ge3rv,  &             ! 
     141            &                                      gtui, gtvi, grui, grvi, arui, arvi, gzui, gzvi, ge3rui, ge3rvi  )  ! of t, s, rd at the last ocean level 
    133142#endif 
    134143         !    
     
    162171      ! 
    163172      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  
    168173         DO jj = 1, jpj 
    169174            DO ji = 1, jpi 
    170 #endif                   
    171175               un_b(ji,jj) = un_b(ji,jj) + fse3u_n(ji,jj,jk) * un(ji,jj,jk) * umask(ji,jj,jk) 
    172176               vn_b(ji,jj) = vn_b(ji,jj) + fse3v_n(ji,jj,jk) * vn(ji,jj,jk) * vmask(ji,jj,jk) 
     
    185189      ! 
    186190      ! 
    187       IF( nn_timing == 1 )  CALL timing_stop('istate_init') 
     191      IF( nn_timing == 1 )   CALL timing_stop('istate_init') 
    188192      ! 
    189193   END SUBROUTINE istate_init 
     194 
    190195 
    191196   SUBROUTINE istate_t_s 
     
    219224   END SUBROUTINE istate_t_s 
    220225 
     226 
    221227   SUBROUTINE istate_eel 
    222228      !!---------------------------------------------------------------------- 
     
    233239      USE divcur     ! hor. divergence & rel. vorticity      (div_cur routine) 
    234240      USE iom 
    235   
     241      ! 
    236242      INTEGER  ::   inum              ! temporary logical unit 
    237243      INTEGER  ::   ji, jj, jk        ! dummy loop indices 
     
    244250      REAL(wp), DIMENSION(jpiglo,jpjglo) ::   zssh  ! initial ssh over the global domain 
    245251      !!---------------------------------------------------------------------- 
    246  
     252      ! 
    247253      SELECT CASE ( jp_cfg )  
    248254         !                                              ! ==================== 
     
    375381      INTEGER, PARAMETER ::   ntsinit = 0   ! (0/1) (analytical/input data files) T&S initialization 
    376382      !!---------------------------------------------------------------------- 
    377  
     383      ! 
    378384      SELECT CASE ( ntsinit) 
    379  
     385      ! 
    380386      CASE ( 0 )                  ! analytical T/S profil deduced from LEVITUS 
    381387         IF(lwp) WRITE(numout,*) 
    382388         IF(lwp) WRITE(numout,*) 'istate_gyre : initial analytical T and S profil deduced from LEVITUS ' 
    383389         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    384  
     390         ! 
    385391         DO jk = 1, jpk 
    386392            DO jj = 1, jpj 
     
    407413            END DO 
    408414         END DO 
    409  
     415         ! 
    410416      CASE ( 1 )                  ! T/S data fields read in dta_tem.nc/data_sal.nc files 
    411417         IF(lwp) WRITE(numout,*) 
     
    431437         tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * tmask(:,:,:)  
    432438         tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
    433  
     439         ! 
    434440      END SELECT 
    435  
     441      ! 
    436442      IF(lwp) THEN 
    437443         WRITE(numout,*) 
     
    440446         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 ) 
    441447      ENDIF 
    442  
     448      ! 
    443449   END SUBROUTINE istate_gyre 
     450 
    444451 
    445452   SUBROUTINE istate_uvg 
     
    457464      USE divcur          ! hor. divergence & rel. vorticity      (div_cur routine) 
    458465      USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    459  
     466      ! 
    460467      INTEGER ::   ji, jj, jk        ! dummy loop indices 
    461468      INTEGER ::   indic             ! ??? 
     
    567574   !!===================================================================== 
    568575END MODULE istate 
    569  
  • branches/2014/dev_r4650_UKMO7_STARTHOUR/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90

    r3625 r5075  
    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] 
    5853   REAL(wp), PUBLIC ::   r1_rau0_rcp                 !: = 1. / ( rau0 * rcp ) 
     
    163158      IF(lwp) WRITE(numout,*) '          melting point of ice             rt0_ice  = ', rt0_ice , ' K' 
    164159 
    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  
     160      IF(lwp) WRITE(numout,*) '          reference density and heat capacity now defined in eosbn2.f90' 
     161               
    176162#if defined key_lim3 || defined key_cice 
    177163      xlsn = lfus * rhosn        ! volumetric latent heat fusion of snow [J/m3] 
Note: See TracChangeset for help on using the changeset viewer.