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.
agrif_oce_interp.F90 in NEMO/trunk/src/NST – NEMO

source: NEMO/trunk/src/NST/agrif_oce_interp.F90 @ 13237

Last change on this file since 13237 was 13216, checked in by rblod, 4 years ago

Merge dev_r12973_AGRIF_CMEMS

  • Property svn:keywords set to Id
File size: 52.4 KB
RevLine 
[9570]1MODULE agrif_oce_interp
[1605]2   !!======================================================================
[9570]3   !!                   ***  MODULE  agrif_oce_interp  ***
[9019]4   !! AGRIF: interpolation package for the ocean dynamics (OPA)
[1605]5   !!======================================================================
[9019]6   !! History :  2.0  !  2002-06  (L. Debreu)  Original cade
[1605]7   !!            3.2  !  2009-04  (R. Benshila)
[5656]8   !!            3.6  !  2014-09  (R. Benshila)
[1605]9   !!----------------------------------------------------------------------
[7646]10#if defined key_agrif
[1605]11   !!----------------------------------------------------------------------
12   !!   'key_agrif'                                              AGRIF zoom
13   !!----------------------------------------------------------------------
14   !!   Agrif_tra     :
15   !!   Agrif_dyn     :
[9019]16   !!   Agrif_ssh     :
17   !!   Agrif_dyn_ts  :
18   !!   Agrif_dta_ts  :
19   !!   Agrif_ssh_ts  :
20   !!   Agrif_avm     :
[1605]21   !!   interpu       :
22   !!   interpv       :
23   !!----------------------------------------------------------------------
[636]24   USE par_oce
25   USE oce
26   USE dom_oce     
[6140]27   USE zdf_oce
[782]28   USE agrif_oce
[1605]29   USE phycst
[9031]30   USE dynspg_ts, ONLY: un_adv, vn_adv
[6140]31   !
[1605]32   USE in_out_manager
[9570]33   USE agrif_oce_sponge
[2715]34   USE lib_mpp
[12377]35   USE vremap
[13216]36   USE lbclnk
[5656]37 
[636]38   IMPLICIT NONE
39   PRIVATE
[4292]40
[12377]41   PUBLIC   Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_dyn_ts_flux, Agrif_ssh_ts, Agrif_dta_ts
[9057]42   PUBLIC   Agrif_tra, Agrif_avm
[9019]43   PUBLIC   interpun , interpvn
[9057]44   PUBLIC   interptsn, interpsshn, interpavm
[9019]45   PUBLIC   interpunb, interpvnb , interpub2b, interpvb2b
[12377]46   PUBLIC   interpe3t
47   PUBLIC   interpht0, interpmbkt
[13216]48   PUBLIC   agrif_initts, agrif_initssh
49
[6140]50   INTEGER ::   bdy_tinterp = 0
51
[1156]52   !!----------------------------------------------------------------------
[9598]53   !! NEMO/NST 4.0 , NEMO Consortium (2018)
[1156]54   !! $Id$
[10068]55   !! Software governed by the CeCILL license (see ./LICENSE)
[1156]56   !!----------------------------------------------------------------------
[5656]57CONTAINS
58
[782]59   SUBROUTINE Agrif_tra
[1605]60      !!----------------------------------------------------------------------
[5656]61      !!                  ***  ROUTINE Agrif_tra  ***
[1605]62      !!----------------------------------------------------------------------
[636]63      !
[1605]64      IF( Agrif_Root() )   RETURN
[6140]65      !
66      Agrif_SpecialValue    = 0._wp
[636]67      Agrif_UseSpecialValue = .TRUE.
[6140]68      !
[5656]69      CALL Agrif_Bc_variable( tsn_id, procname=interptsn )
[6140]70      !
[636]71      Agrif_UseSpecialValue = .FALSE.
[1605]72      !
[636]73   END SUBROUTINE Agrif_tra
74
[1605]75
[636]76   SUBROUTINE Agrif_dyn( kt )
[1605]77      !!----------------------------------------------------------------------
78      !!                  ***  ROUTINE Agrif_DYN  ***
79      !!---------------------------------------------------------------------- 
80      INTEGER, INTENT(in) ::   kt
[6140]81      !
82      INTEGER ::   ji, jj, jk       ! dummy loop indices
[9057]83      INTEGER ::   ibdy1, jbdy1, ibdy2, jbdy2
[9019]84      REAL(wp), DIMENSION(jpi,jpj) ::   zub, zvb
[1605]85      !!---------------------------------------------------------------------- 
[6140]86      !
[1605]87      IF( Agrif_Root() )   RETURN
[6140]88      !
89      Agrif_SpecialValue    = 0._wp
[5656]90      Agrif_UseSpecialValue = ln_spc_dyn
[6140]91      !
[13216]92      use_sign_north = .TRUE.
93      sign_north = -1.
[6140]94      CALL Agrif_Bc_variable( un_interp_id, procname=interpun )
95      CALL Agrif_Bc_variable( vn_interp_id, procname=interpvn )
[13216]96      use_sign_north = .FALSE.
[6140]97      !
[5656]98      Agrif_UseSpecialValue = .FALSE.
[6140]99      !
[12377]100      ! --- West --- !
[13216]101      IF( lk_west ) THEN
102         ibdy1 = 2
103         ibdy2 = 1+nbghostcells 
104         !
105         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport
106            DO ji = mi0(ibdy1), mi1(ibdy2)
107               uu_b(ji,:,Krhs_a) = 0._wp
[782]108
[13216]109               DO jk = 1, jpkm1
110                  DO jj = 1, jpj
111                     uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk)
112                  END DO
113               END DO
114
[6140]115               DO jj = 1, jpj
[13216]116                  uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) * r1_hu(ji,jj,Krhs_a)
[5930]117               END DO
[636]118            END DO
[13216]119         ENDIF
120         !
[12377]121         DO ji = mi0(ibdy1), mi1(ibdy2)
[13216]122            zub(ji,:) = 0._wp    ! Correct transport
[9019]123            DO jk = 1, jpkm1
124               DO jj = 1, jpj
[13216]125                  zub(ji,jj) = zub(ji,jj) & 
126                     & + e3u(ji,jj,jk,Krhs_a)  * uu(ji,jj,jk,Krhs_a)*umask(ji,jj,jk)
[9019]127               END DO
[636]128            END DO
[13216]129            DO jj=1,jpj
130               zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a)
[636]131            END DO
[13216]132               
[6140]133            DO jk = 1, jpkm1
134               DO jj = 1, jpj
[13216]135                  uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) + uu_b(ji,jj,Krhs_a)-zub(ji,jj)) * umask(ji,jj,jk)
[5930]136               END DO
137            END DO
[12377]138         END DO
[13216]139               
140         IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate
141            DO ji = mi0(ibdy1), mi1(ibdy2)
142               zvb(ji,:) = 0._wp
143               DO jk = 1, jpkm1
144                  DO jj = 1, jpj
145                     zvb(ji,jj) = zvb(ji,jj) + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk)
146                  END DO
147               END DO
148               DO jj = 1, jpj
149                  zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a)
150               END DO
151               DO jk = 1, jpkm1
152                  DO jj = 1, jpj
153                     vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) + vv_b(ji,jj,Krhs_a)-zvb(ji,jj))*vmask(ji,jj,jk)
154                  END DO
155               END DO
156            END DO
157         ENDIF
[636]158      ENDIF
[390]159
[9019]160      ! --- East --- !
[13216]161      IF( lk_east) THEN
162         ibdy1 = jpiglo-1-nbghostcells
163         ibdy2 = jpiglo-2 
164         !
165         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport
166            DO ji = mi0(ibdy1), mi1(ibdy2)
167               uu_b(ji,:,Krhs_a) = 0._wp
168               DO jk = 1, jpkm1
169                  DO jj = 1, jpj
170                     uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) & 
171                         & + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk)
172                  END DO
173               END DO
[9057]174               DO jj = 1, jpj
[13216]175                  uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) * r1_hu(ji,jj,Krhs_a)
[5930]176               END DO
[636]177            END DO
[13216]178         ENDIF
179         !
[12377]180         DO ji = mi0(ibdy1), mi1(ibdy2)
[13216]181            zub(ji,:) = 0._wp    ! Correct transport
[6140]182            DO jk = 1, jpkm1
183               DO jj = 1, jpj
[13216]184                  zub(ji,jj) = zub(ji,jj) & 
185                     & + e3u(ji,jj,jk,Krhs_a)  * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk)
[5930]186               END DO
187            END DO
[13216]188            DO jj=1,jpj
189               zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a)
[4486]190            END DO
[13216]191               
[6140]192            DO jk = 1, jpkm1
193               DO jj = 1, jpj
[13216]194                  uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) & 
195                    & + uu_b(ji,jj,Krhs_a)-zub(ji,jj))*umask(ji,jj,jk)
[5930]196               END DO
197            END DO
[12377]198         END DO
[13216]199               
200         IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate
201            ibdy1 = jpiglo-nbghostcells
202            ibdy2 = jpiglo-1 
203            DO ji = mi0(ibdy1), mi1(ibdy2)
204               zvb(ji,:) = 0._wp
205               DO jk = 1, jpkm1
206                  DO jj = 1, jpj
207                     zvb(ji,jj) = zvb(ji,jj) &
208                        & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk)
209                  END DO
210               END DO
211               DO jj = 1, jpj
212                  zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a)
213               END DO
214               DO jk = 1, jpkm1
215                  DO jj = 1, jpj
216                     vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) & 
217                         & + vv_b(ji,jj,Krhs_a)-zvb(ji,jj)) * vmask(ji,jj,jk)
218                  END DO
219               END DO
220            END DO
221         ENDIF
[636]222      ENDIF
[390]223
[9019]224      ! --- South --- !
[13216]225      IF( lk_south ) THEN
226         jbdy1 = 2
227         jbdy2 = 1+nbghostcells 
228         !
229         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport
230            DO jj = mj0(jbdy1), mj1(jbdy2)
231               vv_b(:,jj,Krhs_a) = 0._wp
232               DO jk = 1, jpkm1
233                  DO ji = 1, jpi
234                     vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) & 
235                         & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk)
236                  END DO
237               END DO
238               DO ji=1,jpi
239                  vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) * r1_hv(ji,jj,Krhs_a)     
240               END DO
241            END DO
242         ENDIF
243         !
[12377]244         DO jj = mj0(jbdy1), mj1(jbdy2)
[13216]245            zvb(:,jj) = 0._wp    ! Correct transport
246            DO jk=1,jpkm1
247               DO ji=1,jpi
248                  zvb(ji,jj) = zvb(ji,jj) & 
249                     & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk)
[5930]250               END DO
[636]251            END DO
[13216]252            DO ji = 1, jpi
253               zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a)
[636]254            END DO
[9134]255
[6140]256            DO jk = 1, jpkm1
257               DO ji = 1, jpi
[13216]258                  vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) & 
259                    & + vv_b(ji,jj,Krhs_a) - zvb(ji,jj) ) * vmask(ji,jj,jk)
[5930]260               END DO
261            END DO
[13216]262         END DO
[9057]263               
[13216]264         IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate
265            DO jj = mj0(jbdy1), mj1(jbdy2)
266               zub(:,jj) = 0._wp
267               DO jk = 1, jpkm1
268                  DO ji = 1, jpi
269                     zub(ji,jj) = zub(ji,jj) & 
270                        & + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk)
271                  END DO
272               END DO
[6140]273               DO ji = 1, jpi
[13216]274                  zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a)
[5930]275               END DO
[13216]276                 
277               DO jk = 1, jpkm1
278                  DO ji = 1, jpi
279                     uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) & 
280                       & + uu_b(ji,jj,Krhs_a) - zub(ji,jj) ) * umask(ji,jj,jk)
281                  END DO
282               END DO
[9057]283            END DO
[13216]284         ENDIF
[636]285      ENDIF
[390]286
[9019]287      ! --- North --- !
[13216]288      IF( lk_north ) THEN
289         jbdy1 = jpjglo-1-nbghostcells
290         jbdy2 = jpjglo-2 
291         !
292         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport
293            DO jj = mj0(jbdy1), mj1(jbdy2)
294               vv_b(:,jj,Krhs_a) = 0._wp
295               DO jk = 1, jpkm1
296                  DO ji = 1, jpi
297                     vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) & 
298                         & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk)
299                  END DO
300               END DO
301               DO ji=1,jpi
302                  vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) * r1_hv(ji,jj,Krhs_a)
303               END DO
304            END DO
305         ENDIF
306         !
[12377]307         DO jj = mj0(jbdy1), mj1(jbdy2)
[13216]308            zvb(:,jj) = 0._wp    ! Correct transport
309            DO jk=1,jpkm1
310               DO ji=1,jpi
311                  zvb(ji,jj) = zvb(ji,jj) & 
312                     & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk)
[5930]313               END DO
[636]314            END DO
[13216]315            DO ji = 1, jpi
316               zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a)
[636]317            END DO
[9134]318
[9057]319            DO jk = 1, jpkm1
320               DO ji = 1, jpi
[13216]321                  vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) & 
322                    & + vv_b(ji,jj,Krhs_a) - zvb(ji,jj) ) * vmask(ji,jj,jk)
[9057]323               END DO
324            END DO
[13216]325         END DO
[9057]326               
[13216]327         IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate
328            jbdy1 = jpjglo-nbghostcells
329            jbdy2 = jpjglo-1
330            DO jj = mj0(jbdy1), mj1(jbdy2)
331               zub(:,jj) = 0._wp
332               DO jk = 1, jpkm1
333                  DO ji = 1, jpi
334                     zub(ji,jj) = zub(ji,jj) & 
335                        & + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk)
336                  END DO
337               END DO
[6140]338               DO ji = 1, jpi
[13216]339                  zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a)
[5930]340               END DO
[13216]341                 
342               DO jk = 1, jpkm1
343                  DO ji = 1, jpi
344                     uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) & 
345                       & + uu_b(ji,jj,Krhs_a) - zub(ji,jj) ) * umask(ji,jj,jk)
346                  END DO
347               END DO
[5930]348            END DO
[13216]349         ENDIF
[636]350      ENDIF
[2715]351      !
[636]352   END SUBROUTINE Agrif_dyn
[390]353
[6140]354
[4486]355   SUBROUTINE Agrif_dyn_ts( jn )
[4292]356      !!----------------------------------------------------------------------
357      !!                  ***  ROUTINE Agrif_dyn_ts  ***
358      !!---------------------------------------------------------------------- 
[4486]359      INTEGER, INTENT(in) ::   jn
[4292]360      !!
361      INTEGER :: ji, jj
[12377]362      INTEGER :: istart, iend, jstart, jend
[4486]363      !!---------------------------------------------------------------------- 
[6140]364      !
[4486]365      IF( Agrif_Root() )   RETURN
[9057]366      !
[12377]367      !--- West ---!
[13216]368      IF( lk_west ) THEN
369         istart = 2
370         iend   = nbghostcells+1
371         DO ji = mi0(istart), mi1(iend)
372            DO jj=1,jpj
373               va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
374               ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
375            END DO
[4486]376         END DO
[13216]377      ENDIF
[6140]378      !
[12377]379      !--- East ---!
[13216]380      IF( lk_east ) THEN
381         istart = jpiglo-nbghostcells
382         iend   = jpiglo-1
383         DO ji = mi0(istart), mi1(iend)
384
385            DO jj=1,jpj
386               va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
387            END DO
[4486]388         END DO
[13216]389         istart = jpiglo-nbghostcells-1
390         iend   = jpiglo-2
391         DO ji = mi0(istart), mi1(iend)
392            DO jj=1,jpj
393               ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
394            END DO
[12377]395         END DO
[13216]396      ENDIF 
[6140]397      !
[12377]398      !--- South ---!
[13216]399      IF( lk_south ) THEN
400         jstart = 2
401         jend   = nbghostcells+1
402         DO jj = mj0(jstart), mj1(jend)
403
404            DO ji=1,jpi
405               ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
406               va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
407            END DO
[4486]408         END DO
[13216]409      ENDIF       
[6140]410      !
[12377]411      !--- North ---!
[13216]412      IF( lk_north ) THEN
413         jstart = jpjglo-nbghostcells
414         jend   = jpjglo-1
415         DO jj = mj0(jstart), mj1(jend)
416            DO ji=1,jpi
417               ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
418            END DO
[4486]419         END DO
[13216]420         jstart = jpjglo-nbghostcells-1
421         jend   = jpjglo-2
422         DO jj = mj0(jstart), mj1(jend)
423            DO ji=1,jpi
424               va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
425            END DO
[12377]426         END DO
[13216]427      ENDIF 
[4486]428      !
429   END SUBROUTINE Agrif_dyn_ts
430
[12377]431   SUBROUTINE Agrif_dyn_ts_flux( jn, zu, zv )
432      !!----------------------------------------------------------------------
433      !!                  ***  ROUTINE Agrif_dyn_ts_flux  ***
434      !!---------------------------------------------------------------------- 
435      INTEGER, INTENT(in) ::   jn
436      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   zu, zv
437      !!
438      INTEGER :: ji, jj
439      INTEGER :: istart, iend, jstart, jend
440      !!---------------------------------------------------------------------- 
441      !
442      IF( Agrif_Root() )   RETURN
443      !
444      !--- West ---!
[13216]445      IF( lk_west ) THEN
446         istart = 2
447         iend   = nbghostcells+1
448         DO ji = mi0(istart), mi1(iend)
449            DO jj=1,jpj
450               zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
451               zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
452            END DO
[12377]453         END DO
[13216]454      ENDIF
[12377]455      !
456      !--- East ---!
[13216]457      IF( lk_east ) THEN
458         istart = jpiglo-nbghostcells
459         iend   = jpiglo-1
460         DO ji = mi0(istart), mi1(iend)
461            DO jj=1,jpj
462               zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
463            END DO
[12377]464         END DO
[13216]465         istart = jpiglo-nbghostcells-1
466         iend   = jpiglo-2
467         DO ji = mi0(istart), mi1(iend)
468            DO jj=1,jpj
469               zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
470            END DO
[12377]471         END DO
[13216]472      ENDIF
[12377]473      !
474      !--- South ---!
[13216]475      IF( lk_south ) THEN
476         jstart = 2
477         jend   = nbghostcells+1
478         DO jj = mj0(jstart), mj1(jend)
479            DO ji=1,jpi
480               zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
481               zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
482            END DO
[12377]483         END DO
[13216]484      ENDIF
[12377]485      !
486      !--- North ---!
[13216]487      IF( lk_north ) THEN
488         jstart = jpjglo-nbghostcells
489         jend   = jpjglo-1
490         DO jj = mj0(jstart), mj1(jend)
491            DO ji=1,jpi
492               zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
493            END DO
[12377]494         END DO
[13216]495         jstart = jpjglo-nbghostcells-1
496         jend   = jpjglo-2
497         DO jj = mj0(jstart), mj1(jend)
498            DO ji=1,jpi
499               zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
500            END DO
[12377]501         END DO
[13216]502      ENDIF
[12377]503      !
504   END SUBROUTINE Agrif_dyn_ts_flux
[6140]505
[4486]506   SUBROUTINE Agrif_dta_ts( kt )
507      !!----------------------------------------------------------------------
508      !!                  ***  ROUTINE Agrif_dta_ts  ***
509      !!---------------------------------------------------------------------- 
510      INTEGER, INTENT(in) ::   kt
511      !!
512      INTEGER :: ji, jj
513      LOGICAL :: ll_int_cons
[4292]514      !!---------------------------------------------------------------------- 
[6140]515      !
[4292]516      IF( Agrif_Root() )   RETURN
[6140]517      !
518      ll_int_cons = ln_bt_fw ! Assume conservative temporal integration in the forward case only
519      !
[9031]520      ! Enforce volume conservation if no time refinement: 
521      IF ( Agrif_rhot()==1 ) ll_int_cons=.TRUE. 
[6140]522      !
[4486]523      ! Interpolate barotropic fluxes
[12377]524      Agrif_SpecialValue = 0._wp
[4486]525      Agrif_UseSpecialValue = ln_spc_dyn
[13216]526
527      use_sign_north = .TRUE.
528      sign_north = -1.
529
[6140]530      !
[12377]531      ! Set bdy time interpolation stage to 0 (latter incremented locally do deal with corners)
532      utint_stage(:,:) = 0
533      vtint_stage(:,:) = 0
534      !
[6140]535      IF( ll_int_cons ) THEN  ! Conservative interpolation
[9019]536         ! order matters here !!!!!!
[6140]537         CALL Agrif_Bc_variable( ub2b_interp_id, calledweight=1._wp, procname=interpub2b ) ! Time integrated
[12377]538         CALL Agrif_Bc_variable( vb2b_interp_id, calledweight=1._wp, procname=interpvb2b ) 
539         !
[5656]540         bdy_tinterp = 1
[6140]541         CALL Agrif_Bc_variable( unb_id        , calledweight=1._wp, procname=interpunb  ) ! After
[12377]542         CALL Agrif_Bc_variable( vnb_id        , calledweight=1._wp, procname=interpvnb  ) 
543         !
[5656]544         bdy_tinterp = 2
[6140]545         CALL Agrif_Bc_variable( unb_id        , calledweight=0._wp, procname=interpunb  ) ! Before
[12377]546         CALL Agrif_Bc_variable( vnb_id        , calledweight=0._wp, procname=interpvnb  )   
[4486]547      ELSE ! Linear interpolation
[12377]548         !
549         ubdy(:,:) = 0._wp   ;   vbdy(:,:) = 0._wp 
[9031]550         CALL Agrif_Bc_variable( unb_id, procname=interpunb )
551         CALL Agrif_Bc_variable( vnb_id, procname=interpvnb )
[4486]552      ENDIF
553      Agrif_UseSpecialValue = .FALSE.
[13216]554      use_sign_north = .FALSE.
[5656]555      !
[4486]556   END SUBROUTINE Agrif_dta_ts
557
[6140]558
[2486]559   SUBROUTINE Agrif_ssh( kt )
560      !!----------------------------------------------------------------------
[9031]561      !!                  ***  ROUTINE Agrif_ssh  ***
[2486]562      !!---------------------------------------------------------------------- 
563      INTEGER, INTENT(in) ::   kt
[9019]564      !
[12377]565      INTEGER  :: ji, jj
566      INTEGER  :: istart, iend, jstart, jend
[2486]567      !!---------------------------------------------------------------------- 
[6140]568      !
[2486]569      IF( Agrif_Root() )   RETURN
[9031]570      !     
[9116]571      ! Linear time interpolation of sea level
[9031]572      !
573      Agrif_SpecialValue    = 0._wp
574      Agrif_UseSpecialValue = .TRUE.
575      CALL Agrif_Bc_variable(sshn_id, procname=interpsshn )
576      Agrif_UseSpecialValue = .FALSE.
577      !
[9116]578      ! --- West --- !
[13216]579      IF(lk_west) THEN
580         istart = 2
581         iend   = 1 + nbghostcells
582         DO ji = mi0(istart), mi1(iend)
583            DO jj = 1, jpj
584               ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
585            ENDDO
[9019]586         ENDDO
[13216]587      ENDIF
[6140]588      !
[9019]589      ! --- East --- !
[13216]590      IF(lk_east) THEN
591         istart = jpiglo - nbghostcells
592         iend   = jpiglo - 1
593         DO ji = mi0(istart), mi1(iend)
594            DO jj = 1, jpj
595               ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
596            ENDDO
[9019]597         ENDDO
[13216]598      ENDIF
[6140]599      !
[9019]600      ! --- South --- !
[13216]601      IF(lk_south) THEN
602         jstart = 2
603         jend   = 1 + nbghostcells
604         DO jj = mj0(jstart), mj1(jend)
605            DO ji = 1, jpi
606               ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
607            ENDDO
[9019]608         ENDDO
[13216]609      ENDIF
[6140]610      !
[9019]611      ! --- North --- !
[13216]612      IF(lk_north) THEN
613         jstart = jpjglo - nbghostcells
614         jend   = jpjglo - 1
615         DO jj = mj0(jstart), mj1(jend)
616            DO ji = 1, jpi
617               ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
618            ENDDO
[9019]619         ENDDO
[13216]620      ENDIF
[6140]621      !
[2486]622   END SUBROUTINE Agrif_ssh
623
[6140]624
[4486]625   SUBROUTINE Agrif_ssh_ts( jn )
[4292]626      !!----------------------------------------------------------------------
627      !!                  ***  ROUTINE Agrif_ssh_ts  ***
628      !!---------------------------------------------------------------------- 
[4486]629      INTEGER, INTENT(in) ::   jn
[4292]630      !!
[12377]631      INTEGER :: ji, jj
632      INTEGER  :: istart, iend, jstart, jend
[4292]633      !!---------------------------------------------------------------------- 
[9031]634      !
635      IF( Agrif_Root() )   RETURN
636      !
[9116]637      ! --- West --- !
[13216]638      IF(lk_west) THEN
639         istart = 2
640         iend   = 1+nbghostcells
641         DO ji = mi0(istart), mi1(iend)
642            DO jj = 1, jpj
643               ssha_e(ji,jj) = hbdy(ji,jj)
644            ENDDO
[9116]645         ENDDO
[13216]646      ENDIF
[6140]647      !
[9116]648      ! --- East --- !
[13216]649      IF(lk_east) THEN
650         istart = jpiglo - nbghostcells
651         iend   = jpiglo - 1
652         DO ji = mi0(istart), mi1(iend)
653            DO jj = 1, jpj
654               ssha_e(ji,jj) = hbdy(ji,jj)
655            ENDDO
[9116]656         ENDDO
[13216]657      ENDIF
[6140]658      !
[9116]659      ! --- South --- !
[13216]660      IF(lk_south) THEN
661         jstart = 2
662         jend   = 1+nbghostcells
663         DO jj = mj0(jstart), mj1(jend)
664            DO ji = 1, jpi
665               ssha_e(ji,jj) = hbdy(ji,jj)
666            ENDDO
[9116]667         ENDDO
[13216]668      ENDIF
[6140]669      !
[9116]670      ! --- North --- !
[13216]671      IF(lk_north) THEN
672         jstart = jpjglo - nbghostcells
673         jend   = jpjglo - 1
674         DO jj = mj0(jstart), mj1(jend)
675            DO ji = 1, jpi
676               ssha_e(ji,jj) = hbdy(ji,jj)
677            ENDDO
[9116]678         ENDDO
[13216]679      ENDIF
[6140]680      !
[4292]681   END SUBROUTINE Agrif_ssh_ts
682
[9019]683   SUBROUTINE Agrif_avm
[4292]684      !!----------------------------------------------------------------------
[9019]685      !!                  ***  ROUTINE Agrif_avm  ***
[5656]686      !!---------------------------------------------------------------------- 
687      REAL(wp) ::   zalpha
[6140]688      !!---------------------------------------------------------------------- 
[5656]689      !
[9031]690      IF( Agrif_Root() )   RETURN
[6140]691      !
[9031]692      zalpha = 1._wp ! JC: proper time interpolation impossible 
693                     ! => use last available value from parent
694      !
695      Agrif_SpecialValue    = 0.e0
[5656]696      Agrif_UseSpecialValue = .TRUE.
[6140]697      !
[9019]698      CALL Agrif_Bc_variable( avm_id, calledweight=zalpha, procname=interpavm )       
[6140]699      !
[5656]700      Agrif_UseSpecialValue = .FALSE.
701      !
[9019]702   END SUBROUTINE Agrif_avm
[6140]703   
[5656]704
[12377]705   SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before )
[6140]706      !!----------------------------------------------------------------------
[9019]707      !!                  *** ROUTINE interptsn ***
[6140]708      !!----------------------------------------------------------------------
709      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab
710      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2
711      LOGICAL                                     , INTENT(in   ) ::   before
[5656]712      !
[12377]713      INTEGER  ::   ji, jj, jk, jn  ! dummy loop indices
714      INTEGER  ::   N_in, N_out
[13216]715      INTEGER  :: item
[9031]716      ! vertical interpolation:
[12377]717      REAL(wp) :: zhtot
718      REAL(wp), DIMENSION(k1:k2,1:jpts) :: tabin
[13216]719      REAL(wp), DIMENSION(k1:k2) :: h_in, z_in
720      REAL(wp), DIMENSION(1:jpk) :: h_out, z_out
[12377]721      !!----------------------------------------------------------------------
[9031]722
[13216]723      IF( before ) THEN
724
725         item = Kmm_a
726         IF( l_ini_child )   Kmm_a = Kbb_a 
727
[9031]728         DO jn = 1,jpts
729            DO jk=k1,k2
730               DO jj=j1,j2
731                 DO ji=i1,i2
[12377]732                       ptab(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)
[9031]733                 END DO
734              END DO
735           END DO
[13216]736         END DO
[9031]737
[13216]738         IF( l_vremap .OR. l_ini_child) THEN
739            ! Interpolate thicknesses
740            ! Warning: these are masked, hence extrapolated prior interpolation.
741            DO jk=k1,k2
742               DO jj=j1,j2
743                  DO ji=i1,i2
744                      ptab(ji,jj,jk,jpts+1) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a)
[12377]745
[13216]746                  END DO
747               END DO
748            END DO
749
750            ! Extrapolate thicknesses in partial bottom cells:
751            ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on
752            IF (ln_zps) THEN
753               DO jj=j1,j2
754                  DO ji=i1,i2
755                      jk = mbkt(ji,jj)
756                      ptab(ji,jj,jk,jpts+1) = 0._wp
757                  END DO
758               END DO           
759            END IF
760       
761            ! Save ssh at last level:
762            IF (.NOT.ln_linssh) THEN
763               ptab(i1:i2,j1:j2,k2,jpts+1) = ssh(i1:i2,j1:j2,Kmm_a)*tmask(i1:i2,j1:j2,1) 
764            ELSE
765               ptab(i1:i2,j1:j2,k2,jpts+1) = 0._wp
766            END IF     
767         ENDIF
768         Kmm_a = item
769
[9031]770      ELSE
[13216]771         item = Krhs_a
772         IF( l_ini_child )   Krhs_a = Kbb_a 
[9031]773
[13216]774         IF( l_vremap .OR. l_ini_child ) THEN
775            IF (ln_linssh) ptab(i1:i2,j1:j2,k2,n2) = 0._wp 
776               
777            DO jj=j1,j2
778               DO ji=i1,i2
779                  ts(ji,jj,:,:,Krhs_a) = 0.                 
780               !   IF( l_ini_child) ts(ji,jj,:,:,Krhs_a) = ptab(ji,jj,:,1:jpts)
781                  N_in = mbkt_parent(ji,jj)
782                  zhtot = 0._wp
783                  DO jk=1,N_in !k2 = jpk of parent grid
784                     IF (jk==N_in) THEN
785                        h_in(jk) = ht0_parent(ji,jj) + ptab(ji,jj,k2,n2) - zhtot
786                     ELSE
787                        h_in(jk) = ptab(ji,jj,jk,n2)
788                     ENDIF
789                     zhtot = zhtot + h_in(jk)
790                     tabin(jk,:) = ptab(ji,jj,jk,n1:n2-1)
791                  END DO
792                  z_in(1) = 0.5_wp * h_in(1) - zhtot + ht0_parent(ji,jj)
793                  DO jk=2,N_in
794                     z_in(jk) = z_in(jk-1) + 0.5_wp * h_in(jk)
795                  ENDDO
796
797                  N_out = 0
798                  DO jk=1,jpk ! jpk of child grid
799                     IF (tmask(ji,jj,jk) == 0._wp) EXIT
800                     N_out = N_out + 1
801                     h_out(jk) = e3t(ji,jj,jk,Krhs_a)
802                  ENDDO
803
804                  z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + ht_0(ji,jj)
805                  DO jk=2,N_out
806                     z_out(jk) = z_out(jk-1) + 0.5_wp * h_out(jk)
807                  ENDDO
808
809                  IF (N_in*N_out > 0) THEN
810                     IF( l_ini_child ) THEN
811                        CALL remap_linear(tabin(1:N_in,1:jpts),z_in(1:N_in),ts(ji,jj,1:N_out,1:jpts,Krhs_a),          &
812                                      &   z_out(1:N_out),N_in,N_out,jpts) 
813                     ELSE
814                        CALL reconstructandremap(tabin(1:N_in,1:jpts),h_in(1:N_in),ts(ji,jj,1:N_out,1:jpts,Krhs_a),   &
815                                      &   h_out(1:N_out),N_in,N_out,jpts) 
816                     ENDIF
[12377]817                  ENDIF
[9031]818               ENDDO
819            ENDDO
[13216]820            Krhs_a = item
821 
822         ELSE
823         
824            DO jn=1, jpts
825                ts(i1:i2,j1:j2,1:jpk,jn,Krhs_a)=ptab(i1:i2,j1:j2,1:jpk,jn)*tmask(i1:i2,j1:j2,1:jpk) 
826            END DO
827         ENDIF
[9116]828
[5656]829      ENDIF
830      !
831   END SUBROUTINE interptsn
832
[12377]833   SUBROUTINE interpsshn( ptab, i1, i2, j1, j2, before )
[5656]834      !!----------------------------------------------------------------------
[4292]835      !!                  ***  ROUTINE interpsshn  ***
836      !!---------------------------------------------------------------------- 
[6140]837      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
838      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
839      LOGICAL                         , INTENT(in   ) ::   before
840      !
[5656]841      !!---------------------------------------------------------------------- 
842      !
843      IF( before) THEN
[12377]844         ptab(i1:i2,j1:j2) = ssh(i1:i2,j1:j2,Kmm_a)
[5656]845      ELSE
[12377]846         hbdy(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) * tmask(i1:i2,j1:j2,1)
[5656]847      ENDIF
848      !
849   END SUBROUTINE interpsshn
850
[12377]851   SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before )
[6140]852      !!----------------------------------------------------------------------
[9019]853      !!                  *** ROUTINE interpun ***
[9031]854      !!---------------------------------------------   
855      !!
856      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2
857      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: ptab
858      LOGICAL, INTENT(in) :: before
859      !!
860      INTEGER :: ji,jj,jk
[12377]861      REAL(wp) :: zrhoy, zhtot
[9031]862      ! vertical interpolation:
[13216]863      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in, z_in
864      REAL(wp), DIMENSION(1:jpk) :: h_out, z_out
865      INTEGER  :: N_in, N_out,item
[9031]866      REAL(wp) :: h_diff
867      !!---------------------------------------------   
[5656]868      !
[9031]869      IF (before) THEN
[13216]870
871         item = Kmm_a
872         IF( l_ini_child )   Kmm_a = Kbb_a     
873
[9031]874         DO jk=1,jpk
875            DO jj=j1,j2
876               DO ji=i1,i2
[12377]877                  ptab(ji,jj,jk,1) = (e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) * uu(ji,jj,jk,Kmm_a)*umask(ji,jj,jk)) 
[13216]878                  IF( l_vremap .OR. l_ini_child) THEN
879                     ! Interpolate thicknesses (masked for subsequent extrapolation)
880                     ptab(ji,jj,jk,2) = umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a)
881                  ENDIF
[9031]882               END DO
883            END DO
[5656]884         END DO
[13216]885
886        IF( l_vremap .OR. l_ini_child) THEN
[12377]887         ! Extrapolate thicknesses in partial bottom cells:
888         ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on
[13216]889            IF (ln_zps) THEN
890               DO jj=j1,j2
891                  DO ji=i1,i2
892                     jk = mbku(ji,jj)
893                     ptab(ji,jj,jk,2) = 0._wp
894                  END DO
895               END DO           
896            END IF
897
898           ! Save ssh at last level:
899           ptab(i1:i2,j1:j2,k2,2) = 0._wp
900           IF (.NOT.ln_linssh) THEN
901              ! This vertical sum below should be replaced by the sea-level at U-points (optimization):
902              DO jk=1,jpk
903                 ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) + e3u(i1:i2,j1:j2,jk,Kmm_a) * umask(i1:i2,j1:j2,jk)
904              END DO
905              ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) - hu_0(i1:i2,j1:j2)
906           END IF
907        ENDIF
908
909         Kmm_a = item
[12377]910         !
[5656]911      ELSE
[9031]912         zrhoy = Agrif_rhoy()
[13216]913
914        IF( l_vremap .OR. l_ini_child) THEN
[9031]915! VERTICAL REFINEMENT BEGIN
916
[13216]917            IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp 
[12377]918
[13216]919            DO ji=i1,i2
920               DO jj=j1,j2
921                  uu(ji,jj,:,Krhs_a) = 0._wp
922                  N_in = mbku_parent(ji,jj)
923                  zhtot = 0._wp
924                  DO jk=1,N_in
925                     IF (jk==N_in) THEN
926                        h_in(jk) = hu0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot
927                     ELSE
928                        h_in(jk) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy) 
929                     ENDIF
930                     zhtot = zhtot + h_in(jk)
931                     IF( h_in(jk) .GT. 0. ) THEN
932                     tabin(jk) = ptab(ji,jj,jk,1)/(e2u(ji,jj)*zrhoy*h_in(jk))
933                     ELSE
934                     tabin(jk) = 0.
935                     ENDIF
936                 ENDDO
937                 z_in(1) = 0.5_wp * h_in(1) - zhtot + hu0_parent(ji,jj) 
938                 DO jk=2,N_in
939                    z_in(jk) = z_in(jk-1) + 0.5_wp * h_in(jk)
940                 ENDDO
941                     
942                 N_out = 0
943                 DO jk=1,jpk
944                    IF (umask(ji,jj,jk) == 0) EXIT
945                    N_out = N_out + 1
946                    h_out(N_out) = e3u(ji,jj,jk,Krhs_a)
947                 ENDDO
948
949                 z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + hu_0(ji,jj)
950                 DO jk=2,N_out
951                    z_out(jk) = z_out(jk-1) + 0.5_wp * h_out(jk) 
952                 ENDDO 
953
954                 IF (N_in*N_out > 0) THEN
955                     IF( l_ini_child ) THEN
956                        CALL remap_linear       (tabin(1:N_in),z_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),z_out(1:N_out),N_in,N_out,1)
957                     ELSE
958                        CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),h_out(1:N_out),N_in,N_out,1)
959                     ENDIF   
960                 ENDIF
961               ENDDO
[9031]962            ENDDO
[13216]963         ELSE
964            DO jk = 1, jpkm1
965               DO jj=j1,j2
966                  uu(i1:i2,jj,jk,Krhs_a) = ptab(i1:i2,jj,jk,1) / ( zrhoy * e2u(i1:i2,jj) * e3u(i1:i2,jj,jk,Krhs_a) )
967               END DO
[5656]968            END DO
[13216]969         ENDIF
[9031]970
[5656]971      ENDIF
972      !
973   END SUBROUTINE interpun
974
[12377]975   SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before )
[6140]976      !!----------------------------------------------------------------------
[9019]977      !!                  *** ROUTINE interpvn ***
[6140]978      !!----------------------------------------------------------------------
[5656]979      !
[9031]980      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2
981      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: ptab
982      LOGICAL, INTENT(in) :: before
983      !
984      INTEGER :: ji,jj,jk
985      REAL(wp) :: zrhox
986      ! vertical interpolation:
[13216]987      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in, z_in
988      REAL(wp), DIMENSION(1:jpk) :: h_out, z_out
989      INTEGER  :: N_in, N_out, item
[12377]990      REAL(wp) :: h_diff, zhtot
[9031]991      !!---------------------------------------------   
[5656]992      !     
[13216]993      IF (before) THEN   
994
995         item = Kmm_a
996         IF( l_ini_child )   Kmm_a = Kbb_a     
997       
[9031]998         DO jk=k1,k2
999            DO jj=j1,j2
1000               DO ji=i1,i2
[12377]1001                  ptab(ji,jj,jk,1) = (e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vv(ji,jj,jk,Kmm_a)*vmask(ji,jj,jk))
[13216]1002                  IF( l_vremap .OR. l_ini_child) THEN
1003                     ! Interpolate thicknesses (masked for subsequent extrapolation)
1004                     ptab(ji,jj,jk,2) = vmask(ji,jj,jk) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a)
1005                  ENDIF
[9031]1006               END DO
1007            END DO
[5656]1008         END DO
[13216]1009
1010         IF( l_vremap .OR. l_ini_child) THEN
[12377]1011         ! Extrapolate thicknesses in partial bottom cells:
1012         ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on
[13216]1013            IF (ln_zps) THEN
1014               DO jj=j1,j2
1015                  DO ji=i1,i2
1016                     jk = mbkv(ji,jj)
1017                     ptab(ji,jj,jk,2) = 0._wp
1018                  END DO
1019               END DO           
1020            END IF
1021            ! Save ssh at last level:
1022            ptab(i1:i2,j1:j2,k2,2) = 0._wp
1023            IF (.NOT.ln_linssh) THEN
1024               ! This vertical sum below should be replaced by the sea-level at V-points (optimization):
1025               DO jk=1,jpk
1026                  ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) + e3v(i1:i2,j1:j2,jk,Kmm_a) * vmask(i1:i2,j1:j2,jk)
[12377]1027               END DO
[13216]1028               ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) - hv_0(i1:i2,j1:j2)
1029            END IF
1030         ENDIF
1031         item = Kmm_a
1032
[9031]1033      ELSE       
1034         zrhox = Agrif_rhox()
1035
[13216]1036         IF( l_vremap .OR. l_ini_child ) THEN
[9031]1037
[13216]1038            IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp 
1039
1040            DO jj=j1,j2
1041               DO ji=i1,i2
1042                  vv(ji,jj,:,Krhs_a) = 0._wp
1043                  N_in = mbkv_parent(ji,jj)
1044                  zhtot = 0._wp
1045                  DO jk=1,N_in
1046                     IF (jk==N_in) THEN
1047                        h_in(jk) = hv0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot
1048                     ELSE
1049                        h_in(jk) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox) 
1050                     ENDIF
1051                     zhtot = zhtot + h_in(jk)
1052                     IF( h_in(jk) .GT. 0. ) THEN
1053                       tabin(jk) = ptab(ji,jj,jk,1)/(e1v(ji,jj)*zrhox*h_in(jk))
1054                     ELSE
1055                       tabin(jk)  = 0.
1056                     ENDIF
1057                  ENDDO
1058
1059                  z_in(1) = 0.5_wp * h_in(1) - zhtot + hv0_parent(ji,jj)
1060                  DO jk=2,N_in
1061                     z_in(jk) = z_in(jk-1) + 0.5_wp * h_in(jk)
1062                  ENDDO
1063
1064                  N_out = 0
1065                  DO jk=1,jpk
1066                     IF (vmask(ji,jj,jk) == 0) EXIT
1067                     N_out = N_out + 1
1068                     h_out(N_out) = e3v(ji,jj,jk,Krhs_a)
1069                  ENDDO
1070
1071                  z_out(1) = 0.5_wp * h_out(1) - SUM(h_out(1:N_out)) + hv_0(ji,jj)
1072                  DO jk=2,N_out
1073                     z_out(jk) = z_out(jk-1) + 0.5_wp * h_out(jk)
1074                  ENDDO
1075 
1076                  IF (N_in*N_out > 0) THEN
1077                     IF( l_ini_child ) THEN
1078                        CALL remap_linear       (tabin(1:N_in),z_in(1:N_in),vv(ji,jj,1:N_out,Krhs_a),z_out(1:N_out),N_in,N_out,1)
1079                     ELSE
1080                        CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),vv(ji,jj,1:N_out,Krhs_a),h_out(1:N_out),N_in,N_out,1)
1081                     ENDIF   
[12377]1082                  ENDIF
[9031]1083               END DO
1084            END DO
[13216]1085         ELSE
1086            DO jk = 1, jpkm1
1087               vv(i1:i2,j1:j2,jk,Krhs_a) = ptab(i1:i2,j1:j2,jk,1) / ( zrhox * e1v(i1:i2,j1:j2) * e3v(i1:i2,j1:j2,jk,Krhs_a) )
1088            END DO
1089         ENDIF
[5656]1090      ENDIF
1091      !       
1092   END SUBROUTINE interpvn
[636]1093
[12377]1094   SUBROUTINE interpunb( ptab, i1, i2, j1, j2, before)
[1605]1095      !!----------------------------------------------------------------------
[5656]1096      !!                  ***  ROUTINE interpunb  ***
[1605]1097      !!---------------------------------------------------------------------- 
[6140]1098      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1099      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1100      LOGICAL                         , INTENT(in   ) ::   before
1101      !
1102      INTEGER  ::   ji, jj
1103      REAL(wp) ::   zrhoy, zrhot, zt0, zt1, ztcoeff
[1605]1104      !!---------------------------------------------------------------------- 
[5656]1105      !
[6140]1106      IF( before ) THEN
[12377]1107         ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * hu(i1:i2,j1:j2,Kmm_a) * uu_b(i1:i2,j1:j2,Kmm_a)
[5656]1108      ELSE
1109         zrhoy = Agrif_Rhoy()
1110         zrhot = Agrif_rhot()
1111         ! Time indexes bounds for integration
1112         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot
1113         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot     
[12377]1114         !
1115         DO ji = i1, i2
1116            DO jj = j1, j2
1117               IF ( utint_stage(ji,jj) < (bdy_tinterp + 1) ) THEN
1118                  IF    ( utint_stage(ji,jj) == 1  ) THEN
1119                     ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        &
1120                        &               - zt0**2._wp * (       zt0 - 1._wp)        )
1121                  ELSEIF( utint_stage(ji,jj) == 2  ) THEN
1122                     ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp &
1123                        &               - zt0        * (       zt0 - 1._wp)**2._wp )
1124                  ELSEIF( utint_stage(ji,jj) == 0  ) THEN               
1125                     ztcoeff = 1._wp
1126                  ELSE
1127                     ztcoeff = 0._wp
1128                  ENDIF
1129                  !   
1130                  ubdy(ji,jj) = ubdy(ji,jj) + ztcoeff * ptab(ji,jj)
1131                  !           
1132                  IF (( utint_stage(ji,jj) == 2 ).OR.( utint_stage(ji,jj) == 0 )) THEN
1133                     ubdy(ji,jj) = ubdy(ji,jj) / (zrhoy*e2u(ji,jj)) * umask(ji,jj,1)
1134                  ENDIF
1135                  !
1136                  utint_stage(ji,jj) = utint_stage(ji,jj) + 1
1137               ENDIF
1138            END DO
1139         END DO
1140      END IF
[5656]1141      !
1142   END SUBROUTINE interpunb
[636]1143
[6140]1144
[12377]1145   SUBROUTINE interpvnb( ptab, i1, i2, j1, j2, before )
[1605]1146      !!----------------------------------------------------------------------
[5656]1147      !!                  ***  ROUTINE interpvnb  ***
[1605]1148      !!---------------------------------------------------------------------- 
[6140]1149      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1150      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1151      LOGICAL                         , INTENT(in   ) ::   before
1152      !
[12377]1153      INTEGER  ::   ji, jj
[6140]1154      REAL(wp) ::   zrhox, zrhot, zt0, zt1, ztcoeff   
[1605]1155      !!---------------------------------------------------------------------- 
[5656]1156      !
[6140]1157      IF( before ) THEN
[12377]1158         ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * hv(i1:i2,j1:j2,Kmm_a) * vv_b(i1:i2,j1:j2,Kmm_a)
[5656]1159      ELSE
1160         zrhox = Agrif_Rhox()
1161         zrhot = Agrif_rhot()
1162         ! Time indexes bounds for integration
1163         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot
[12377]1164         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 
1165         !     
1166         DO ji = i1, i2
1167            DO jj = j1, j2
1168               IF ( vtint_stage(ji,jj) < (bdy_tinterp + 1) ) THEN
1169                  IF    ( vtint_stage(ji,jj) == 1  ) THEN
1170                     ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        &
1171                        &               - zt0**2._wp * (       zt0 - 1._wp)        )
1172                  ELSEIF( vtint_stage(ji,jj) == 2  ) THEN
1173                     ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp &
1174                        &               - zt0        * (       zt0 - 1._wp)**2._wp )
1175                  ELSEIF( vtint_stage(ji,jj) == 0  ) THEN               
1176                     ztcoeff = 1._wp
1177                  ELSE
1178                     ztcoeff = 0._wp
1179                  ENDIF
1180                  !   
1181                  vbdy(ji,jj) = vbdy(ji,jj) + ztcoeff * ptab(ji,jj)
1182                  !           
1183                  IF (( vtint_stage(ji,jj) == 2 ).OR.( vtint_stage(ji,jj) == 0 )) THEN
1184                     vbdy(ji,jj) = vbdy(ji,jj) / (zrhox*e1v(ji,jj)) * vmask(ji,jj,1)
1185                  ENDIF
1186                  !
1187                  vtint_stage(ji,jj) = vtint_stage(ji,jj) + 1
1188               ENDIF
1189            END DO
1190         END DO         
[5656]1191      ENDIF
1192      !
1193   END SUBROUTINE interpvnb
[390]1194
[6140]1195
[12377]1196   SUBROUTINE interpub2b( ptab, i1, i2, j1, j2, before )
[1605]1197      !!----------------------------------------------------------------------
[5656]1198      !!                  ***  ROUTINE interpub2b  ***
[1605]1199      !!---------------------------------------------------------------------- 
[6140]1200      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1201      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1202      LOGICAL                         , INTENT(in   ) ::   before
1203      !
1204      INTEGER  ::   ji,jj
[12377]1205      REAL(wp) ::   zrhot, zt0, zt1, zat
[1605]1206      !!---------------------------------------------------------------------- 
[5656]1207      IF( before ) THEN
[9031]1208         IF ( ln_bt_fw ) THEN
1209            ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * ub2_b(i1:i2,j1:j2)
1210         ELSE
1211            ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * un_adv(i1:i2,j1:j2)
1212         ENDIF
[5656]1213      ELSE
1214         zrhot = Agrif_rhot()
1215         ! Time indexes bounds for integration
1216         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot
1217         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot
1218         ! Polynomial interpolation coefficients:
[6140]1219         zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    &
1220            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    ) 
[12377]1221         !
1222         ubdy(i1:i2,j1:j2) = zat * ptab(i1:i2,j1:j2) 
1223         !
1224         ! Update interpolation stage:
1225         utint_stage(i1:i2,j1:j2) = 1
[5656]1226      ENDIF
1227      !
1228   END SUBROUTINE interpub2b
[6140]1229   
[636]1230
[12377]1231   SUBROUTINE interpvb2b( ptab, i1, i2, j1, j2, before )
[4292]1232      !!----------------------------------------------------------------------
[5656]1233      !!                  ***  ROUTINE interpvb2b  ***
[4292]1234      !!---------------------------------------------------------------------- 
[6140]1235      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1236      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1237      LOGICAL                         , INTENT(in   ) ::   before
1238      !
1239      INTEGER ::   ji,jj
[12377]1240      REAL(wp) ::   zrhot, zt0, zt1, zat
[4292]1241      !!---------------------------------------------------------------------- 
[5656]1242      !
1243      IF( before ) THEN
[9031]1244         IF ( ln_bt_fw ) THEN
1245            ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vb2_b(i1:i2,j1:j2)
1246         ELSE
1247            ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vn_adv(i1:i2,j1:j2)
1248         ENDIF
[5656]1249      ELSE     
1250         zrhot = Agrif_rhot()
1251         ! Time indexes bounds for integration
1252         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot
1253         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot
1254         ! Polynomial interpolation coefficients:
[6140]1255         zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    &
1256            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    ) 
[5656]1257         !
[12377]1258         vbdy(i1:i2,j1:j2) = zat * ptab(i1:i2,j1:j2)
1259         !
1260         ! update interpolation stage:
1261         vtint_stage(i1:i2,j1:j2) = 1
[5656]1262      ENDIF
1263      !     
1264   END SUBROUTINE interpvb2b
[4292]1265
[6140]1266
[12377]1267   SUBROUTINE interpe3t( ptab, i1, i2, j1, j2, k1, k2, before )
[5656]1268      !!----------------------------------------------------------------------
1269      !!                  ***  ROUTINE interpe3t  ***
1270      !!---------------------------------------------------------------------- 
[6140]1271      INTEGER                              , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
[5656]1272      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab
[6140]1273      LOGICAL                              , INTENT(in   ) :: before
[5656]1274      !
1275      INTEGER :: ji, jj, jk
1276      !!---------------------------------------------------------------------- 
1277      !   
[6140]1278      IF( before ) THEN
1279         ptab(i1:i2,j1:j2,k1:k2) = tmask(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2)
[5656]1280      ELSE
[9019]1281         !
[6140]1282         DO jk = k1, k2
1283            DO jj = j1, j2
1284               DO ji = i1, i2
[9019]1285                  IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) ) > 1.D-2) THEN
[12377]1286                     WRITE(numout,*) ' Agrif error for e3t_0: parent , child, i, j, k ',  & 
1287                     &                 ptab(ji,jj,jk), tmask(ji,jj,jk) * e3t_0(ji,jj,jk), &
1288                     &                 ji+nimpp-1, jj+njmpp-1, jk
1289                     kindic_agr = kindic_agr + 1
[5656]1290                  ENDIF
1291               END DO
1292            END DO
1293         END DO
[6140]1294         !
[5656]1295      ENDIF
1296      !
1297   END SUBROUTINE interpe3t
1298
[9031]1299   SUBROUTINE interpavm( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before )
[4486]1300      !!----------------------------------------------------------------------
[5656]1301      !!                  ***  ROUTINE interavm  ***
[4486]1302      !!---------------------------------------------------------------------- 
[9116]1303      INTEGER                                    , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, m1, m2
[9031]1304      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) ::   ptab
[9116]1305      LOGICAL                                    , INTENT(in   ) ::   before
[12377]1306      !
1307      INTEGER  :: ji, jj, jk
1308      INTEGER  :: N_in, N_out
1309      REAL(wp), DIMENSION(k1:k2) :: tabin, z_in
1310      REAL(wp), DIMENSION(1:jpk) :: z_out
[4486]1311      !!---------------------------------------------------------------------- 
[5656]1312      !     
[9031]1313      IF (before) THEN         
1314         DO jk=k1,k2
1315            DO jj=j1,j2
1316              DO ji=i1,i2
1317                    ptab(ji,jj,jk,1) = avm_k(ji,jj,jk)
1318              END DO
1319           END DO
[13216]1320         END DO
[12377]1321
[13216]1322         IF( l_vremap ) THEN
1323            ! Interpolate thicknesses
1324            ! Warning: these are masked, hence extrapolated prior interpolation.
1325            DO jk=k1,k2
1326               DO jj=j1,j2
1327                  DO ji=i1,i2
1328                      ptab(ji,jj,jk,2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a)
1329                  END DO
1330               END DO
1331            END DO
[12377]1332
[13216]1333            ! Extrapolate thicknesses in partial bottom cells:
1334            ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on
1335            IF (ln_zps) THEN
1336               DO jj=j1,j2
1337                  DO ji=i1,i2
1338                      jk = mbkt(ji,jj)
1339                      ptab(ji,jj,jk,2) = 0._wp
1340                  END DO
1341               END DO           
1342            END IF
1343       
1344           ! Save ssh at last level:
1345            IF (.NOT.ln_linssh) THEN
1346               ptab(i1:i2,j1:j2,k2,2) = ssh(i1:i2,j1:j2,Kmm_a)*tmask(i1:i2,j1:j2,1) 
1347            ELSE
1348               ptab(i1:i2,j1:j2,k2,2) = 0._wp
1349            END IF     
1350          ENDIF
1351
[9031]1352      ELSE
[13216]1353
1354         IF( l_vremap ) THEN
1355            IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp 
1356            avm_k(i1:i2,j1:j2,k1:k2) = 0._wp
1357               
1358            DO jj = j1, j2
1359               DO ji =i1, i2
1360                  N_in = mbkt_parent(ji,jj)
1361                  IF ( tmask(ji,jj,1) == 0._wp) N_in = 0
1362                  z_in(N_in+1) = ht0_parent(ji,jj) + ptab(ji,jj,k2,2)
1363                  DO jk = N_in, 1, -1  ! Parent vertical grid               
1364                        z_in(jk) = z_in(jk+1) - ptab(ji,jj,jk,2)
1365                       tabin(jk) = ptab(ji,jj,jk,1)
1366                  END DO
1367                  N_out = mbkt(ji,jj) 
1368                  DO jk = 1, N_out        ! Child vertical grid
1369                     z_out(jk) = gdepw(ji,jj,jk,Kmm_a)
1370                  ENDDO
1371                  IF (N_in*N_out > 0) THEN
1372                     CALL remap_linear(tabin(1:N_in),z_in(1:N_in),avm_k(ji,jj,1:N_out),z_out(1:N_out),N_in,N_out,1)
1373                  ENDIF
[9031]1374               ENDDO
1375            ENDDO
[13216]1376         ELSE
1377            avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2,1)
1378         ENDIF
[5656]1379      ENDIF
1380      !
1381   END SUBROUTINE interpavm
[4486]1382
[12377]1383   SUBROUTINE interpmbkt( ptab, i1, i2, j1, j2, before )
1384      !!----------------------------------------------------------------------
1385      !!                  ***  ROUTINE interpsshn  ***
1386      !!---------------------------------------------------------------------- 
1387      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1388      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1389      LOGICAL                         , INTENT(in   ) ::   before
1390      !
1391      !!---------------------------------------------------------------------- 
1392      !
1393      IF( before) THEN
1394         ptab(i1:i2,j1:j2) = REAL(mbkt(i1:i2,j1:j2),wp)
1395      ELSE
1396         mbkt_parent(i1:i2,j1:j2) = NINT(ptab(i1:i2,j1:j2))
1397      ENDIF
1398      !
1399   END SUBROUTINE interpmbkt
1400
1401   SUBROUTINE interpht0( ptab, i1, i2, j1, j2, before )
1402      !!----------------------------------------------------------------------
1403      !!                  ***  ROUTINE interpsshn  ***
1404      !!---------------------------------------------------------------------- 
1405      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1406      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1407      LOGICAL                         , INTENT(in   ) ::   before
1408      !
1409      !!---------------------------------------------------------------------- 
1410      !
1411      IF( before) THEN
1412         ptab(i1:i2,j1:j2) = ht_0(i1:i2,j1:j2)
1413      ELSE
1414         ht0_parent(i1:i2,j1:j2) = ptab(i1:i2,j1:j2)
1415      ENDIF
1416      !
1417   END SUBROUTINE interpht0
1418
[13216]1419   SUBROUTINE agrif_initts(tabres,i1,i2,j1,j2,k1,k2,m1,m2,before)
1420       INTEGER :: i1, i2, j1, j2, k1, k2, m1, m2
1421       REAL(wp):: tabres(i1:i2,j1:j2,k1:k2,m1:m2)
1422       LOGICAL :: before
1423
1424       INTEGER :: jm
1425
1426       IF (before) THEN
1427         DO jm=1,jpts
1428             tabres(i1:i2,j1:j2,k1:k2,jm) = ts(i1:i2,j1:j2,k1:k2,jm,Kbb_a)
1429         END DO
1430       ELSE
1431         DO jm=1,jpts
1432             ts(i1:i2,j1:j2,k1:k2,jm,Kbb_a)=tabres(i1:i2,j1:j2,k1:k2,jm)
1433         END DO
1434       ENDIF
1435   END SUBROUTINE agrif_initts 
1436
1437   SUBROUTINE agrif_initssh( ptab, i1, i2, j1, j2, before )
1438      !!----------------------------------------------------------------------
1439      !!                  ***  ROUTINE interpsshn  ***
1440      !!---------------------------------------------------------------------- 
1441      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
1442      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab
1443      LOGICAL                         , INTENT(in   ) ::   before
1444      !
1445      !!---------------------------------------------------------------------- 
1446      !
1447      IF( before) THEN
1448         ptab(i1:i2,j1:j2) = ssh(i1:i2,j1:j2,Kbb_a)
1449      ELSE
1450         ssh(i1:i2,j1:j2,Kbb_a) = ptab(i1:i2,j1:j2)*tmask(i1:i2,j1:j2,1)
1451      ENDIF
1452      !
1453   END SUBROUTINE agrif_initssh
1454   
[390]1455#else
[1605]1456   !!----------------------------------------------------------------------
1457   !!   Empty module                                          no AGRIF zoom
1458   !!----------------------------------------------------------------------
[636]1459CONTAINS
[9570]1460   SUBROUTINE Agrif_OCE_Interp_empty
1461      WRITE(*,*)  'agrif_oce_interp : You should not have seen this print! error?'
1462   END SUBROUTINE Agrif_OCE_Interp_empty
[390]1463#endif
[1605]1464
1465   !!======================================================================
[9570]1466END MODULE agrif_oce_interp
Note: See TracBrowser for help on using the repository browser.