source: trunk/NEMOGCM/NEMO/OPA_SRC/DOM/iscplrst.F90 @ 7646

Last change on this file since 7646 was 7646, checked in by timgraham, 4 years ago

Merge of dev_merge_2016 into trunk. UPDATE TO ARCHFILES NEEDED for XIOS2.
LIM_SRC_s/limrhg.F90 to follow in next commit due to change of kind (I'm unable to do it in this commit).
Merged using the following steps:

1) svn merge —reintegrate svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk .
2) Resolve minor conflicts in sette.sh and namelist_cfg for ORCA2LIM3 (due to a change in trunk after branch was created)
3) svn commit
4) svn switch svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk
5) svn merge svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2016/dev_merge_2016 .
6) At this stage I checked out a clean copy of the branch to compare against what is about to be committed to the trunk.
6) svn commit #Commit code to the trunk

In this commit I have also reverted a change to Fcheck_archfile.sh which was causing problems on the Paris machine.

File size: 20.8 KB
Line 
1MODULE iscplrst
2   !!======================================================================
3   !!                       ***  MODULE  iscplrst  ***
4   !! Ocean forcing: update the restart file in case of ice sheet/ocean coupling
5   !!=====================================================================
6   !! History :  NEMO  ! 2015-01 P. Mathiot: original
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   iscpl_stp          : step management
11   !!   iscpl_rst_interpol : restart interpolation in case of coupling with ice sheet
12   !!----------------------------------------------------------------------
13   USE dom_oce         ! ocean space and time domain
14   USE domwri          ! ocean space and time domain
15   USE domvvl, ONLY : dom_vvl_interpol
16   USE phycst          ! physical constants
17   USE sbc_oce         ! surface boundary condition variables
18   USE oce             ! global tra/dyn variable
19   USE in_out_manager  ! I/O manager
20   USE iom             ! I/O module
21   USE lib_mpp         ! MPP library
22   USE lib_fortran     ! MPP library
23   USE wrk_nemo        ! Memory allocation
24   USE lbclnk          ! communication
25   USE iscplini        ! ice sheet coupling: initialisation
26   USE iscplhsb        ! ice sheet coupling: conservation
27
28   IMPLICIT NONE
29   PRIVATE
30   
31   PUBLIC   iscpl_stp          ! step management
32   !!
33   !! * Substitutions 
34#  include "vectopt_loop_substitute.h90"
35   !!----------------------------------------------------------------------
36   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
37   !! $Id: sbcrnf.F90 4666 2014-06-11 12:52:23Z mathiot $
38   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
39   !!----------------------------------------------------------------------
40CONTAINS
41
42   SUBROUTINE iscpl_stp
43      !!----------------------------------------------------------------------
44      !!                   ***  ROUTINE iscpl_stp  ***
45      !!
46      !! ** Purpose : compute initialisation
47      !!              compute extrapolation of restart variable un, vn, tsn, sshn (wetting/drying)   
48      !!              compute correction term if needed
49      !!
50      !!----------------------------------------------------------------------
51      INTEGER  ::   inum0
52      REAL(wp), DIMENSION(:,:  ), POINTER ::   zsmask_b
53      REAL(wp), DIMENSION(:,:,:), POINTER ::   ztmask_b, zumask_b, zvmask_b
54      REAL(wp), DIMENSION(:,:,:), POINTER ::   ze3t_b  , ze3u_b  , ze3v_b 
55      REAL(wp), DIMENSION(:,:,:), POINTER ::   zdepw_b
56      CHARACTER(20) :: cfile
57      !!----------------------------------------------------------------------
58
59      CALL wrk_alloc(jpi,jpj,jpk,   ztmask_b, zumask_b, zvmask_b) ! mask before
60      CALL wrk_alloc(jpi,jpj,jpk,   ze3t_b  , ze3u_b  , ze3v_b  ) ! e3   before
61      CALL wrk_alloc(jpi,jpj,jpk,   zdepw_b )
62      CALL wrk_alloc(jpi,jpj,       zsmask_b                    )
63
64
65      !! get restart variable
66      CALL iom_get( numror, jpdom_autoglo, 'tmask'  , ztmask_b   ) ! need to extrapolate T/S
67      CALL iom_get( numror, jpdom_autoglo, 'umask'  , zumask_b   ) ! need to correct barotropic velocity
68      CALL iom_get( numror, jpdom_autoglo, 'vmask'  , zvmask_b   ) ! need to correct barotropic velocity
69      CALL iom_get( numror, jpdom_autoglo, 'smask'  , zsmask_b   ) ! need to correct barotropic velocity
70      CALL iom_get( numror, jpdom_autoglo, 'e3t_n'  , ze3t_b(:,:,:) )  ! need to compute temperature correction
71      CALL iom_get( numror, jpdom_autoglo, 'e3u_n'  , ze3u_b(:,:,:) )  ! need to correct barotropic velocity
72      CALL iom_get( numror, jpdom_autoglo, 'e3v_n'  , ze3v_b(:,:,:) )  ! need to correct barotropic velocity
73      CALL iom_get( numror, jpdom_autoglo, 'gdepw_n', zdepw_b(:,:,:) ) ! need to interpol vertical profile (vvl)
74
75      !! read namelist
76      CALL iscpl_init()
77
78      !!  ! Extrapolation/interpolation of modify cell and new cells ... (maybe do it later after domvvl)
79      CALL iscpl_rst_interpol( ztmask_b, zumask_b, zvmask_b, zsmask_b, ze3t_b, ze3u_b, ze3v_b, zdepw_b )
80
81      !! compute correction if conservation needed
82      IF ( ln_hsb ) THEN
83         IF( iscpl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'rst_iscpl : unable to allocate rst_iscpl arrays' )
84         CALL iscpl_cons(ztmask_b, zsmask_b, ze3t_b, htsc_iscpl, hdiv_iscpl, rdt_iscpl)
85      END IF
86         
87      !! print mesh/mask
88      IF( nn_msh /= 0 .AND. ln_iscpl )   CALL dom_wri      ! Create a domain file
89
90      IF ( ln_hsb ) THEN
91         cfile='correction'
92         cfile = TRIM( cfile )
93         CALL iom_open  ( cfile, inum0, ldwrt = .TRUE., kiolib = jprstlib )
94         CALL iom_rstput( 0, 0, inum0, 'vol_cor', hdiv_iscpl(:,:,:) )
95         CALL iom_rstput( 0, 0, inum0, 'tem_cor', htsc_iscpl(:,:,:,jp_tem) )
96         CALL iom_rstput( 0, 0, inum0, 'sal_cor', htsc_iscpl(:,:,:,jp_sal) )
97         CALL iom_close ( inum0 )
98      END IF
99
100      CALL wrk_dealloc(jpi,jpj,jpk,   ztmask_b,zumask_b,zvmask_b ) 
101      CALL wrk_dealloc(jpi,jpj,jpk,   ze3t_b  ,ze3u_b  ,ze3v_b   ) 
102      CALL wrk_dealloc(jpi,jpj,jpk,   zdepw_b                    )
103      CALL wrk_dealloc(jpi,jpj,       zsmask_b                   )
104
105      !! next step is an euler time step
106      neuler = 0
107
108      !! set _b and _n variables equal
109      tsb (:,:,:,:) = tsn (:,:,:,:)
110      ub  (:,:,:)   = un  (:,:,:)
111      vb  (:,:,:)   = vn  (:,:,:)
112      sshb(:,:)     = sshn(:,:)
113
114      !! set _b and _n vertical scale factor equal
115      e3t_b (:,:,:) = e3t_n (:,:,:)
116      e3u_b (:,:,:) = e3u_n (:,:,:)
117      e3v_b (:,:,:) = e3v_n (:,:,:)
118
119      e3uw_b (:,:,:) = e3uw_n (:,:,:)
120      e3vw_b (:,:,:) = e3vw_n (:,:,:)
121      gdept_b(:,:,:) = gdept_n(:,:,:)
122      gdepw_b(:,:,:) = gdepw_n(:,:,:)
123      hu_b   (:,:)   = hu_n   (:,:)
124      hv_b   (:,:)   = hv_n   (:,:)
125      r1_hu_b(:,:)   = r1_hu_n(:,:)
126      r1_hv_b(:,:)   = r1_hv_n(:,:)
127      !
128   END SUBROUTINE iscpl_stp
129
130
131   SUBROUTINE iscpl_rst_interpol (ptmask_b, pumask_b, pvmask_b, psmask_b, pe3t_b, pe3u_b, pe3v_b, pdepw_b)
132      !!----------------------------------------------------------------------
133      !!                   ***  ROUTINE iscpl_rst_interpol  ***
134      !!
135      !! ** Purpose :   compute new tn, sn, un, vn and sshn in case of evolving geometry of ice shelves
136      !!                compute 2d fields of heat, salt and volume correction
137      !!
138      !! ** Method  :   tn, sn : extrapolation from neigbourg cells
139      !!                un, vn : fill with 0 velocity and keep barotropic transport by modifing surface velocity or adjacent velocity
140      !!----------------------------------------------------------------------
141      REAL(wp), DIMENSION(:,:,:  ), INTENT(in ) :: ptmask_b, pumask_b, pvmask_b    !! mask before
142      REAL(wp), DIMENSION(:,:,:  ), INTENT(in ) :: pe3t_b  , pe3u_b  , pe3v_b      !! scale factor before
143      REAL(wp), DIMENSION(:,:,:  ), INTENT(in ) :: pdepw_b                         !! depth w before
144      REAL(wp), DIMENSION(:,:    ), INTENT(in ) :: psmask_b                        !! mask before
145      !!
146      INTEGER :: ji, jj, jk, iz          !! loop index
147      INTEGER :: jip1, jim1, jjp1, jjm1, jkp1, jkm1
148      !!
149      REAL(wp):: summsk, zsum, zsum1, zarea, zsumn, zsumb
150      REAL(wp):: zdz, zdzm1, zdzp1
151      !!
152      REAL(wp), DIMENSION(:,:    ), POINTER :: zdmask , zdsmask, zvcorr, zucorr, zde3t
153      REAL(wp), DIMENSION(:,:    ), POINTER :: zbub   , zbvb   , zbun  , zbvn
154      REAL(wp), DIMENSION(:,:    ), POINTER :: zssh0  , zssh1, zhu1, zhv1
155      REAL(wp), DIMENSION(:,:    ), POINTER :: zsmask0, zsmask1
156      REAL(wp), DIMENSION(:,:,:  ), POINTER :: ztmask0, ztmask1, ztrp
157      REAL(wp), DIMENSION(:,:,:  ), POINTER :: zwmaskn, zwmaskb, ztmp3d
158      REAL(wp), DIMENSION(:,:,:,:), POINTER :: zts0
159      !!----------------------------------------------------------------------
160
161      !! allocate variables
162      CALL wrk_alloc(jpi,jpj,jpk,2, zts0                                   )
163      CALL wrk_alloc(jpi,jpj,jpk,   ztmask0, ztmask1 , ztrp, ztmp3d        ) 
164      CALL wrk_alloc(jpi,jpj,jpk,   zwmaskn, zwmaskb                       ) 
165      CALL wrk_alloc(jpi,jpj,       zsmask0, zsmask1                       ) 
166      CALL wrk_alloc(jpi,jpj,       zdmask , zdsmask, zvcorr, zucorr, zde3t) 
167      CALL wrk_alloc(jpi,jpj,       zbub   , zbvb    , zbun , zbvn         ) 
168      CALL wrk_alloc(jpi,jpj,       zssh0  , zssh1, zhu1, zhv1             ) 
169
170      !! mask value to be sure
171      tsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) * ptmask_b(:,:,:)
172      tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * ptmask_b(:,:,:)
173     
174      ! compute wmask
175      zwmaskn(:,:,1) = tmask   (:,:,1)
176      zwmaskb(:,:,1) = ptmask_b(:,:,1)
177      DO jk = 2,jpk
178         zwmaskn(:,:,jk) =  tmask  (:,:,jk) *  tmask  (:,:,jk-1)
179         zwmaskb(:,:,jk) = ptmask_b(:,:,jk) * ptmask_b(:,:,jk-1)
180      END DO
181           
182      ! compute new ssh if we open a full water column (average of the closest neigbourgs) 
183      sshb (:,:)=sshn(:,:)
184      zssh0(:,:)=sshn(:,:)
185      zsmask0(:,:) = psmask_b(:,:)
186      zsmask1(:,:) = psmask_b(:,:)
187      DO iz = 1,10    ! need to be tuned (configuration dependent) (OK for ISOMIP+)
188         zdsmask(:,:) = ssmask(:,:)-zsmask0(:,:)
189         DO jj = 2,jpj-1
190            DO ji = fs_2, fs_jpim1   ! vector opt.
191               jip1=ji+1; jim1=ji-1;
192               jjp1=jj+1; jjm1=jj-1;
193               summsk=(zsmask0(jip1,jj)+zsmask0(jim1,jj)+zsmask0(ji,jjp1)+zsmask0(ji,jjm1))
194               IF (zdsmask(ji,jj) == 1._wp .AND. summsk /= 0._wp) THEN
195                  sshn(ji,jj)=( zssh0(jip1,jj)*zsmask0(jip1,jj)     &
196                  &           + zssh0(jim1,jj)*zsmask0(jim1,jj)     &
197                  &           + zssh0(ji,jjp1)*zsmask0(ji,jjp1)     &
198                  &           + zssh0(ji,jjm1)*zsmask0(ji,jjm1))/summsk
199                  zsmask1(ji,jj)=1._wp
200               END IF
201            END DO
202         END DO
203         CALL lbc_lnk(sshn,'T',1._wp)
204         CALL lbc_lnk(zsmask1,'T',1._wp)
205         zssh0   = sshn
206         zsmask0 = zsmask1
207      END DO
208      sshn(:,:) = sshn(:,:) * ssmask(:,:)
209
210!=============================================================================
211!PM: Is this needed since introduction of VVL by default?
212      IF (.NOT.ln_linssh) THEN
213      ! Reconstruction of all vertical scale factors at now time steps
214      ! =============================================================================
215      ! Horizontal scale factor interpolations
216      ! --------------------------------------
217         DO jk = 1,jpk
218            DO jj=1,jpj
219               DO ji=1,jpi
220                  IF (tmask(ji,jj,1) == 0._wp .OR. ptmask_b(ji,jj,1) == 0._wp) THEN
221                     e3t_n(ji,jj,jk) = e3t_0(ji,jj,jk) * ( 1._wp + sshn(ji,jj) / ( ht_0(ji,jj) + 1._wp - ssmask(ji,jj) ) * tmask(ji,jj,jk) )
222                  ENDIF
223               END DO
224            END DO
225         END DO
226
227         CALL dom_vvl_interpol( e3t_n(:,:,:), e3u_n(:,:,:), 'U' )
228         CALL dom_vvl_interpol( e3t_n(:,:,:), e3v_n(:,:,:), 'V' )
229         CALL dom_vvl_interpol( e3u_n(:,:,:), e3f_n(:,:,:), 'F' )
230
231      ! Vertical scale factor interpolations
232      ! ------------------------------------
233         CALL dom_vvl_interpol( e3t_n(:,:,:), e3w_n (:,:,:), 'W'  )
234         CALL dom_vvl_interpol( e3u_n(:,:,:), e3uw_n(:,:,:), 'UW' )
235         CALL dom_vvl_interpol( e3v_n(:,:,:), e3vw_n(:,:,:), 'VW' )
236
237      ! t- and w- points depth
238      ! ----------------------
239         gdept_n(:,:,1) = 0.5_wp * e3w_n(:,:,1)
240         gdepw_n(:,:,1) = 0.0_wp
241         gde3w_n(:,:,1) = gdept_n(:,:,1) - sshn(:,:)
242         DO jj = 1,jpj
243            DO ji = 1,jpi
244               DO jk = 2,mikt(ji,jj)-1
245                  gdept_n(ji,jj,jk) = gdept_0(ji,jj,jk)
246                  gdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk)
247                  gde3w_n(ji,jj,jk) = gdept_0(ji,jj,jk) - sshn(ji,jj)
248               END DO
249               IF (mikt(ji,jj) > 1) THEN
250                  jk = mikt(ji,jj)
251                  gdept_n(ji,jj,jk) = gdepw_0(ji,jj,jk) + 0.5_wp * e3w_n(ji,jj,jk)
252                  gdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk)
253                  gde3w_n(ji,jj,jk) = gdept_n(ji,jj,jk  ) - sshn   (ji,jj)
254               END IF
255               DO jk = mikt(ji,jj)+1, jpk
256                  gdept_n(ji,jj,jk) = gdept_n(ji,jj,jk-1) + e3w_n(ji,jj,jk)
257                  gdepw_n(ji,jj,jk) = gdepw_n(ji,jj,jk-1) + e3t_n(ji,jj,jk-1)
258                  gde3w_n(ji,jj,jk) = gdept_n(ji,jj,jk  ) - sshn (ji,jj)
259               END DO
260            END DO
261         END DO
262
263      ! t-, u- and v- water column thickness
264      ! ------------------------------------
265         ht_n(:,:) = 0._wp ; hu_n(:,:) = 0._wp ; hv_n(:,:) = 0._wp
266         DO jk = 1, jpkm1
267            hu_n(:,:) = hu_n(:,:) + e3u_n(:,:,jk) * umask(:,:,jk)
268            hv_n(:,:) = hv_n(:,:) + e3v_n(:,:,jk) * vmask(:,:,jk)
269            ht_n(:,:) = ht_n(:,:) + e3t_n(:,:,jk) * tmask(:,:,jk)
270         END DO
271         !                                        ! Inverse of the local depth
272         r1_hu_n(:,:) = 1._wp / ( hu_n(:,:) + 1._wp - ssumask(:,:) ) * ssumask(:,:)
273         r1_hv_n(:,:) = 1._wp / ( hv_n(:,:) + 1._wp - ssvmask(:,:) ) * ssvmask(:,:)
274
275      END IF
276
277!=============================================================================
278! compute velocity
279! compute velocity in order to conserve barotropic velocity (modification by poderation of the scale factor).
280      ub(:,:,:)=un(:,:,:)
281      vb(:,:,:)=vn(:,:,:)
282      DO jk = 1,jpk
283         DO jj = 1,jpj
284            DO ji = 1,jpi
285               un(ji,jj,jk) = ub(ji,jj,jk)*pe3u_b(ji,jj,jk)*pumask_b(ji,jj,jk)/e3u_n(ji,jj,jk)*umask(ji,jj,jk);
286               vn(ji,jj,jk) = vb(ji,jj,jk)*pe3v_b(ji,jj,jk)*pvmask_b(ji,jj,jk)/e3v_n(ji,jj,jk)*vmask(ji,jj,jk);
287            END DO
288         END DO
289      END DO
290
291! compute new velocity if we close a cell (check barotropic velocity and change velocity over the water column)
292! compute barotropic velocity now and after
293      ztrp(:,:,:) = ub(:,:,:)*pe3u_b(:,:,:); 
294      zbub(:,:)   = SUM(ztrp,DIM=3)
295      ztrp(:,:,:) = vb(:,:,:)*pe3v_b(:,:,:); 
296      zbvb(:,:)   = SUM(ztrp,DIM=3)
297      ztrp(:,:,:) = un(:,:,:)*e3u_n(:,:,:); 
298      zbun(:,:)   = SUM(ztrp,DIM=3)
299      ztrp(:,:,:) = vn(:,:,:)*e3v_n(:,:,:); 
300      zbvn(:,:)   = SUM(ztrp,DIM=3)
301
302      ! new water column
303      zhu1=0.0_wp ;
304      zhv1=0.0_wp ;
305      DO jk  = 1,jpk
306        zhu1(:,:) = zhu1(:,:) + e3u_n(:,:,jk) * umask(:,:,jk)
307        zhv1(:,:) = zhv1(:,:) + e3v_n(:,:,jk) * vmask(:,:,jk)
308      END DO
309     
310      ! compute correction     
311      zucorr = 0._wp
312      zvcorr = 0._wp
313      DO jj = 1,jpj
314         DO ji = 1,jpi
315            IF (zbun(ji,jj) /= zbub(ji,jj) .AND. zhu1(ji,jj) /= 0._wp ) THEN
316               zucorr(ji,jj) = (zbun(ji,jj) - zbub(ji,jj))/zhu1(ji,jj)
317            END IF
318            IF (zbvn(ji,jj) /= zbvb(ji,jj) .AND. zhv1(ji,jj) /= 0._wp ) THEN
319               zvcorr(ji,jj) = (zbvn(ji,jj) - zbvb(ji,jj))/zhv1(ji,jj)
320            END IF
321         END DO
322      END DO 
323     
324      ! update velocity
325      DO jk  = 1,jpk
326         un(:,:,jk)=(un(:,:,jk) - zucorr(:,:))*umask(:,:,jk)
327         vn(:,:,jk)=(vn(:,:,jk) - zvcorr(:,:))*vmask(:,:,jk)
328      END DO
329
330!=============================================================================
331      ! compute temp and salt
332      ! compute new tn and sn if we open a new cell
333      tsb (:,:,:,:) = tsn(:,:,:,:)
334      zts0(:,:,:,:) = tsn(:,:,:,:)
335      ztmask1(:,:,:) = ptmask_b(:,:,:)
336      ztmask0(:,:,:) = ptmask_b(:,:,:)
337      DO iz = 1,nn_drown ! resolution dependent (OK for ISOMIP+ case)
338          DO jk = 1,jpk-1
339              zdmask=tmask(:,:,jk)-ztmask0(:,:,jk);
340              DO jj = 2,jpj-1
341                 DO ji = fs_2,fs_jpim1
342                      jip1=ji+1; jim1=ji-1;
343                      jjp1=jj+1; jjm1=jj-1;
344                      summsk= (ztmask0(jip1,jj  ,jk)+ztmask0(jim1,jj  ,jk)+ztmask0(ji  ,jjp1,jk)+ztmask0(ji  ,jjm1,jk))
345                      IF (zdmask(ji,jj) == 1._wp .AND. summsk /= 0._wp) THEN
346                      !! horizontal basic extrapolation
347                         tsn(ji,jj,jk,1)=( zts0(jip1,jj  ,jk,1)*ztmask0(jip1,jj  ,jk) &
348                         &                +zts0(jim1,jj  ,jk,1)*ztmask0(jim1,jj  ,jk) &
349                         &                +zts0(ji  ,jjp1,jk,1)*ztmask0(ji  ,jjp1,jk) &
350                         &                +zts0(ji  ,jjm1,jk,1)*ztmask0(ji  ,jjm1,jk) ) / summsk
351                         tsn(ji,jj,jk,2)=( zts0(jip1,jj  ,jk,2)*ztmask0(jip1,jj  ,jk) &
352                         &                +zts0(jim1,jj  ,jk,2)*ztmask0(jim1,jj  ,jk) &
353                         &                +zts0(ji  ,jjp1,jk,2)*ztmask0(ji  ,jjp1,jk) &
354                         &                +zts0(ji  ,jjm1,jk,2)*ztmask0(ji  ,jjm1,jk) ) / summsk
355                         ztmask1(ji,jj,jk)=1
356                      ELSEIF (zdmask(ji,jj) == 1._wp .AND. summsk == 0._wp) THEN
357                      !! vertical extrapolation if horizontal extrapolation failed
358                         jkm1=max(1,jk-1) ; jkp1=min(jpk,jk+1)
359                         summsk=(ztmask0(ji,jj,jkm1)+ztmask0(ji,jj,jkp1))
360                         IF (zdmask(ji,jj) == 1._wp .AND. summsk /= 0._wp ) THEN
361                            tsn(ji,jj,jk,1)=( zts0(ji,jj,jkp1,1)*ztmask0(ji,jj,jkp1)     &
362                            &                +zts0(ji,jj,jkm1,1)*ztmask0(ji,jj,jkm1))/summsk
363                            tsn(ji,jj,jk,2)=( zts0(ji,jj,jkp1,2)*ztmask0(ji,jj,jkp1)     &
364                            &                +zts0(ji,jj,jkm1,2)*ztmask0(ji,jj,jkm1))/summsk
365                            ztmask1(ji,jj,jk)=1._wp
366                         END IF
367                      END IF
368                  END DO
369              END DO
370          END DO
371         
372          CALL lbc_lnk(tsn(:,:,:,1),'T',1._wp)
373          CALL lbc_lnk(tsn(:,:,:,2),'T',1._wp)
374          CALL lbc_lnk(ztmask1,     'T',1._wp)
375
376          ! update
377          zts0(:,:,:,:) = tsn(:,:,:,:)
378          ztmask0 = ztmask1
379
380      END DO
381
382      ! mask new tsn field
383      tsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) * tmask(:,:,:)
384      tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * tmask(:,:,:)
385
386      ! compute new T/S (interpolation) if vvl only for common wet cell in before and after wmask
387      !PM: Is this IF needed since change to VVL by default
388      IF (.NOT.ln_linssh) THEN
389         DO jk = 2,jpk-1
390            DO jj = 1,jpj
391               DO ji = 1,jpi
392                  IF (zwmaskn(ji,jj,jk) * zwmaskb(ji,jj,jk) == 1._wp .AND. (tmask(ji,jj,1)==0._wp .OR. ptmask_b(ji,jj,1)==0._wp) ) THEN
393                     !compute weight
394                     zdzp1 = MAX(0._wp,gdepw_n(ji,jj,jk+1) - pdepw_b(ji,jj,jk+1))
395                     zdz   =           gdepw_n(ji,jj,jk+1) - pdepw_b(ji,jj,jk  ) 
396                     zdzm1 = MAX(0._wp,pdepw_b(ji,jj,jk  ) - gdepw_n(ji,jj,jk  ))
397                     IF (zdz .LT. 0._wp) THEN
398                        CALL ctl_stop( 'STOP', 'rst_iscpl : unable to compute the interpolation' )
399                     END IF
400                     tsn(ji,jj,jk,jp_tem) = ( zdzp1*tsb(ji,jj,jk+1,jp_tem)      &
401                        &                   + zdz  *tsb(ji,jj,jk  ,jp_tem)      &
402                        &                   + zdzm1*tsb(ji,jj,jk-1,jp_tem)      )/e3t_n(ji,jj,jk)
403                     tsn(ji,jj,jk,jp_sal) = ( zdzp1*tsb(ji,jj,jk+1,jp_sal)      &
404                        &                   + zdz  *tsb(ji,jj,jk  ,jp_sal)      &
405                        &                   + zdzm1*tsb(ji,jj,jk-1,jp_sal)      )/e3t_n(ji,jj,jk)
406                  END IF
407               END DO
408            END DO
409         END DO               
410      END IF
411
412      ! closed pool
413      ! -----------------------------------------------------------------------------------------
414      ! case we open a cell but no neigbour cells available to get an estimate of T and S
415      WHERE (tmask(:,:,:) == 1._wp .AND. tsn(:,:,:,2) == 0._wp) 
416         tsn(:,:,:,2) = -99._wp  ! Special value for closed pool (checking purpose in output.init)
417         tmask(:,:,:) = 0._wp    ! set mask to 0 to run
418         umask(:,:,:) = 0._wp
419         vmask(:,:,:) = 0._wp
420      END WHERE
421     
422      ! set mbkt and mikt to 1 in thiese location
423      WHERE (SUM(tmask,dim=3) == 0)
424         mbkt(:,:)=1 ; mbku(:,:)=1 ; mbkv(:,:)=1
425         mikt(:,:)=1 ; miku(:,:)=1 ; mikv(:,:)=1
426      END WHERE
427      ! -------------------------------------------------------------------------------------------
428      ! compute new tn and sn if we close cell
429      ! nothing to do
430      !
431      ! deallocation tmp arrays
432      CALL wrk_dealloc(jpi,jpj,jpk,2, zts0                                   )
433      CALL wrk_dealloc(jpi,jpj,jpk,   ztmask0, ztmask1 , ztrp                ) 
434      CALL wrk_dealloc(jpi,jpj,jpk,   zwmaskn, zwmaskb , ztmp3d              ) 
435      CALL wrk_dealloc(jpi,jpj,       zsmask0, zsmask1                       ) 
436      CALL wrk_dealloc(jpi,jpj,       zdmask , zdsmask, zvcorr, zucorr, zde3t) 
437      CALL wrk_dealloc(jpi,jpj,       zbub   , zbvb    , zbun  , zbvn        ) 
438      CALL wrk_dealloc(jpi,jpj,       zssh0  , zssh1  , zhu1 , zhv1          ) 
439      !
440   END SUBROUTINE iscpl_rst_interpol
441
442   !!======================================================================
443END MODULE iscplrst
Note: See TracBrowser for help on using the repository browser.