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 trunk/NEMO/NST_SRC – NEMO

source: trunk/NEMO/NST_SRC/agrif_user.F90 @ 1200

Last change on this file since 1200 was 1200, checked in by rblod, 16 years ago

Adapt Agrif to the new SBC and correct several bugs for agrif (restart writing and reading), see ticket #133
Note : this fix does not work yet on NEC computerq (sxf90/360)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.4 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/nam_mpp_dyndist/jpni,jpnj,jpnij
22
23      IF (Agrif_Nbstepint() .EQ. 0) THEN
24        nummpp = Agrif_Get_Unit()
25        namelistname='namelist'
26        IF (.NOT. Agrif_Root()) namelistname=TRIM(Agrif_CFixed())//'_namelist'
27        OPEN(nummpp,file=namelistname,status='OLD',form='formatted')
28        READ (nummpp,nam_mpp_dyndist)
29        CLOSE(nummpp)
30      ENDIF
31#endif
32
33      IF( .NOT. Agrif_Root() ) THEN
34         jpiglo = nbcellsx + 2 + 2*nbghostcells
35         jpjglo = nbcellsy + 2 + 2*nbghostcells
36         jpi = ( jpiglo-2*jpreci + (jpni-1+0) ) / jpni + 2*jpreci
37         jpj = ( jpjglo-2*jprecj + (jpnj-1+0) ) / jpnj + 2*jprecj
38         jpim1 = jpi-1
39         jpjm1 = jpj-1
40         jpkm1 = jpk-1                                       
41         jpij  = jpi*jpj
42         jpidta = jpiglo
43         jpjdta = jpjglo
44         jpizoom = 1
45         jpjzoom = 1
46         nperio = 0
47         jperio = 0
48      ENDIF
49
50   END SUBROUTINE Agrif_InitWorkspace
51
52   !
53   SUBROUTINE Agrif_InitValues
54      !!------------------------------------------
55      !!   *** ROUTINE Agrif_InitValues ***
56      !!
57      !! ** Purpose :: Declaration of variables to
58      !!               be interpolated
59      !!------------------------------------------
60      USE Agrif_Util
61      USE oce 
62      USE dom_oce
63      USE opa
64      USE sms
65#if defined key_tradmp   ||   defined key_esopa
66      USE tradmp
67#endif
68      USE sol_oce
69      USE in_out_manager
70#if defined key_lim3 || defined key_lim2
71      USE ice_oce
72#endif
73      USE agrif_opa_update
74      USE agrif_opa_interp
75      USE agrif_opa_sponge
76      USE agrif_top_update
77      USE agrif_top_interp
78
79      IMPLICIT NONE
80
81      REAL(wp) :: tabtemp(jpi,jpj,jpk)
82#if defined key_top
83      REAL(wp) :: tabtrtemp(jpi,jpj,jpk,jptra)
84#endif
85      LOGICAL check_namelist
86
87      ! 0. Initializations
88      !-------------------
89#if defined key_orca_r025 || defined key_orca_r05 || defined key_orca_r2 || defined key_orca_r4
90      jp_cfg = -1    ! set special value for jp_cfg on fine grids
91      cp_cfg = "default"
92#endif
93
94      Call opa_init  ! Initializations of each fine grid
95      Call agrif_opa_init
96
97      ! Specific fine grid Initializations
98#if defined key_tradmp || defined key_esopa
99      ! no tracer damping on fine grids
100      lk_tradmp = .FALSE.
101#endif
102      ! 1. Declaration of the type of variable which have to be interpolated
103      !---------------------------------------------------------------------
104      Call Agrif_Set_type(un,(/1,2,0/),(/2,3,0/))
105      Call Agrif_Set_type(vn,(/2,1,0/),(/3,2,0/))
106
107      Call Agrif_Set_type(ua,(/1,2,0/),(/2,3,0/))
108      Call Agrif_Set_type(va,(/2,1,0/),(/3,2,0/))
109
110      Call Agrif_Set_type(e1u,(/1,2/),(/2,3/))
111      Call Agrif_Set_type(e2v,(/2,1/),(/3,2/))
112
113      Call Agrif_Set_type(tn,(/2,2,0/),(/3,3,0/))
114      Call Agrif_Set_type(sn,(/2,2,0/),(/3,3,0/)) 
115
116      Call Agrif_Set_type(tb,(/2,2,0/),(/3,3,0/))
117      Call Agrif_Set_type(sb,(/2,2,0/),(/3,3,0/)) 
118
119      Call Agrif_Set_type(ta,(/2,2,0/),(/3,3,0/))
120      Call Agrif_Set_type(sa,(/2,2,0/),(/3,3,0/))       
121
122      Call Agrif_Set_type(sshn,(/2,2/),(/3,3/))
123      Call Agrif_Set_type(gcb,(/2,2/),(/3,3/))
124
125#if defined key_top
126      Call Agrif_Set_type(trb,(/2,2,0,0/),(/3,3,0,0/))
127      Call Agrif_Set_type(trn,(/2,2,0,0/),(/3,3,0,0/))
128      Call Agrif_Set_type(tra,(/2,2,0,0/),(/3,3,0,0/))
129#endif
130     
131      ! 2. Space directions for each variables
132      !---------------------------------------
133      Call Agrif_Set_raf(un,(/'x','y','N'/))
134      Call Agrif_Set_raf(vn,(/'x','y','N'/))
135
136      Call Agrif_Set_raf(ua,(/'x','y','N'/))
137      Call Agrif_Set_raf(va,(/'x','y','N'/))
138
139      Call Agrif_Set_raf(e1u,(/'x','y'/))
140      Call Agrif_Set_raf(e2v,(/'x','y'/))
141
142      Call Agrif_Set_raf(tn,(/'x','y','N'/))
143      Call Agrif_Set_raf(sn,(/'x','y','N'/))
144
145      Call Agrif_Set_raf(tb,(/'x','y','N'/))
146      Call Agrif_Set_raf(sb,(/'x','y','N'/))
147
148      Call Agrif_Set_raf(ta,(/'x','y','N'/))
149      Call Agrif_Set_raf(sa,(/'x','y','N'/))     
150
151      Call Agrif_Set_raf(sshn,(/'x','y'/))
152      Call Agrif_Set_raf(gcb,(/'x','y'/))
153
154#if defined key_top
155      Call Agrif_Set_raf(trb,(/'x','y','N','N'/))
156      Call Agrif_Set_raf(trn,(/'x','y','N','N'/))
157      Call Agrif_Set_raf(tra,(/'x','y','N','N'/))
158#endif
159
160      ! 3. Type of interpolation
161      !-------------------------
162      Call Agrif_Set_bcinterp(tn,interp=AGRIF_linear)
163      Call Agrif_Set_bcinterp(sn,interp=AGRIF_linear)
164
165      Call Agrif_Set_bcinterp(ta,interp=AGRIF_linear)
166      Call Agrif_Set_bcinterp(sa,interp=AGRIF_linear)
167
168      Call Agrif_Set_bcinterp(un,interp1=Agrif_linear,interp2=AGRIF_ppm)
169      Call Agrif_Set_bcinterp(vn,interp1=AGRIF_ppm,interp2=Agrif_linear)
170
171      Call Agrif_Set_bcinterp(ua,interp1=Agrif_linear,interp2=AGRIF_ppm)
172      Call Agrif_Set_bcinterp(va,interp1=AGRIF_ppm,interp2=Agrif_linear)
173
174      Call Agrif_Set_bcinterp(e1u,interp1=Agrif_linear,interp2=AGRIF_ppm)
175      Call Agrif_Set_bcinterp(e2v,interp1=AGRIF_ppm,interp2=Agrif_linear)
176
177#if defined key_top
178      Call Agrif_Set_bcinterp(trn,interp=AGRIF_linear)
179      Call Agrif_Set_bcinterp(tra,interp=AGRIF_linear)
180#endif
181
182      ! 4. Location of interpolation
183      !-----------------------------
184      Call Agrif_Set_bc(un,(/0,1/))
185      Call Agrif_Set_bc(vn,(/0,1/))
186
187      Call Agrif_Set_bc(e1u,(/0,0/))
188      Call Agrif_Set_bc(e2v,(/0,0/))
189
190      Call Agrif_Set_bc(tn,(/0,1/))
191      Call Agrif_Set_bc(sn,(/0,1/))
192
193      Call Agrif_Set_bc(ta,(/-3*Agrif_irhox(),0/))
194      Call Agrif_Set_bc(sa,(/-3*Agrif_irhox(),0/))
195
196      Call Agrif_Set_bc(ua,(/-2*Agrif_irhox(),0/))
197      Call Agrif_Set_bc(va,(/-2*Agrif_irhox(),0/))
198
199#if defined key_top
200      Call Agrif_Set_bc(trn,(/0,1/))
201      Call Agrif_Set_bc(tra,(/-3*Agrif_irhox(),0/))
202#endif
203
204      ! 5. Update type
205      !---------------
206      Call Agrif_Set_Updatetype(tn, update = AGRIF_Update_Average)
207      Call Agrif_Set_Updatetype(sn, update = AGRIF_Update_Average)
208
209      Call Agrif_Set_Updatetype(tb, update = AGRIF_Update_Average)
210      Call Agrif_Set_Updatetype(sb, update = AGRIF_Update_Average)
211
212      Call Agrif_Set_Updatetype(sshn, update = AGRIF_Update_Average)
213      Call Agrif_Set_Updatetype(gcb,update = AGRIF_Update_Average)
214
215#if defined key_top
216      Call Agrif_Set_Updatetype(trn, update = AGRIF_Update_Average)
217      Call Agrif_Set_Updatetype(trb, update = AGRIF_Update_Average)
218#endif
219
220      Call Agrif_Set_Updatetype(un,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average)
221      Call Agrif_Set_Updatetype(vn,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy)
222
223      Call Agrif_Set_Updatetype(e1u,update1 = Agrif_Update_Copy, update2=Agrif_Update_Average)
224      Call Agrif_Set_Updatetype(e2v,update1 = Agrif_Update_Average, update2=Agrif_Update_Copy)
225
226      ! 6. First interpolations of potentially non zero fields
227      !-------------------------------------------------------
228      Agrif_SpecialValue=0.
229      Agrif_UseSpecialValue = .TRUE.
230      Call Agrif_Bc_variable(tabtemp,tn,calledweight=1.)
231      Call Agrif_Bc_variable(tabtemp,sn,calledweight=1.)
232      Call Agrif_Bc_variable(tabtemp,un,calledweight=1.,procname=interpu)
233      Call Agrif_Bc_variable(tabtemp,vn,calledweight=1.,procname=interpv)
234
235      Call Agrif_Bc_variable(tabtemp,ta,calledweight=1.,procname=interptn)
236      Call Agrif_Bc_variable(tabtemp,sa,calledweight=1.,procname=interpsn)
237
238      Call Agrif_Bc_variable(tabtemp,ua,calledweight=1.,procname=interpun)
239      Call Agrif_Bc_variable(tabtemp,va,calledweight=1.,procname=interpvn)
240
241#if defined key_top
242      Call Agrif_Bc_variable(tabtrtemp,trn,calledweight=1.)
243      Call Agrif_Bc_variable(tabtrtemp,tra,calledweight=1.)
244#endif
245      Agrif_UseSpecialValue = .FALSE.
246
247      ! 7. Some controls
248      !-----------------
249      check_namelist = .true.
250           
251      IF( check_namelist ) THEN
252     
253         ! Check time steps           
254         IF( nint(Agrif_Rhot()) * nint(rdt) .ne. Agrif_Parent(rdt) ) THEN
255            WRITE(*,*) 'incompatible time step between grids'
256            WRITE(*,*) 'parent grid value : ',Agrif_Parent(rdt)
257            WRITE(*,*) 'child  grid value : ',nint(rdt)
258            WRITE(*,*) 'value on parent grid should be : ',rdt*Agrif_Rhot()
259            STOP
260         ENDIF
261         
262         ! Check run length
263         IF( Agrif_IRhot() * (Agrif_Parent(nitend)- &
264            Agrif_Parent(nit000)+1) .ne. (nitend-nit000+1) ) THEN
265            WRITE(*,*) 'incompatible run length between grids'
266            WRITE(*,*) 'parent grid value : ',(Agrif_Parent(nitend)- &
267               Agrif_Parent(nit000)+1),' time step'
268            WRITE(*,*) 'child  grid value : ', &
269               (nitend-nit000+1),' time step'
270            WRITE(*,*) 'value on child grid should be : ', &
271               Agrif_IRhot() * (Agrif_Parent(nitend)- &
272               Agrif_Parent(nit000)+1)
273            STOP
274         ENDIF
275         
276         ! Check coordinates
277         IF( ln_zps ) THEN
278            ! check parameters for partial steps
279            IF( Agrif_Parent(e3zps_min) .ne. e3zps_min ) THEN
280               WRITE(*,*) 'incompatible e3zps_min between grids'
281               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_min)
282               WRITE(*,*) 'child grid  :',e3zps_min
283               WRITE(*,*) 'those values should be identical'
284               STOP
285            ENDIF         
286            IF( Agrif_Parent(e3zps_rat) .ne. e3zps_rat ) THEN
287               WRITE(*,*) 'incompatible e3zps_rat between grids'
288               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_rat)
289               WRITE(*,*) 'child grid  :',e3zps_rat
290               WRITE(*,*) 'those values should be identical'                 
291               STOP
292            ENDIF
293         ENDIF
294
295      ENDIF
296
297      CALL Agrif_Update_tra(0)
298      CALL Agrif_Update_dyn(0)
299
300      nbcline = 0
301
302   END SUBROUTINE Agrif_InitValues
303   !
304   
305SUBROUTINE Agrif_detect(g,sizex)
306      !!------------------------------------------
307      !!   *** ROUTINE Agrif_detect ***
308      !!------------------------------------------
309      USE Agrif_Types
310 
311      INTEGER, DIMENSION(2) :: sizex
312      INTEGER, DIMENSION(sizex(1),sizex(2)) :: g 
313
314      Return
315
316   End SUBROUTINE Agrif_detect
317
318   SUBROUTINE agrif_opa_init
319      !!---------------------------------------------
320      !!   *** ROUTINE agrif_init ***
321      !!---------------------------------------------
322      USE agrif_oce 
323      USE in_out_manager
324
325      IMPLICIT NONE
326
327      NAMELIST/namagrif/ nbclineupdate, visc_tra, visc_dyn, ln_spc_dyn
328
329      REWIND ( numnam )
330      READ   ( numnam, namagrif )
331      IF(lwp) THEN
332         WRITE(numout,*)
333         WRITE(numout,*) 'agrif_opa_init : agrif parameters'
334         WRITE(numout,*) '~~~~~~~~~~~~'
335         WRITE(numout,*) '          Namelist namagrif : set agrif parameters'
336         WRITE(numout,*) '             baroclinic update frequency          =  ', nbclineupdate
337         WRITE(numout,*) '             sponge coefficient for tracers       =  ', visc_tra
338         WRITE(numout,*) '             sponge coefficient for dynamics      =  ', visc_dyn
339         WRITE(numout,*) '             use special values for dynamics      =  ', ln_spc_dyn
340         WRITE(numout,*) 
341      ENDIF
342
343    END SUBROUTINE agrif_opa_init
344#if defined key_mpp_mpi
345   SUBROUTINE Agrif_InvLoc(indloc,nprocloc,i,indglob)
346      !!------------------------------------------
347      !!   *** ROUTINE Agrif_detect ***
348      !!------------------------------------------
349      USE dom_oce
350     
351      IMPLICIT NONE
352
353      INTEGER :: indglob,indloc,nprocloc,i
354
355      SELECT CASE(i)
356      CASE(1)
357         indglob = indloc + nimppt(nprocloc+1) - 1
358      CASE(2)
359         indglob = indloc + njmppt(nprocloc+1) - 1 
360      CASE(3)
361         indglob = indloc
362      CASE(4)
363         indglob = indloc
364      END SELECT
365
366   END SUBROUTINE Agrif_InvLoc
367#endif
368#else
369   SUBROUTINE Subcalledbyagrif
370      !!------------------------------------------
371      !!   *** ROUTINE Subcalledbyagrif ***
372      !!------------------------------------------
373      WRITE(*,*) 'Impossible to be here'
374   END SUBROUTINE Subcalledbyagrif
375#endif
Note: See TracBrowser for help on using the repository browser.