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

Contents 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 - (show 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 #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_RL( 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_RL( 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_RL( wc01theta, mythid )
156 _EXCH_XYZ_RL( 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_RL( 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_RL( 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_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 O rhoK(1-OLx,1-OLy,bi,bj),
205 I k, bi, bj, myThid )
206 IF (k.GT.1) THEN
207 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 O rhoKm1(1-OLx,1-OLy,bi,bj),
212 I k-1, bi, bj, myThid )
213 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 _EXCH_XYZ_RL( sigmaX, myThid )
240 _EXCH_XYZ_RL( sigmaY, myThid )
241 _EXCH_XYZ_RL( sigmaR, myThid )
242
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 _EXCH_XYZ_RL( wc01_3D_Lx, mythid )
331 _EXCH_XYZ_RL( wc01_3D_Ly, mythid )
332 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 _EXCH_XYZ_RL( wc01theta, mythid )
383
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 _EXCH_XYZ_RL( sigmaX, myThid )
408 _EXCH_XYZ_RL( sigmaY, myThid )
409 _EXCH_XYZ_RL( sigmaR, myThid )
410
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 c _EXCH_XYZ_RL( Kwz, myThid )
483 c _EXCH_XYZ_RL( wc01salt, myThid )
484
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 _EXCH_XYZ_RL( wc01salt, myThid )
519 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 _EXCH_XYZ_RL( kappaRwc01, myThid )
621
622 _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
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