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_user.F90 in branches/dev_005_AWL/NEMO/NST_SRC – NEMO

source: branches/dev_005_AWL/NEMO/NST_SRC/agrif_user.F90 @ 3500

Last change on this file since 3500 was 1786, checked in by sga, 15 years ago

add new AGRIF without LIM code to NEMO branch dev_005_AWL taken from NOCS NEMO branch noc_dev_024_AWL revision 1051 (patch file differences from NOCS NEMO trunk revision 1043)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 23.9 KB
Line 
1#if defined key_agrif
2   !!----------------------------------------------------------------------
3   !!   OPA 9.0 , LOCEAN-IPSL (2006)
4   !! $Id$
5   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
6   !!----------------------------------------------------------------------
7
8   SUBROUTINE Agrif_InitWorkspace
9      !!----------------------------------------------------------------------
10      !!                 *** ROUTINE Agrif_InitWorkspace ***
11      !!----------------------------------------------------------------------
12      USE par_oce
13      USE dom_oce
14      USE Agrif_Util
15      !!
16      IMPLICIT NONE
17      !!
18#if defined key_mpp_dyndist
19      CHARACTER(len=20) :: namelistname
20      INTEGER nummpp
21      NAMELIST/nammpp_dyndist/ jpni, jpnj, jpnij
22#endif
23      !!----------------------------------------------------------------------
24
25#if defined key_mpp_dyndist
26      ! MPP dynamical distribution : read the processor cutting in the namelist
27      IF( Agrif_Nbstepint() == 0 ) THEN
28        nummpp = Agrif_Get_Unit()
29        namelistname='namelist'
30        IF(.NOT. Agrif_Root() )   namelistname=TRIM(Agrif_CFixed())//'_namelist'
31        !
32        OPEN (nummpp,file=namelistname,status='OLD',form='formatted')
33        READ (nummpp,nammpp_dyndist)
34        CLOSE(nummpp)
35      ENDIF
36#endif
37
38      IF( .NOT. Agrif_Root() ) THEN
39         jpiglo  = nbcellsx + 2 + 2*nbghostcells
40         jpjglo  = nbcellsy + 2 + 2*nbghostcells
41         jpi     = ( jpiglo-2*jpreci + (jpni-1+0) ) / jpni + 2*jpreci
42         jpj     = ( jpjglo-2*jprecj + (jpnj-1+0) ) / jpnj + 2*jprecj
43         jpim1   = jpi-1
44         jpjm1   = jpj-1
45         jpkm1   = jpk-1                                       
46         jpij    = jpi*jpj
47         jpidta  = jpiglo
48         jpjdta  = jpjglo
49         jpizoom = 1
50         jpjzoom = 1
51         nperio  = 0
52         jperio  = 0
53      ENDIF
54      !
55   END SUBROUTINE Agrif_InitWorkspace
56
57#if ! defined key_off_tra
58
59   SUBROUTINE Agrif_InitValues
60      !!----------------------------------------------------------------------
61      !!                 *** ROUTINE Agrif_InitValues ***
62      !!
63      !! ** Purpose :: Declaration of variables to be interpolated
64      !!----------------------------------------------------------------------
65      USE Agrif_Util
66      USE oce 
67      USE dom_oce
68      USE opa
69#if defined key_top
70      USE trc
71#endif
72#if defined key_tradmp   ||   defined key_esopa
73      USE tradmp
74#endif
75      USE sol_oce
76      USE in_out_manager
77      USE agrif_opa_update
78      USE agrif_opa_interp
79      USE agrif_opa_sponge
80      USE agrif_top_update
81      USE agrif_top_interp
82      USE agrif_top_sponge
83      !!
84      IMPLICIT NONE
85      !!
86      REAL(wp) :: tabtemp(jpi,jpj,jpk)
87#if defined key_top
88      REAL(wp) :: tabtrtemp(jpi,jpj,jpk,jptra)
89#endif 
90#if defined key_agrif_nolim
91      REAL(wp) :: tabflxtemp(jpi,jpj)
92#endif
93      LOGICAL check_namelist
94      !!----------------------------------------------------------------------
95
96      ! 0. Initializations
97      !-------------------
98#if defined key_orca_r025 || defined key_orca_r05 || defined key_orca_r2 || defined key_orca_r4
99      jp_cfg = -1    ! set special value for jp_cfg on fine grids
100      cp_cfg = "default"
101#endif
102
103      Call opa_init  ! Initializations of each fine grid
104      Call agrif_opa_init
105
106      ! Specific fine grid Initializations
107#if defined key_tradmp || defined key_esopa
108      ! no tracer damping on fine grids
109      lk_tradmp = .FALSE.
110#endif
111      ! 1. Declaration of the type of variable which have to be interpolated
112      !---------------------------------------------------------------------
113      Call Agrif_Set_type(un,(/1,2,0/),(/2,3,0/))
114      Call Agrif_Set_type(vn,(/2,1,0/),(/3,2,0/))
115
116      Call Agrif_Set_type(ua,(/1,2,0/),(/2,3,0/))
117      Call Agrif_Set_type(va,(/2,1,0/),(/3,2,0/))
118
119      Call Agrif_Set_type(e1u,(/1,2/),(/2,3/))
120      Call Agrif_Set_type(e2v,(/2,1/),(/3,2/))
121
122      Call Agrif_Set_type(tn,(/2,2,0/),(/3,3,0/))
123      Call Agrif_Set_type(sn,(/2,2,0/),(/3,3,0/)) 
124
125      Call Agrif_Set_type(tb,(/2,2,0/),(/3,3,0/))
126      Call Agrif_Set_type(sb,(/2,2,0/),(/3,3,0/)) 
127
128      Call Agrif_Set_type(ta,(/2,2,0/),(/3,3,0/))
129      Call Agrif_Set_type(sa,(/2,2,0/),(/3,3,0/))       
130
131      Call Agrif_Set_type(sshn,(/2,2/),(/3,3/))
132      Call Agrif_Set_type(gcb,(/2,2/),(/3,3/))
133
134#if defined key_top
135      Call Agrif_Set_type(trb,(/2,2,0,0/),(/3,3,0,0/))
136      Call Agrif_Set_type(trn,(/2,2,0,0/),(/3,3,0,0/))
137      Call Agrif_Set_type(tra,(/2,2,0,0/),(/3,3,0,0/))
138#endif
139     
140#if defined key_lim2 && defined key_agrif_nolim
141      Call Agrif_Set_type(utau_nst,(/1,2/),(/2,3/))
142      Call Agrif_Set_type(vtau_nst,(/2,1/),(/3,2/))
143      Call Agrif_Set_type(taum_nst,(/2,2/),(/3,3/))
144      Call Agrif_Set_type(qsr_nst,(/2,2/),(/3,3/))
145      Call Agrif_Set_type(qns_nst,(/2,2/),(/3,3/))
146      Call Agrif_Set_type(emp_nst,(/2,2/),(/3,3/))
147      Call Agrif_Set_type(emps_nst,(/2,2/),(/3,3/))
148      Call Agrif_Set_type(wndm_nst,(/2,2/),(/3,3/))
149      Call Agrif_Set_type(fri_nst,(/2,2/),(/3,3/))
150      Call Agrif_Set_type(tag_nst,(/2,2/),(/3,3/))
151#endif
152
153      ! 2. Space directions for each variables
154      !---------------------------------------
155      Call Agrif_Set_raf(un,(/'x','y','N'/))
156      Call Agrif_Set_raf(vn,(/'x','y','N'/))
157
158      Call Agrif_Set_raf(ua,(/'x','y','N'/))
159      Call Agrif_Set_raf(va,(/'x','y','N'/))
160
161      Call Agrif_Set_raf(e1u,(/'x','y'/))
162      Call Agrif_Set_raf(e2v,(/'x','y'/))
163
164      Call Agrif_Set_raf(tn,(/'x','y','N'/))
165      Call Agrif_Set_raf(sn,(/'x','y','N'/))
166
167      Call Agrif_Set_raf(tb,(/'x','y','N'/))
168      Call Agrif_Set_raf(sb,(/'x','y','N'/))
169
170      Call Agrif_Set_raf(ta,(/'x','y','N'/))
171      Call Agrif_Set_raf(sa,(/'x','y','N'/))     
172
173      Call Agrif_Set_raf(sshn,(/'x','y'/))
174      Call Agrif_Set_raf(gcb,(/'x','y'/))
175
176#if defined key_top
177      Call Agrif_Set_raf(trn,(/'x','y','N','N'/))
178      Call Agrif_Set_raf(trb,(/'x','y','N','N'/))
179      Call Agrif_Set_raf(tra,(/'x','y','N','N'/))
180#endif
181
182#if defined key_lim2 && defined key_agrif_nolim
183      Call Agrif_Set_raf(utau_nst,(/'x','y'/))
184      Call Agrif_Set_raf(vtau_nst,(/'x','y'/))
185      Call Agrif_Set_raf(taum_nst,(/'x','y'/))
186      Call Agrif_Set_raf(qsr_nst,(/'x','y'/))
187      Call Agrif_Set_raf(qns_nst,(/'x','y'/))
188      Call Agrif_Set_raf(emp_nst,(/'x','y'/))
189      Call Agrif_Set_raf(emps_nst,(/'x','y'/))
190      Call Agrif_Set_raf(wndm_nst,(/'x','y'/))
191      Call Agrif_Set_raf(fri_nst,(/'x','y'/))
192      Call Agrif_Set_raf(tag_nst,(/'x','y'/))
193#endif
194
195      ! 3. Type of interpolation
196      !-------------------------
197      Call Agrif_Set_bcinterp(tn,interp=AGRIF_linear)
198      Call Agrif_Set_bcinterp(sn,interp=AGRIF_linear)
199
200      Call Agrif_Set_bcinterp(ta,interp=AGRIF_linear)
201      Call Agrif_Set_bcinterp(sa,interp=AGRIF_linear)
202
203      Call Agrif_Set_bcinterp(un,interp1=Agrif_linear,interp2=AGRIF_ppm)
204      Call Agrif_Set_bcinterp(vn,interp1=AGRIF_ppm,interp2=Agrif_linear)
205
206      Call Agrif_Set_bcinterp(ua,interp1=Agrif_linear,interp2=AGRIF_ppm)
207      Call Agrif_Set_bcinterp(va,interp1=AGRIF_ppm,interp2=Agrif_linear)
208
209      Call Agrif_Set_bcinterp(e1u,interp1=Agrif_linear,interp2=AGRIF_ppm)
210      Call Agrif_Set_bcinterp(e2v,interp1=AGRIF_ppm,interp2=Agrif_linear)
211
212#if defined key_top
213      Call Agrif_Set_bcinterp(trn,interp=AGRIF_linear)
214      Call Agrif_Set_bcinterp(tra,interp=AGRIF_linear)
215#endif
216
217#if defined key_lim2 && defined key_agrif_nolim
218      Call Agrif_Set_interp(utau_nst,interp1=Agrif_linear,interp2=AGRIF_ppm)
219      Call Agrif_Set_interp(vtau_nst,interp1=AGRIF_ppm,interp2=Agrif_linear)
220      Call Agrif_Set_interp(taum_nst,interp=AGRIF_linear)
221      Call Agrif_Set_interp(qsr_nst,interp=AGRIF_linear)
222      Call Agrif_Set_interp(qns_nst,interp=AGRIF_linear)
223      Call Agrif_Set_interp(emp_nst,interp=AGRIF_linear)
224      Call Agrif_Set_interp(emps_nst,interp=AGRIF_linear)
225      Call Agrif_Set_interp(wndm_nst,interp=AGRIF_linear)
226      Call Agrif_Set_interp(fri_nst,interp=AGRIF_linear)
227      Call Agrif_Set_interp(tag_nst,interp=AGRIF_linear)
228
229      Call Agrif_Set_bcinterp(utau_nst,interp1=Agrif_linear,interp2=AGRIF_ppm)
230      Call Agrif_Set_bcinterp(vtau_nst,interp1=AGRIF_ppm,interp2=Agrif_linear)
231      Call Agrif_Set_bcinterp(taum_nst,interp=AGRIF_linear)
232      Call Agrif_Set_bcinterp(qsr_nst,interp=AGRIF_linear)
233      Call Agrif_Set_bcinterp(qns_nst,interp=AGRIF_linear)
234      Call Agrif_Set_bcinterp(emp_nst,interp=AGRIF_linear)
235      Call Agrif_Set_bcinterp(emps_nst,interp=AGRIF_linear)
236      Call Agrif_Set_bcinterp(wndm_nst,interp=AGRIF_linear)
237      Call Agrif_Set_bcinterp(fri_nst,interp=AGRIF_linear)
238      Call Agrif_Set_bcinterp(tag_nst,interp=AGRIF_linear)
239#endif
240
241      ! 4. Location of interpolation
242      !-----------------------------
243      Call Agrif_Set_bc(un,(/0,1/))
244      Call Agrif_Set_bc(vn,(/0,1/))
245
246      Call Agrif_Set_bc(e1u,(/0,0/))
247      Call Agrif_Set_bc(e2v,(/0,0/))
248
249      Call Agrif_Set_bc(tn,(/0,1/))
250      Call Agrif_Set_bc(sn,(/0,1/))
251
252      Call Agrif_Set_bc(ta,(/-3*Agrif_irhox(),0/))
253      Call Agrif_Set_bc(sa,(/-3*Agrif_irhox(),0/))
254
255      Call Agrif_Set_bc(ua,(/-2*Agrif_irhox(),0/))
256      Call Agrif_Set_bc(va,(/-2*Agrif_irhox(),0/))
257
258#if defined key_top
259      Call Agrif_Set_bc(trn,(/0,1/))
260      Call Agrif_Set_bc(tra,(/-3*Agrif_irhox(),0/))
261#endif
262
263#if defined key_lim2 && defined key_agrif_nolim
264      Call Agrif_Set_bc(utau_nst,(/0,1/))
265      Call Agrif_Set_bc(vtau_nst,(/0,1/))
266      Call Agrif_Set_bc(taum_nst,(/0,1/))
267      Call Agrif_Set_bc(qsr_nst,(/0,1/))
268      Call Agrif_Set_bc(qns_nst,(/0,1/))
269      Call Agrif_Set_bc(emp_nst,(/0,1/))
270      Call Agrif_Set_bc(emps_nst,(/0,1/))
271      Call Agrif_Set_bc(wndm_nst,(/0,1/))
272      Call Agrif_Set_bc(fri_nst,(/0,1/))
273      Call Agrif_Set_bc(tag_nst,(/0,1/))
274#endif
275
276      ! 5. Update type
277      !---------------
278      Call Agrif_Set_Updatetype(tn, update = AGRIF_Update_Average)
279      Call Agrif_Set_Updatetype(sn, update = AGRIF_Update_Average)
280
281      Call Agrif_Set_Updatetype(tb, update = AGRIF_Update_Average)
282      Call Agrif_Set_Updatetype(sb, update = AGRIF_Update_Average)
283
284      Call Agrif_Set_Updatetype(sshn, update = AGRIF_Update_Average)
285      Call Agrif_Set_Updatetype(gcb,update = AGRIF_Update_Average)
286
287#if defined key_top
288      Call Agrif_Set_Updatetype(trn, update = AGRIF_Update_Average)
289      Call Agrif_Set_Updatetype(trb, update = AGRIF_Update_Average)
290#endif
291
292      Call Agrif_Set_Updatetype(un,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average)
293      Call Agrif_Set_Updatetype(vn,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy)
294
295      Call Agrif_Set_Updatetype(e1u,update1 = Agrif_Update_Copy, update2=Agrif_Update_Average)
296      Call Agrif_Set_Updatetype(e2v,update1 = Agrif_Update_Average, update2=Agrif_Update_Copy)
297
298#if defined key_lim2 && defined key_agrif_nolim
299      Call Agrif_Set_Updatetype(utau_nst,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average)
300      Call Agrif_Set_Updatetype(vtau_nst,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy)
301      Call Agrif_Set_Updatetype(taum_nst , update = AGRIF_Update_Average)
302      Call Agrif_Set_Updatetype(qsr_nst , update = AGRIF_Update_Average)
303      Call Agrif_Set_Updatetype(qns_nst , update = AGRIF_Update_Average)
304      Call Agrif_Set_Updatetype(emp_nst , update = AGRIF_Update_Average)
305      Call Agrif_Set_Updatetype(emps_nst, update = AGRIF_Update_Average)
306      Call Agrif_Set_Updatetype(wndm_nst, update = AGRIF_Update_Average)
307      Call Agrif_Set_Updatetype(fri_nst, update = AGRIF_Update_Average)
308      Call Agrif_Set_Updatetype(tag_nst , update = AGRIF_Update_Average)
309#endif
310
311      ! 6. First interpolations of potentially non zero fields
312      !-------------------------------------------------------
313      Agrif_SpecialValue=0.
314      Agrif_UseSpecialValue = .TRUE.
315      Call Agrif_Bc_variable(tabtemp,tn,calledweight=1.)
316      Call Agrif_Bc_variable(tabtemp,sn,calledweight=1.)
317      Call Agrif_Bc_variable(tabtemp,un,calledweight=1.,procname=interpu)
318      Call Agrif_Bc_variable(tabtemp,vn,calledweight=1.,procname=interpv)
319
320      Call Agrif_Bc_variable(tabtemp,ta,calledweight=1.,procname=interptn)
321      Call Agrif_Bc_variable(tabtemp,sa,calledweight=1.,procname=interpsn)
322
323      Call Agrif_Bc_variable(tabtemp,ua,calledweight=1.,procname=interpun)
324      Call Agrif_Bc_variable(tabtemp,va,calledweight=1.,procname=interpvn)
325
326#if defined key_top
327      Call Agrif_Bc_variable(tabtrtemp,trn,calledweight=1.)
328      Call Agrif_Bc_variable(tabtrtemp,tra,calledweight=1.,procname=interptrn)
329#endif
330
331#if defined key_lim2 && defined key_agrif_nolim
332
333!     Call Agrif_Interp_variable(tabflxtemp,utau_nst,procname=interputau)
334!     Call Agrif_Interp_variable(tabflxtemp,vtau_nst,procname=interpvtau)
335      Call Agrif_Interp_variable(tabflxtemp,utau_nst)
336      Call Agrif_Interp_variable(tabflxtemp,vtau_nst)
337      Call Agrif_Interp_variable(tabflxtemp,taum_nst)
338      Call Agrif_Interp_variable(tabflxtemp,qsr_nst)
339      Call Agrif_Interp_variable(tabflxtemp,qns_nst)
340      Call Agrif_Interp_variable(tabflxtemp,emp_nst)
341      Call Agrif_Interp_variable(tabflxtemp,emps_nst)
342      Call Agrif_Interp_variable(tabflxtemp,wndm_nst)
343      Call Agrif_Interp_variable(tabflxtemp,fri_nst)
344      Call Agrif_Interp_variable(tabflxtemp,tag_nst)
345!     Call Agrif_Bc_variable(tabflxtemp,utau_nst,calledweight=1.,procname=interputau)
346!     Call Agrif_Bc_variable(tabflxtemp,vtau_nst,calledweight=1.,procname=interpvtau)
347      Call Agrif_Bc_variable(tabflxtemp,utau_nst,calledweight=1.)
348      Call Agrif_Bc_variable(tabflxtemp,vtau_nst,calledweight=1.)
349      Call Agrif_Bc_variable(tabflxtemp,taum_nst,calledweight=1.)
350      Call Agrif_Bc_variable(tabflxtemp,qsr_nst,calledweight=1.)
351      Call Agrif_Bc_variable(tabflxtemp,qns_nst,calledweight=1.)
352      Call Agrif_Bc_variable(tabflxtemp,emp_nst,calledweight=1.)
353      Call Agrif_Bc_variable(tabflxtemp,emps_nst,calledweight=1.)
354      Call Agrif_Bc_variable(tabflxtemp,wndm_nst,calledweight=1.)
355      Call Agrif_Bc_variable(tabflxtemp,fri_nst,calledweight=1.)
356      Call Agrif_Bc_variable(tabflxtemp,tag_nst,calledweight=1.)
357#endif
358      Agrif_UseSpecialValue = .FALSE.
359
360      ! 7. Some controls
361      !-----------------
362      check_namelist = .true.
363           
364      IF( check_namelist ) THEN
365     
366         ! Check time steps           
367         IF( nint(Agrif_Rhot()) * nint(rdt) .ne. Agrif_Parent(rdt) ) THEN
368            WRITE(*,*) 'incompatible time step between grids'
369            WRITE(*,*) 'parent grid value : ',Agrif_Parent(rdt)
370            WRITE(*,*) 'child  grid value : ',nint(rdt)
371            WRITE(*,*) 'value on parent grid should be : ',rdt*Agrif_Rhot()
372            STOP
373         ENDIF
374         
375         ! Check run length
376         IF( Agrif_IRhot() * (Agrif_Parent(nitend)- &
377            Agrif_Parent(nit000)+1) .ne. (nitend-nit000+1) ) THEN
378            WRITE(*,*) 'incompatible run length between grids'
379            WRITE(*,*) 'parent grid value : ',(Agrif_Parent(nitend)- &
380               Agrif_Parent(nit000)+1),' time step'
381            WRITE(*,*) 'child  grid value : ', &
382               (nitend-nit000+1),' time step'
383            WRITE(*,*) 'value on child grid should be : ', &
384               Agrif_IRhot() * (Agrif_Parent(nitend)- &
385               Agrif_Parent(nit000)+1)
386            STOP
387         ENDIF
388         
389         ! Check coordinates
390         IF( ln_zps ) THEN
391            ! check parameters for partial steps
392            IF( Agrif_Parent(e3zps_min) .ne. e3zps_min ) THEN
393               WRITE(*,*) 'incompatible e3zps_min between grids'
394               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_min)
395               WRITE(*,*) 'child grid  :',e3zps_min
396               WRITE(*,*) 'those values should be identical'
397               STOP
398            ENDIF         
399            IF( Agrif_Parent(e3zps_rat) .ne. e3zps_rat ) THEN
400               WRITE(*,*) 'incompatible e3zps_rat between grids'
401               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_rat)
402               WRITE(*,*) 'child grid  :',e3zps_rat
403               WRITE(*,*) 'those values should be identical'                 
404               STOP
405            ENDIF
406         ENDIF
407#if defined key_top
408        ! Check passive tracer cell
409        IF( ndttrc .ne. 1 ) THEN
410           WRITE(*,*) 'ndttrc should be equal to 1'
411        ENDIF
412#endif
413
414      ENDIF
415
416#if defined key_top
417      CALL Agrif_Update_trc(0)
418#endif
419      CALL Agrif_Update_tra(0)
420      CALL Agrif_Update_dyn(0)
421
422#if defined key_top
423      nbcline_trc = 0
424#endif
425      nbcline = 0
426      !
427   END SUBROUTINE Agrif_InitValues
428
429#else
430
431   SUBROUTINE Agrif_InitValues
432      !!----------------------------------------------------------------------
433      !!                 *** ROUTINE Agrif_InitValues ***
434      !!
435      !! ** Purpose :: Declaration of variables to be interpolated
436      !!----------------------------------------------------------------------
437      USE Agrif_Util
438      USE oce 
439      USE dom_oce
440      USE opa
441      USE trc
442      USE in_out_manager
443      USE agrif_top_update
444      USE agrif_top_interp
445      USE agrif_top_sponge
446      !!
447      IMPLICIT NONE
448      !!
449      REAL(wp) :: tabtrtemp(jpi,jpj,jpk,jptra)
450      LOGICAL check_namelist
451      !!----------------------------------------------------------------------
452
453      ! 0. Initializations
454      !-------------------
455#if defined key_orca_r025 || defined key_orca_r05 || defined key_orca_r2 || defined key_orca_r4
456      jp_cfg = -1    ! set special value for jp_cfg on fine grids
457      cp_cfg = "default"
458#endif
459
460      Call opa_init  ! Initializations of each fine grid
461      Call agrif_opa_init
462
463      ! 1. Declaration of the type of variable which have to be interpolated
464      !---------------------------------------------------------------------
465      Call Agrif_Set_type(trb,(/2,2,0,0/),(/3,3,0,0/))
466      Call Agrif_Set_type(trn,(/2,2,0,0/),(/3,3,0,0/))
467      Call Agrif_Set_type(tra,(/2,2,0,0/),(/3,3,0,0/))
468     
469      ! 2. Space directions for each variables
470      !---------------------------------------
471      Call Agrif_Set_raf(trn,(/'x','y','N','N'/))
472      Call Agrif_Set_raf(trb,(/'x','y','N','N'/))
473      Call Agrif_Set_raf(tra,(/'x','y','N','N'/))
474
475      ! 3. Type of interpolation
476      !-------------------------
477      Call Agrif_Set_bcinterp(trn,interp=AGRIF_linear)
478      Call Agrif_Set_bcinterp(tra,interp=AGRIF_linear)
479
480      ! 4. Location of interpolation
481      !-----------------------------
482      Call Agrif_Set_bc(trn,(/0,1/))
483      Call Agrif_Set_bc(tra,(/-3*Agrif_irhox(),0/))
484
485      ! 5. Update type
486      !---------------
487      Call Agrif_Set_Updatetype(trn, update = AGRIF_Update_Average)
488      Call Agrif_Set_Updatetype(trb, update = AGRIF_Update_Average)
489
490      ! 6. First interpolations of potentially non zero fields
491      !-------------------------------------------------------
492      Agrif_SpecialValue=0.
493      Agrif_UseSpecialValue = .TRUE.
494      Call Agrif_Bc_variable(tabtrtemp,trn,calledweight=1.)
495      Call Agrif_Bc_variable(tabtrtemp,tra,calledweight=1.,procname=interptrn)
496      Agrif_UseSpecialValue = .FALSE.
497
498      ! 7. Some controls
499      !-----------------
500      check_namelist = .true.
501           
502      IF( check_namelist ) THEN
503     
504         ! Check time steps           
505         IF( nint(Agrif_Rhot()) * nint(rdt) .ne. Agrif_Parent(rdt) ) THEN
506            WRITE(*,*) 'incompatible time step between grids'
507            WRITE(*,*) 'parent grid value : ',Agrif_Parent(rdt)
508            WRITE(*,*) 'child  grid value : ',nint(rdt)
509            WRITE(*,*) 'value on parent grid should be : ',rdt*Agrif_Rhot()
510            STOP
511         ENDIF
512         
513         ! Check run length
514         IF( Agrif_IRhot() * (Agrif_Parent(nitend)- &
515            Agrif_Parent(nit000)+1) .ne. (nitend-nit000+1) ) THEN
516            WRITE(*,*) 'incompatible run length between grids'
517            WRITE(*,*) 'parent grid value : ',(Agrif_Parent(nitend)- &
518               Agrif_Parent(nit000)+1),' time step'
519            WRITE(*,*) 'child  grid value : ', &
520               (nitend-nit000+1),' time step'
521            WRITE(*,*) 'value on child grid should be : ', &
522               Agrif_IRhot() * (Agrif_Parent(nitend)- &
523               Agrif_Parent(nit000)+1)
524            STOP
525         ENDIF
526         
527         ! Check coordinates
528         IF( ln_zps ) THEN
529            ! check parameters for partial steps
530            IF( Agrif_Parent(e3zps_min) .ne. e3zps_min ) THEN
531               WRITE(*,*) 'incompatible e3zps_min between grids'
532               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_min)
533               WRITE(*,*) 'child grid  :',e3zps_min
534               WRITE(*,*) 'those values should be identical'
535               STOP
536            ENDIF         
537            IF( Agrif_Parent(e3zps_rat) .ne. e3zps_rat ) THEN
538               WRITE(*,*) 'incompatible e3zps_rat between grids'
539               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_rat)
540               WRITE(*,*) 'child grid  :',e3zps_rat
541               WRITE(*,*) 'those values should be identical'                 
542               STOP
543            ENDIF
544         ENDIF
545        ! Check passive tracer cell
546        IF( ndttrc .ne. 1 ) THEN
547           WRITE(*,*) 'ndttrc should be equal to 1'
548        ENDIF
549
550      ENDIF
551
552      CALL Agrif_Update_trc(0)
553      nbcline_trc = 0
554      !
555   END SUBROUTINE Agrif_InitValues
556
557#endif
558   
559   SUBROUTINE Agrif_detect( g, sizex )
560      !!----------------------------------------------------------------------
561      !!   *** ROUTINE Agrif_detect ***
562      !!----------------------------------------------------------------------
563      USE Agrif_Types
564      !!
565      INTEGER, DIMENSION(2) :: sizex
566      INTEGER, DIMENSION(sizex(1),sizex(2)) :: g 
567      !!----------------------------------------------------------------------
568      !
569      RETURN
570      !
571   END SUBROUTINE Agrif_detect
572
573
574   SUBROUTINE agrif_opa_init
575      !!----------------------------------------------------------------------
576      !!                     *** ROUTINE agrif_init ***
577      !!----------------------------------------------------------------------
578      USE agrif_oce 
579      USE in_out_manager
580      !!
581      IMPLICIT NONE
582      !!
583      NAMELIST/namagrif/ nn_cln_update, rn_sponge_tra, rn_sponge_dyn, ln_spc_dyn
584      !!----------------------------------------------------------------------
585
586      REWIND( numnam )                ! Read namagrif namelist
587      READ  ( numnam, namagrif )
588      !
589      IF(lwp) THEN                    ! control print
590         WRITE(numout,*)
591         WRITE(numout,*) 'agrif_opa_init : AGRIF parameters'
592         WRITE(numout,*) '~~~~~~~~~~~~'
593         WRITE(numout,*) '   Namelist namagrif : set AGRIF parameters'
594         WRITE(numout,*) '      baroclinic update frequency       nn_cln_update = ', nn_cln_update
595         WRITE(numout,*) '      sponge coefficient for tracers    rn_sponge_tra = ', rn_sponge_tra, ' s'
596         WRITE(numout,*) '      sponge coefficient for dynamics   rn_sponge_tra = ', rn_sponge_dyn, ' s'
597         WRITE(numout,*) '      use special values for dynamics   ln_spc_dyn    = ', ln_spc_dyn
598         WRITE(numout,*) 
599      ENDIF
600      !
601      ! convert DOCTOR namelist name into OLD names
602      nbclineupdate = nn_cln_update
603      visc_tra      = rn_sponge_tra
604      visc_dyn      = rn_sponge_dyn
605      !
606    END SUBROUTINE agrif_opa_init
607
608# if defined key_mpp_mpi
609
610   SUBROUTINE Agrif_InvLoc( indloc, nprocloc, i, indglob )
611      !!----------------------------------------------------------------------
612      !!                     *** ROUTINE Agrif_detect ***
613      !!----------------------------------------------------------------------
614      USE dom_oce
615      !!
616      IMPLICIT NONE
617      !!
618      INTEGER :: indglob,indloc,nprocloc,i
619      !!----------------------------------------------------------------------
620      !
621      SELECT CASE(i)
622      CASE(1)
623         indglob = indloc + nimppt(nprocloc+1) - 1
624      CASE(2)
625         indglob = indloc + njmppt(nprocloc+1) - 1 
626      CASE(3)
627         indglob = indloc
628      CASE(4)
629         indglob = indloc
630      END SELECT
631      !
632   END SUBROUTINE Agrif_InvLoc
633
634# endif
635
636#else
637   SUBROUTINE Subcalledbyagrif
638      !!----------------------------------------------------------------------
639      !!   *** ROUTINE Subcalledbyagrif ***
640      !!----------------------------------------------------------------------
641      WRITE(*,*) 'Impossible to be here'
642   END SUBROUTINE Subcalledbyagrif
643#endif
Note: See TracBrowser for help on using the repository browser.