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

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

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


Revision 1.15 - (show annotations) (download)
Fri Oct 23 08:10:16 2009 UTC (14 years, 11 months ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint62, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint61z, checkpoint61y
Changes since 1.14: +52 -29 lines
 - change seaice_calc_viscosities/strainraties for better vectorization after AD by TAF

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_calc_strainrates.F,v 1.14 2009/06/24 08:23:38 mlosch Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE SEAICE_CALC_STRAINRATES(
8 I uFld, vFld,
9 O e11Loc, e22Loc, e12Loc,
10 I iStep, myTime, myIter, myThid )
11 C /==========================================================\
12 C | SUBROUTINE SEAICE_CALC_STRAINRATES |
13 C | o compute strain rates from ice velocities |
14 C |==========================================================|
15 C | written by Martin Losch, Apr 2007 |
16 C \==========================================================/
17 IMPLICIT NONE
18
19 C === Global variables ===
20 #include "SIZE.h"
21 #include "EEPARAMS.h"
22 #include "PARAMS.h"
23 #include "GRID.h"
24 #include "SEAICE_PARAMS.h"
25 #include "SEAICE.h"
26
27 #ifdef ALLOW_AUTODIFF_TAMC
28 # include "tamc.h"
29 #endif
30
31 C === Routine arguments ===
32 C iStep :: Sub-time-step number
33 C myTime :: Simulation time
34 C myIter :: Simulation timestep number
35 C myThid :: My Thread Id. number
36 INTEGER iStep
37 _RL myTime
38 INTEGER myIter
39 INTEGER myThid
40 C ice velocities
41 _RL uFld (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
42 _RL vFld (1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
43 C strain rate tensor
44 _RL e11Loc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
45 _RL e22Loc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
46 _RL e12Loc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
47 CEndOfInterface
48
49 #ifdef SEAICE_CGRID
50 #ifdef SEAICE_ALLOW_DYNAMICS
51 C === Local variables ===
52 C i,j,bi,bj - Loop counters
53 INTEGER i, j, bi, bj
54 C hFacU, hFacV - determine the no-slip boundary condition
55 INTEGER k
56 _RS hFacU, hFacV, noSlipFac
57 C auxillary variables that help writing code that
58 C vectorizes even after TAFization
59 _RL dudx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60 _RL dvdy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
61 _RL dudy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
62 _RL dvdx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
63 _RL uave (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
64 _RL vave (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
65
66 k = 1
67 noSlipFac = 0. _d 0
68 IF ( SEAICE_no_slip ) noSlipFac = 1. _d 0
69 C
70 #ifndef SEAICE_OLD_AND_BAD_DISCRETIZATION
71 DO bj=myByLo(myThid),myByHi(myThid)
72 DO bi=myBxLo(myThid),myBxHi(myThid)
73 C abbreviations on C-points, need to do them in separate loops
74 C for vectorization
75 DO j=1-Oly,sNy+Oly-1
76 DO i=1-Olx,sNx+Olx-1
77 dudx(I,J) = _recip_dxF(I,J,bi,bj) *
78 & (uFld(I+1,J,bi,bj)-uFld(I,J,bi,bj))
79 uave(I,J) = 0.5 _d 0 * (uFld(I,J,bi,bj)+uFld(I+1,J,bi,bj))
80 ENDDO
81 ENDDO
82 DO j=1-Oly,sNy+Oly-1
83 DO i=1-Olx,sNx+Olx-1
84 dvdy(I,J) = _recip_dyF(I,J,bi,bj) *
85 & (vFld(I,J+1,bi,bj)-vFld(I,J,bi,bj))
86 vave(I,J) = 0.5 _d 0 * (vFld(I,J,bi,bj)+vFld(I,J+1,bi,bj))
87 ENDDO
88 ENDDO
89 C evaluate strain rates at C-points
90 DO j=1-Oly,sNy+Oly-1
91 DO i=1-Olx,sNx+Olx-1
92 e11Loc(I,J,bi,bj) = dudx(I,J) + vave(I,J) * k2AtC(I,J,bi,bj)
93 e22Loc(I,J,bi,bj) = dvdy(I,J) + uave(I,J) * k1AtC(I,J,bi,bj)
94 ENDDO
95 ENDDO
96 C abbreviations at Z-points, need to do them in separate loops
97 C for vectorization
98 DO j=1-Oly+1,sNy+Oly
99 DO i=1-Olx+1,sNx+Olx
100 dudy(I,J) = ( uFld(I,J,bi,bj) - uFld(I ,J-1,bi,bj) )
101 & * _recip_dyU(I,J,bi,bj)
102 uave(I,J) = 0.5 _d 0 * (uFld(I,J,bi,bj)+uFld(I ,J-1,bi,bj))
103 ENDDO
104 ENDDO
105 DO j=1-Oly+1,sNy+Oly
106 DO i=1-Olx+1,sNx+Olx
107 dvdx(I,J) = ( vFld(I,J,bi,bj) - vFld(I-1,J ,bi,bj) )
108 & * _recip_dxV(I,J,bi,bj)
109 vave(I,J) = 0.5 _d 0 * (vFld(I,J,bi,bj)+vFld(I-1,J ,bi,bj))
110 ENDDO
111 ENDDO
112 C evaluate strain rates at Z-points
113 DO j=1-Oly+1,sNy+Oly
114 DO i=1-Olx+1,sNx+Olx
115 hFacU = _maskW(i,j,k,bi,bj) - _maskW(i,j-1,k,bi,bj)
116 hFacV = _maskS(i,j,k,bi,bj) - _maskS(i-1,j,k,bi,bj)
117 e12Loc(I,J,bi,bj) = 0.5 _d 0 * (
118 & dudy(I,J) + dvdx(I,J)
119 & - k1AtZ(I,J,bi,bj) * vave(I,J)
120 & - k2AtZ(I,J,bi,bj) * uave(I,J)
121 & )
122 & *maskC(I ,J ,k,bi,bj)*maskC(I-1,J ,k,bi,bj)
123 & *maskC(I ,J-1,k,bi,bj)*maskC(I-1,J-1,k,bi,bj)
124 & + 2.0 _d 0 * noSlipFac * (
125 & 2.0 _d 0 * uave(I,J) * _recip_dyU(I,J,bi,bj) * hFacU
126 & + 2.0 _d 0 * vave(I,J) * _recip_dxV(I,J,bi,bj) * hFacV
127 & )
128 C no slip at the boundary implies u(j)+u(j-1)=0 and v(i)+v(i-1)=0
129 C accross the boundary; this is already accomplished by masking so
130 C that the following lines are not necessary
131 c$$$ & - hFacV * k1AtZ(I,J,bi,bj) * vave(I,J)
132 c$$$ & - hFacU * k2AtZ(I,J,bi,bj) * uave(I,J)
133 ENDDO
134 ENDDO
135
136 ENDDO
137 ENDDO
138 #else
139 C this the old and incomplete discretization, here I also erroneously
140 C used finite-volumes to discretize the strain rates
141 DO bj=myByLo(myThid),myByHi(myThid)
142 DO bi=myBxLo(myThid),myBxHi(myThid)
143 DO j=1-Oly,sNy+Oly-1
144 DO i=1-Olx,sNx+Olx-1
145 C evaluate strain rates
146 e11Loc(I,J,bi,bj) = _recip_dxF(I,J,bi,bj) *
147 & (uFld(I+1,J,bi,bj)-uFld(I,J,bi,bj))
148 & -HALF*
149 & (vFld(I,J,bi,bj)+vFld(I,J+1,bi,bj))
150 & * _tanPhiAtU(I,J,bi,bj)*recip_rSphere
151 e22Loc(I,J,bi,bj) = _recip_dyF(I,J,bi,bj) *
152 & (vFld(I,J+1,bi,bj)-vFld(I,J,bi,bj))
153 C one metric term is missing
154 ENDDO
155 ENDDO
156 DO j=1-Oly+1,sNy+Oly
157 DO i=1-Olx+1,sNx+Olx
158 e12Loc(I,J,bi,bj) = HALF*(
159 & (uFld(I ,J ,bi,bj) * _dxC(I ,J ,bi,bj)
160 & -uFld(I ,J-1,bi,bj) * _dxC(I ,J-1,bi,bj)
161 & +vFld(I ,J ,bi,bj) * _dyC(I ,J ,bi,bj)
162 & -vFld(I-1,J ,bi,bj) * _dyC(I-1,J ,bi,bj))
163 & * recip_rAz(I,J,bi,bj)
164 & +
165 & 0.25 _d 0 * (uFld(I,J,bi,bj)+uFld(I ,J-1,bi,bj))
166 & * ( _tanPhiAtU(I,J,bi,bj) + _tanPhiAtU(I,J-1,bi,bj) )
167 & *recip_rSphere
168 & )
169 & *maskC(I ,J ,k,bi,bj)*maskC(I-1,J ,k,bi,bj)
170 & *maskC(I ,J-1,k,bi,bj)*maskC(I-1,J-1,k,bi,bj)
171 C one metric term is missing
172 ENDDO
173 ENDDO
174 IF ( SEAICE_no_slip ) THEN
175 C no slip boundary conditions apply only to e12Loc
176 DO j=1-Oly+1,sNy+Oly
177 DO i=1-Olx+1,sNx+Olx
178 hFacU = _maskW(i,j,k,bi,bj) - _maskW(i,j-1,k,bi,bj)
179 hFacV = _maskS(i,j,k,bi,bj) - _maskS(i-1,j,k,bi,bj)
180
181 e12Loc(I,J,bi,bj) = e12Loc(I,J,bi,bj)
182 & + recip_rAz(i,j,bi,bj) * 2. _d 0 *
183 & ( hFacU * ( _dxC(i,j-1,bi,bj)*uFld(i,j ,bi,bj)
184 & + _dxC(i,j, bi,bj)*uFld(i,j-1,bi,bj) )
185 & + hFacV * ( _dyC(i-1,j,bi,bj)*vFld(i ,j,bi,bj)
186 & + _dyC(i, j,bi,bj)*vFld(i-1,j,bi,bj) ) )
187 & - hFacU
188 & * 0.25 _d 0 * (uFld(I,J,bi,bj)+uFld(I ,J-1,bi,bj))
189 & * ( _tanPhiAtU(I,J,bi,bj) + _tanPhiAtU(I,J-1,bi,bj) )
190 & *recip_rSphere
191 C one metric term is missing
192 ENDDO
193 ENDDO
194
195 ENDIF
196 ENDDO
197 ENDDO
198 #endif /* SEAICE_OLD_AND_BAD_DISCRETIZATION */
199 #endif /* SEAICE_ALLOW_DYNAMICS */
200 #endif /* SEAICE_CGRID */
201 RETURN
202 END

  ViewVC Help
Powered by ViewVC 1.1.22