/[MITgcm]/MITgcm/pkg/seaice/seaice_calc_viscosities.F
ViewVC logotype

Contents of /MITgcm/pkg/seaice/seaice_calc_viscosities.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.24 - (show annotations) (download)
Fri May 3 14:51:02 2013 UTC (11 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n
Changes since 1.23: +32 -36 lines
remove unused variables

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_calc_viscosities.F,v 1.23 2013/04/23 09:53:44 mlosch Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CBOP
7 CStartOfInterface
8 SUBROUTINE SEAICE_CALC_VISCOSITIES(
9 I e11, e22, e12, zMin, zMax, hEffM, press0,
10 O eta, etaZ, zeta, press,
11 I iStep, myTime, myIter, myThid )
12 C *==========================================================*
13 C | SUBROUTINE SEAICE_CALC_VISCOSITIES |
14 C | o compute shear and bulk viscositites eta, zeta and the |
15 C | corrected ice strength P |
16 C | (see Zhang and Hibler, JGR, 102, 8691-8702, 1997) |
17 C *==========================================================*
18 C | written by Martin Losch, Mar 2006 |
19 C *==========================================================*
20 IMPLICIT NONE
21
22 C === Global variables ===
23 #include "SIZE.h"
24 #include "EEPARAMS.h"
25 #include "PARAMS.h"
26 #include "GRID.h"
27 #include "SEAICE_SIZE.h"
28 #include "SEAICE_PARAMS.h"
29
30 #ifdef ALLOW_AUTODIFF_TAMC
31 # include "tamc.h"
32 #endif
33
34 C === Routine arguments ===
35 C iStep :: Sub-time-step number
36 C myTime :: Simulation time
37 C myIter :: Simulation timestep number
38 C myThid :: My Thread Id. number
39 INTEGER iStep
40 _RL myTime
41 INTEGER myIter
42 INTEGER myThid
43 C strain rate tensor
44 _RL e11 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
45 _RL e22 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
46 _RL e12 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
47 C
48 _RL zMin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
49 _RL zMax (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
50 _RL hEffM (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
51 C
52 _RL press0(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
53 _RL press (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
54 C bulk viscosity
55 _RL eta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
56 _RL etaZ (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
57 C shear viscosity
58 _RL zeta (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
59 CEndOfInterface
60
61 #if ( defined (SEAICE_CGRID) && defined (SEAICE_ALLOW_DYNAMICS) )
62 C === Local variables ===
63 C i,j,bi,bj - Loop counters
64 C e11, e12, e22 - components of strain rate tensor
65 C ecm2 - inverse of square of eccentricity of yield curve
66 INTEGER i, j, bi, bj
67 _RL ECM2, deltaC, deltaCreg, tmp
68 _RL e12Csqr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69 #ifdef SEAICE_ALLOW_TEM
70 _RL etaMax, etaDen
71 #endif /* SEAICE_ALLOW_TEM */
72 INTEGER k
73 _RL sumNorm
74 #ifdef SEAICE_ZETA_SMOOTHREG
75 _RL argTmp
76 #endif /* SEAICE_ZETA_SMOOTHREG */
77 CEOP
78
79 C-- FIRST SET UP BASIC CONSTANTS
80 k=1
81 ecm2=0. _d 0
82 IF ( SEAICE_eccen .NE. 0. _d 0 ) ecm2=ONE/(SEAICE_eccen**2)
83 C
84 DO bj=myByLo(myThid),myByHi(myThid)
85 DO bi=myBxLo(myThid),myBxHi(myThid)
86 C need to do this beforehand for easier vectorization after
87 C TAFization
88 IF ( SEAICEetaZmethod .EQ. 0 ) THEN
89 DO j=1-OLy+1,sNy+OLy-1
90 DO i=1-OLx+1,sNx+OLx-1
91 tmp = 0.25 *
92 & ( e12(I,J ,bi,bj) + e12(I+1,J ,bi,bj)
93 & + e12(I,J+1,bi,bj) + e12(I+1,J+1,bi,bj) )
94 e12Csqr(i,j) = tmp*tmp
95 ENDDO
96 ENDDO
97 ELSEIF ( SEAICEetaZmethod .EQ. 3 ) THEN
98 DO j=1-OLy+1,sNy+OLy-1
99 DO i=1-OLx+1,sNx+OLx-1
100 C area weighted average of the squares of e12 is more accurate
101 C (and energy conserving)
102 e12Csqr(i,j) = 0.25 _d 0 * recip_rA(I,J,bi,bj) *
103 & ( rAz(I ,J ,bi,bj)*e12(I ,J ,bi,bj)**2
104 & + rAz(I+1,J ,bi,bj)*e12(I+1,J ,bi,bj)**2
105 & + rAz(I ,J+1,bi,bj)*e12(I ,J+1,bi,bj)**2
106 & + rAz(I+1,J+1,bi,bj)*e12(I+1,J+1,bi,bj)**2 )
107 ENDDO
108 ENDDO
109 ENDIF
110 DO j=1-OLy+1,sNy+OLy-1
111 DO i=1-OLx+1,sNx+OLx-1
112 deltaC = (e11(i,j,bi,bj)**2+e22(i,j,bi,bj)**2)*(ONE+ecm2)
113 & + 4. _d 0*ecm2*e12Csqr(i,j)
114 & + 2. _d 0*e11(i,j,bi,bj)*e22(i,j,bi,bj)*(ONE-ecm2)
115 #ifdef ALLOW_AUTODIFF_TAMC
116 C avoid sqrt of 0
117 IF ( deltaC .GT. 0. _d 0 ) deltaC = SQRT(deltaC)
118 #else
119 deltaC = SQRT(deltaC)
120 #endif /* ALLOW_AUTODIFF_TAMC */
121 deltaCreg = MAX(deltaC,SEAICE_EPS)
122 C "replacement pressure"
123 zeta (I,J,bi,bj) = HALF*press0(I,J,bi,bj)/deltaCreg
124 C put min and max viscosities in
125 #ifdef SEAICE_ZETA_SMOOTHREG
126 C regularize zeta to zmax with a smooth tanh-function instead
127 C of a min(zeta,zmax). This improves convergence of iterative
128 C solvers (Lemieux and Tremblay 2009, JGR). No effect on EVP
129 argTmp = exp(-1. _d 0/(deltaCreg*SEAICE_zetaMaxFac))
130 zeta (I,J,bi,bj) = ZMAX(I,J,bi,bj)
131 & *(1. _d 0 - argTmp)/(1. _d 0 + argTmp)
132 #else
133 zeta (I,J,bi,bj) = MIN(ZMAX(I,J,bi,bj),zeta(I,J,bi,bj))
134 #endif /* SEAICE_ZETA_SMOOTHREG */
135 zeta (I,J,bi,bj) = MAX(ZMIN(I,J,bi,bj),zeta(I,J,bi,bj))
136 C set viscosities to zero at hEffM flow pts
137 zeta (I,J,bi,bj) = zeta(I,J,bi,bj)*HEFFM(I,J,bi,bj)
138 eta (I,J,bi,bj) = ECM2*zeta(I,J,bi,bj)
139 press(I,J,bi,bj) = TWO *zeta(I,J,bi,bj)*deltaC
140 ENDDO
141 ENDDO
142 #ifdef SEAICE_ALLOW_TEM
143 IF ( SEAICEuseTEM ) THEN
144 DO j=1-OLy+1,sNy+OLy-1
145 DO i=1-OLx+1,sNx+OLx-1
146 etaDen = (e11(I,J,bi,bj)-e22(I,J,bi,bj))**2
147 & + 4. _d 0*e12Csqr(i,j)
148 etaDen = SQRT(MAX(SEAICE_EPS_SQ,etaDen))
149 etaMax = ( 0.5 _d 0*press(I,J,bi,bj)-zeta(I,J,bi,bj)
150 & *( e11(I,J,bi,bj)+e22(I,J,bi,bj) )
151 & )/etaDen
152 eta(I,J,bi,bj) = MIN(eta(I,J,bi,bj),etaMax)
153 ENDDO
154 ENDDO
155 ENDIF
156 #endif /* SEAICE_ALLOW_TEM */
157 C compute eta at Z-points by simple averaging
158 DO j=1-OLy+1,sNy+OLy-1
159 DO i=1-OLx+1,sNx+OLx-1
160 sumNorm = maskC(I,J, k,bi,bj)+maskC(I-1,J, k,bi,bj)
161 & + maskC(I,J-1,k,bi,bj)+maskC(I-1,J-1,k,bi,bj)
162 IF ( sumNorm.GT.0. _d 0 ) sumNorm = 1. _d 0 / sumNorm
163 etaZ(I,J,bi,bj) = sumNorm *
164 & ( eta (I,J ,bi,bj) + eta (I-1,J ,bi,bj)
165 & + eta (I,J-1,bi,bj) + eta (I-1,J-1,bi,bj) )
166 ENDDO
167 ENDDO
168 C free-slip means no lateral stress, which is best achieved masking
169 C eta on vorticity(=Z)-points; from now on we only need to worry
170 C about the no-slip boundary conditions
171 IF (.NOT.SEAICE_no_slip) THEN
172 DO J=1-OLy+1,sNy+OLy-1
173 DO I=1-OLx+1,sNx+OLx-1
174 etaZ(I,J,bi,bj) = etaZ(I,J,bi,bj)
175 & *maskC(I,J, k,bi,bj)*maskC(I-1,J, k,bi,bj)
176 & *maskC(I,J-1,k,bi,bj)*maskC(I-1,J-1,k,bi,bj)
177 ENDDO
178 ENDDO
179 ENDIF
180 ENDDO
181 ENDDO
182
183 #endif /* SEAICE_ALLOW_DYNAMICS and SEAICE_CGRID */
184 RETURN
185 END

  ViewVC Help
Powered by ViewVC 1.1.22