/[MITgcm]/MITgcm_contrib/gael/pkg/smooth/smooth_init3D.F
ViewVC logotype

Annotation of /MITgcm_contrib/gael/pkg/smooth/smooth_init3D.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (hide annotations) (download)
Fri Oct 16 03:36:34 2009 UTC (15 years, 9 months ago) by gforget
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +36 -34 lines
bring pkg/smooth up to date

1 gforget 1.1 #include "CPP_OPTIONS.h"
2     #include "GMREDI_OPTIONS.h"
3    
4     subroutine smooth_init3D (mythid)
5    
6    
7     IMPLICIT NONE
8     #include "SIZE.h"
9     #include "EEPARAMS.h"
10     #include "PARAMS.h"
11     #include "DYNVARS.h"
12     #include "GRID.h"
13     #include "GAD.h"
14     c#include "tamc.h"
15     #include "FFIELDS.h"
16     #include "EOS.h"
17     #include "GMREDI.h"
18     #include "smooth.h"
19    
20    
21     c input
22     c bi, bj : array indices
23     c k : vertical index used for masking
24     integer i,j,k, bi, bj, imin, imax, jmin, jmax
25     integer itlo,ithi
26     integer jtlo,jthi
27     integer myThid
28     character*( 80) fnamegeneric
29    
30     _RL wc01theta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
31     _RL wc01salt (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
32     _RL rhokm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
33     _RL rhok (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
34     _RL rhokp1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
35     _RL sigmaX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
36     _RL sigmaY (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
37     _RL sigmaR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
38     c parameter to restrain the Kz based on grid cells
39     _RL wc01_3D_KzMax
40     c to rotate the diffusion
41     _RL Kuxprime, Kvyprime, rotate_s2,rotate_cos,rotate_sin
42     _RL rotaTmp1,rotaTmp2,rotaTmp3
43     integer ii,jj,kk
44     # ifndef GM_EXTRA_DIAGONAL
45     _RL Kuz (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
46     _RL Kvz (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
47     # endif
48    
49     jtlo = mybylo(mythid)
50     jthi = mybyhi(mythid)
51     itlo = mybxlo(mythid)
52     ithi = mybxhi(mythid)
53    
54     wc01_dt=1.
55     wc01_T=wc01_nbt(smoothOpNbCur)*wc01_dt
56    
57     WRITE(standardMessageUnit,'(A,2I4,/,3f5.2)')
58     & 'smooth 3D default parameters: ',
59     & wc01_nbt(smoothOpNbCur),wc01_T,
60     & wc01_3D_Lx0(smoothOpNbCur),wc01_3D_Ly0(smoothOpNbCur),
61     & wc01_3D_Lz0(smoothOpNbCur)
62    
63     cgf "pour rotation H: sauver nouveaux champs"
64     cgf "et poser une limite [deep interior -> isotropic]"
65     cgf "... eviter les sauts de direction"
66    
67     c here fill the wc01_3D_Lz array
68     if ((smooth3DtypeZ(smoothOpNbCur).NE.0).AND.
69     & (smooth3DsizeZ(smoothOpNbCur).EQ.3)) then
70     write(fnamegeneric(1:80),'(1a,i3.3)')
71     & 'wc01_3DscalesZ',smoothOpNbCur
72     call mdsreadfield(fnamegeneric,64,'RL',nR,
73     & wc01_3D_Lz,1,mythid)
74 gforget 1.2 _EXCH_XYZ_RL( wc01_3D_Lz, mythid )
75 gforget 1.1 else
76     DO bj=jtlo,jthi
77     DO bi=itlo,ithi
78     DO k=1,Nr
79     DO j=1-OLy,sNy+OLy
80     DO i=1-OLx,sNx+OLx
81     wc01_3D_Lz(i,j,k,bi,bj)=wc01_3D_Lz0(smoothOpNbCur)
82     ENDDO
83     ENDDO
84     ENDDO
85     ENDDO
86     ENDDO
87     endif
88    
89    
90     c vertical diffusion
91     DO bj=jtlo,jthi
92     DO bi=itlo,ithi
93     DO k=1,Nr
94     DO j=1-OLy,sNy+OLy
95     DO i=1-OLx,sNx+OLx
96     kappaRwc01(i,j,k,bi,bj)=wc01_3D_Lz(i,j,k,bi,bj)*
97     & wc01_3D_Lz(i,j,k,bi,bj)/wc01_T/2
98     ENDDO
99     ENDDO
100     ENDDO
101     ENDDO
102     ENDDO
103    
104     c begin: to restrain the Kz based on grid cells
105     if (smooth3DsizeZ(smoothOpNbCur).NE.3) then
106     DO bj=jtlo,jthi
107     DO bi=itlo,ithi
108     DO k=1,Nr
109     DO j=1-OLy,sNy+OLy
110     DO i=1-OLx,sNx+OLx
111    
112     wc01_3D_KzMax=drC(k)
113     wc01_3D_KzMax=wc01_3D_KzMax*wc01_3D_KzMax/wc01_T/2
114     if (kappaRwc01(i,j,k,bi,bj).GT.wc01_3D_KzMax) then
115     kappaRwc01(i,j,k,bi,bj)=wc01_3D_KzMax
116     endif
117     ENDDO
118     ENDDO
119     ENDDO
120     ENDDO
121     ENDDO
122     endif
123     c end: to restrain the Kz based on grid cells
124    
125 gforget 1.2 _EXCH_XYZ_RL( kappaRwc01, myThid )
126 gforget 1.1
127     c horizontal/isopycnal operator:
128    
129     DO bj=jtlo,jthi
130     DO bi=itlo,ithi
131     DO k=1,Nr
132     DO j=1-OLy,sNy+OLy
133     DO i=1-OLx,sNx+OLx
134     wc01_Kuy(i,j,k,bi,bj)=0.
135     wc01_Kvx(i,j,k,bi,bj)=0.
136     ENDDO
137     ENDDO
138     ENDDO
139     ENDDO
140     ENDDO
141    
142    
143     if ((smooth3DtypeH(smoothOpNbCur).EQ.2).OR.
144     & (smooth3DtypeH(smoothOpNbCur).EQ.3)) then
145    
146     c isopycnal operator:
147    
148     write(fnamegeneric(1:80),'(1a,i3.3)')
149     & 'wc01_3DscalesH',smoothOpNbCur
150    
151     call mdsreadfield(fnamegeneric,64,'RL',nR,
152     & wc01theta,1,mythid)
153     call mdsreadfield(fnamegeneric,64,'RL',nR,
154     & wc01salt,2,mythid)
155 gforget 1.2 _EXCH_XYZ_RL( wc01theta, mythid )
156     _EXCH_XYZ_RL( wc01salt, mythid )
157 gforget 1.1
158     if (smooth3DsizeH(smoothOpNbCur).EQ.3) then
159     call mdsreadfield(fnamegeneric,64,'RL',nR,
160     & wc01_3D_Lx,3,mythid)
161 gforget 1.2 _EXCH_XYZ_RL( wc01_3D_Lx, mythid )
162 gforget 1.1 else
163     DO bj=jtlo,jthi
164     DO bi=itlo,ithi
165     DO k=1,Nr
166     DO j=1-OLy,sNy+OLy
167     DO i=1-OLx,sNx+OLx
168     wc01_3D_Lx(i,j,k,bi,bj)=wc01_3D_Lx0(smoothOpNbCur)
169     ENDDO
170     ENDDO
171     ENDDO
172     ENDDO
173     ENDDO
174     endif
175    
176     DO bj=jtlo,jthi
177     DO bi=itlo,ithi
178     DO k=1,Nr
179     DO j=1-OLy,sNy+OLy
180     DO i=1-OLx,sNx+OLx
181     c here wc01_3D_Lx contains K divided by Kgmredi(=1000)
182     wc01_3D_Lx(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*
183     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2 /1000
184     ENDDO
185     ENDDO
186     ENDDO
187     ENDDO
188     ENDDO
189    
190 gforget 1.2 _EXCH_XYZ_RL( wc01_3D_Lx, mythid )
191 gforget 1.1
192     iMin = 1-OLx
193     iMax = sNx+OLx
194     jMin = 1-OLy
195     jMax = sNy+OLy
196    
197     DO bj=jtlo,jthi
198     DO bi=itlo,ithi
199     DO k=Nr,1,-1
200 gforget 1.2 CALL FIND_RHO_2D(
201     I iMin, iMax, jMin, jMax, k,
202     I wc01theta(1-OLx,1-OLy,k,bi,bj),
203     I wc01salt(1-OLx,1-OLy,k,bi,bj),
204 gforget 1.1 O rhoK(1-OLx,1-OLy,bi,bj),
205 gforget 1.2 I k, bi, bj, myThid )
206 gforget 1.1 IF (k.GT.1) THEN
207 gforget 1.2 CALL FIND_RHO_2D(
208     I iMin, iMax, jMin, jMax, k,
209     I wc01theta(1-OLx,1-OLy,k-1,bi,bj),
210     I wc01salt(1-OLx,1-OLy,k-1,bi,bj),
211 gforget 1.1 O rhoKm1(1-OLx,1-OLy,bi,bj),
212 gforget 1.2 I k-1, bi, bj, myThid )
213 gforget 1.1 ELSE
214     DO j=1-OLy,sNy+OLy
215     DO i=1-OLx,sNx+OLx
216     rhoKm1(i,j,bi,bj)=rhoK(i,j,bi,bj)
217     ENDDO
218     ENDDO
219     ENDIF
220     DO j=1-OLy,sNy+OLy
221     DO i=1-OLx,sNx+OLx
222     rhoKp1(i,j,bi,bj)=rhoK(i,j,bi,bj)
223     ENDDO
224     ENDDO
225     cgf rk: GRAD_SIGMA ne calcule la derivee verticale au point w, entre Km1 et K
226     CALL GRAD_SIGMA(
227     & bi, bj, iMin, iMax, jMin, jMax, k,
228     & rhoK(1-OLx,1-OLy,bi,bj),
229     & rhoKm1(1-OLx,1-OLy,bi,bj),
230     & rhoKp1(1-OLx,1-OLy,bi,bj),
231     & sigmaX(1-OLx,1-OLy,1,bi,bj),
232     & sigmaY(1-OLx,1-OLy,1,bi,bj),
233     & sigmaR(1-OLx,1-OLy,1,bi,bj),
234     I myThid )
235     ENDDO
236     ENDDO
237     ENDDO
238    
239 gforget 1.2 _EXCH_XYZ_RL( sigmaX, myThid )
240     _EXCH_XYZ_RL( sigmaY, myThid )
241     _EXCH_XYZ_RL( sigmaR, myThid )
242 gforget 1.1
243     DO bj=jtlo,jthi
244     DO bi=itlo,ithi
245    
246     CALL GMREDI_CALC_TENSOR(
247     I bi, bj, iMin, iMax, jMin, jMax,
248     I sigmaX(1-OLx,1-OLy,1,bi,bj),
249     & sigmaY(1-OLx,1-OLy,1,bi,bj),
250     & sigmaR(1-OLx,1-OLy,1,bi,bj),
251     I myThid )
252    
253     DO k=1,Nr
254     DO j=1-OLy,sNy+OLy
255     DO i=1-OLx,sNx+OLx
256     if (smooth3DtypeH(smoothOpNbCur).EQ.2) then
257     Kwx(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)
258     Kwy(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
259     # ifdef GM_EXTRA_DIAGONAL
260     Kuz(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kuz(i,j,k,bi,bj)
261     Kvz(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kvz(i,j,k,bi,bj)
262     # else
263     Kuz(i,j,k,bi,bj)=0.
264     Kvz(i,j,k,bi,bj)=0.
265     # endif
266     else
267     Kwx(i,j,k,bi,bj)=2*wc01_3D_Lx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)
268     Kwy(i,j,k,bi,bj)=2*wc01_3D_Lx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
269     Kuz(i,j,k,bi,bj)=0.
270     Kvz(i,j,k,bi,bj)=0.
271     endif
272     Kwz(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kwz(i,j,k,bi,bj)
273     Kux(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kux(i,j,k,bi,bj)
274     Kvy(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kvy(i,j,k,bi,bj)
275     ENDDO
276     ENDDO
277     ENDDO
278    
279     c begin: to restrain the Kz based on grid cells
280     DO k=1,Nr
281     DO j=1-OLy,sNy+OLy
282     DO i=1-OLx,sNx+OLx
283    
284     wc01_3D_KzMax=drC(k)
285     wc01_3D_KzMax=wc01_3D_KzMax*wc01_3D_KzMax/wc01_T/2
286    
287     if (Kwz(i,j,k,bi,bj).GT.wc01_3D_KzMax) then
288     Kwx(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)
289     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
290     Kwy(i,j,k,bi,bj)=Kwy(i,j,k,bi,bj)
291     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
292     Kuz(i,j,k,bi,bj)=Kuz(i,j,k,bi,bj)
293     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
294     Kvz(i,j,k,bi,bj)=Kvz(i,j,k,bi,bj)
295     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
296     Kux(i,j,k,bi,bj)=Kux(i,j,k,bi,bj)
297     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
298     Kvy(i,j,k,bi,bj)=Kvy(i,j,k,bi,bj)
299     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
300     Kwz(i,j,k,bi,bj)=Kwz(i,j,k,bi,bj)
301     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
302     endif
303     ENDDO
304     ENDDO
305     ENDDO
306     c end: to restrain the Kz based on grid cells
307    
308    
309     CALL GMREDI_CALC_DIFF(
310     I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
311     U KappaRwc01(1-OLx,1-OLy,1,bi,bj),
312     I myThid)
313    
314     ENDDO
315     ENDDO
316    
317     else
318    
319     c hoizontal operator:
320    
321    
322     if ((smooth3DtypeH(smoothOpNbCur).NE.0).AND.
323     & (smooth3DsizeH(smoothOpNbCur).EQ.3)) then
324     write(fnamegeneric(1:80),'(1a,i3.3)')
325     & 'wc01_3DscalesH',smoothOpNbCur
326     call mdsreadfield(fnamegeneric,64,'RL',nR,
327     & wc01_3D_Lx,1,mythid)
328     call mdsreadfield(fnamegeneric,64,'RL',nR,
329     & wc01_3D_Ly,2,mythid)
330 gforget 1.2 _EXCH_XYZ_RL( wc01_3D_Lx, mythid )
331     _EXCH_XYZ_RL( wc01_3D_Ly, mythid )
332 gforget 1.1 else
333     DO bj=jtlo,jthi
334     DO bi=itlo,ithi
335     DO k=1,Nr
336     DO j=1-OLy,sNy+OLy
337     DO i=1-OLx,sNx+OLx
338     wc01_3D_Lx(i,j,k,bi,bj)=wc01_3D_Lx0(smoothOpNbCur)
339     wc01_3D_Ly(i,j,k,bi,bj)=wc01_3D_Ly0(smoothOpNbCur)
340     ENDDO
341     ENDDO
342     ENDDO
343     ENDDO
344     ENDDO
345     endif
346    
347     if (smooth3DtypeH(smoothOpNbCur).NE.4) then
348     c along model axes
349     DO bj=jtlo,jthi
350     DO bi=itlo,ithi
351     DO k=1,Nr
352     DO j=1-OLy,sNy+OLy
353     DO i=1-OLx,sNx+OLx
354     Kwx(i,j,k,bi,bj)=0.
355     Kwy(i,j,k,bi,bj)=0.
356     Kwz(i,j,k,bi,bj)=0.
357     Kux(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*
358     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
359     Kvy(i,j,k,bi,bj)=wc01_3D_Ly(i,j,k,bi,bj)*
360     & wc01_3D_Ly(i,j,k,bi,bj)/wc01_T/2
361     Kuz(i,j,k,bi,bj)=0.
362     Kvz(i,j,k,bi,bj)=0.
363     ENDDO
364     ENDDO
365     ENDDO
366     ENDDO
367     ENDDO
368    
369     else
370    
371     c along rotated axes
372    
373     write(fnamegeneric(1:80),'(1a,i3.3)')
374     & 'wc01_3DscalesH',smoothOpNbCur
375     if (smooth3DsizeH(smoothOpNbCur).EQ.3) then
376     call mdsreadfield(fnamegeneric,64,'RL',nR,
377     & wc01theta,3,mythid)
378     else
379     call mdsreadfield(fnamegeneric,64,'RL',nR,
380     & wc01theta,1,mythid)
381     endif
382 gforget 1.2 _EXCH_XYZ_RL( wc01theta, mythid )
383 gforget 1.1
384     iMin = 1-OLx
385     iMax = sNx+OLx
386     jMin = 1-OLy
387     jMax = sNy+OLy
388    
389     write(fnamegeneric(1:80),'(1a)') 'wc01_3Dtest'
390    
391     c compute the gradients from the "direction" field
392     DO bj=jtlo,jthi
393     DO bi=itlo,ithi
394     DO k=Nr,1,-1
395     CALL GRAD_SIGMA(
396     & bi, bj, iMin, iMax, jMin, jMax, k,
397     & wc01theta(1-OLx,1-OLy,k,bi,bj),
398     & wc01theta(1-OLx,1-OLy,k,bi,bj),
399     & wc01theta(1-OLx,1-OLy,k,bi,bj),
400     & sigmaX(1-OLx,1-OLy,1,bi,bj),
401     & sigmaY(1-OLx,1-OLy,1,bi,bj),
402     & sigmaR(1-OLx,1-OLy,1,bi,bj),
403     I myThid )
404     ENDDO
405     ENDDO
406     ENDDO
407 gforget 1.2 _EXCH_XYZ_RL( sigmaX, myThid )
408     _EXCH_XYZ_RL( sigmaY, myThid )
409     _EXCH_XYZ_RL( sigmaR, myThid )
410 gforget 1.1
411     call mdswritefield(fnamegeneric,64,.false.,'RL',
412     & nR,sigmaX,1,1,mythid)
413     call mdswritefield(fnamegeneric,64,.false.,'RL',
414     & nR,sigmaY,2,1,mythid)
415    
416     c available for the following computation:
417     c rhok,rhokm1,rhokp1,wc01salt,sigmar
418    
419     c compute the associated cos and sin
420     c rk1: Kwx is cos // Kwy is sin
421     c rk2: 2 is used as a missing value
422     DO bj=jtlo,jthi
423     DO bi=itlo,ithi
424     DO k=1,Nr
425     DO j=1-OLy,sNy+OLy
426     DO i=1-OLx,sNx+OLx
427     rotate_s2=sigmaX(i,j,k,bi,bj)*sigmaX(i,j,k,bi,bj)
428     & +sigmaY(i,j,k,bi,bj)*sigmaY(i,j,k,bi,bj)
429     if ((rotate_s2.GT.0.).AND.(_maskS(i,j,k,bi,bj).NE.0.)
430     & .AND.(_maskW(i,j,k,bi,bj).NE.0.) ) then
431     Kwx(i,j,k,bi,bj)=sigmaY(i,j,k,bi,bj)/sqrt(rotate_s2)
432     Kwy(i,j,k,bi,bj)=-sigmaX(i,j,k,bi,bj)/sqrt(rotate_s2)
433     else
434     Kwx(i,j,k,bi,bj)=2.
435     Kwy(i,j,k,bi,bj)=2.
436     endif
437     ENDDO
438     ENDDO
439     ENDDO
440     ENDDO
441     ENDDO
442    
443     call mdswritefield(fnamegeneric,64,.false.,'RL',
444     & nR,kwx,3,1,mythid)
445     call mdswritefield(fnamegeneric,64,.false.,'RL',
446     & nR,kwy,4,1,mythid)
447    
448     c compute a saturation coefficient: where the angle is changing (heterogeneous)
449     c we will stay isotropic
450     c rk1: Kwz is the angle // wc01salt is the saturation coeff
451     c rk2: the computation uses atan to compute the angle, and has
452     c to be done twice because atan is not continuous at pi/2
453     DO kk=1,2
454    
455     c initialization
456     DO bj=jtlo,jthi
457     DO bi=itlo,ithi
458     DO k=1,Nr
459     DO j=1-OLy,sNy+OLy
460     DO i=1-OLx,sNx+OLx
461     Kwz(i,j,k,bi,bj)=999.
462     if ((Kwx(i,j,k,bi,bj).NE.2.).AND.
463     & (Kwx(i,j,k,bi,bj).NE.0.)) then
464     Kwz(i,j,k,bi,bj)=atan(Kwy(i,j,k,bi,bj)
465     & /Kwx(i,j,k,bi,bj))
466     elseif (Kwx(i,j,k,bi,bj).NE.2.) then
467     Kwz(i,j,k,bi,bj)=sign(pi/2.,Kwy(i,j,k,bi,bj))
468     endif
469     if (kk.EQ.1) then
470     wc01salt(i,j,k,bi,bj)=999.
471     endif
472     c rk: it is important that the missing value is a (large) positive value
473     if ((kk.EQ.2).AND.(Kwz(i,j,k,bi,bj).LT.0.)) then
474     Kwz(i,j,k,bi,bj)=Kwz(i,j,k,bi,bj)+pi
475     endif
476     ENDDO
477     ENDDO
478     ENDDO
479     ENDDO
480     ENDDO
481    
482 gforget 1.2 c _EXCH_XYZ_RL( Kwz, myThid )
483     c _EXCH_XYZ_RL( wc01salt, myThid )
484 gforget 1.1
485     c the computation/update of the saturation coeff
486     DO bj=jtlo,jthi
487     DO bi=itlo,ithi
488     DO k=1,Nr
489     DO j=1,sNy
490     DO i=1,sNx
491     if (Kwz(i,j,k,bi,bj).NE.999.) then
492     rotaTmp1=0.
493     rotaTmp2=0.
494     rotaTmp3=0.
495     do ii=-1,1
496     do jj=-1,1
497     if (Kwz(i+ii,j+jj,k,bi,bj).NE.999.) then
498     rotaTmp1=rotaTmp1+Kwz(i+ii,j+jj,k,bi,bj)
499     rotaTmp2=rotaTmp2+Kwz(i+ii,j+jj,k,bi,bj)*Kwz(i+ii,j+jj,k,bi,bj)
500     rotaTmp3=rotaTmp3+1.
501     endif
502     enddo
503     enddo
504     rotaTmp1=rotaTmp1/rotaTmp3
505     rotaTmp2=rotaTmp2/rotaTmp3
506     rotaTmp3=rotaTmp2-rotaTmp1*rotaTmp1
507     wc01salt(i,j,k,bi,bj)=min(wc01salt(i,j,k,bi,bj),rotaTmp3)
508     if (kk.EQ.2) then
509     rotaTmp3= (1 _d +00 - wc01salt(i,j,k,bi,bj)/(pi/2/6))
510     wc01salt(i,j,k,bi,bj)=max(0 _d +00 , rotaTmp3)
511     endif
512     endif
513     ENDDO
514     ENDDO
515     ENDDO
516     ENDDO
517     ENDDO
518 gforget 1.2 _EXCH_XYZ_RL( wc01salt, myThid )
519 gforget 1.1 ENDDO ! DO kk=1,2
520    
521     call mdswritefield(fnamegeneric,64,.false.,'RL',
522     & nR,wc01salt,5,1,mythid)
523    
524     c finally, compute the diffusion operator
525     c rk: I will need to double-check the limit case (boundary)
526     DO bj=jtlo,jthi
527     DO bi=itlo,ithi
528     DO k=1,Nr
529     DO j=1-OLy,sNy+OLy
530     DO i=1-OLx,sNx+OLx
531     if (Kwz(i,j,k,bi,bj).NE.999.) then
532    
533     rotaTmp1=wc01_3D_Lx(i,j,k,bi,bj)*
534     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
535     rotaTmp2=wc01_3D_Ly(i,j,k,bi,bj)*
536     & wc01_3D_Ly(i,j,k,bi,bj)/wc01_T/2
537    
538     Kuxprime=rotaTmp1
539     Kvyprime=rotaTmp2*wc01salt(i,j,k,bi,bj)
540     & + rotaTmp1*(1.-wc01salt(i,j,k,bi,bj))
541    
542     Kux(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)*Kuxprime
543     & +Kwy(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)*Kvyprime
544     wc01_Kuy(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
545     & *(-Kuxprime+Kvyprime)
546     Kvy(i,j,k,bi,bj)=Kwy(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)*Kuxprime
547     & +Kwx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)*Kvyprime
548     wc01_Kvx(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
549     & *(-Kuxprime+Kvyprime)
550    
551     else
552    
553     rotaTmp1=wc01_3D_Lx(i,j,k,bi,bj)*
554     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
555     Kux(i,j,k,bi,bj)=rotaTmp1
556     wc01_Kuy(i,j,k,bi,bj)=0.
557     Kvy(i,j,k,bi,bj)=rotaTmp1
558     wc01_Kvx(i,j,k,bi,bj)=0.
559    
560     endif
561    
562     Kwx(i,j,k,bi,bj)=0.
563     Kwy(i,j,k,bi,bj)=0.
564     Kwz(i,j,k,bi,bj)=0.
565     Kuz(i,j,k,bi,bj)=0.
566     Kvz(i,j,k,bi,bj)=0.
567     ENDDO
568     ENDDO
569     ENDDO
570     ENDDO
571     ENDDO
572    
573     c OLD VERSION
574     c Kuxprime=wc01_3D_Lx(i,j,k,bi,bj)*
575     c & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
576     c Kvyprime=wc01_3D_Ly(i,j,k,bi,bj)*
577     c & wc01_3D_Ly(i,j,k,bi,bj)/wc01_T/2
578    
579     c rotate_cos=0.7071
580     c rotate_sin=0.7071
581     cc rotate_cos=0.
582     cc rotate_sin=1.
583    
584     c Kux(i,j,k,bi,bj)=rotate_cos*Kuxprime
585     c & -rotate_sin*Kvyprime
586     c Kvy(i,j,k,bi,bj)=rotate_sin*Kuxprime
587     c & +rotate_cos*Kvyprime
588    
589     c DO bj=jtlo,jthi
590     c DO bi=itlo,ithi
591     c DO k=1,Nr
592     c DO j=1-OLy,sNy+OLy
593     c DO i=1-OLx,sNx+OLx
594     c Kux(i,j,k,bi,bj)=rotate_cos*rotate_cos*Kuxprime
595     c & +rotate_sin*rotate_sin*Kvyprime
596     c wc01_Kuy(i,j,k,bi,bj)=rotate_cos*rotate_sin
597     c & *(-Kuxprime+Kvyprime)
598     c Kvy(i,j,k,bi,bj)=rotate_sin*rotate_sin*Kuxprime
599     c & +rotate_cos*rotate_cos*Kvyprime
600     c wc01_Kvx(i,j,k,bi,bj)=rotate_cos*rotate_sin
601     c & *(-Kuxprime+Kvyprime)
602     c Kwx(i,j,k,bi,bj)=0.
603     c Kwy(i,j,k,bi,bj)=0.
604     c Kwz(i,j,k,bi,bj)=0.
605     c Kuz(i,j,k,bi,bj)=0.
606     c Kvz(i,j,k,bi,bj)=0.
607     c ENDDO
608     c ENDDO
609     c ENDDO
610     c ENDDO
611     c ENDDO
612    
613     endif
614    
615     endif
616    
617    
618     c finalize the set sup:
619    
620 gforget 1.2 _EXCH_XYZ_RL( kappaRwc01, myThid )
621 gforget 1.1
622 gforget 1.2 _EXCH_XYZ_RL( Kwx, myThid )
623     _EXCH_XYZ_RL( Kwy, myThid )
624     _EXCH_XYZ_RL( Kwz, myThid )
625     _EXCH_XYZ_RL( Kux, myThid )
626     _EXCH_XYZ_RL( Kvy, myThid )
627     _EXCH_XYZ_RL( Kuz, myThid )
628     _EXCH_XYZ_RL( Kvz, myThid )
629 gforget 1.1
630     DO bj=jtlo,jthi
631     DO bi=itlo,ithi
632     DO k=1,Nr
633     DO j=1-OLy,sNy+OLy
634     DO i=1-OLx,sNx+OLx
635     wc01_Kwx(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)
636     wc01_Kwy(i,j,k,bi,bj)=Kwy(i,j,k,bi,bj)
637     wc01_Kwz(i,j,k,bi,bj)=Kwz(i,j,k,bi,bj)
638     wc01_Kux(i,j,k,bi,bj)=Kux(i,j,k,bi,bj)
639     wc01_Kvy(i,j,k,bi,bj)=Kvy(i,j,k,bi,bj)
640     wc01_Kuz(i,j,k,bi,bj)=Kuz(i,j,k,bi,bj)
641     wc01_Kvz(i,j,k,bi,bj)=Kvz(i,j,k,bi,bj)
642     ENDDO
643     ENDDO
644     ENDDO
645     ENDDO
646     ENDDO
647    
648     c write the diffusion operator into file:
649    
650     write(fnamegeneric(1:80),'(1a,i3.3)')
651     & 'wc01_3Doperator',smoothOpNbCur
652    
653     call mdswritefield(fnamegeneric,64,.false.,'RL',
654     & nR,Kwx,1,1,mythid)
655     call mdswritefield(fnamegeneric,64,.false.,'RL',
656     & nR,Kwy,2,1,mythid)
657     call mdswritefield(fnamegeneric,64,.false.,'RL',
658     & nR,Kwz,3,1,mythid)
659     call mdswritefield(fnamegeneric,64,.false.,'RL',
660     & nR,Kux,4,1,mythid)
661     call mdswritefield(fnamegeneric,64,.false.,'RL',
662     & nR,Kvy,5,1,mythid)
663     call mdswritefield(fnamegeneric,64,.false.,'RL',
664     & nR,Kuz,6,1,mythid)
665     call mdswritefield(fnamegeneric,64,.false.,'RL',
666     & nR,Kvz,7,1,mythid)
667     call mdswritefield(fnamegeneric,64,.false.,'RL',
668     & nR,wc01_Kuy,8,1,mythid)
669     call mdswritefield(fnamegeneric,64,.false.,'RL',
670     & nR,wc01_Kvx,9,1,mythid)
671     call mdswritefield(fnamegeneric,64,.false.,'RL',
672     & nR,kappaRwc01,10,1,mythid)
673    
674    
675     END

  ViewVC Help
Powered by ViewVC 1.1.22