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 @ 699

Last change on this file since 699 was 699, checked in by smasson, 17 years ago

insert revision Id

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