File indexing completed on 2023-09-21 05:10:50 UTC
view on githubraw file Latest commit 96b00645 on 2023-09-20 15:15:14 UTC
29d9814714 Dani*0001 #include "STREAMICE_OPTIONS.h"
0002
0003
0004
0005
96b006450c dngo*0006 SUBROUTINE STREAMICE_DRIVING_STRESS_FD( myThid )
0007
0008
29d9814714 Dani*0009
0010
96b006450c dngo*0011
29d9814714 Dani*0012
0013
0014
0015
0016 IMPLICIT NONE
0017
0018
0019 #include "SIZE.h"
0020 #include "EEPARAMS.h"
0021 #include "PARAMS.h"
0022 #include "GRID.h"
0023 #include "STREAMICE.h"
0024 #include "STREAMICE_CG.h"
0025
0026
0027 INTEGER myThid
96b006450c dngo*0028
0029
29d9814714 Dani*0030
0031 #ifdef ALLOW_STREAMICE
0032
0033
96b006450c dngo*0034 INTEGER i, j, bi, bj
0035
29d9814714 Dani*0036 _RL dsdx
0037 & (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0038 _RL dsdy
0039 & (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0040 _RL face_factor, grd_below_sl, i_rhow
0041
0042 i_rhow = 1./streamice_density_ocean_avg
0043
0044 DO bj = myByLo(myThid), myByHi(myThid)
0045 DO bi = myBxLo(myThid), myBxHi(myThid)
0046 DO j=1-OLy+1,sNy+OLy-1
0047 DO i=1-OLx+1,sNx+OLx-1
0048 taudx_SI(i,j,bi,bj) = 0. _d 0
96b006450c dngo*0049 taudy_SI(i,j,bi,bj) = 0. _d 0
29d9814714 Dani*0050 ENDDO
0051 ENDDO
0052 ENDDO
0053 ENDDO
0054
0055 DO bj = myByLo(myThid), myByHi(myThid)
0056 DO bi = myBxLo(myThid), myBxHi(myThid)
b2df4048e4 Dani*0057 DO j=1,sNy
0058 DO i=1,sNx
29d9814714 Dani*0059
0060 IF (streamice_hmask(i,j,bi,bj) .eq. 1) THEN
0061
96b006450c dngo*0062
29d9814714 Dani*0063
0064 IF (streamice_hmask(i-1,j,bi,bj) .eq. 1) THEN
0065
0066 dsdx(i,j,bi,bj) = recip_dxC(i,j,bi,bj) *
96b006450c dngo*0067 & (surf_el_streamice(i,j,bi,bj) -
29d9814714 Dani*0068 & surf_el_streamice(i-1,j,bi,bj))
0069
0070 ELSEIF (streamice_hmask(i-1,j,bi,bj).eq.0.or.
0071 & streamice_hmask(i-1,j,bi,bj).eq.2) THEN
0072
0073 IF (streamice_hmask(i+1,j,bi,bj).eq.1) THEN
0074 dsdx(i,j,bi,bj) = recip_dxC(i+1,j,bi,bj) *
96b006450c dngo*0075 & (surf_el_streamice(i+1,j,bi,bj) -
29d9814714 Dani*0076 & surf_el_streamice(i,j,bi,bj))
0077 ELSE
0078 dsdx(i,j,bi,bj) = 0.0
0079 ENDIF
0080
0081 ELSE
0082 dsdx(i,j,bi,bj) = 0.0
0083 ENDIF
0084
96b006450c dngo*0085
29d9814714 Dani*0086
0087 IF (streamice_hmask(i,j-1,bi,bj) .eq. 1) THEN
0088
0089 dsdy(i,j,bi,bj) = recip_dyC(i,j,bi,bj) *
96b006450c dngo*0090 & (surf_el_streamice(i,j,bi,bj) -
29d9814714 Dani*0091 & surf_el_streamice(i,j-1,bi,bj))
0092
0093 ELSEIF (streamice_hmask(i,j-1,bi,bj).eq.0.or.
0094 & streamice_hmask(i,j-1,bi,bj).eq.2) THEN
0095
0096 IF (streamice_hmask(i,j+1,bi,bj).eq.1) THEN
0097 dsdy(i,j,bi,bj) = recip_dyC(i,j+1,bi,bj) *
96b006450c dngo*0098 & (surf_el_streamice(i,j+1,bi,bj) -
29d9814714 Dani*0099 & surf_el_streamice(i,j,bi,bj))
0100 ELSE
0101 dsdy(i,j,bi,bj) = 0.0
0102 ENDIF
0103
0104 ELSE
0105 dsdx(i,j,bi,bj) = 0.0
0106 ENDIF
0107
96b006450c dngo*0108
29d9814714 Dani*0109
0110 ELSEIF(streamice_hmask(i,j,bi,bj).eq.0.or.
0111 & streamice_hmask(i,j,bi,bj).eq.2) THEN
0112
96b006450c dngo*0113
29d9814714 Dani*0114
0115 IF(streamice_hmask(i-1,j,bi,bj).eq.1.and.
0116 & streamice_hmask(i-2,j,bi,bj).eq.1) THEN
0117
0118 dsdx(i,j,bi,bj) = recip_dxC(i-1,j,bi,bj) *
96b006450c dngo*0119 & (surf_el_streamice(i-1,j,bi,bj) -
29d9814714 Dani*0120 & surf_el_streamice(i-2,j,bi,bj))
0121
0122 ELSE
0123 dsdx(i,j,bi,bj) = 0.0
0124
0125 ENDIF
0126
96b006450c dngo*0127
29d9814714 Dani*0128
0129 IF(streamice_hmask(i,j-1,bi,bj).eq.1.and.
0130 & streamice_hmask(i,j-2,bi,bj).eq.1) THEN
0131
0132 dsdy(i,j,bi,bj) = recip_dyC(i,j-1,bi,bj) *
96b006450c dngo*0133 & (surf_el_streamice(i,j-1,bi,bj) -
29d9814714 Dani*0134 & surf_el_streamice(i,j-2,bi,bj))
0135
0136 ELSE
0137 dsdy(i,j,bi,bj) = 0.0
0138
0139 ENDIF
0140
96b006450c dngo*0141
0142
29d9814714 Dani*0143 ENDIF
0144 ENDDO
0145 ENDDO
0146 ENDDO
0147 ENDDO
0148
96b006450c dngo*0149 _EXCH_XY_RL(dsdy, myThid)
0150 _EXCH_XY_RL(dsdx, myThid)
29d9814714 Dani*0151
0152 DO bj = myByLo(myThid), myByHi(myThid)
0153 DO bi = myBxLo(myThid), myBxHi(myThid)
96b006450c dngo*0154
29d9814714 Dani*0155 DO i=1,sNx
0156 DO j=1,sNy
0157
96b006450c dngo*0158
0159
29d9814714 Dani*0160
0161 IF (streamice_hmask(i,j,bi,bj).eq.1.0) THEN
96b006450c dngo*0162
29d9814714 Dani*0163 IF (streamice_umask(i,j,bi,bj).eq.1.0) THEN
0164
96b006450c dngo*0165 taudx_si(i,j,bi,bj) = taudx_si(i,j,bi,bj) +
0166 & gravity * streamice_density *
0167 & H_streamice (i,j,bi,bj) * dsdx (i,j,bi,bj) *
0168 & (0.5 * dyG(i,j,bi,bj) + 0.25 * dyF(i,j,bi,bj)) *
29d9814714 Dani*0169 & 0.5 * dxG(i,j,bi,bj)
0170
96b006450c dngo*0171 taudx_si(i,j,bi,bj) = taudx_si(i,j,bi,bj) +
0172 & gravity * streamice_density *
0173 & H_streamice (i,j,bi,bj) * dsdx (i+1,j,bi,bj) *
0174 & 0.25 * dyF(i,j,bi,bj) *
29d9814714 Dani*0175 & 0.5 * dxG(i,j,bi,bj)
0176
0177 ENDIF
0178
0179 IF (streamice_umask(i+1,j,bi,bj).eq.1.0) THEN
0180
96b006450c dngo*0181 taudx_si(i+1,j,bi,bj) = taudx_si(i+1,j,bi,bj) +
0182 & gravity * streamice_density *
0183 & H_streamice (i,j,bi,bj) * dsdx (i+1,j,bi,bj) *
0184 & (0.5 * dyG(i+1,j,bi,bj) + 0.25 * dyF(i,j,bi,bj)) *
29d9814714 Dani*0185 & 0.5 * dxG(i,j,bi,bj)
0186
96b006450c dngo*0187 taudx_si(i+1,j,bi,bj) = taudx_si(i+1,j,bi,bj) +
0188 & gravity * streamice_density *
0189 & H_streamice (i,j,bi,bj) * dsdx (i,j,bi,bj) *
0190 & 0.25 * dyF(i,j,bi,bj) *
29d9814714 Dani*0191 & 0.5 * dxG(i,j,bi,bj)
0192
0193 ENDIF
0194
0195 IF (streamice_umask(i,j+1,bi,bj).eq.1.0) THEN
0196
96b006450c dngo*0197 taudx_si(i,j+1,bi,bj) = taudx_si(i,j+1,bi,bj) +
0198 & gravity * streamice_density *
0199 & H_streamice (i,j,bi,bj) * dsdx (i,j,bi,bj) *
0200 & (0.5 * dyG(i,j,bi,bj) + 0.25 * dyF(i,j,bi,bj)) *
29d9814714 Dani*0201 & 0.5 * dxG(i,j+1,bi,bj)
0202
96b006450c dngo*0203 taudx_si(i,j+1,bi,bj) = taudx_si(i,j+1,bi,bj) +
0204 & gravity * streamice_density *
0205 & H_streamice (i,j,bi,bj) * dsdx (i+1,j,bi,bj) *
0206 & 0.25 * dyF(i,j,bi,bj) *
29d9814714 Dani*0207 & 0.5 * dxG(i,j+1,bi,bj)
0208
0209 ENDIF
0210
0211 IF (streamice_umask(i+1,j+1,bi,bj).eq.1.0) THEN
0212
96b006450c dngo*0213 taudx_si(i+1,j+1,bi,bj) = taudx_si(i+1,j+1,bi,bj) +
0214 & gravity * streamice_density *
0215 & H_streamice (i,j,bi,bj) * dsdx (i+1,j,bi,bj) *
0216 & (0.5 * dyG(i+1,j,bi,bj) + 0.25 * dyF(i,j,bi,bj)) *
29d9814714 Dani*0217 & 0.5 * dxG(i,j+1,bi,bj)
0218
96b006450c dngo*0219 taudx_si(i+1,j+1,bi,bj) = taudx_si(i+1,j+1,bi,bj) +
0220 & gravity * streamice_density *
0221 & H_streamice (i,j,bi,bj) * dsdx (i,j,bi,bj) *
0222 & 0.25 * dyF(i,j,bi,bj) *
29d9814714 Dani*0223 & 0.5 * dxG(i,j+1,bi,bj)
0224
0225 ENDIF
0226
0227 #ifdef USE_ALT_RLOW
0228 IF (R_low_si(i,j,bi,bj) .lt. 0. _d 0) then
96b006450c dngo*0229 #else
29d9814714 Dani*0230 IF (R_low(i,j,bi,bj) .lt. 0. _d 0) then
96b006450c dngo*0231 #endif
29d9814714 Dani*0232 grd_below_sl = 1. _d 0
0233 else
0234 grd_below_sl = 0. _d 0
0235 endif
0236
96b006450c dngo*0237
29d9814714 Dani*0238 IF (streamice_hmask(i+1,j,bi,bj).eq.0.or.
0239 & streamice_hmask(i+1,j,bi,bj).eq.2.or.
0240 & streamice_ufacemask(i+1,j,bi,bj).eq.2) THEN
0241
0242 IF (float_frac_streamice(i,j,bi,bj) .eq. 1.0) THEN
96b006450c dngo*0243
0244 face_factor =
29d9814714 Dani*0245 & 0.25 * dyG(i+1,j,bi,bj) *
96b006450c dngo*0246 & gravity *
29d9814714 Dani*0247 & streamice_density * H_streamice(i,j,bi,bj)**2-
0248 #ifdef USE_ALT_RLOW
96b006450c dngo*0249 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0250 & R_low_si(i,j,bi,bj)**2
96b006450c dngo*0251 #else
0252 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0253 & R_low(i,j,bi,bj)**2
0254 #endif
0255
0256 ELSE
0257
96b006450c dngo*0258 face_factor =
29d9814714 Dani*0259 & 0.25 * dyG(i+1,j,bi,bj) *
0260 & streamice_density * gravity *
0261 & (1-streamice_density*i_rhow) *
96b006450c dngo*0262 & H_streamice(i,j,bi,bj)**2
29d9814714 Dani*0263
0264 ENDIF
0265
96b006450c dngo*0266 taudx_si(i+1,j,bi,bj) = taudx_si(i+1,j,bi,bj)
29d9814714 Dani*0267 & - face_factor
0268
96b006450c dngo*0269 taudx_si(i+1,j+1,bi,bj) = taudx_si(i+1,j+1,bi,bj)
29d9814714 Dani*0270 & - face_factor
0271
0272 ENDIF
0273
96b006450c dngo*0274
29d9814714 Dani*0275 IF (streamice_hmask(i-1,j,bi,bj).eq.0.or.
0276 & streamice_hmask(i-1,j,bi,bj).eq.2.or.
0277 & streamice_ufacemask(i,j,bi,bj).eq.2) THEN
0278
0279 IF (float_frac_streamice(i,j,bi,bj) .eq. 1.0) THEN
96b006450c dngo*0280
0281 face_factor =
29d9814714 Dani*0282 & 0.25 * dyG(i,j,bi,bj) *
96b006450c dngo*0283 & gravity *
29d9814714 Dani*0284 & streamice_density * H_streamice(i,j,bi,bj)**2-
0285 #ifdef USE_ALT_RLOW
96b006450c dngo*0286 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0287 & R_low_si(i,j,bi,bj)**2
96b006450c dngo*0288 #else
0289 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0290 & R_low(i,j,bi,bj)**2
0291 #endif
0292
0293 ELSE
0294
96b006450c dngo*0295 face_factor =
29d9814714 Dani*0296 & 0.25 * dyG(i,j,bi,bj) *
0297 & streamice_density * gravity *
0298 & (1-streamice_density*i_rhow) *
96b006450c dngo*0299 & H_streamice(i,j,bi,bj)**2
29d9814714 Dani*0300
0301 ENDIF
0302
96b006450c dngo*0303 taudx_si(i,j,bi,bj) = taudx_si(i,j,bi,bj)
29d9814714 Dani*0304 & + face_factor
0305
96b006450c dngo*0306 taudx_si(i,j+1,bi,bj) = taudx_si(i,j+1,bi,bj)
29d9814714 Dani*0307 & + face_factor
0308
0309 ENDIF
0310
96b006450c dngo*0311
29d9814714 Dani*0312
0313 IF (streamice_vmask(i,j,bi,bj).eq.1.0) THEN
0314
96b006450c dngo*0315 taudy_si(i,j,bi,bj) = taudy_si(i,j,bi,bj) +
0316 & gravity * streamice_density *
0317 & H_streamice (i,j,bi,bj) * dsdy (i,j,bi,bj) *
0318 & (0.5 * dxG(i,j,bi,bj) + 0.25 * dxF(i,j,bi,bj)) *
29d9814714 Dani*0319 & 0.5 * dyG(i,j,bi,bj)
0320
96b006450c dngo*0321 taudy_si(i,j,bi,bj) = taudy_si(i,j,bi,bj) +
0322 & gravity * streamice_density *
0323 & H_streamice (i,j,bi,bj) * dsdy (i,j+1,bi,bj) *
0324 & 0.25 * dxF(i,j,bi,bj) *
29d9814714 Dani*0325 & 0.5 * dyG(i,j,bi,bj)
0326
0327 ENDIF
0328
0329 IF (streamice_vmask(i,j+1,bi,bj).eq.1.0) THEN
0330
96b006450c dngo*0331 taudy_si(i,j+1,bi,bj) = taudy_si(i,j+1,bi,bj) +
0332 & gravity * streamice_density *
0333 & H_streamice (i,j,bi,bj) * dsdy (i,j+1,bi,bj) *
0334 & (0.5 * dxG(i,j+1,bi,bj) + 0.25 * dxF(i,j,bi,bj)) *
29d9814714 Dani*0335 & 0.5 * dyG(i,j,bi,bj)
0336
96b006450c dngo*0337 taudy_si(i,j+1,bi,bj) = taudy_si(i,j+1,bi,bj) +
0338 & gravity * streamice_density *
0339 & H_streamice (i,j,bi,bj) * dsdy (i,j,bi,bj) *
0340 & 0.25 * dxF(i,j,bi,bj) *
29d9814714 Dani*0341 & 0.5 * dyG(i,j,bi,bj)
0342
0343 ENDIF
0344
0345 IF (streamice_vmask(i+1,j,bi,bj).eq.1.0) THEN
0346
96b006450c dngo*0347 taudy_si(i+1,j,bi,bj) = taudy_si(i+1,j,bi,bj) +
0348 & gravity * streamice_density *
0349 & H_streamice (i,j,bi,bj) * dsdy (i,j,bi,bj) *
0350 & (0.5 * dxG(i,j,bi,bj) + 0.25 * dxF(i,j,bi,bj)) *
29d9814714 Dani*0351 & 0.5 * dyG(i+1,j,bi,bj)
0352
96b006450c dngo*0353 taudy_si(i+1,j,bi,bj) = taudy_si(i+1,j,bi,bj) +
0354 & gravity * streamice_density *
0355 & H_streamice (i,j,bi,bj) * dsdy (i,j+1,bi,bj) *
0356 & 0.25 * dxF(i,j,bi,bj) *
29d9814714 Dani*0357 & 0.5 * dyG(i+1,j,bi,bj)
0358
0359 ENDIF
0360
0361 IF (streamice_umask(i+1,j+1,bi,bj).eq.1.0) THEN
0362
96b006450c dngo*0363 taudy_si(i+1,j+1,bi,bj) = taudy_si(i+1,j+1,bi,bj) +
0364 & gravity * streamice_density *
0365 & H_streamice (i,j,bi,bj) * dsdy (i,j+1,bi,bj) *
0366 & (0.5 * dxG(i,j+1,bi,bj) + 0.25 * dxF(i,j,bi,bj)) *
29d9814714 Dani*0367 & 0.5 * dyG(i,j+1,bi,bj)
0368
96b006450c dngo*0369 taudy_si(i+1,j+1,bi,bj) = taudy_si(i+1,j+1,bi,bj) +
0370 & gravity * streamice_density *
0371 & H_streamice (i,j,bi,bj) * dsdy (i,j,bi,bj) *
0372 & 0.25 * dxF(i,j,bi,bj) *
29d9814714 Dani*0373 & 0.5 * dyG(i,j+1,bi,bj)
0374
0375 ENDIF
0376
0377 #ifdef USE_ALT_RLOW
0378 IF (R_low_si(i,j,bi,bj) .lt. 0. _d 0) then
96b006450c dngo*0379 #else
29d9814714 Dani*0380 IF (R_low(i,j,bi,bj) .lt. 0. _d 0) then
96b006450c dngo*0381 #endif
29d9814714 Dani*0382 grd_below_sl = 1. _d 0
0383 else
0384 grd_below_sl = 0. _d 0
0385 endif
0386
96b006450c dngo*0387
29d9814714 Dani*0388 IF (streamice_hmask(i,j+1,bi,bj).eq.0.or.
0389 & streamice_hmask(i,j+1,bi,bj).eq.2.or.
0390 & streamice_vfacemask(i,j+1,bi,bj).eq.2) THEN
0391
0392 IF (float_frac_streamice(i,j,bi,bj) .eq. 1.0) THEN
96b006450c dngo*0393
0394 face_factor =
29d9814714 Dani*0395 & 0.25 * dxG(i,j+1,bi,bj) *
96b006450c dngo*0396 & gravity *
29d9814714 Dani*0397 & streamice_density * H_streamice(i,j,bi,bj)**2-
0398 #ifdef USE_ALT_RLOW
96b006450c dngo*0399 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0400 & R_low_si(i,j,bi,bj)**2
96b006450c dngo*0401 #else
0402 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0403 & R_low(i,j,bi,bj)**2
0404 #endif
0405
0406 ELSE
0407
96b006450c dngo*0408 face_factor =
29d9814714 Dani*0409 & 0.25 * dxG(i,j+1,bi,bj) *
0410 & streamice_density * gravity *
0411 & (1-streamice_density*i_rhow) *
96b006450c dngo*0412 & H_streamice(i,j,bi,bj)**2
29d9814714 Dani*0413
0414 ENDIF
0415
96b006450c dngo*0416 taudy_si(i,j+1,bi,bj) = taudy_si(i,j+1,bi,bj)
29d9814714 Dani*0417 & - face_factor
0418
96b006450c dngo*0419 taudy_si(i+1,j+1,bi,bj) = taudy_si(i+1,j+1,bi,bj)
29d9814714 Dani*0420 & - face_factor
0421
0422 ENDIF
0423
96b006450c dngo*0424
29d9814714 Dani*0425 IF (streamice_hmask(i,j-1,bi,bj).eq.0.or.
0426 & streamice_hmask(i,j-1,bi,bj).eq.2.or.
0427 & streamice_vfacemask(i,j,bi,bj).eq.2) THEN
0428
0429 IF (float_frac_streamice(i,j,bi,bj) .eq. 1.0) THEN
96b006450c dngo*0430
0431 face_factor =
29d9814714 Dani*0432 & 0.25 * dxG(i,j,bi,bj) *
96b006450c dngo*0433 & gravity *
29d9814714 Dani*0434 & streamice_density * H_streamice(i,j,bi,bj)**2-
0435 #ifdef USE_ALT_RLOW
96b006450c dngo*0436 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0437 & R_low_si(i,j,bi,bj)**2
96b006450c dngo*0438 #else
0439 & streamice_density_ocean_avg * grd_below_sl *
29d9814714 Dani*0440 & R_low(i,j,bi,bj)**2
0441 #endif
0442
0443 ELSE
0444
96b006450c dngo*0445 face_factor =
29d9814714 Dani*0446 & 0.25 * dxG(i,j,bi,bj) *
0447 & streamice_density * gravity *
0448 & (1-streamice_density*i_rhow) *
96b006450c dngo*0449 & H_streamice(i,j,bi,bj)**2
29d9814714 Dani*0450
0451 ENDIF
0452
96b006450c dngo*0453 taudy_si(i,j,bi,bj) = taudy_SI(i,j,bi,bj)
29d9814714 Dani*0454 & + face_factor
0455
96b006450c dngo*0456 taudy_si(i+1,j,bi,bj) = taudy_si(i+1,j,bi,bj)
29d9814714 Dani*0457 & + face_factor
0458
0459 ENDIF
0460
0461 ENDIF
0462
0463 ENDDO
0464 ENDDO
0465 ENDDO
0466 ENDDO
0467
0468 DO bj = myByLo(myThid), myByHi(myThid)
0469 DO bi = myBxLo(myThid), myBxHi(myThid)
0470 DO j=1-OLy+1,sNy+OLy-1
0471 DO i=1-OLx+1,sNx+OLx-1
0472 taudx_SI(i,j,bi,bj) = -1.*taudx_SI(i,j,bi,bj)
0473 taudy_SI(i,j,bi,bj) = -1.*taudy_SI(i,j,bi,bj)
0474 ENDDO
0475 ENDDO
0476 ENDDO
0477 ENDDO
96b006450c dngo*0478
29d9814714 Dani*0479
0480 #endif
0481 RETURN
0482 END