1 |
C $Header$ |
C $Header$ |
2 |
C $Name$ |
C $Name$ |
3 |
#include "CPP_OPTIONS.h" |
#include "TIMEAVE_OPTIONS.h" |
4 |
|
|
5 |
CStartofinterface |
CStartofinterface |
6 |
SUBROUTINE TIMEAVE_CUMUL_2V( |
SUBROUTINE TIMEAVE_CUMUL_2V( |
7 |
O fldtave, |
O fldtave, |
8 |
I fld1, fld2, Ksize, dir, deltaT, |
I fld1, fld2, Ksize, dir, deltaT, |
9 |
I bi, bj, myThid ) |
I bi, bj, myThid ) |
10 |
C /==========================================================\ |
C /==========================================================* |
11 |
C | SUBROUTINE TIMEAVE_CUMUL_2V | |
C | SUBROUTINE TIMEAVE_CUMUL_2V |
12 |
C | o Sum over time a product of two arrays depending on the | |
C | o Sum over time a product of two arrays depending on the |
13 |
C | type of the second array (tracer_grid, u_grid, v_grid) | |
C | relative position of the 2 fields. |
14 |
C | The first array must be on tracer_grid | |
C | (tracer point, u, v, w ...) |
15 |
C \==========================================================/ |
C \==========================================================* |
16 |
IMPLICIT NONE |
IMPLICIT NONE |
17 |
|
|
18 |
C == Global variables === |
C == Global variables === |
19 |
#include "SIZE.h" |
#include "SIZE.h" |
20 |
#include "EEPARAMS.h" |
#include "EEPARAMS.h" |
21 |
|
#include "GRID.h" |
22 |
|
|
23 |
C == Routine arguments == |
C == Routine arguments == |
24 |
C myThid - Thread number for this instance of the routine. |
C myThid - Thread number for this instance of the routine. |
25 |
C fldtave - time averaged Field |
C fldtave - time averaged Field |
26 |
C fld1,fld2 - Input Field |
C fld1,fld2 - Input Field |
27 |
C dir - type of grid for 2nd array (0: tracer, 1: zonal, 2 merid) |
C dir - type of grid for 2nd array relatively to the 1rst array |
28 |
|
C 0: same grid ; 1: dX/2 shift ; 2: dY/2 shift ; 3: dr/2 shift |
29 |
|
C (2 digits => also shift the 1rst array) |
30 |
C Ksize - 3rd dimension of local arrays (Input and Output fields) |
C Ksize - 3rd dimension of local arrays (Input and Output fields) |
31 |
INTEGER Ksize, dir |
INTEGER Ksize, dir |
32 |
_RL fld1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy) |
_RL fld1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Ksize,nSx,nSy) |
37 |
|
|
38 |
CEndofinterface |
CEndofinterface |
39 |
|
|
40 |
|
#ifdef ALLOW_TIMEAVE |
41 |
C == Local variables == |
C == Local variables == |
42 |
C i,j,k,bi,bj - Loop counters |
C i,j,k,bi,bj - Loop counters |
43 |
INTEGER i, j, k |
INTEGER i, j, k |
44 |
|
INTEGER km1 |
45 |
|
|
46 |
IF ( dir.eq.0 ) THEN |
IF ( dir.eq.0 ) THEN |
47 |
|
c- both fields at the same location : |
48 |
|
|
49 |
C DO bj = myByLo(myThid), myByHi(myThid) |
C DO bj = myByLo(myThid), myByHi(myThid) |
50 |
C DO bi = myBxLo(myThid), myBxHi(myThid) |
C DO bi = myBxLo(myThid), myBxHi(myThid) |
53 |
DO i=1,sNx |
DO i=1,sNx |
54 |
fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj) |
fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj) |
55 |
& + fld1(i,j,k,bi,bj)*fld2(i,j,k,bi,bj)*deltaT |
& + fld1(i,j,k,bi,bj)*fld2(i,j,k,bi,bj)*deltaT |
|
ENDDO |
|
56 |
ENDDO |
ENDDO |
57 |
ENDDO |
ENDDO |
58 |
C ENDDO |
ENDDO |
59 |
C ENDDO |
C ENDDO |
60 |
|
C ENDDO |
61 |
|
|
62 |
ELSEIF ( dir.eq.1 ) THEN |
ELSEIF ( dir.eq.1 ) THEN |
63 |
|
c- 2nd field shifted by -dX/2 (e.g.: 1=T, 2=U) : |
64 |
|
|
|
C DO bj = myByLo(myThid), myByHi(myThid) |
|
|
C DO bi = myBxLo(myThid), myBxHi(myThid) |
|
65 |
DO k=1,Ksize |
DO k=1,Ksize |
66 |
DO j=1,sNy |
DO j=1,sNy |
67 |
DO i=1,sNx |
DO i=1,sNx |
69 |
& + .5 * ( fld1(i-1,j,k,bi,bj) + fld1(i,j,k,bi,bj) ) |
& + .5 * ( fld1(i-1,j,k,bi,bj) + fld1(i,j,k,bi,bj) ) |
70 |
& * fld2(i,j,k,bi,bj) |
& * fld2(i,j,k,bi,bj) |
71 |
& * deltaT |
& * deltaT |
|
ENDDO |
|
72 |
ENDDO |
ENDDO |
73 |
ENDDO |
ENDDO |
74 |
C ENDDO |
ENDDO |
|
C ENDDO |
|
75 |
|
|
76 |
ELSEIF ( dir.eq.2 ) THEN |
ELSEIF ( dir.eq.2 ) THEN |
77 |
|
c- 2nd field shifted by -dY/2 (e.g.: 1=T, 2=V) : |
78 |
|
|
|
C DO bj = myByLo(myThid), myByHi(myThid) |
|
|
C DO bi = myBxLo(myThid), myBxHi(myThid) |
|
79 |
DO k=1,Ksize |
DO k=1,Ksize |
80 |
DO j=1,sNy |
DO j=1,sNy |
81 |
DO i=1,sNx |
DO i=1,sNx |
83 |
& + .5 * ( fld1(i,j-1,k,bi,bj) + fld1(i,j,k,bi,bj) ) |
& + .5 * ( fld1(i,j-1,k,bi,bj) + fld1(i,j,k,bi,bj) ) |
84 |
& * fld2(i,j,k,bi,bj) |
& * fld2(i,j,k,bi,bj) |
85 |
& * deltaT |
& * deltaT |
|
ENDDO |
|
86 |
ENDDO |
ENDDO |
87 |
ENDDO |
ENDDO |
88 |
C ENDDO |
ENDDO |
89 |
C ENDDO |
|
90 |
|
ELSEIF ( dir.eq.3 ) THEN |
91 |
|
c- 2nd field shifted by -dR/2 (e.g.: 1=T, 2=W) : |
92 |
|
|
93 |
|
DO k=1,Ksize |
94 |
|
km1 = MAX(k-1,1) |
95 |
|
DO j=1,sNy |
96 |
|
DO i=1,sNx |
97 |
|
fldtave(i,j,k,bi,bj)= fldtave(i,j,k,bi,bj) |
98 |
|
& + .5 * ( fld1(i,j,km1,bi,bj) + fld1(i,j,k,bi,bj) ) |
99 |
|
& * fld2(i,j,k,bi,bj) |
100 |
|
& * deltaT |
101 |
|
ENDDO |
102 |
|
ENDDO |
103 |
|
ENDDO |
104 |
|
|
105 |
|
ELSEIF ( dir.eq.12 ) THEN |
106 |
|
c- 1rst & 2nd fields shifted by -dY/2 & -dX/2 |
107 |
|
c (e.g.: 1=U, 2=V, product at the corner) : |
108 |
|
|
109 |
|
DO k=1,Ksize |
110 |
|
DO j=1,sNy |
111 |
|
DO i=1,sNx |
112 |
|
fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) |
113 |
|
& + .25 _d 0*( fld1(i,j-1,k,bi,bj) + fld1(i,j,k,bi,bj) ) |
114 |
|
& *( fld2(i-1,j,k,bi,bj) + fld2(i,j,k,bi,bj) ) |
115 |
|
& * deltaT |
116 |
|
ENDDO |
117 |
|
ENDDO |
118 |
|
ENDDO |
119 |
|
|
120 |
|
ELSEIF ( dir.eq.13 ) THEN |
121 |
|
c- 1rst & 2nd fields shifted by -dR/2 & -dX/2 (e.g.: 1=U, 2=W): |
122 |
|
|
123 |
|
DO k=1,Ksize |
124 |
|
km1 = MAX(k-1,1) |
125 |
|
DO j=1,sNy |
126 |
|
DO i=1,sNx |
127 |
|
fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) |
128 |
|
& + .25 _d 0*( fld1(i,j,km1,bi,bj) + fld1(i,j,k,bi,bj) ) |
129 |
|
& *( fld2(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj) |
130 |
|
& +fld2( i ,j,k,bi,bj)*rA( i ,j,bi,bj) |
131 |
|
& )*recip_rAw(i,j,bi,bj) |
132 |
|
& * deltaT |
133 |
|
ENDDO |
134 |
|
ENDDO |
135 |
|
ENDDO |
136 |
|
|
137 |
|
ELSEIF ( dir.eq.23 ) THEN |
138 |
|
c- 1rst & 2nd fields shifted by -dR/2 & -dY/2 (e.g.: 1=V, 2=W): |
139 |
|
|
140 |
|
DO k=1,Ksize |
141 |
|
km1 = MAX(k-1,1) |
142 |
|
DO j=1,sNy |
143 |
|
DO i=1,sNx |
144 |
|
fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) |
145 |
|
& + .25 _d 0*( fld1(i,j,km1,bi,bj) + fld1(i,j,k,bi,bj) ) |
146 |
|
& *( fld2(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj) |
147 |
|
& +fld2(i, j ,k,bi,bj)*rA(i, j ,bi,bj) |
148 |
|
& )*recip_rAs(i,j,bi,bj) |
149 |
|
& * deltaT |
150 |
|
ENDDO |
151 |
|
ENDDO |
152 |
|
ENDDO |
153 |
|
|
154 |
|
ELSEIF ( dir.eq.-13 ) THEN |
155 |
|
c- gradient of the 1rst field * 2nd fields, shifted by -dR/2 & -dX/2 resp. |
156 |
|
c- (e.g.: used for advective form of vertical advection: w.du/dr) |
157 |
|
|
158 |
|
DO k=2,Ksize |
159 |
|
DO j=1,sNy |
160 |
|
DO i=1,sNx |
161 |
|
fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) |
162 |
|
& + .5 _d 0*( fld1(i,j,k-1,bi,bj) - fld1(i,j,k,bi,bj) ) |
163 |
|
& *( fld2(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj) |
164 |
|
& +fld2( i ,j,k,bi,bj)*rA( i ,j,bi,bj) |
165 |
|
& )*recip_rAw(i,j,bi,bj) |
166 |
|
& * deltaT |
167 |
|
ENDDO |
168 |
|
ENDDO |
169 |
|
ENDDO |
170 |
|
|
171 |
|
ELSEIF ( dir.eq.-23 ) THEN |
172 |
|
c- gradient of the 1rst field * 2nd fields, shifted by -dR/2 & -dY/2 resp. |
173 |
|
c- (e.g.: used for advective form of vertical advection: w.dv/dr) |
174 |
|
|
175 |
|
DO k=2,Ksize |
176 |
|
DO j=1,sNy |
177 |
|
DO i=1,sNx |
178 |
|
fldtave(i,j,k,bi,bj) = fldtave(i,j,k,bi,bj) |
179 |
|
& + .5 _d 0*( fld1(i,j,k-1,bi,bj) - fld1(i,j,k,bi,bj) ) |
180 |
|
& *( fld2(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj) |
181 |
|
& +fld2(i, j ,k,bi,bj)*rA(i, j ,bi,bj) |
182 |
|
& )*recip_rAs(i,j,bi,bj) |
183 |
|
& * deltaT |
184 |
|
ENDDO |
185 |
|
ENDDO |
186 |
|
ENDDO |
187 |
|
|
188 |
ENDIF |
ENDIF |
189 |
|
|
190 |
|
#endif /* ALLOW_TIMEAVE */ |
191 |
|
|
192 |
RETURN |
RETURN |
193 |
END |
END |