4 |
CStartOfInterface |
CStartOfInterface |
5 |
SUBROUTINE GMREDI_SLOPE_LIMIT( |
SUBROUTINE GMREDI_SLOPE_LIMIT( |
6 |
I dSigmaDrReal, |
I dSigmaDrReal, |
7 |
I depthZ, |
I depthZ,K, |
8 |
U SlopeX, SlopeY, |
U SlopeX, SlopeY, |
9 |
|
U dSigmaDx, dSigmaDy, |
10 |
O SlopeSqr, taperFct, |
O SlopeSqr, taperFct, |
11 |
I bi,bj, myThid ) |
I bi,bj, myThid ) |
12 |
C /==========================================================\ |
C /==========================================================\ |
41 |
C |
C |
42 |
_RL SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL SlopeX(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
43 |
_RL SlopeY(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL SlopeY(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
44 |
|
_RL dSigmaDx(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
45 |
|
_RL dSigmaDy(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
46 |
_RL dSigmaDrReal(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL dSigmaDrReal(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
47 |
_RL SlopeSqr(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL SlopeSqr(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
48 |
_RL taperFct(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
_RL taperFct(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
49 |
_RL depthZ |
_RL depthZ |
50 |
INTEGER bi,bj,myThid |
INTEGER bi,bj,K,myThid |
51 |
CEndOfInterface |
CEndOfInterface |
52 |
|
|
53 |
#ifdef ALLOW_GMREDI |
#ifdef ALLOW_GMREDI |
89 |
IF (GM_taper_scheme.EQ.'orig' .OR. |
IF (GM_taper_scheme.EQ.'orig' .OR. |
90 |
& GM_taper_scheme.EQ.'clipping') THEN |
& GM_taper_scheme.EQ.'clipping') THEN |
91 |
|
|
92 |
|
#if (defined (GM_TAPER_ORIG_CLIPPING)) |
93 |
|
|
94 |
C- Original implementation in mitgcmuv |
C- Original implementation in mitgcmuv |
95 |
C (this turns out to be the same as Cox slope clipping) |
C (this turns out to be the same as Cox slope clipping) |
96 |
|
|
97 |
C- Cox 1987 "Slope clipping" |
C- Cox 1987 "Slope clipping" |
98 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
99 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
100 |
IF ( SlopeX(i,j)*SlopeX(i,j) + SlopeY(i,j)*SlopeY(i,j) |
IF ( DSigmaDX(i,j)*DSigmaDX(i,j) + |
101 |
|
& DSigmaDY(i,j)*DSigmaDY(i,j) |
102 |
& .EQ. 0. ) THEN |
& .EQ. 0. ) THEN |
103 |
gradSmod(i,j) = 0. _d 0 |
gradSmod(i,j) = 0. _d 0 |
104 |
ELSE |
ELSE |
105 |
gradSmod(i,j) = sqrt(SlopeX(i,j)*SlopeX(i,j) |
gradSmod(i,j) = sqrt(DSigmaDX(i,j)*DSigmaDX(i,j) |
106 |
& +SlopeY(i,j)*SlopeY(i,j)) |
& +DSigmaDY(i,j)*DSigmaDY(i,j)) |
107 |
ENDIF |
ENDIF |
108 |
ENDDO |
ENDDO |
109 |
ENDDO |
ENDDO |
110 |
|
|
111 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
112 |
CADJ STORE gradSmod(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE gradSmod(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
113 |
CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
114 |
#endif |
#endif |
115 |
|
|
116 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
117 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
118 |
IF (gradSmod(i,j) .NE. 0.) THEN |
IF (gradSmod(i,j) .NE. 0.) THEN |
119 |
dSigmaDrLtd(i,j) = -gradSmod(i,j)*GM_rMaxSlope |
dSigmaDrLtd(i,j) = -gradSmod(i,j)*GM_rMaxSlope |
120 |
IF (dSigmaDrReal(i,j) .GE. dSigmaDrLtd(i,j)) |
IF ( dSigmaDrReal(i,j) .GE. |
121 |
& dSigmaDrReal(i,j) = dSigmaDrLtd(i,j) |
& GM_adjointRescale*dSigmaDrLtd(i,j) ) |
122 |
|
& dSigmaDrReal(i,j) = |
123 |
|
& dSigmaDrLtd(i,j)*GM_adjointRescale |
124 |
|
ctest dSigmaDrReal(i,j) = dSigmaDrLtd(i,j) |
125 |
ENDIF |
ENDIF |
126 |
ENDDO |
ENDDO |
127 |
ENDDO |
ENDDO |
128 |
|
|
129 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
130 |
CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
131 |
CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
132 |
CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
133 |
#endif |
#endif |
134 |
|
|
135 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
138 |
SlopeX(i,j) = 0. _d 0 |
SlopeX(i,j) = 0. _d 0 |
139 |
SlopeY(i,j) = 0. _d 0 |
SlopeY(i,j) = 0. _d 0 |
140 |
ELSE |
ELSE |
141 |
dRdSigmaLtd(i,j) = 1./dSigmaDrReal(i,j) |
dRdSigmaLtd(i,j) = 1./( dSigmaDrReal(i,j) ) |
142 |
SlopeX(i,j)=-SlopeX(i,j)*dRdSigmaLtd(i,j) |
SlopeX(i,j)=-DSigmaDX(i,j)*dRdSigmaLtd(i,j) |
143 |
SlopeY(i,j)=-SlopeY(i,j)*dRdSigmaLtd(i,j) |
SlopeY(i,j)=-DSigmaDY(i,j)*dRdSigmaLtd(i,j) |
144 |
ENDIF |
ENDIF |
145 |
ENDDO |
ENDDO |
146 |
ENDDO |
ENDDO |
147 |
|
|
148 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
149 |
CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
150 |
CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
151 |
#endif |
#endif |
152 |
|
|
153 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
158 |
ENDDO |
ENDDO |
159 |
ENDDO |
ENDDO |
160 |
|
|
161 |
|
#else |
162 |
|
|
163 |
|
STOP 'Need to set runtime flag GM_taper_scheme correctly' |
164 |
|
|
165 |
|
#endif /* GM_TAPER_ORIG_CLIPPING */ |
166 |
|
|
167 |
|
ELSE IF (GM_taper_scheme.EQ.'ac02') THEN |
168 |
|
|
169 |
|
#if (defined (GM_TAPER_AC02)) |
170 |
|
|
171 |
|
DO j=1-Oly+1,sNy+Oly-1 |
172 |
|
DO i=1-Olx+1,sNx+Olx-1 |
173 |
|
dRdSigmaLtd(i,j)= |
174 |
|
& dSigmaDx(i,j)*dSigmaDx(i,j) |
175 |
|
& + dSigmaDy(i,j)*dSigmaDy(i,j) |
176 |
|
& + dSigmaDrReal(i,j)**2 |
177 |
|
ctest |
178 |
|
IF (dRdSigmaLtd(i,j).NE.0.) then |
179 |
|
dRdSigmaLtd(i,j)=1. _d 0 |
180 |
|
& / ( dRdSigmaLtd(i,j) ) |
181 |
|
SlopeSqr(i,j)=(dSigmaDx(i,j)*dSigmaDx(i,j) |
182 |
|
& +dSigmaDy(i,j)*dSigmaDy(i,j))*dRdSigmaLtd(i,j) |
183 |
|
SlopeX(i,j)=-dSigmaDx(i,j) |
184 |
|
& *dRdSigmaLtd(i,j)*dSigmaDrReal(i,j) |
185 |
|
SlopeY(i,j)=-dSigmaDy(i,j) |
186 |
|
& *dRdSigmaLtd(i,j)*dSigmaDrReal(i,j) |
187 |
|
cph T11(i,j)=(dSigmaDrReal(i,j)**2)*dRdSigmaLtd(i,j) |
188 |
|
taperFct(i,j) = 1. _d 0 |
189 |
|
cph ELSE |
190 |
|
cph SlopeSqr(i,j) = 0. _d 0 |
191 |
|
cph SlopeX(i,j) = 0. _d 0 |
192 |
|
cph SlopeY(i,j) = 0. _d 0 |
193 |
|
cph T11(i,j) = 0. _d 0 |
194 |
|
cph taperFct(i,j) = 0. _d 0 |
195 |
|
ENDIF |
196 |
|
cph IF ( SlopeSqr(i,j) .GT. GM_maxSlope**2 ) THEN |
197 |
|
cph taperFct(i,j) = GM_maxSlope**2/SlopeSqr(i,j) |
198 |
|
cph ENDIF |
199 |
|
ENDDO |
200 |
|
ENDDO |
201 |
|
|
202 |
|
#else |
203 |
|
|
204 |
|
STOP 'Need to set runtime flag GM_taper_scheme correctly' |
205 |
|
|
206 |
|
#endif /* GM_TAPER_AC02 */ |
207 |
|
|
208 |
ELSE |
ELSE |
209 |
|
|
210 |
|
#if (defined (GM_TAPER_REST)) |
211 |
|
|
212 |
C---------------------------------------------------------------------- |
C---------------------------------------------------------------------- |
213 |
|
|
214 |
C- Compute the slope, no clipping, but avoid reverse slope in negatively |
C- Compute the slope, no clipping, but avoid reverse slope in negatively |
215 |
C stratified (Sigma_Z > 0) region : |
C stratified (Sigma_Z > 0) region : |
216 |
|
|
217 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
218 |
CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
219 |
#endif |
#endif |
220 |
|
|
221 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
228 |
ENDDO |
ENDDO |
229 |
|
|
230 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
231 |
CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE dSigmaDx(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
232 |
CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE dSigmaDy(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
233 |
CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE dSigmaDrReal(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
234 |
#endif |
#endif |
235 |
|
|
236 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
237 |
DO i=1-Olx+1,sNx+Olx-1 |
DO i=1-Olx+1,sNx+Olx-1 |
238 |
IF ( dSigmaDrReal(i,j) .EQ. 0. ) THEN |
IF ( dSigmaDrReal(i,j) .EQ. 0. ) THEN |
239 |
IF ( SlopeX(i,j) .NE. 0. ) |
IF ( dSigmaDx(i,j) .NE. 0. ) |
240 |
& SlopeX(i,j) = SIGN(Small_taper,SlopeX(i,j)) |
& SlopeX(i,j) = SIGN(Small_taper,dSigmaDx(i,j)) |
241 |
IF ( SlopeY(i,j) .NE. 0. ) |
IF ( dSigmaDy(i,j) .NE. 0. ) |
242 |
& SlopeY(i,j) = SIGN(Small_taper,SlopeY(i,j)) |
& SlopeY(i,j) = SIGN(Small_taper,dSigmaDy(i,j)) |
243 |
ELSE |
ELSE |
244 |
dRdSigmaLtd(i,j) = 1./dSigmaDrReal(i,j) |
dRdSigmaLtd(i,j) = 1./dSigmaDrReal(i,j) |
245 |
SlopeX(i,j) = -SlopeX(i,j)*dRdSigmaLtd(i,j) |
SlopeX(i,j) = -dSigmaDx(i,j)*dRdSigmaLtd(i,j) |
246 |
SlopeY(i,j) = -SlopeY(i,j)*dRdSigmaLtd(i,j) |
SlopeY(i,j) = -dSigmaDy(i,j)*dRdSigmaLtd(i,j) |
247 |
ENDIF |
ENDIF |
248 |
ENDDO |
ENDDO |
249 |
ENDDO |
ENDDO |
250 |
|
|
251 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
252 |
CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE slopeX(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
253 |
CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
cnostore CADJ STORE slopeY(:,:) = comlev1_bibj, key=ikey, byte=isbyte |
254 |
#endif |
#endif |
255 |
|
|
256 |
DO j=1-Oly+1,sNy+Oly-1 |
DO j=1-Oly+1,sNy+Oly-1 |
338 |
STOP 'GMREDI_SLOPE_LIMIT: Bad GM_taper_scheme' |
STOP 'GMREDI_SLOPE_LIMIT: Bad GM_taper_scheme' |
339 |
ENDIF |
ENDIF |
340 |
|
|
341 |
|
#endif |
342 |
|
|
343 |
ENDIF |
ENDIF |
344 |
|
|
345 |
|
|