File indexing completed on 2024-03-02 06:10:28 UTC
view on githubraw file Latest commit 5cf43646 on 2024-03-01 18:50:49 UTC
3752238fd8 Patr*0001 #include "EXF_OPTIONS.h"
3a255f48df Gael*0002 #ifdef ALLOW_CTRL
0003 # include "CTRL_OPTIONS.h"
0004 #endif
0005 #ifdef ALLOW_AUTODIFF
0006 # include "AUTODIFF_OPTIONS.h"
0007 #endif
3752238fd8 Patr*0008
c5e3091043 Jean*0009 SUBROUTINE EXF_WIND( myTime, myIter, myThid )
3752238fd8 Patr*0010
c5e3091043 Jean*0011
0012
0013
0014
0015
0016
0017
0018
0019
3752238fd8 Patr*0020
c5e3091043 Jean*0021 IMPLICIT NONE
3752238fd8 Patr*0022
c5e3091043 Jean*0023
3752238fd8 Patr*0024
0025 #include "SIZE.h"
50113055f4 Jean*0026 #include "EEPARAMS.h"
3752238fd8 Patr*0027 #include "PARAMS.h"
0028
082e18c36c Jean*0029 #include "EXF_PARAM.h"
0030 #include "EXF_FIELDS.h"
0031 #include "EXF_CONSTANTS.h"
56d13a40ed Mart*0032 #include "DYNVARS.h"
3752238fd8 Patr*0033
0034 #ifdef ALLOW_AUTODIFF_TAMC
0035 #include "tamc.h"
0036 #endif
423768d890 Jean*0037 #ifdef ALLOW_GENTIM2D_CONTROL
6a3fbcbfe3 Gael*0038 # include "CTRL_SIZE.h"
5cf4364659 Mart*0039 # include "CTRL.h"
6a3fbcbfe3 Gael*0040 # include "CTRL_GENARR.h"
0041 #endif
3752238fd8 Patr*0042
c5e3091043 Jean*0043
3752238fd8 Patr*0044
c5e3091043 Jean*0045 _RL myTime
0046 INTEGER myIter
0047 INTEGER myThid
3752238fd8 Patr*0048
c5e3091043 Jean*0049
3752238fd8 Patr*0050
c5e3091043 Jean*0051
3752238fd8 Patr*0052
c5e3091043 Jean*0053 INTEGER bi,bj
56d13a40ed Mart*0054 INTEGER i,j,ks
0055 _RL urelw(1:sNx,1:sNy)
0056 _RL vrelw(1:sNx,1:sNy)
0057 _RL wsLoc(1:sNx,1:sNy)
c5e3091043 Jean*0058 _RL wsSq
423768d890 Jean*0059 #ifdef ALLOW_BULKFORMULAE
c5e3091043 Jean*0060 _RL usSq, recip_sqrtRhoA, ustar
0061 _RL tmp1, tmp2, tmp3, tmp4
423768d890 Jean*0062 #endif /* ALLOW_BULKFORMULAE */
c5e3091043 Jean*0063 _RL oneThirdRL
0064 PARAMETER ( oneThirdRL = 1.d0 / 3.d0 )
423768d890 Jean*0065 #if
0066 _RL wsm, tmpbulk
0067 #endif
0068 #ifdef ALLOW_GENTIM2D_CONTROL
6a3fbcbfe3 Gael*0069 INTEGER iarr
0070 #endif
7c50f07931 Mart*0071 #ifdef ALLOW_AUTODIFF_TAMC
0072 INTEGER ikey
0073 #endif
c5e3091043 Jean*0074
3752238fd8 Patr*0075
c5e3091043 Jean*0076
3752238fd8 Patr*0077
56d13a40ed Mart*0078 ks = 1
0079 IF ( usingPCoords ) ks = Nr
0080
c5e3091043 Jean*0081
0082 DO bj = myByLo(myThid),myByHi(myThid)
0083 DO bi = myBxLo(myThid),myBxHi(myThid)
3752238fd8 Patr*0084
ddea17ebdb Gael*0085 #ifdef ALLOW_AUTODIFF_TAMC
20dee61641 Mart*0086 ikey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
ddea17ebdb Gael*0087 #endif /* ALLOW_AUTODIFF_TAMC */
0088
c5e3091043 Jean*0089
0090 DO j = 1,sNy
0091 DO i = 1,sNx
0092 wsLoc(i,j) = 0. _d 0
56d13a40ed Mart*0093 urelw(i,j) = uwind(i,j,bi,bj)
0094 vrelw(i,j) = vwind(i,j,bi,bj)
3752238fd8 Patr*0095 cw(i,j,bi,bj) = 0. _d 0
0096 sw(i,j,bi,bj) = 0. _d 0
0097 sh(i,j,bi,bj) = 0. _d 0
c5e3091043 Jean*0098 wStress(i,j,bi,bj) = 0. _d 0
0099 ENDDO
0100 ENDDO
0101
56d13a40ed Mart*0102 IF (useRelativeWind) THEN
0103
0104 DO j = 1,sNy
0105 DO i = 1,sNx
0106 urelw(i,j) = uwind(i,j,bi,bj) - 0.5 _d 0
0107 & * (uVel(i,j,ks,bi,bj)+uVel(i+1,j,ks,bi,bj))
0108 vrelw(i,j) = vwind(i,j,bi,bj) - 0.5 _d 0
0109 & * (vVel(i,j,ks,bi,bj)+vVel(i,j+1,ks,bi,bj))
0110 ENDDO
0111 ENDDO
0112 #ifdef ALLOW_DIAGNOSTICS
0113 IF ( useDiagnostics ) THEN
0114 CALL DIAGNOSTICS_FILL( urelw,'EXFurelw',0,1,3,bi,bj,myThid )
0115 CALL DIAGNOSTICS_FILL( vrelw,'EXFvrelw',0,1,3,bi,bj,myThid )
0116 ENDIF
0117 #endif
0118 ENDIF
0119
358649780a Gael*0120 #ifdef ALLOW_AUTODIFF_TAMC
56d13a40ed Mart*0121
0122
358649780a Gael*0123
0124 #endif
0125
0126 IF ( useAtmWind ) THEN
c5e3091043 Jean*0127
0128
423768d890 Jean*0129 DO j = 1,sNy
0130 DO i = 1,sNx
56d13a40ed Mart*0131 wsSq = urelw(i,j)*urelw(i,j)
0132 & + vrelw(i,j)*vrelw(i,j)
c5e3091043 Jean*0133 IF ( wsSq .NE. 0. _d 0 ) THEN
0134 wsLoc(i,j) = SQRT(wsSq)
56d13a40ed Mart*0135 cw(i,j,bi,bj) = urelw(i,j)/wsLoc(i,j)
0136 sw(i,j,bi,bj) = vrelw(i,j)/wsLoc(i,j)
c5e3091043 Jean*0137 ELSE
0138 wsLoc(i,j) = 0. _d 0
3752238fd8 Patr*0139 cw(i,j,bi,bj) = 0. _d 0
0140 sw(i,j,bi,bj) = 0. _d 0
c5e3091043 Jean*0141 ENDIF
423768d890 Jean*0142 ENDDO
c5e3091043 Jean*0143 ENDDO
423768d890 Jean*0144 IF ( wspeedfile .EQ. ' ' ) THEN
c5e3091043 Jean*0145
0146 DO j = 1,sNy
0147 DO i = 1,sNx
0148 wspeed(i,j,bi,bj) = wsLoc(i,j)
0149 ENDDO
0150 ENDDO
423768d890 Jean*0151 ENDIF
c5e3091043 Jean*0152
423768d890 Jean*0153 #ifdef ALLOW_BULKFORMULAE
358649780a Gael*0154 ELSE
423768d890 Jean*0155
c5e3091043 Jean*0156
0157
423768d890 Jean*0158 DO j = 1,sNy
0159 DO i = 1,sNx
c5e3091043 Jean*0160 IF ( stressIsOnCgrid ) THEN
0161 usSq = ( ustress(i, j,bi,bj)*ustress(i ,j,bi,bj)
0162 & +ustress(i+1,j,bi,bj)*ustress(i+1,j,bi,bj)
0163 & +vstress(i,j, bi,bj)*vstress(i,j ,bi,bj)
0164 & +vstress(i,j+1,bi,bj)*vstress(i,j+1,bi,bj)
0165 & )*0.5 _d 0
0166 ELSE
0167 usSq = ustress(i,j,bi,bj)*ustress(i,j,bi,bj)
0168 & +vstress(i,j,bi,bj)*vstress(i,j,bi,bj)
0169 ENDIF
0170 IF ( usSq .NE. 0. _d 0 ) THEN
0171 wStress(i,j,bi,bj) = SQRT(usSq)
0172
0173 cw(i,j,bi,bj) = ustress(i,j,bi,bj)/wStress(i,j,bi,bj)
0174 sw(i,j,bi,bj) = vstress(i,j,bi,bj)/wStress(i,j,bi,bj)
0175 ELSE
0176 wStress(i,j,bi,bj) = 0. _d 0
0177 cw(i,j,bi,bj) = 0. _d 0
0178 sw(i,j,bi,bj) = 0. _d 0
0179 ENDIF
423768d890 Jean*0180 ENDDO
c5e3091043 Jean*0181 ENDDO
0182
423768d890 Jean*0183 IF ( wspeedfile .EQ. ' ' ) THEN
0fcb643df7 Mart*0184
c5e3091043 Jean*0185
0186
0187
0188
0189
0190
423768d890 Jean*0191 recip_sqrtRhoA = 1. _d 0 / SQRT(atmrho)
0192 DO j = 1,sNy
0193 DO i = 1,sNx
7c50f07931 Mart*0194
502f242cbd Mart*0195 IF ( wStress(i,j,bi,bj) .LE. 0. _d 0 ) THEN
0196 ustar = 0. _d 0
0197 wsloc(i,j) = 0. _d 0
c5e3091043 Jean*0198 ELSE
502f242cbd Mart*0199 ustar = SQRT(wStress(i,j,bi,bj))*recip_sqrtRhoA
0200 IF ( ustar .LT. ustofu11 ) THEN
0201 tmp1 = -cquadrag_2/cquadrag_1*exf_half
0202 tmp2 = SQRT(tmp1*tmp1 + ustar*ustar/cquadrag_1)
0203 wsLoc(i,j) = SQRT(tmp1 + tmp2)
0204 ELSE
0205 tmp1 = clindrag_2/clindrag_1*oneThirdRL
0206 tmp2 = ustar*ustar/clindrag_1*exf_half
0207 & - tmp1*tmp1*tmp1
0208 tmp3 = SQRT( ustar*ustar/clindrag_1*
0209 & (ustar*ustar/clindrag_1*0.25 _d 0 - tmp1*tmp1*tmp1 )
0210 & )
0211 tmp4 = (tmp2 + tmp3)**oneThirdRL
0212 wsLoc(i,j) = tmp4 + tmp1*tmp1 / tmp4 - tmp1
0213
0214
0215 ENDIF
c5e3091043 Jean*0216 ENDIF
423768d890 Jean*0217 ENDDO
c5e3091043 Jean*0218 ENDDO
0219
423768d890 Jean*0220 DO j = 1,sNy
0221 DO i = 1,sNx
c5e3091043 Jean*0222 wspeed(i,j,bi,bj) = wsLoc(i,j)
423768d890 Jean*0223 ENDDO
c5e3091043 Jean*0224 ENDDO
423768d890 Jean*0225
0226 ENDIF
c5e3091043 Jean*0227
358649780a Gael*0228 #ifdef ALLOW_AUTODIFF_TAMC
0229
0230
0231
0232
0233
0234 #endif
0235
c5e3091043 Jean*0236
423768d890 Jean*0237 DO j = 1,sNy
0238 DO i = 1,sNx
c5e3091043 Jean*0239 uwind(i,j,bi,bj) = wspeed(i,j,bi,bj)*cw(i,j,bi,bj)
0240 vwind(i,j,bi,bj) = wspeed(i,j,bi,bj)*sw(i,j,bi,bj)
423768d890 Jean*0241 ENDDO
c5e3091043 Jean*0242 ENDDO
423768d890 Jean*0243
0244 #endif /* ALLOW_BULKFORMULAE */
0245
358649780a Gael*0246 ENDIF
3752238fd8 Patr*0247
423768d890 Jean*0248 #ifdef ALLOW_GENTIM2D_CONTROL
6a3fbcbfe3 Gael*0249 DO j = 1,sNy
0250 DO i = 1,sNx
0251 do iarr = 1, maxCtrlTim2D
d15205fe5b Gael*0252 if (xx_gentim2d_file(iarr)(1:9).EQ.'xx_wspeed')
6a3fbcbfe3 Gael*0253 & wspeed(i,j,bi,bj)=wspeed(i,j,bi,bj)+
0254 & xx_gentim2d(i,j,bi,bj,iarr)
0255 enddo
0256 ENDDO
0257 ENDDO
0258 #endif
0259
ddea17ebdb Gael*0260 #ifdef ALLOW_AUTODIFF_TAMC
0261
0262 #endif
0263
c5e3091043 Jean*0264
0265 DO j = 1,sNy
0266 DO i = 1,sNx
0267 sh(i,j,bi,bj) = MAX(wspeed(i,j,bi,bj),uMin)
0268 ENDDO
0269 ENDDO
0270
423768d890 Jean*0271 #if
0272
0273
0274 IF ( useAtmWind ) THEN
bab1d47ef6 Jean*0275
423768d890 Jean*0276
0277 DO j = 1,sNy
0278 DO i = 1,sNx
0279 wsm = sh(i,j,bi,bj)
cc60455fbb Mart*0280 # ifdef ALLOW_DRAG_LARGEYEAGER09
0281
0282 tmpbulk = cdrag_1/wsm + cdrag_2 + cdrag_3*wsm
0283 & + cdrag_8 * wsm**6
0284 tmpbulk = exf_scal_BulkCdn * (
0285 & ( halfRL - SIGN(halfRL, wsm-umax) )*tmpbulk
0286 & + ( halfRL + SIGN(halfRL, wsm-umax) )*cdragMax
0287 & )
0288 # else
423768d890 Jean*0289 tmpbulk = exf_scal_BulkCdn
0290 & * ( cdrag_1/wsm + cdrag_2 + cdrag_3*wsm )
cc60455fbb Mart*0291 # endif
423768d890 Jean*0292 ustress(i,j,bi,bj) = atmrho*tmpbulk*wspeed(i,j,bi,bj)
56d13a40ed Mart*0293 & * urelw(i,j)
423768d890 Jean*0294 vstress(i,j,bi,bj) = atmrho*tmpbulk*wspeed(i,j,bi,bj)
56d13a40ed Mart*0295 & * vrelw(i,j)
423768d890 Jean*0296 ENDDO
0297 ENDDO
bab1d47ef6 Jean*0298
0299
0300
423768d890 Jean*0301
0302 ENDIF
0303 #endif /* ndef ALLOW_BULKFORMULAE or ndef ALLOW_ATM_TEMP */
0304
c5e3091043 Jean*0305
0306 ENDDO
0307 ENDDO
0308
0309 RETURN
0310 END