/[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.1 - (hide annotations) (download)
Tue Jun 19 18:23:18 2007 UTC (18 years, 1 month ago) by gforget
Branch: MAIN
pkg/smooth preliminary version

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     _EXCH_XYZ_R8( wc01_3D_Lz, mythid )
75     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     _EXCH_XYZ_R8( kappaRwc01, myThid )
126    
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     _EXCH_XYZ_R8( wc01theta, mythid )
156     _EXCH_XYZ_R8( wc01salt, mythid )
157    
158     if (smooth3DsizeH(smoothOpNbCur).EQ.3) then
159     call mdsreadfield(fnamegeneric,64,'RL',nR,
160     & wc01_3D_Lx,3,mythid)
161     _EXCH_XYZ_R8( wc01_3D_Lx, mythid )
162     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     _EXCH_XYZ_R8( wc01_3D_Lx, mythid )
191    
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     CALL FIND_RHO(
201     I bi, bj, iMin, iMax, jMin, jMax, k, k,
202     I wc01theta, wc01salt,
203     O rhoK(1-OLx,1-OLy,bi,bj),
204     I myThid )
205     IF (k.GT.1) THEN
206     CALL FIND_RHO(
207     I bi, bj, iMin, iMax, jMin, jMax, k-1, k,
208     I wc01theta, wc01salt,
209     O rhoKm1(1-OLx,1-OLy,bi,bj),
210     I myThid )
211     ELSE
212     DO j=1-OLy,sNy+OLy
213     DO i=1-OLx,sNx+OLx
214     rhoKm1(i,j,bi,bj)=rhoK(i,j,bi,bj)
215     ENDDO
216     ENDDO
217     ENDIF
218     DO j=1-OLy,sNy+OLy
219     DO i=1-OLx,sNx+OLx
220     rhoKp1(i,j,bi,bj)=rhoK(i,j,bi,bj)
221     ENDDO
222     ENDDO
223     cgf rk: GRAD_SIGMA ne calcule la derivee verticale au point w, entre Km1 et K
224     CALL GRAD_SIGMA(
225     & bi, bj, iMin, iMax, jMin, jMax, k,
226     & rhoK(1-OLx,1-OLy,bi,bj),
227     & rhoKm1(1-OLx,1-OLy,bi,bj),
228     & rhoKp1(1-OLx,1-OLy,bi,bj),
229     & sigmaX(1-OLx,1-OLy,1,bi,bj),
230     & sigmaY(1-OLx,1-OLy,1,bi,bj),
231     & sigmaR(1-OLx,1-OLy,1,bi,bj),
232     I myThid )
233     ENDDO
234     ENDDO
235     ENDDO
236    
237     _EXCH_XYZ_R8( sigmaX, myThid )
238     _EXCH_XYZ_R8( sigmaY, myThid )
239     _EXCH_XYZ_R8( sigmaR, myThid )
240    
241     DO bj=jtlo,jthi
242     DO bi=itlo,ithi
243    
244     CALL GMREDI_CALC_TENSOR(
245     I bi, bj, iMin, iMax, jMin, jMax,
246     I sigmaX(1-OLx,1-OLy,1,bi,bj),
247     & sigmaY(1-OLx,1-OLy,1,bi,bj),
248     & sigmaR(1-OLx,1-OLy,1,bi,bj),
249     I myThid )
250    
251     DO k=1,Nr
252     DO j=1-OLy,sNy+OLy
253     DO i=1-OLx,sNx+OLx
254     if (smooth3DtypeH(smoothOpNbCur).EQ.2) then
255     Kwx(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)
256     Kwy(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
257     # ifdef GM_EXTRA_DIAGONAL
258     Kuz(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kuz(i,j,k,bi,bj)
259     Kvz(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kvz(i,j,k,bi,bj)
260     # else
261     Kuz(i,j,k,bi,bj)=0.
262     Kvz(i,j,k,bi,bj)=0.
263     # endif
264     else
265     Kwx(i,j,k,bi,bj)=2*wc01_3D_Lx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)
266     Kwy(i,j,k,bi,bj)=2*wc01_3D_Lx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
267     Kuz(i,j,k,bi,bj)=0.
268     Kvz(i,j,k,bi,bj)=0.
269     endif
270     Kwz(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kwz(i,j,k,bi,bj)
271     Kux(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kux(i,j,k,bi,bj)
272     Kvy(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*Kvy(i,j,k,bi,bj)
273     ENDDO
274     ENDDO
275     ENDDO
276    
277     c begin: to restrain the Kz based on grid cells
278     DO k=1,Nr
279     DO j=1-OLy,sNy+OLy
280     DO i=1-OLx,sNx+OLx
281    
282     wc01_3D_KzMax=drC(k)
283     wc01_3D_KzMax=wc01_3D_KzMax*wc01_3D_KzMax/wc01_T/2
284    
285     if (Kwz(i,j,k,bi,bj).GT.wc01_3D_KzMax) then
286     Kwx(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)
287     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
288     Kwy(i,j,k,bi,bj)=Kwy(i,j,k,bi,bj)
289     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
290     Kuz(i,j,k,bi,bj)=Kuz(i,j,k,bi,bj)
291     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
292     Kvz(i,j,k,bi,bj)=Kvz(i,j,k,bi,bj)
293     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
294     Kux(i,j,k,bi,bj)=Kux(i,j,k,bi,bj)
295     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
296     Kvy(i,j,k,bi,bj)=Kvy(i,j,k,bi,bj)
297     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
298     Kwz(i,j,k,bi,bj)=Kwz(i,j,k,bi,bj)
299     & *wc01_3D_KzMax/Kwz(i,j,k,bi,bj)
300     endif
301     ENDDO
302     ENDDO
303     ENDDO
304     c end: to restrain the Kz based on grid cells
305    
306    
307     CALL GMREDI_CALC_DIFF(
308     I bi,bj,iMin,iMax,jMin,jMax,0,Nr,
309     U KappaRwc01(1-OLx,1-OLy,1,bi,bj),
310     I myThid)
311    
312     ENDDO
313     ENDDO
314    
315     else
316    
317     c hoizontal operator:
318    
319    
320     if ((smooth3DtypeH(smoothOpNbCur).NE.0).AND.
321     & (smooth3DsizeH(smoothOpNbCur).EQ.3)) then
322     write(fnamegeneric(1:80),'(1a,i3.3)')
323     & 'wc01_3DscalesH',smoothOpNbCur
324     call mdsreadfield(fnamegeneric,64,'RL',nR,
325     & wc01_3D_Lx,1,mythid)
326     call mdsreadfield(fnamegeneric,64,'RL',nR,
327     & wc01_3D_Ly,2,mythid)
328     _EXCH_XYZ_R8( wc01_3D_Lx, mythid )
329     _EXCH_XYZ_R8( wc01_3D_Ly, mythid )
330     else
331     DO bj=jtlo,jthi
332     DO bi=itlo,ithi
333     DO k=1,Nr
334     DO j=1-OLy,sNy+OLy
335     DO i=1-OLx,sNx+OLx
336     wc01_3D_Lx(i,j,k,bi,bj)=wc01_3D_Lx0(smoothOpNbCur)
337     wc01_3D_Ly(i,j,k,bi,bj)=wc01_3D_Ly0(smoothOpNbCur)
338     ENDDO
339     ENDDO
340     ENDDO
341     ENDDO
342     ENDDO
343     endif
344    
345     if (smooth3DtypeH(smoothOpNbCur).NE.4) then
346     c along model axes
347     DO bj=jtlo,jthi
348     DO bi=itlo,ithi
349     DO k=1,Nr
350     DO j=1-OLy,sNy+OLy
351     DO i=1-OLx,sNx+OLx
352     Kwx(i,j,k,bi,bj)=0.
353     Kwy(i,j,k,bi,bj)=0.
354     Kwz(i,j,k,bi,bj)=0.
355     Kux(i,j,k,bi,bj)=wc01_3D_Lx(i,j,k,bi,bj)*
356     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
357     Kvy(i,j,k,bi,bj)=wc01_3D_Ly(i,j,k,bi,bj)*
358     & wc01_3D_Ly(i,j,k,bi,bj)/wc01_T/2
359     Kuz(i,j,k,bi,bj)=0.
360     Kvz(i,j,k,bi,bj)=0.
361     ENDDO
362     ENDDO
363     ENDDO
364     ENDDO
365     ENDDO
366    
367     else
368    
369     c along rotated axes
370    
371     write(fnamegeneric(1:80),'(1a,i3.3)')
372     & 'wc01_3DscalesH',smoothOpNbCur
373     if (smooth3DsizeH(smoothOpNbCur).EQ.3) then
374     call mdsreadfield(fnamegeneric,64,'RL',nR,
375     & wc01theta,3,mythid)
376     else
377     call mdsreadfield(fnamegeneric,64,'RL',nR,
378     & wc01theta,1,mythid)
379     endif
380     _EXCH_XYZ_R8( wc01theta, mythid )
381    
382     iMin = 1-OLx
383     iMax = sNx+OLx
384     jMin = 1-OLy
385     jMax = sNy+OLy
386    
387     write(fnamegeneric(1:80),'(1a)') 'wc01_3Dtest'
388    
389     c compute the gradients from the "direction" field
390     DO bj=jtlo,jthi
391     DO bi=itlo,ithi
392     DO k=Nr,1,-1
393     CALL GRAD_SIGMA(
394     & bi, bj, iMin, iMax, jMin, jMax, k,
395     & wc01theta(1-OLx,1-OLy,k,bi,bj),
396     & wc01theta(1-OLx,1-OLy,k,bi,bj),
397     & wc01theta(1-OLx,1-OLy,k,bi,bj),
398     & sigmaX(1-OLx,1-OLy,1,bi,bj),
399     & sigmaY(1-OLx,1-OLy,1,bi,bj),
400     & sigmaR(1-OLx,1-OLy,1,bi,bj),
401     I myThid )
402     ENDDO
403     ENDDO
404     ENDDO
405     _EXCH_XYZ_R8( sigmaX, myThid )
406     _EXCH_XYZ_R8( sigmaY, myThid )
407     _EXCH_XYZ_R8( sigmaR, myThid )
408    
409     call mdswritefield(fnamegeneric,64,.false.,'RL',
410     & nR,sigmaX,1,1,mythid)
411     call mdswritefield(fnamegeneric,64,.false.,'RL',
412     & nR,sigmaY,2,1,mythid)
413    
414     c available for the following computation:
415     c rhok,rhokm1,rhokp1,wc01salt,sigmar
416    
417     c compute the associated cos and sin
418     c rk1: Kwx is cos // Kwy is sin
419     c rk2: 2 is used as a missing value
420     DO bj=jtlo,jthi
421     DO bi=itlo,ithi
422     DO k=1,Nr
423     DO j=1-OLy,sNy+OLy
424     DO i=1-OLx,sNx+OLx
425     rotate_s2=sigmaX(i,j,k,bi,bj)*sigmaX(i,j,k,bi,bj)
426     & +sigmaY(i,j,k,bi,bj)*sigmaY(i,j,k,bi,bj)
427     if ((rotate_s2.GT.0.).AND.(_maskS(i,j,k,bi,bj).NE.0.)
428     & .AND.(_maskW(i,j,k,bi,bj).NE.0.) ) then
429     Kwx(i,j,k,bi,bj)=sigmaY(i,j,k,bi,bj)/sqrt(rotate_s2)
430     Kwy(i,j,k,bi,bj)=-sigmaX(i,j,k,bi,bj)/sqrt(rotate_s2)
431     else
432     Kwx(i,j,k,bi,bj)=2.
433     Kwy(i,j,k,bi,bj)=2.
434     endif
435     ENDDO
436     ENDDO
437     ENDDO
438     ENDDO
439     ENDDO
440    
441     call mdswritefield(fnamegeneric,64,.false.,'RL',
442     & nR,kwx,3,1,mythid)
443     call mdswritefield(fnamegeneric,64,.false.,'RL',
444     & nR,kwy,4,1,mythid)
445    
446     c compute a saturation coefficient: where the angle is changing (heterogeneous)
447     c we will stay isotropic
448     c rk1: Kwz is the angle // wc01salt is the saturation coeff
449     c rk2: the computation uses atan to compute the angle, and has
450     c to be done twice because atan is not continuous at pi/2
451     DO kk=1,2
452    
453     c initialization
454     DO bj=jtlo,jthi
455     DO bi=itlo,ithi
456     DO k=1,Nr
457     DO j=1-OLy,sNy+OLy
458     DO i=1-OLx,sNx+OLx
459     Kwz(i,j,k,bi,bj)=999.
460     if ((Kwx(i,j,k,bi,bj).NE.2.).AND.
461     & (Kwx(i,j,k,bi,bj).NE.0.)) then
462     Kwz(i,j,k,bi,bj)=atan(Kwy(i,j,k,bi,bj)
463     & /Kwx(i,j,k,bi,bj))
464     elseif (Kwx(i,j,k,bi,bj).NE.2.) then
465     Kwz(i,j,k,bi,bj)=sign(pi/2.,Kwy(i,j,k,bi,bj))
466     endif
467     if (kk.EQ.1) then
468     wc01salt(i,j,k,bi,bj)=999.
469     endif
470     c rk: it is important that the missing value is a (large) positive value
471     if ((kk.EQ.2).AND.(Kwz(i,j,k,bi,bj).LT.0.)) then
472     Kwz(i,j,k,bi,bj)=Kwz(i,j,k,bi,bj)+pi
473     endif
474     ENDDO
475     ENDDO
476     ENDDO
477     ENDDO
478     ENDDO
479    
480     c _EXCH_XYZ_R8( Kwz, myThid )
481     c _EXCH_XYZ_R8( wc01salt, myThid )
482    
483     c the computation/update of the saturation coeff
484     DO bj=jtlo,jthi
485     DO bi=itlo,ithi
486     DO k=1,Nr
487     DO j=1,sNy
488     DO i=1,sNx
489     if (Kwz(i,j,k,bi,bj).NE.999.) then
490     rotaTmp1=0.
491     rotaTmp2=0.
492     rotaTmp3=0.
493     do ii=-1,1
494     do jj=-1,1
495     if (Kwz(i+ii,j+jj,k,bi,bj).NE.999.) then
496     rotaTmp1=rotaTmp1+Kwz(i+ii,j+jj,k,bi,bj)
497     rotaTmp2=rotaTmp2+Kwz(i+ii,j+jj,k,bi,bj)*Kwz(i+ii,j+jj,k,bi,bj)
498     rotaTmp3=rotaTmp3+1.
499     endif
500     enddo
501     enddo
502     rotaTmp1=rotaTmp1/rotaTmp3
503     rotaTmp2=rotaTmp2/rotaTmp3
504     rotaTmp3=rotaTmp2-rotaTmp1*rotaTmp1
505     wc01salt(i,j,k,bi,bj)=min(wc01salt(i,j,k,bi,bj),rotaTmp3)
506     if (kk.EQ.2) then
507     rotaTmp3= (1 _d +00 - wc01salt(i,j,k,bi,bj)/(pi/2/6))
508     wc01salt(i,j,k,bi,bj)=max(0 _d +00 , rotaTmp3)
509     endif
510     endif
511     ENDDO
512     ENDDO
513     ENDDO
514     ENDDO
515     ENDDO
516     _EXCH_XYZ_R8( wc01salt, myThid )
517     ENDDO ! DO kk=1,2
518    
519     call mdswritefield(fnamegeneric,64,.false.,'RL',
520     & nR,wc01salt,5,1,mythid)
521    
522     c finally, compute the diffusion operator
523     c rk: I will need to double-check the limit case (boundary)
524     DO bj=jtlo,jthi
525     DO bi=itlo,ithi
526     DO k=1,Nr
527     DO j=1-OLy,sNy+OLy
528     DO i=1-OLx,sNx+OLx
529     if (Kwz(i,j,k,bi,bj).NE.999.) then
530    
531     rotaTmp1=wc01_3D_Lx(i,j,k,bi,bj)*
532     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
533     rotaTmp2=wc01_3D_Ly(i,j,k,bi,bj)*
534     & wc01_3D_Ly(i,j,k,bi,bj)/wc01_T/2
535    
536     Kuxprime=rotaTmp1
537     Kvyprime=rotaTmp2*wc01salt(i,j,k,bi,bj)
538     & + rotaTmp1*(1.-wc01salt(i,j,k,bi,bj))
539    
540     Kux(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)*Kuxprime
541     & +Kwy(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)*Kvyprime
542     wc01_Kuy(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
543     & *(-Kuxprime+Kvyprime)
544     Kvy(i,j,k,bi,bj)=Kwy(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)*Kuxprime
545     & +Kwx(i,j,k,bi,bj)*Kwx(i,j,k,bi,bj)*Kvyprime
546     wc01_Kvx(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)*Kwy(i,j,k,bi,bj)
547     & *(-Kuxprime+Kvyprime)
548    
549     else
550    
551     rotaTmp1=wc01_3D_Lx(i,j,k,bi,bj)*
552     & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
553     Kux(i,j,k,bi,bj)=rotaTmp1
554     wc01_Kuy(i,j,k,bi,bj)=0.
555     Kvy(i,j,k,bi,bj)=rotaTmp1
556     wc01_Kvx(i,j,k,bi,bj)=0.
557    
558     endif
559    
560     Kwx(i,j,k,bi,bj)=0.
561     Kwy(i,j,k,bi,bj)=0.
562     Kwz(i,j,k,bi,bj)=0.
563     Kuz(i,j,k,bi,bj)=0.
564     Kvz(i,j,k,bi,bj)=0.
565     ENDDO
566     ENDDO
567     ENDDO
568     ENDDO
569     ENDDO
570    
571     c OLD VERSION
572     c Kuxprime=wc01_3D_Lx(i,j,k,bi,bj)*
573     c & wc01_3D_Lx(i,j,k,bi,bj)/wc01_T/2
574     c Kvyprime=wc01_3D_Ly(i,j,k,bi,bj)*
575     c & wc01_3D_Ly(i,j,k,bi,bj)/wc01_T/2
576    
577     c rotate_cos=0.7071
578     c rotate_sin=0.7071
579     cc rotate_cos=0.
580     cc rotate_sin=1.
581    
582     c Kux(i,j,k,bi,bj)=rotate_cos*Kuxprime
583     c & -rotate_sin*Kvyprime
584     c Kvy(i,j,k,bi,bj)=rotate_sin*Kuxprime
585     c & +rotate_cos*Kvyprime
586    
587     c DO bj=jtlo,jthi
588     c DO bi=itlo,ithi
589     c DO k=1,Nr
590     c DO j=1-OLy,sNy+OLy
591     c DO i=1-OLx,sNx+OLx
592     c Kux(i,j,k,bi,bj)=rotate_cos*rotate_cos*Kuxprime
593     c & +rotate_sin*rotate_sin*Kvyprime
594     c wc01_Kuy(i,j,k,bi,bj)=rotate_cos*rotate_sin
595     c & *(-Kuxprime+Kvyprime)
596     c Kvy(i,j,k,bi,bj)=rotate_sin*rotate_sin*Kuxprime
597     c & +rotate_cos*rotate_cos*Kvyprime
598     c wc01_Kvx(i,j,k,bi,bj)=rotate_cos*rotate_sin
599     c & *(-Kuxprime+Kvyprime)
600     c Kwx(i,j,k,bi,bj)=0.
601     c Kwy(i,j,k,bi,bj)=0.
602     c Kwz(i,j,k,bi,bj)=0.
603     c Kuz(i,j,k,bi,bj)=0.
604     c Kvz(i,j,k,bi,bj)=0.
605     c ENDDO
606     c ENDDO
607     c ENDDO
608     c ENDDO
609     c ENDDO
610    
611     endif
612    
613     endif
614    
615    
616     c finalize the set sup:
617    
618     _EXCH_XYZ_R8( kappaRwc01, myThid )
619    
620     _EXCH_XYZ_R8( Kwx, myThid )
621     _EXCH_XYZ_R8( Kwy, myThid )
622     _EXCH_XYZ_R8( Kwz, myThid )
623     _EXCH_XYZ_R8( Kux, myThid )
624     _EXCH_XYZ_R8( Kvy, myThid )
625     _EXCH_XYZ_R8( Kuz, myThid )
626     _EXCH_XYZ_R8( Kvz, myThid )
627    
628     DO bj=jtlo,jthi
629     DO bi=itlo,ithi
630     DO k=1,Nr
631     DO j=1-OLy,sNy+OLy
632     DO i=1-OLx,sNx+OLx
633     wc01_Kwx(i,j,k,bi,bj)=Kwx(i,j,k,bi,bj)
634     wc01_Kwy(i,j,k,bi,bj)=Kwy(i,j,k,bi,bj)
635     wc01_Kwz(i,j,k,bi,bj)=Kwz(i,j,k,bi,bj)
636     wc01_Kux(i,j,k,bi,bj)=Kux(i,j,k,bi,bj)
637     wc01_Kvy(i,j,k,bi,bj)=Kvy(i,j,k,bi,bj)
638     wc01_Kuz(i,j,k,bi,bj)=Kuz(i,j,k,bi,bj)
639     wc01_Kvz(i,j,k,bi,bj)=Kvz(i,j,k,bi,bj)
640     ENDDO
641     ENDDO
642     ENDDO
643     ENDDO
644     ENDDO
645    
646     c write the diffusion operator into file:
647    
648     write(fnamegeneric(1:80),'(1a,i3.3)')
649     & 'wc01_3Doperator',smoothOpNbCur
650    
651     call mdswritefield(fnamegeneric,64,.false.,'RL',
652     & nR,Kwx,1,1,mythid)
653     call mdswritefield(fnamegeneric,64,.false.,'RL',
654     & nR,Kwy,2,1,mythid)
655     call mdswritefield(fnamegeneric,64,.false.,'RL',
656     & nR,Kwz,3,1,mythid)
657     call mdswritefield(fnamegeneric,64,.false.,'RL',
658     & nR,Kux,4,1,mythid)
659     call mdswritefield(fnamegeneric,64,.false.,'RL',
660     & nR,Kvy,5,1,mythid)
661     call mdswritefield(fnamegeneric,64,.false.,'RL',
662     & nR,Kuz,6,1,mythid)
663     call mdswritefield(fnamegeneric,64,.false.,'RL',
664     & nR,Kvz,7,1,mythid)
665     call mdswritefield(fnamegeneric,64,.false.,'RL',
666     & nR,wc01_Kuy,8,1,mythid)
667     call mdswritefield(fnamegeneric,64,.false.,'RL',
668     & nR,wc01_Kvx,9,1,mythid)
669     call mdswritefield(fnamegeneric,64,.false.,'RL',
670     & nR,kappaRwc01,10,1,mythid)
671    
672    
673     END

  ViewVC Help
Powered by ViewVC 1.1.22