source: NEMO/branches/2020/dev_r12973_AGRIF_CMEMS/src/NST/agrif_user.F90 @ 13162

Last change on this file since 13162 was 13162, checked in by rblod, 3 months ago

#2129 : suppress ln_bry_south

  • Property svn:keywords set to Id
File size: 50.5 KB
Line 
1#undef UPD_HIGH   /* MIX HIGH UPDATE */
2#if defined key_agrif
3   !! * Substitutions
4#  include "do_loop_substitute.h90"
5   !!----------------------------------------------------------------------
6   !! NEMO/NST 4.0 , NEMO Consortium (2018)
7   !! $Id$
8   !! Software governed by the CeCILL license (see ./LICENSE)
9   !!----------------------------------------------------------------------
10   SUBROUTINE agrif_user
11   END SUBROUTINE agrif_user
12
13   SUBROUTINE agrif_before_regridding
14   END SUBROUTINE agrif_before_regridding
15
16   SUBROUTINE Agrif_InitWorkspace
17   END SUBROUTINE Agrif_InitWorkspace
18
19   SUBROUTINE Agrif_InitValues
20      !!----------------------------------------------------------------------
21      !!                 *** ROUTINE Agrif_InitValues ***
22      !!----------------------------------------------------------------------
23      USE nemogcm
24      !!----------------------------------------------------------------------
25      !
26      CALL nemo_init       !* Initializations of each fine grid
27      Kbb_a = Nbb; Kmm_a = Nnn; Krhs_a = Nrhs   ! agrif_oce module copies of time level indices
28      !
29      !                    !* Agrif initialization
30      CALL Agrif_InitValues_cont
31# if defined key_top
32      CALL Agrif_InitValues_cont_top
33# endif
34# if defined key_si3
35      CALL Agrif_InitValues_cont_ice
36# endif
37      !   
38   END SUBROUTINE Agrif_initvalues
39
40   SUBROUTINE agrif_istate( Kbb, Kmm, Kaa )
41
42       USE domvvl
43       USE domain
44       USE par_oce
45       USE agrif_oce
46       USE agrif_oce_interp
47       USE oce
48       USE lib_mpp
49       USe lbclnk
50
51      INTEGER, INTENT(in)  :: Kbb, Kmm, Kaa
52      INTEGER :: jn
53
54      IF(lwp) WRITE(numout,*) ' '
55      IF(lwp) WRITE(numout,*) 'AGRIF: interp child initial state from parent'
56      IF(lwp) WRITE(numout,*) ' '
57
58      l_ini_child = .TRUE.
59      Agrif_SpecialValue    = 0._wp
60      Agrif_UseSpecialValue = .TRUE.
61      uu(:,:,:,:) = 0.  ;  vv(:,:,:,:) = 0.   ;  ts(:,:,:,:,:) = 0.
62       
63      Krhs_a = Kbb ; Kmm_a = Kbb
64
65      ! Brutal fix to pas 1x1 refinment.
66  !    IF(Agrif_Irhox() == 1) THEN
67  !       CALL Agrif_Init_Variable(tsini_id, procname=agrif_initts)
68  !    ELSE
69      CALL Agrif_Init_Variable(tsini_id, procname=interptsn)
70
71  !    ENDIF
72! just for VORTEX because Parent velocities can actually be exactly zero
73!      Agrif_UseSpecialValue = .FALSE.
74      Agrif_UseSpecialValue = ln_spc_dyn
75      use_sign_north = .TRUE.
76      sign_north = -1.
77      CALL Agrif_Init_Variable(uini_id , procname=interpun )
78      CALL Agrif_Init_Variable(vini_id , procname=interpvn )
79      use_sign_north = .FALSE.
80
81      Agrif_UseSpecialValue = .FALSE.            !
82      l_ini_child = .FALSE.
83
84      Krhs_a = Kaa ; Kmm_a = Kmm
85
86      DO jn = 1, jpts
87         ts(:,:,:,jn,Kbb) = ts(:,:,:,jn,Kbb)*tmask(:,:,:)
88      END DO
89      uu(:,:,:,Kbb) =  uu(:,:,:,Kbb) * umask(:,:,:)     
90      vv(:,:,:,Kbb) =  vv(:,:,:,Kbb) * vmask(:,:,:) 
91
92
93      CALL lbc_lnk_multi( 'agrif_istate', uu(:,:,:,Kbb), 'U', -1. , vv(:,:,:,Kbb), 'V', -1. )
94      CALL lbc_lnk( 'agrif_istate', ts(:,:,:,:,Kbb), 'T', 1. )
95
96   END SUBROUTINE agrif_istate   
97
98   SUBROUTINE agrif_declare_var_ini
99      !!----------------------------------------------------------------------
100      !!                 *** ROUTINE agrif_declare_var ***
101      !!----------------------------------------------------------------------
102      USE agrif_util
103      USE agrif_oce
104      USE par_oce
105      USE zdf_oce 
106      USE oce
107      USE dom_oce
108      !
109      IMPLICIT NONE
110      !
111      INTEGER :: ind1, ind2, ind3
112      External :: nemo_mapping
113      !!----------------------------------------------------------------------
114
115! In case of East-West periodicity, prevent AGRIF interpolation at east and west boundaries
116! The procnames will not be called at these boundaries
117      IF (jperio == 1) THEN
118         CALL Agrif_Set_NearCommonBorderX(.TRUE.)
119         CALL Agrif_Set_DistantCommonBorderX(.TRUE.)
120      ENDIF
121
122      IF ( .NOT. lk_south ) THEN
123         CALL Agrif_Set_NearCommonBorderY(.TRUE.)
124      ENDIF
125
126      ! 1. Declaration of the type of variable which have to be interpolated
127      !---------------------------------------------------------------------
128      ind1 =     nbghostcells
129      ind2 = 2 + nbghostcells_x
130      ind3 = 2 + nbghostcells_y_s
131
132      CALL agrif_declare_variable((/2,2,0/),(/ind2,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),e3t_id)
133      CALL agrif_declare_variable((/2,2/)  ,(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),mbkt_id)
134      CALL agrif_declare_variable((/2,2/)  ,(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ht0_id)
135
136      CALL agrif_declare_variable((/1,2/),(/ind2-1,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),e1u_id)
137      CALL agrif_declare_variable((/2,1/),(/ind2,ind3-1/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),e2v_id)
138
139   
140      ! Initial or restart velues
141     
142      CALL agrif_declare_variable((/2,2,0,0/),(/ind2  ,ind3  ,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts+1/),tsini_id)
143      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3  ,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/)     ,uini_id ) 
144      CALL agrif_declare_variable((/2,1,0,0/),(/ind2  ,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/)     ,vini_id )
145      CALL agrif_declare_variable((/2,2/)    ,(/ind2,ind3/)        ,(/'x','y'/),(/1,1/),(/nlci,nlcj/),sshini_id)
146      !
147     
148      ! 2. Type of interpolation
149      !-------------------------
150      CALL Agrif_Set_bcinterp(e3t_id,interp=AGRIF_constant)
151
152      CALL Agrif_Set_bcinterp(mbkt_id,interp=AGRIF_constant)
153      CALL Agrif_Set_interp  (mbkt_id,interp=AGRIF_constant)
154      CALL Agrif_Set_bcinterp(ht0_id ,interp=AGRIF_constant)
155      CALL Agrif_Set_interp  (ht0_id ,interp=AGRIF_constant)
156
157      CALL Agrif_Set_bcinterp( e1u_id, interp1=Agrif_linear, interp2=AGRIF_ppm    )
158      CALL Agrif_Set_bcinterp( e2v_id, interp1=AGRIF_ppm   , interp2=Agrif_linear )
159
160      ! Initial fields
161      CALL Agrif_Set_bcinterp(tsini_id ,interp=AGRIF_linear)
162      CALL Agrif_Set_interp  (tsini_id ,interp=AGRIF_linear)
163      CALL Agrif_Set_bcinterp(uini_id  ,interp=AGRIF_linear)
164      CALL Agrif_Set_interp  (uini_id  ,interp=AGRIF_linear)
165      CALL Agrif_Set_bcinterp(vini_id  ,interp=AGRIF_linear)
166      CALL Agrif_Set_interp  (vini_id  ,interp=AGRIF_linear)
167      CALL Agrif_Set_bcinterp(sshini_id,interp=AGRIF_linear)
168      CALL Agrif_Set_interp  (sshini_id,interp=AGRIF_linear)
169
170       ! 3. Location of interpolation
171      !-----------------------------
172!      CALL Agrif_Set_bc(  e3t_id, (/-nn_sponge_len*Agrif_irhox(),ind1-1/) ) 
173! JC: check near the boundary only until matching in sponge has been sorted out:
174      CALL Agrif_Set_bc(  e3t_id, (/0,ind1-1/) ) 
175
176      ! extend the interpolation zone by 1 more point than necessary:
177      ! RB check here
178      CALL Agrif_Set_bc(  mbkt_id, (/-nn_sponge_len*Agrif_irhox()-2,ind1/) )
179      CALL Agrif_Set_bc(  ht0_id,  (/-nn_sponge_len*Agrif_irhox()-2,ind1/) )
180     
181      CALL Agrif_Set_bc(e1u_id,(/0,ind1-1/))
182      CALL Agrif_Set_bc(e2v_id,(/0,ind1-1/)) 
183
184      CALL Agrif_Set_bc( tsini_id , (/0,ind1-1/) ) ! if west,  rhox=3 and nbghost=3: columns 2 to 4
185      CALL Agrif_Set_bc( uini_id  , (/0,ind1-1/) ) 
186      CALL Agrif_Set_bc( vini_id  , (/0,ind1-1/) )
187      CALL Agrif_Set_bc( sshini_id, (/0,ind1-1/) )
188
189      ! 4. Update type
190      !---------------
191# if defined UPD_HIGH
192      CALL Agrif_Set_Updatetype(e1u_id,update1 = Agrif_Update_Average, update2=Agrif_Update_Full_Weighting)
193      CALL Agrif_Set_Updatetype(e2v_id,update1 = Agrif_Update_Full_Weighting, update2=Agrif_Update_Average)
194#else
195      CALL Agrif_Set_Updatetype(e1u_id,update1 = Agrif_Update_Copy, update2=Agrif_Update_Average)
196      CALL Agrif_Set_Updatetype(e2v_id,update1 = Agrif_Update_Average, update2=Agrif_Update_Copy)
197#endif
198     
199      CALL Agrif_Set_ExternalMapping(nemo_mapping)
200      !
201   END SUBROUTINE agrif_declare_var_ini
202
203
204   SUBROUTINE Agrif_Init_Domain( Kbb, Kmm, Kaa ) 
205      !!----------------------------------------------------------------------
206      !!                 *** ROUTINE Agrif_InitValues_cont_dom ***
207      !!----------------------------------------------------------------------
208 
209         !!----------------------------------------------------------------------
210         !!                 *** ROUTINE Agrif_InitValues_cont ***
211         !!
212         !! ** Purpose ::   Declaration of variables to be interpolated
213         !!----------------------------------------------------------------------
214      USE agrif_oce_update
215      USE agrif_oce_interp
216      USE agrif_oce_sponge
217      USE Agrif_Util
218      USE oce 
219      USE dom_oce
220      USE zdf_oce
221      USE nemogcm
222      USE agrif_oce
223      !
224      USE lbclnk
225      USE lib_mpp
226      USE in_out_manager
227      !
228      IMPLICIT NONE
229      !
230      INTEGER, INTENT(in) ::  Kbb, Kmm, Kaa
231      !
232      LOGICAL :: check_namelist
233      CHARACTER(len=15) :: cl_check1, cl_check2, cl_check3, cl_check4 
234      REAL(wp), DIMENSION(jpi,jpj) ::   zk   ! workspace
235      INTEGER :: ji, jj, jk
236      !!----------------------------------------------------------------------
237   
238     ! CALL Agrif_Declare_Var_ini
239
240      IF( agrif_oce_alloc()  > 0 )   CALL ctl_warn('agrif agrif_oce_alloc: allocation of arrays failed')
241
242      lk_west  = .NOT. ( Agrif_Ix() == 1 )
243      lk_east  = .NOT. ( Agrif_Ix() + nbcellsx/AGRIF_Irhox() == Agrif_Parent(jpiglo) -1 )
244      lk_south = .NOT. ( Agrif_Iy() == 1 )
245      lk_north = .NOT. ( Agrif_Iy() + nbcellsy/AGRIF_Irhoy() == Agrif_Parent(jpjglo) -1 )
246
247      ! Build consistent parent bathymetry and number of levels
248      ! on the child grid
249      Agrif_UseSpecialValue = .FALSE.
250      ht0_parent(:,:) = 0._wp
251      mbkt_parent(:,:) = 0
252      !
253  !    CALL Agrif_Bc_variable(ht0_id ,calledweight=1.,procname=interpht0 )
254  !    CALL Agrif_Bc_variable(mbkt_id,calledweight=1.,procname=interpmbkt)
255      CALL Agrif_Init_Variable(ht0_id , procname=interpht0 )
256      CALL Agrif_Init_Variable(mbkt_id, procname=interpmbkt)
257      !
258      ! Assume step wise change of bathymetry near interface
259      ! TODO: Switch to linear interpolation of bathymetry in the s-coordinate case
260      !       and no refinement
261      DO_2D_10_10
262         mbku_parent(ji,jj) = MIN(  mbkt_parent(ji+1,jj  ) , mbkt_parent(ji,jj)  )
263         mbkv_parent(ji,jj) = MIN(  mbkt_parent(ji  ,jj+1) , mbkt_parent(ji,jj)  )
264      END_2D
265      IF ( ln_sco.AND.Agrif_Parent(ln_sco) ) THEN
266         DO_2D_10_10
267            hu0_parent(ji,jj) = 0.5_wp * ( ht0_parent(ji,jj)+ht0_parent(ji+1,jj) )
268            hv0_parent(ji,jj) = 0.5_wp * ( ht0_parent(ji,jj)+ht0_parent(ji,jj+1) )
269         END_2D
270      ELSE
271         DO_2D_10_10
272            hu0_parent(ji,jj) = MIN( ht0_parent(ji,jj), ht0_parent(ji+1,jj))
273            hv0_parent(ji,jj) = MIN( ht0_parent(ji,jj), ht0_parent(ji,jj+1))
274         END_2D
275
276      ENDIF
277      !
278      CALL lbc_lnk( 'Agrif_Init_Domain', hu0_parent, 'U', 1. )
279      CALL lbc_lnk( 'Agrif_Init_Domain', hv0_parent, 'V', 1. )
280      zk(:,:) = REAL( mbku_parent(:,:), wp )   ;   CALL lbc_lnk( 'Agrif_InitValues_cont', zk, 'U', 1. )
281      mbku_parent(:,:) = MAX( NINT( zk(:,:) ), 1 ) ;
282      zk(:,:) = REAL( mbkv_parent(:,:), wp )   ;   CALL lbc_lnk( 'Agrif_InitValues_cont', zk, 'V', 1. )
283      mbkv_parent(:,:) = MAX( NINT( zk(:,:) ), 1 )   
284
285      IF ( ln_init_chfrpar ) THEN
286         CALL Agrif_Init_Variable(sshini_id, procname=agrif_initssh)
287         CALL lbc_lnk( 'Agrif_Init_Domain', ssh(:,:,Kbb), 'T', 1. )
288         DO jk = 1, jpk
289               e3t(:,:,jk,Kbb) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kbb)  ) &
290                        &             / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk)   &
291                        &              + e3t_0(:,:,jk) * ( 1._wp - tmask(:,:,jk) )
292         END DO
293      ENDIF
294
295      ! check if masks and bathymetries match
296      IF(ln_chk_bathy) THEN
297         Agrif_UseSpecialValue = .FALSE.
298         !
299         IF(lwp) WRITE(numout,*) ' '
300         IF(lwp) WRITE(numout,*) 'AGRIF: Check Bathymetry and masks near bdys. Level: ', Agrif_Level()
301         !
302         kindic_agr = 0
303         IF( .NOT. l_vremap ) THEN
304            !
305            ! check if tmask and vertical scale factors agree with parent in sponge area:
306            CALL Agrif_Bc_variable(e3t_id,calledweight=1.,procname=interpe3t)
307            !
308         ELSE
309            !
310            ! In case of vertical interpolation, check only that total depths agree between child and parent:
311            DO ji = 1, jpi
312               DO jj = 1, jpj
313                  IF ((mbkt_parent(ji,jj)/=0).AND.(ABS(ht0_parent(ji,jj)-ht_0(ji,jj))>1.e-3)) kindic_agr = kindic_agr + 1
314                  IF ((mbku_parent(ji,jj)/=0).AND.(ABS(hu0_parent(ji,jj)-hu_0(ji,jj))>1.e-3)) kindic_agr = kindic_agr + 1
315                  IF ((mbkv_parent(ji,jj)/=0).AND.(ABS(hv0_parent(ji,jj)-hv_0(ji,jj))>1.e-3)) kindic_agr = kindic_agr + 1
316               END DO
317            END DO
318
319            CALL mpp_sum( 'agrif_user', kindic_agr )
320            IF( kindic_agr /= 0 ) THEN
321               CALL ctl_stop('==> Child Bathymetry is NOT correct near boundaries.')
322            ELSE
323               IF(lwp) WRITE(numout,*) '==> Child Bathymetry is ok near boundaries.'
324               IF(lwp) WRITE(numout,*) ' '
325            ENDIF 
326         ENDIF
327      ENDIF
328
329      IF( l_vremap ) THEN
330      ! Additional constrain that should be removed someday:
331         IF ( Agrif_Parent(jpk).GT.jpk ) THEN
332            CALL ctl_stop( ' With l_vremap, child grids must have jpk greater or equal to the parent value' )
333         ENDIF
334      ENDIF
335      !
336   END SUBROUTINE Agrif_Init_Domain
337
338
339   SUBROUTINE Agrif_InitValues_cont
340         !!----------------------------------------------------------------------
341         !!                 *** ROUTINE Agrif_InitValues_cont ***
342         !!
343         !! ** Purpose ::   Declaration of variables to be interpolated
344         !!----------------------------------------------------------------------
345      USE agrif_oce_update
346      USE agrif_oce_interp
347      USE agrif_oce_sponge
348      USE Agrif_Util
349      USE oce 
350      USE dom_oce
351      USE zdf_oce
352      USE nemogcm
353      USE agrif_oce
354      !
355      USE lbclnk
356      USE lib_mpp
357      USE in_out_manager
358      !
359      IMPLICIT NONE
360      !
361      LOGICAL :: check_namelist
362      CHARACTER(len=15) :: cl_check1, cl_check2, cl_check3, cl_check4 
363      REAL(wp), DIMENSION(jpi,jpj) ::   zk   ! workspace
364      INTEGER :: ji, jj
365
366      ! 1. Declaration of the type of variable which have to be interpolated
367      !---------------------------------------------------------------------
368      CALL agrif_declare_var
369
370      ! 2. First interpolations of potentially non zero fields
371      !-------------------------------------------------------
372      Agrif_SpecialValue    = 0._wp
373      Agrif_UseSpecialValue = .TRUE.
374      CALL Agrif_Bc_variable(tsn_id,calledweight=1.,procname=interptsn)
375      CALL Agrif_Sponge
376      tabspongedone_tsn = .FALSE.
377      CALL Agrif_Bc_variable(tsn_sponge_id,calledweight=1.,procname=interptsn_sponge)
378      ! reset tsa to zero
379      ts(:,:,:,:,Krhs_a) = 0._wp
380
381      Agrif_UseSpecialValue = ln_spc_dyn
382      use_sign_north = .TRUE.
383      sign_north = -1.
384      CALL Agrif_Bc_variable(un_interp_id,calledweight=1.,procname=interpun)
385      CALL Agrif_Bc_variable(vn_interp_id,calledweight=1.,procname=interpvn)
386      tabspongedone_u = .FALSE.
387      tabspongedone_v = .FALSE.
388      CALL Agrif_Bc_variable(un_sponge_id,calledweight=1.,procname=interpun_sponge)
389      tabspongedone_u = .FALSE.
390      tabspongedone_v = .FALSE.
391      CALL Agrif_Bc_variable(vn_sponge_id,calledweight=1.,procname=interpvn_sponge)
392      use_sign_north = .FALSE.
393      uu(:,:,:,Krhs_a) = 0._wp
394      vv(:,:,:,Krhs_a) = 0._wp
395
396      Agrif_UseSpecialValue = .TRUE.
397      CALL Agrif_Bc_variable(sshn_id,calledweight=1., procname=interpsshn )
398      hbdy(:,:) = 0._wp
399      ssh(:,:,Krhs_a) = 0._wp
400
401      IF ( ln_dynspg_ts ) THEN
402         Agrif_UseSpecialValue = ln_spc_dyn
403         use_sign_north = .TRUE.
404         sign_north = -1.
405         CALL Agrif_Bc_variable(unb_id,calledweight=1.,procname=interpunb)
406         CALL Agrif_Bc_variable(vnb_id,calledweight=1.,procname=interpvnb)
407         CALL Agrif_Bc_variable(ub2b_interp_id,calledweight=1.,procname=interpub2b)
408         CALL Agrif_Bc_variable(vb2b_interp_id,calledweight=1.,procname=interpvb2b)
409         use_sign_north = .FALSE.
410         ubdy(:,:) = 0._wp
411         vbdy(:,:) = 0._wp
412      ENDIF
413      Agrif_UseSpecialValue = .FALSE. 
414
415      !-----------------
416      check_namelist = .TRUE.
417
418      IF( check_namelist ) THEN 
419         ! Check free surface scheme
420         IF ( ( Agrif_Parent(ln_dynspg_ts ).AND.ln_dynspg_exp ).OR.&
421            & ( Agrif_Parent(ln_dynspg_exp).AND.ln_dynspg_ts ) ) THEN
422            WRITE(cl_check1,*)  Agrif_Parent( ln_dynspg_ts )
423            WRITE(cl_check2,*)  ln_dynspg_ts
424            WRITE(cl_check3,*)  Agrif_Parent( ln_dynspg_exp )
425            WRITE(cl_check4,*)  ln_dynspg_exp
426            CALL ctl_stop( 'Incompatible free surface scheme between grids' ,  &
427                  &               'parent grid ln_dynspg_ts  :'//cl_check1  ,  & 
428                  &               'child  grid ln_dynspg_ts  :'//cl_check2  ,  &
429                  &               'parent grid ln_dynspg_exp :'//cl_check3  ,  &
430                  &               'child  grid ln_dynspg_exp :'//cl_check4  ,  &
431                  &               'those logicals should be identical' )                 
432            STOP
433         ENDIF
434
435         ! Check if identical linear free surface option
436         IF ( ( Agrif_Parent(ln_linssh ).AND.(.NOT.ln_linssh )).OR.&
437            & ( (.NOT.Agrif_Parent(ln_linssh)).AND.ln_linssh ) ) THEN
438            WRITE(cl_check1,*)  Agrif_Parent(ln_linssh )
439            WRITE(cl_check2,*)  ln_linssh
440            CALL ctl_stop( 'Incompatible linearized fs option between grids',  &
441                  &               'parent grid ln_linssh  :'//cl_check1     ,  &
442                  &               'child  grid ln_linssh  :'//cl_check2     ,  &
443                  &               'those logicals should be identical' )                 
444            STOP
445         ENDIF
446      ENDIF
447
448   END SUBROUTINE Agrif_InitValues_cont
449
450   SUBROUTINE agrif_declare_var
451      !!----------------------------------------------------------------------
452      !!                 *** ROUTINE agrif_declare_var ***
453      !!----------------------------------------------------------------------
454      USE agrif_util
455      USE agrif_oce
456      USE par_oce
457      USE zdf_oce 
458      USE oce
459      !
460      IMPLICIT NONE
461      !
462      INTEGER :: ind1, ind2, ind3
463      !!----------------------------------------------------------------------
464
465      ! 1. Declaration of the type of variable which have to be interpolated
466      !---------------------------------------------------------------------
467
468      ind1 =     nbghostcells
469      ind2 = 2 + nbghostcells_x
470      ind3 = 2 + nbghostcells_y_s
471
472# if defined key_vertical
473      CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts+1/),tsn_id)
474      CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts+1/),tsn_sponge_id)
475      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),un_interp_id)
476      CALL agrif_declare_variable((/2,1,0,0/),(/ind2,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),vn_interp_id)
477      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),un_update_id)
478      CALL agrif_declare_variable((/2,1,0,0/),(/ind2,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),vn_update_id)
479      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),un_sponge_id)
480      CALL agrif_declare_variable((/2,1,0,0/),(/ind2,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),vn_sponge_id)
481# else
482      CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_id)
483      CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_sponge_id)
484      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),un_interp_id)
485      CALL agrif_declare_variable((/2,1,0,0/),(/ind2,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),vn_interp_id)
486      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),un_update_id)
487      CALL agrif_declare_variable((/2,1,0,0/),(/ind2,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),vn_update_id)
488      CALL agrif_declare_variable((/1,2,0,0/),(/ind2-1,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),un_sponge_id)
489      CALL agrif_declare_variable((/2,1,0,0/),(/ind2,ind3-1,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),vn_sponge_id)
490# endif
491      CALL agrif_declare_variable((/1,2/),(/ind2-1,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),unb_id)
492      CALL agrif_declare_variable((/2,1/),(/ind2,ind3-1/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vnb_id)
493      CALL agrif_declare_variable((/1,2/),(/ind2-1,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ub2b_interp_id)
494      CALL agrif_declare_variable((/2,1/),(/ind2,ind3-1/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vb2b_interp_id)
495      CALL agrif_declare_variable((/1,2/),(/ind2-1,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ub2b_update_id)
496      CALL agrif_declare_variable((/2,1/),(/ind2,ind3-1/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vb2b_update_id)
497
498      CALL agrif_declare_variable((/2,2/),(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),sshn_id)
499
500
501      IF( ln_zdftke.OR.ln_zdfgls ) THEN  ! logical not known at this point
502!         CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/), en_id)
503!         CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),avt_id)
504# if defined key_vertical
505         CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),avm_id)
506# else
507         CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),avm_id)
508# endif
509      ENDIF
510     
511      ! 2. Type of interpolation
512      !-------------------------
513      CALL Agrif_Set_bcinterp(tsn_id,interp=AGRIF_linear)
514      CALL Agrif_Set_bcinterp(un_interp_id,interp1=Agrif_linear,interp2=AGRIF_ppm)
515      CALL Agrif_Set_bcinterp(vn_interp_id,interp1=AGRIF_ppm,interp2=Agrif_linear)
516
517      CALL Agrif_Set_bcinterp(tsn_sponge_id,interp=AGRIF_linear)
518      CALL Agrif_Set_bcinterp(un_sponge_id,interp1=Agrif_linear,interp2=AGRIF_ppm)
519      CALL Agrif_Set_bcinterp(vn_sponge_id,interp1=AGRIF_ppm,interp2=Agrif_linear)
520
521      CALL Agrif_Set_bcinterp(sshn_id,interp=AGRIF_linear)
522      CALL Agrif_Set_bcinterp(unb_id,interp1=Agrif_linear,interp2=AGRIF_ppm)
523      CALL Agrif_Set_bcinterp(vnb_id,interp1=AGRIF_ppm,interp2=Agrif_linear)
524      CALL Agrif_Set_bcinterp(ub2b_interp_id,interp1=Agrif_linear,interp2=AGRIF_ppm)
525      CALL Agrif_Set_bcinterp(vb2b_interp_id,interp1=AGRIF_ppm,interp2=Agrif_linear)
526!
527! > Divergence conserving alternative:
528!      CALL Agrif_Set_bcinterp(sshn_id,interp=AGRIF_constant)
529!      CALL Agrif_Set_bcinterp(unb_id,interp1=Agrif_linear,interp2=AGRIF_constant)
530!      CALL Agrif_Set_bcinterp(vnb_id,interp1=AGRIF_constant,interp2=Agrif_linear)
531!      CALL Agrif_Set_bcinterp(ub2b_interp_id,interp1=Agrif_linear,interp2=AGRIF_constant)
532!      CALL Agrif_Set_bcinterp(vb2b_interp_id,interp1=AGRIF_constant,interp2=Agrif_linear)
533!<
534
535      IF( ln_zdftke.OR.ln_zdfgls )  CALL Agrif_Set_bcinterp( avm_id, interp=AGRIF_linear )
536   
537
538       ! 3. Location of interpolation
539      !-----------------------------
540      CALL Agrif_Set_bc(       tsn_id, (/0,ind1-1/) ) ! if west,  rhox=3 and nbghost=3: columns 2 to 4
541      CALL Agrif_Set_bc( un_interp_id, (/0,ind1-1/) ) 
542      CALL Agrif_Set_bc( vn_interp_id, (/0,ind1-1/) )
543
544      CALL Agrif_Set_bc( tsn_sponge_id, (/-nn_sponge_len*Agrif_irhox()-1,0/) )  ! if west,  rhox=3, nn_sponge_len=2
545      CALL Agrif_Set_bc(  un_sponge_id, (/-nn_sponge_len*Agrif_irhox()-1,0/) )  ! and nbghost=3:
546      CALL Agrif_Set_bc(  vn_sponge_id, (/-nn_sponge_len*Agrif_irhox()-1,0/) )  ! columns 4 to 11
547
548      CALL Agrif_Set_bc(        sshn_id, (/0,ind1-1/) )
549      CALL Agrif_Set_bc(         unb_id, (/0,ind1-1/) )
550      CALL Agrif_Set_bc(         vnb_id, (/0,ind1-1/) )
551      CALL Agrif_Set_bc( ub2b_interp_id, (/0,ind1-1/) )
552      CALL Agrif_Set_bc( vb2b_interp_id, (/0,ind1-1/) )
553
554      IF( ln_zdftke.OR.ln_zdfgls ) CALL Agrif_Set_bc( avm_id, (/0,ind1/) )
555
556      ! 4. Update type
557      !---------------
558
559# if defined UPD_HIGH
560      CALL Agrif_Set_Updatetype(tsn_id, update = Agrif_Update_Full_Weighting)
561      CALL Agrif_Set_Updatetype(un_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Full_Weighting)
562      CALL Agrif_Set_Updatetype(vn_update_id,update1 = Agrif_Update_Full_Weighting, update2 = Agrif_Update_Average)
563
564      CALL Agrif_Set_Updatetype(ub2b_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Full_Weighting)
565      CALL Agrif_Set_Updatetype(vb2b_update_id,update1 = Agrif_Update_Full_Weighting, update2 = Agrif_Update_Average)
566      CALL Agrif_Set_Updatetype(sshn_id,update = Agrif_Update_Full_Weighting)
567      CALL Agrif_Set_Updatetype(e3t_id, update = Agrif_Update_Full_Weighting)
568
569  !    IF( ln_zdftke.OR.ln_zdfgls ) THEN
570!         CALL Agrif_Set_Updatetype( en_id, update = AGRIF_Update_Full_Weighting)
571!         CALL Agrif_Set_Updatetype(avt_id, update = AGRIF_Update_Full_Weighting)
572!         CALL Agrif_Set_Updatetype(avm_id, update = AGRIF_Update_Full_Weighting)
573   !   ENDIF
574
575#else
576      CALL Agrif_Set_Updatetype(tsn_id, update = AGRIF_Update_Average)
577      CALL Agrif_Set_Updatetype(un_update_id,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average)
578      CALL Agrif_Set_Updatetype(vn_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy)
579
580      CALL Agrif_Set_Updatetype(ub2b_update_id,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average)
581      CALL Agrif_Set_Updatetype(vb2b_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy)
582      CALL Agrif_Set_Updatetype(sshn_id,update = AGRIF_Update_Average)
583      CALL Agrif_Set_Updatetype(e3t_id, update = AGRIF_Update_Average)
584
585 !     IF( ln_zdftke.OR.ln_zdfgls ) THEN
586!         CALL Agrif_Set_Updatetype( en_id, update = AGRIF_Update_Average)
587!         CALL Agrif_Set_Updatetype(avt_id, update = AGRIF_Update_Average)
588!         CALL Agrif_Set_Updatetype(avm_id, update = AGRIF_Update_Average)
589 !     ENDIF
590
591#endif
592      !
593   END SUBROUTINE agrif_declare_var
594
595#if defined key_si3
596SUBROUTINE Agrif_InitValues_cont_ice
597      USE Agrif_Util
598      USE sbc_oce, ONLY : nn_fsbc  ! clem: necessary otherwise Agrif_Parent(nn_fsbc) = nn_fsbc
599      USE ice
600      USE agrif_ice
601      USE in_out_manager
602      USE agrif_ice_interp
603      USE lib_mpp
604      !!----------------------------------------------------------------------
605      !!                 *** ROUTINE Agrif_InitValues_cont_ice ***
606      !!----------------------------------------------------------------------
607
608      ! Controls
609
610      ! clem: For some reason, nn_fsbc(child)/=1 does not work properly (signal can be largely degraded by the agrif zoom)
611      !          the run must satisfy CFL=Uice/(dx/dt) < 0.6/nn_fsbc(child)
612      !          therefore, if nn_fsbc(child)>1 one must reduce the time-step in proportion to nn_fsbc(child), which is not acceptable
613      !       If a solution is found, the following stop could be removed because the rest of the code take nn_fsbc(child) into account     
614      IF( nn_fsbc > 1 )  CALL ctl_stop('nn_fsbc(child) must be set to 1 otherwise agrif and sea-ice may not work properly')
615
616      ! stop if rhot * nn_fsbc(parent) /= N * nn_fsbc(child) with N being integer
617      IF( MOD( Agrif_irhot() * Agrif_Parent(nn_fsbc), nn_fsbc ) /= 0 )  THEN
618         CALL ctl_stop('rhot * nn_fsbc(parent) /= N * nn_fsbc(child), therefore nn_fsbc(child) should be set to 1 or nn_fsbc(parent)')
619      ENDIF
620      ! First Interpolations (using "after" ice subtime step => nbstep_ice=1)
621      !----------------------------------------------------------------------
622      nbstep_ice = ( Agrif_irhot() * Agrif_Parent(nn_fsbc) / nn_fsbc ) ! clem: to have calledweight=1 in interp (otherwise the western border of the zoom is wrong)
623      CALL agrif_interp_ice('U') ! interpolation of ice velocities
624      CALL agrif_interp_ice('V') ! interpolation of ice velocities
625      CALL agrif_interp_ice('T') ! interpolation of ice tracers
626      nbstep_ice = 0   
627      !
628   END SUBROUTINE Agrif_InitValues_cont_ice
629
630   SUBROUTINE agrif_declare_var_ice
631      !!----------------------------------------------------------------------
632      !!                 *** ROUTINE agrif_declare_var_ice ***
633      !!----------------------------------------------------------------------
634
635      USE Agrif_Util
636      USE ice
637      USE par_oce, ONLY : nbghostcells, nbghostcells_x, nbghostcells_y_s
638      !
639      IMPLICIT NONE
640      !
641      INTEGER :: ind1, ind2, ind3
642         !!----------------------------------------------------------------------
643      !
644      ! 1. Declaration of the type of variable which have to be interpolated (parent=>child)
645      !       agrif_declare_variable(position,1st point index,--,--,dimensions,name)
646      !           ex.:  position=> 1,1 = not-centered (in i and j)
647      !                            2,2 =     centered (    -     )
648      !                 index   => 1,1 = one ghost line
649      !                            2,2 = two ghost lines
650      !-------------------------------------------------------------------------------------
651
652      ind1 =     nbghostcells
653      ind2 = 2 + nbghostcells_x
654      ind3 = 2 + nbghostcells_y_s
655      CALL agrif_declare_variable((/2,2,0/),(/ind2,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpl*(8+nlay_s+nlay_i)/),tra_ice_id)
656      CALL agrif_declare_variable((/1,2/)  ,(/ind2-1,ind3/)  ,(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,u_ice_id  )
657      CALL agrif_declare_variable((/2,1/)  ,(/ind2,ind3-1/)  ,(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,v_ice_id  )
658
659      CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpl*(8+nlay_s+nlay_i)/),tra_iceini_id)
660      CALL agrif_declare_variable((/1,2/)  ,(/ind2-1,ind3/)  ,(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,u_iceini_id  )
661      CALL agrif_declare_variable((/2,1/)  ,(/ind2,ind3-1/)  ,(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,v_iceini_id  )
662
663      ! 2. Set interpolations (normal & tangent to the grid cell for velocities)
664      !-----------------------------------
665      CALL Agrif_Set_bcinterp(tra_ice_id, interp  = AGRIF_linear)
666      CALL Agrif_Set_bcinterp(u_ice_id  , interp1 = Agrif_linear,interp2 = AGRIF_ppm   )
667      CALL Agrif_Set_bcinterp(v_ice_id  , interp1 = AGRIF_ppm   ,interp2 = Agrif_linear)
668
669      CALL Agrif_Set_bcinterp(tra_iceini_id, interp  = AGRIF_linear)
670      CALL Agrif_Set_interp  (tra_iceini_id, interp  = AGRIF_linear)
671      CALL Agrif_Set_bcinterp(u_iceini_id  , interp  = AGRIF_linear  )
672      CALL Agrif_Set_interp  (u_iceini_id  , interp  = AGRIF_linear   )
673      CALL Agrif_Set_bcinterp(v_iceini_id  , interp  = AGRIF_linear)
674      CALL Agrif_Set_interp  (v_iceini_id  , interp  = AGRIF_linear)
675
676      ! 3. Set location of interpolations
677      !----------------------------------
678      CALL Agrif_Set_bc(tra_ice_id,(/0,ind1/))
679      CALL Agrif_Set_bc(u_ice_id  ,(/0,ind1/))
680      CALL Agrif_Set_bc(v_ice_id  ,(/0,ind1/))
681
682      CALL Agrif_Set_bc(tra_iceini_id,(/0,ind1/))
683      CALL Agrif_Set_bc(u_iceini_id  ,(/0,ind1/))
684      CALL Agrif_Set_bc(v_iceini_id  ,(/0,ind1/))
685
686      ! 4. Set update type in case 2 ways (child=>parent) (normal & tangent to the grid cell for velocities)
687      !--------------------------------------------------
688# if defined UPD_HIGH
689      CALL Agrif_Set_Updatetype(tra_ice_id, update  = Agrif_Update_Full_Weighting)
690      CALL Agrif_Set_Updatetype(u_ice_id  , update1 = Agrif_Update_Average       , update2 = Agrif_Update_Full_Weighting)
691      CALL Agrif_Set_Updatetype(v_ice_id  , update1 = Agrif_Update_Full_Weighting, update2 = Agrif_Update_Average       )
692# else
693      CALL Agrif_Set_Updatetype(tra_ice_id, update  = AGRIF_Update_Average)
694      CALL Agrif_Set_Updatetype(u_ice_id  , update1 = Agrif_Update_Copy   , update2 = Agrif_Update_Average)
695      CALL Agrif_Set_Updatetype(v_ice_id  , update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy   )
696# endif
697
698   END SUBROUTINE agrif_declare_var_ice
699#endif
700
701
702# if defined key_top
703   SUBROUTINE Agrif_InitValues_cont_top
704      !!----------------------------------------------------------------------
705      !!                 *** ROUTINE Agrif_InitValues_cont_top ***
706      !!----------------------------------------------------------------------
707      USE Agrif_Util
708      USE oce 
709      USE dom_oce
710      USE nemogcm
711      USE par_trc
712      USE lib_mpp
713      USE trc
714      USE in_out_manager
715      USE agrif_oce_sponge
716      USE agrif_top_update
717      USE agrif_top_interp
718      USE agrif_top_sponge
719      !!
720 
721   !!
722   IMPLICIT NONE
723   !
724   CHARACTER(len=10) :: cl_check1, cl_check2, cl_check3
725   LOGICAL :: check_namelist
726      !!----------------------------------------------------------------------
727
728
729   ! 1. Declaration of the type of variable which have to be interpolated
730   !---------------------------------------------------------------------
731   CALL agrif_declare_var_top
732
733   ! 2. First interpolations of potentially non zero fields
734   !-------------------------------------------------------
735   Agrif_SpecialValue=0.
736   Agrif_UseSpecialValue = .TRUE.
737   CALL Agrif_Bc_variable(trn_id,calledweight=1.,procname=interptrn)
738   Agrif_UseSpecialValue = .FALSE.
739   CALL Agrif_Sponge
740   tabspongedone_trn = .FALSE.
741   CALL Agrif_Bc_variable(trn_sponge_id,calledweight=1.,procname=interptrn_sponge)
742   ! reset tsa to zero
743   tra(:,:,:,:) = 0.
744
745   ! 3. Some controls
746   !-----------------
747   check_namelist = .TRUE.
748
749   IF( check_namelist ) THEN
750      ! Check time steps
751      IF( NINT(Agrif_Rhot()) * NINT(rdt) .NE. Agrif_Parent(rdt) ) THEN
752         WRITE(cl_check1,*)  Agrif_Parent(rdt)
753         WRITE(cl_check2,*)  rdt
754         WRITE(cl_check3,*)  rdt*Agrif_Rhot()
755         CALL ctl_stop( 'incompatible time step between grids',   &
756               &               'parent grid value : '//cl_check1    ,   & 
757               &               'child  grid value : '//cl_check2    ,   & 
758               &               'value on child grid should be changed to  &
759               &               :'//cl_check3  )
760      ENDIF
761
762      ! Check run length
763      IF( Agrif_IRhot() * (Agrif_Parent(nitend)- &
764            Agrif_Parent(nit000)+1) .NE. (nitend-nit000+1) ) THEN
765         WRITE(cl_check1,*)  (Agrif_Parent(nit000)-1)*Agrif_IRhot() + 1
766         WRITE(cl_check2,*)   Agrif_Parent(nitend)   *Agrif_IRhot()
767         CALL ctl_warn( 'incompatible run length between grids'               ,   &
768               &              ' nit000 on fine grid will be change to : '//cl_check1,   &
769               &              ' nitend on fine grid will be change to : '//cl_check2    )
770         nit000 = (Agrif_Parent(nit000)-1)*Agrif_IRhot() + 1
771         nitend =  Agrif_Parent(nitend)   *Agrif_IRhot()
772      ENDIF
773   ENDIF
774   !
775   END SUBROUTINE Agrif_InitValues_cont_top
776
777
778   SUBROUTINE agrif_declare_var_top
779      !!----------------------------------------------------------------------
780      !!                 *** ROUTINE agrif_declare_var_top ***
781      !!----------------------------------------------------------------------
782      USE agrif_util
783      USE agrif_oce
784      USE dom_oce
785      USE trc
786      !!
787      IMPLICIT NONE
788      !
789      INTEGER :: ind1, ind2, ind3
790      !!----------------------------------------------------------------------
791
792
793
794!RB_CMEMS : declare here init for top     
795      ! 1. Declaration of the type of variable which have to be interpolated
796      !---------------------------------------------------------------------
797      ind1 =     nbghostcells
798      ind2 = 2 + nbghostcells_x
799      ind3 = 2 + nbghostcells_y_s
800# if defined key_vertical
801      CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra+1/),trn_id)
802      CALL agrif_declare_variable((/2,2,0,0/),(/ind2,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra+1/),trn_sponge_id)
803# else
804! LAURENT: STRANGE why (3,3) here ?
805      CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_id)
806      CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_sponge_id)
807# endif
808
809      ! 2. Type of interpolation
810      !-------------------------
811      CALL Agrif_Set_bcinterp(trn_id,interp=AGRIF_linear)
812      CALL Agrif_Set_bcinterp(trn_sponge_id,interp=AGRIF_linear)
813
814      ! 3. Location of interpolation
815      !-----------------------------
816      CALL Agrif_Set_bc(trn_id,(/0,ind1-1/))
817      CALL Agrif_Set_bc(trn_sponge_id,(/-nn_sponge_len*Agrif_irhox()-1,0/))
818
819      ! 4. Update type
820      !---------------
821# if defined UPD_HIGH
822      CALL Agrif_Set_Updatetype(trn_id, update = Agrif_Update_Full_Weighting)
823#else
824      CALL Agrif_Set_Updatetype(trn_id, update = AGRIF_Update_Average)
825#endif
826   !
827   END SUBROUTINE agrif_declare_var_top
828# endif
829
830   SUBROUTINE Agrif_detect( kg, ksizex )
831      !!----------------------------------------------------------------------
832      !!                      *** ROUTINE Agrif_detect ***
833      !!----------------------------------------------------------------------
834      INTEGER, DIMENSION(2) :: ksizex
835      INTEGER, DIMENSION(ksizex(1),ksizex(2)) :: kg 
836      !!----------------------------------------------------------------------
837      !
838      RETURN
839      !
840   END SUBROUTINE Agrif_detect
841
842   SUBROUTINE agrif_nemo_init
843      !!----------------------------------------------------------------------
844      !!                     *** ROUTINE agrif_init ***
845      !!----------------------------------------------------------------------
846   USE agrif_oce 
847   USE agrif_ice
848   USE dom_oce
849   USE in_out_manager
850   USE lib_mpp
851      !!
852      IMPLICIT NONE
853      !
854      INTEGER  ::   ios                 ! Local integer output status for namelist read
855      NAMELIST/namagrif/ ln_agrif_2way, ln_init_chfrpar, rn_sponge_tra, rn_sponge_dyn, rn_trelax_tra, rn_trelax_dyn, &
856                       & ln_spc_dyn, ln_chk_bathy
857      !!--------------------------------------------------------------------------------------
858      !
859      READ  ( numnam_ref, namagrif, IOSTAT = ios, ERR = 901)
860901 IF( ios /= 0 )   CALL ctl_nam ( ios , 'namagrif in reference namelist' )
861      READ  ( numnam_cfg, namagrif, IOSTAT = ios, ERR = 902 )
862902 IF( ios >  0 )   CALL ctl_nam ( ios , 'namagrif in configuration namelist' )
863      IF(lwm) WRITE ( numond, namagrif )
864      !
865      IF(lwp) THEN                    ! control print
866         WRITE(numout,*)
867         WRITE(numout,*) 'agrif_nemo_init : AGRIF parameters'
868         WRITE(numout,*) '~~~~~~~~~~~~~~~'
869         WRITE(numout,*) '   Namelist namagrif : set AGRIF parameters'
870         WRITE(numout,*) '      Two way nesting activated ln_agrif_2way         = ', ln_agrif_2way
871         WRITE(numout,*) '      child initial state from parent ln_init_chfrpar = ', ln_init_chfrpar
872         WRITE(numout,*) '      ad. sponge coeft for tracers      rn_sponge_tra = ', rn_sponge_tra
873         WRITE(numout,*) '      ad. sponge coeft for dynamics     rn_sponge_tra = ', rn_sponge_dyn
874         WRITE(numout,*) '      ad. time relaxation for tracers   rn_trelax_tra = ', rn_trelax_tra
875         WRITE(numout,*) '      ad. time relaxation for dynamics  rn_trelax_dyn = ', rn_trelax_dyn
876         WRITE(numout,*) '      use special values for dynamics   ln_spc_dyn    = ', ln_spc_dyn
877         WRITE(numout,*) '      check bathymetry                  ln_chk_bathy  = ', ln_chk_bathy
878      ENDIF
879      !
880      ! Set the number of ghost cells according to periodicity
881      nbghostcells_x = nbghostcells
882      nbghostcells_y_s = nbghostcells
883      nbghostcells_y_n = nbghostcells
884      !
885      IF ( jperio == 1 ) nbghostcells_x = 0
886      IF ( .NOT. lk_south ) nbghostcells_y_s = 0
887
888      ! Some checks
889      IF( jpiglo /= nbcellsx + 2 + 2*nbghostcells_x )   &
890          CALL ctl_stop( 'STOP', 'agrif_nemo_init: Agrif children requires jpiglo == nbcellsx + 2 + 2*nbghostcells_x' )
891      IF( jpjglo /= nbcellsy + 2 + nbghostcells_y_s + nbghostcells_y_n )   &
892          CALL ctl_stop( 'STOP', 'agrif_nemo_init: Agrif children requires jpjglo == nbcellsy + 2 + nbghostcells_y_s + nbghostcells_y_n' )
893      IF( ln_use_jattr )   CALL ctl_stop( 'STOP', 'agrif_nemo_init:Agrif children requires ln_use_jattr = .false. ' )
894      !
895   END SUBROUTINE agrif_nemo_init
896
897# if defined key_mpp_mpi
898   SUBROUTINE Agrif_InvLoc( indloc, nprocloc, i, indglob )
899      !!----------------------------------------------------------------------
900      !!                     *** ROUTINE Agrif_InvLoc ***
901      !!----------------------------------------------------------------------
902      USE dom_oce
903      !!
904      IMPLICIT NONE
905      !
906      INTEGER :: indglob, indloc, nprocloc, i
907      !!----------------------------------------------------------------------
908      !
909      SELECT CASE( i )
910      CASE(1)   ;   indglob = indloc + nimppt(nprocloc+1) - 1
911      CASE(2)   ;   indglob = indloc + njmppt(nprocloc+1) - 1
912      CASE DEFAULT
913         indglob = indloc
914      END SELECT
915      !
916   END SUBROUTINE Agrif_InvLoc
917
918   SUBROUTINE Agrif_get_proc_info( imin, imax, jmin, jmax )
919      !!----------------------------------------------------------------------
920      !!                 *** ROUTINE Agrif_get_proc_info ***
921      !!----------------------------------------------------------------------
922      USE par_oce
923      !!
924      IMPLICIT NONE
925      !
926      INTEGER, INTENT(out) :: imin, imax
927      INTEGER, INTENT(out) :: jmin, jmax
928      !!----------------------------------------------------------------------
929      !
930      imin = nimppt(Agrif_Procrank+1)  ! ?????
931      jmin = njmppt(Agrif_Procrank+1)  ! ?????
932      imax = imin + jpi - 1
933      jmax = jmin + jpj - 1
934      !
935   END SUBROUTINE Agrif_get_proc_info
936
937   SUBROUTINE Agrif_estimate_parallel_cost(imin, imax,jmin, jmax, nbprocs, grid_cost)
938      !!----------------------------------------------------------------------
939      !!                 *** ROUTINE Agrif_estimate_parallel_cost ***
940      !!----------------------------------------------------------------------
941      USE par_oce
942      !!
943      IMPLICIT NONE
944      !
945      INTEGER,  INTENT(in)  :: imin, imax
946      INTEGER,  INTENT(in)  :: jmin, jmax
947      INTEGER,  INTENT(in)  :: nbprocs
948      REAL(wp), INTENT(out) :: grid_cost
949      !!----------------------------------------------------------------------
950      !
951      grid_cost = REAL(imax-imin+1,wp)*REAL(jmax-jmin+1,wp) / REAL(nbprocs,wp)
952      !
953   END SUBROUTINE Agrif_estimate_parallel_cost
954
955# endif
956
957   SUBROUTINE nemo_mapping(ndim,ptx,pty,bounds,bounds_chunks,correction_required,nb_chunks)
958      !!----------------------------------------------------------------------
959      !!                   *** ROUTINE Nemo_mapping ***
960      !!----------------------------------------------------------------------
961      USE dom_oce
962      !!
963      IMPLICIT NONE
964      !
965      INTEGER :: ndim
966      INTEGER :: ptx, pty
967      INTEGER, DIMENSION(ndim,2,2) :: bounds
968      INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: bounds_chunks
969      LOGICAL, DIMENSION(:), ALLOCATABLE :: correction_required
970      INTEGER :: nb_chunks
971      !
972      INTEGER :: i
973
974      IF (agrif_debug_interp) THEN
975         DO i=1,ndim
976            WRITE(*,*) 'direction = ',i,bounds(i,1,2),bounds(i,2,2)
977         ENDDO
978      ENDIF
979
980      IF( bounds(2,2,2) > jpjglo) THEN
981         IF( bounds(2,1,2) <=jpjglo) THEN
982            nb_chunks = 2
983            ALLOCATE(bounds_chunks(nb_chunks,ndim,2,2))
984            ALLOCATE(correction_required(nb_chunks))
985            DO i = 1,nb_chunks
986               bounds_chunks(i,:,:,:) = bounds
987            END DO
988       
989      ! FIRST CHUNCK (for j<=jpjglo)   
990
991      ! Original indices
992            bounds_chunks(1,1,1,1) = bounds(1,1,2)
993            bounds_chunks(1,1,2,1) = bounds(1,2,2)
994            bounds_chunks(1,2,1,1) = bounds(2,1,2)
995            bounds_chunks(1,2,2,1) = jpjglo
996
997            bounds_chunks(1,1,1,2) = bounds(1,1,2)
998            bounds_chunks(1,1,2,2) = bounds(1,2,2)
999            bounds_chunks(1,2,1,2) = bounds(2,1,2)
1000            bounds_chunks(1,2,2,2) = jpjglo
1001
1002      ! Correction required or not
1003            correction_required(1)=.FALSE.
1004       
1005      ! SECOND CHUNCK (for j>jpjglo)
1006
1007      ! Original indices
1008            bounds_chunks(2,1,1,1) = bounds(1,1,2)
1009            bounds_chunks(2,1,2,1) = bounds(1,2,2)
1010            bounds_chunks(2,2,1,1) = jpjglo-2
1011            bounds_chunks(2,2,2,1) = bounds(2,2,2)
1012
1013      ! Where to find them
1014      ! We use the relation TAB(ji,jj)=TAB(jpiglo-ji+2,jpjglo-2-(jj-jpjglo))
1015
1016            IF( ptx == 2) THEN ! T, V points
1017               bounds_chunks(2,1,1,2) = jpiglo-bounds(1,2,2)+2
1018               bounds_chunks(2,1,2,2) = jpiglo-bounds(1,1,2)+2
1019            ELSE ! U, F points
1020               bounds_chunks(2,1,1,2) = jpiglo-bounds(1,2,2)+1
1021               bounds_chunks(2,1,2,2) = jpiglo-bounds(1,1,2)+1       
1022            ENDIF
1023
1024            IF( pty == 2) THEN ! T, U points
1025               bounds_chunks(2,2,1,2) = jpjglo-2-(bounds(2,2,2) -jpjglo)
1026               bounds_chunks(2,2,2,2) = jpjglo-2-(jpjglo-2      -jpjglo)
1027            ELSE ! V, F points
1028               bounds_chunks(2,2,1,2) = jpjglo-3-(bounds(2,2,2) -jpjglo)
1029               bounds_chunks(2,2,2,2) = jpjglo-3-(jpjglo-2      -jpjglo)
1030            ENDIF
1031      ! Correction required or not
1032            correction_required(2)=.TRUE.
1033
1034         ELSE
1035            nb_chunks = 1
1036            ALLOCATE(bounds_chunks(nb_chunks,ndim,2,2))
1037            ALLOCATE(correction_required(nb_chunks))
1038            DO i=1,nb_chunks
1039               bounds_chunks(i,:,:,:) = bounds
1040            END DO
1041
1042            bounds_chunks(1,1,1,1) = bounds(1,1,2)
1043            bounds_chunks(1,1,2,1) = bounds(1,2,2)
1044            bounds_chunks(1,2,1,1) = bounds(2,1,2)
1045            bounds_chunks(1,2,2,1) = bounds(2,2,2)
1046
1047            bounds_chunks(1,1,1,2) = jpiglo-bounds(1,2,2)+2
1048            bounds_chunks(1,1,2,2) = jpiglo-bounds(1,1,2)+2
1049
1050            bounds_chunks(1,2,1,2) = jpjglo-2-(bounds(2,2,2)-jpjglo)
1051            bounds_chunks(1,2,2,2) = jpjglo-2-(bounds(2,1,2)-jpjglo)
1052
1053            IF( ptx == 2) THEN ! T, V points
1054               bounds_chunks(1,1,1,2) = jpiglo-bounds(1,2,2)+2
1055               bounds_chunks(1,1,2,2) = jpiglo-bounds(1,1,2)+2
1056            ELSE ! U, F points
1057               bounds_chunks(1,1,1,2) = jpiglo-bounds(1,2,2)+1
1058               bounds_chunks(1,1,2,2) = jpiglo-bounds(1,1,2)+1       
1059            ENDIF
1060
1061            IF (pty == 2) THEN ! T, U points
1062               bounds_chunks(1,2,1,2) = jpjglo-2-(bounds(2,2,2) -jpjglo)
1063               bounds_chunks(1,2,2,2) = jpjglo-2-(bounds(2,1,2) -jpjglo)
1064            ELSE ! V, F points
1065               bounds_chunks(1,2,1,2) = jpjglo-3-(bounds(2,2,2) -jpjglo)
1066               bounds_chunks(1,2,2,2) = jpjglo-3-(bounds(2,1,2) -jpjglo)
1067            ENDIF
1068
1069            correction_required(1)=.TRUE.         
1070         ENDIF
1071
1072      ELSE IF (bounds(1,1,2) < 1) THEN
1073         IF (bounds(1,2,2) > 0) THEN
1074            nb_chunks = 2
1075            ALLOCATE(correction_required(nb_chunks))
1076            correction_required=.FALSE.
1077            ALLOCATE(bounds_chunks(nb_chunks,ndim,2,2))
1078            DO i=1,nb_chunks
1079               bounds_chunks(i,:,:,:) = bounds
1080            END DO
1081             
1082            bounds_chunks(1,1,1,2) = bounds(1,1,2)+jpiglo-2
1083            bounds_chunks(1,1,2,2) = 1+jpiglo-2
1084         
1085            bounds_chunks(1,1,1,1) = bounds(1,1,2)
1086            bounds_chunks(1,1,2,1) = 1
1087       
1088            bounds_chunks(2,1,1,2) = 2
1089            bounds_chunks(2,1,2,2) = bounds(1,2,2)
1090         
1091            bounds_chunks(2,1,1,1) = 2
1092            bounds_chunks(2,1,2,1) = bounds(1,2,2)
1093
1094         ELSE
1095            nb_chunks = 1
1096            ALLOCATE(correction_required(nb_chunks))
1097            correction_required=.FALSE.
1098            ALLOCATE(bounds_chunks(nb_chunks,ndim,2,2))
1099            DO i=1,nb_chunks
1100               bounds_chunks(i,:,:,:) = bounds
1101            END DO   
1102            bounds_chunks(1,1,1,2) = bounds(1,1,2)+jpiglo-2
1103            bounds_chunks(1,1,2,2) = bounds(1,2,2)+jpiglo-2
1104         
1105            bounds_chunks(1,1,1,1) = bounds(1,1,2)
1106           bounds_chunks(1,1,2,1) = bounds(1,2,2)
1107         ENDIF
1108      ELSE
1109         nb_chunks=1 
1110         ALLOCATE(correction_required(nb_chunks))
1111         correction_required=.FALSE.
1112         ALLOCATE(bounds_chunks(nb_chunks,ndim,2,2))
1113         DO i=1,nb_chunks
1114            bounds_chunks(i,:,:,:) = bounds
1115         END DO
1116         bounds_chunks(1,1,1,2) = bounds(1,1,2)
1117         bounds_chunks(1,1,2,2) = bounds(1,2,2)
1118         bounds_chunks(1,2,1,2) = bounds(2,1,2)
1119         bounds_chunks(1,2,2,2) = bounds(2,2,2)
1120         
1121         bounds_chunks(1,1,1,1) = bounds(1,1,2)
1122         bounds_chunks(1,1,2,1) = bounds(1,2,2)
1123         bounds_chunks(1,2,1,1) = bounds(2,1,2)
1124         bounds_chunks(1,2,2,1) = bounds(2,2,2)             
1125      ENDIF
1126       
1127   END SUBROUTINE nemo_mapping
1128
1129   FUNCTION agrif_external_switch_index(ptx,pty,i1,isens)
1130
1131   USE dom_oce
1132
1133   INTEGER :: ptx, pty, i1, isens
1134   INTEGER :: agrif_external_switch_index
1135
1136   IF( isens == 1 ) THEN
1137      IF( ptx == 2 ) THEN ! T, V points
1138         agrif_external_switch_index = jpiglo-i1+2
1139      ELSE ! U, F points
1140         agrif_external_switch_index = jpiglo-i1+1     
1141      ENDIF
1142   ELSE IF( isens ==2 ) THEN
1143      IF ( pty == 2 ) THEN ! T, U points
1144         agrif_external_switch_index = jpjglo-2-(i1 -jpjglo)
1145      ELSE ! V, F points
1146         agrif_external_switch_index = jpjglo-3-(i1 -jpjglo)
1147      ENDIF
1148   ENDIF
1149
1150   END FUNCTION agrif_external_switch_index
1151
1152   SUBROUTINE Correct_field(tab2d,i1,i2,j1,j2)
1153      !!----------------------------------------------------------------------
1154      !!                   *** ROUTINE Correct_field ***
1155      !!----------------------------------------------------------------------
1156   
1157   USE dom_oce
1158   USE agrif_oce
1159
1160   INTEGER :: i1,i2,j1,j2
1161   REAL(wp), DIMENSION(i1:i2,j1:j2) :: tab2d
1162
1163   INTEGER :: i,j
1164   REAL(wp), DIMENSION(i1:i2,j1:j2) :: tab2dtemp
1165
1166   tab2dtemp = tab2d
1167
1168   IF( .NOT. use_sign_north ) THEN
1169      DO j=j1,j2
1170         DO i=i1,i2
1171            tab2d(i,j)=tab2dtemp(i2-(i-i1),j2-(j-j1))
1172         END DO
1173      END DO
1174   ELSE
1175      DO j=j1,j2
1176         DO i=i1,i2
1177            tab2d(i,j)=sign_north * tab2dtemp(i2-(i-i1),j2-(j-j1))
1178         END DO
1179      END DO
1180   ENDIF
1181
1182   END SUBROUTINE Correct_field
1183
1184#else
1185   SUBROUTINE Subcalledbyagrif
1186      !!----------------------------------------------------------------------
1187      !!                   *** ROUTINE Subcalledbyagrif ***
1188      !!----------------------------------------------------------------------
1189      WRITE(*,*) 'Impossible to be here'
1190   END SUBROUTINE Subcalledbyagrif
1191#endif
Note: See TracBrowser for help on using the repository browser.