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

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