/[MITgcm]/MITgcm/pkg/flt/flt_runga4.F
ViewVC logotype

Contents of /MITgcm/pkg/flt/flt_runga4.F

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


Revision 1.2 - (show annotations) (download)
Wed Dec 22 21:25:18 2010 UTC (13 years, 4 months ago) by jahn
Branch: MAIN
CVS Tags: checkpoint63a, checkpoint63b, checkpoint63, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62z, checkpoint62y, checkpoint62x
Changes since 1.1: +3 -2 lines
add FLT_SIZE.h

1 C $Header: /u/gcmpack/MITgcm/pkg/flt/flt_runga4.F,v 1.1 2010/12/22 21:20:49 jahn Exp $
2 C $Name: $
3
4 #include "FLT_OPTIONS.h"
5
6 SUBROUTINE FLT_RUNGA4 (
7 I myTime, myIter, myThid )
8
9 C ==================================================================
10 C SUBROUTINE FLT_RUNGA4
11 C ==================================================================
12 C o This routine steps floats forward with second order Runge-Kutta
13 C
14 C started: Arne Biastoch
15 C
16 C changed: 2004.06.10 Antti Westerlund (antti.westerlund@helsinki.fi)
17 C and Sergio Jaramillo (sju@eos.ubc.ca)
18 C ==================================================================
19
20 C !USES:
21 IMPLICIT NONE
22
23 C == global variables ==
24 #include "SIZE.h"
25 #include "EEPARAMS.h"
26 #include "PARAMS.h"
27 #include "GRID.h"
28 #include "DYNVARS.h"
29 #include "FLT_SIZE.h"
30 #include "FLT.h"
31
32 C == routine arguments ==
33 _RL myTime
34 INTEGER myIter, myThid
35
36 C == Functions ==
37 c _RL FLT_MAP_R2K
38 c EXTERNAL FLT_MAP_R2K
39
40 C == local variables ==
41 INTEGER bi, bj
42 CHARACTER*(MAX_LEN_MBUF) msgBuf
43 INTEGER ip
44 INTEGER ic, jc, kc, iG, jG
45 _RL u1, v1, u2, v2, u3, v3, u4, v4
46 #ifdef ALLOW_3D_FLT
47 _RL w1, w2, w3, w4, ktz1, ktz2, ktz3, kz, scalez
48 _RL kzlo, kzhi
49 #endif
50 _RL ix, jy, itx1, jty1, itx2, jty2, itx3, jty3
51 _RL scalex, scaley
52 #ifdef USE_FLT_ALT_NOISE
53 Real*8 PORT_RAND_NORM
54 #else
55 Real*8 PORT_RAND
56 #undef _USE_INTEGERS
57 #ifdef _USE_INTEGERS
58 INTEGER seed
59 seed = -1
60 #else
61 Real*8 seed
62 seed = -1.d0
63 #endif
64 #endif
65
66 C == end of interface ==
67
68 #ifdef ALLOW_3D_FLT
69 kzlo = 0.5 _d 0
70 kzhi = 0.5 _d 0 + DFLOAT(Nr)
71 #endif
72
73 DO bj=myByLo(myThid),myByHi(myThid)
74 DO bi=myBxLo(myThid),myBxHi(myThid)
75 DO ip=1,npart_tile(bi,bj)
76
77 C If float has died move to level 0
78 IF ( tend(ip,bi,bj).NE.-1. .AND. myTime.GT.tend(ip,bi,bj)
79 & ) THEN
80 kpart(ip,bi,bj) = 0.
81 ELSE
82 C Start integration between tstart and tend (individual for each float)
83 IF ( (tstart(ip,bi,bj).EQ.-1..OR.myTime.GE.tstart(ip,bi,bj))
84 & .AND.( tend(ip,bi,bj).EQ.-1..OR.myTime.LE. tend(ip,bi,bj))
85 & .AND.( iup(ip,bi,bj).NE.-3.)
86 & ) THEN
87
88 ix = ipart(ip,bi,bj)
89 jy = jpart(ip,bi,bj)
90 ic=NINT(ix)
91 jc=NINT(jy)
92 kc=NINT(kpart(ip,bi,bj))
93
94 scalex=recip_dxF(ic,jc,bi,bj)
95 scaley=recip_dyF(ic,jc,bi,bj)
96 iG = myXGlobalLo + (bi-1)*sNx + ic-1
97 jG = myYGlobalLo + (bj-1)*sNy + jc-1
98
99 C First step
100
101 #ifdef ALLOW_3D_FLT
102 IF (iup(ip,bi,bj).EQ.-1.) THEN
103 c kz=global2local_k(kpart(ip,bi,bj),bi,bj,mjtyhid)
104
105 C recip_drF is in units 1/r (so IF r is in m this is in 1/m)
106 scalez=rkSign*recip_drF(kc)
107 C We should not do any special conversions for kz, since flt_trilinear
108 C expects it to be just a normal kpart type variable.
109 kz=kpart(ip,bi,bj)
110 CALL FLT_TRILINEAR(ix,jy,kz,u1,uVel,1,bi,bj,myThid)
111 CALL FLT_TRILINEAR(ix,jy,kz,v1,vVel,2,bi,bj,myThid)
112 CALL FLT_TRILINEAR(ix,jy,kz,w1,wVel,4,bi,bj,myThid)
113 ELSE
114 #else /* ALLOW_3D_FLT */
115 IF ( .TRUE. ) THEN
116 #endif /* ALLOW_3D_FLT */
117 CALL FLT_BILINEAR(ix,jy,u1,uVel,kc,1,bi,bj,myThid)
118 CALL FLT_BILINEAR(ix,jy,v1,vVel,kc,2,bi,bj,myThid)
119 ENDIF
120
121 C When using this alternative scheme the noise probably should not be added twice.
122 #ifndef USE_FLT_ALT_NOISE
123 IF (iup(ip,bi,bj).NE.-2.) THEN
124 u1 = u1 + u1*(PORT_RAND(seed)-0.5)*flt_noise
125 v1 = v1 + v1*(PORT_RAND(seed)-0.5)*flt_noise
126 #ifdef ALLOW_3D_FLT
127 #ifdef ALLOW_FLT_3D_NOISE
128 IF (iup(ip,bi,bj).EQ.-1.) THEN
129 w1 = w1 + w1*(PORT_RAND(seed)-0.5)*flt_noise
130 ENDIF
131 #endif
132 #endif /* ALLOW_3D_FLT */
133 ENDIF
134 #endif
135
136 C ix and itx are in indices. Therefore it is necessary to multiply
137 C with a grid scale factor.
138
139 itx1=ix+0.5*flt_deltaT*u1*scalex
140 jty1=jy+0.5*flt_deltaT*v1*scaley
141
142 C Second step
143
144 #ifdef ALLOW_3D_FLT
145 IF (iup(ip,bi,bj).EQ.-1.) THEN
146 ktz1=kz+0.5*flt_deltaT*w1*scalez
147 CALL FLT_TRILINEAR(itx1,jty1,ktz1,u2,uVel,
148 & 1,bi,bj,myThid)
149 CALL FLT_TRILINEAR(itx1,jty1,ktz1,v2,vVel,
150 & 2,bi,bj,myThid)
151 CALL FLT_TRILINEAR(itx1,jty1,ktz1,w2,wVel,
152 & 4,bi,bj,myThid)
153 ELSE
154 #else /* ALLOW_3D_FLT */
155 IF ( .TRUE. ) THEN
156 #endif /* ALLOW_3D_FLT */
157 CALL FLT_BILINEAR(itx1,jty1,u2,uVel,
158 & kc,1,bi,bj,myThid)
159 CALL FLT_BILINEAR(itx1,jty1,v2,vVel,
160 & kc,2,bi,bj,myThid)
161 ENDIF
162
163 IF (iup(ip,bi,bj).NE.-2.) THEN
164 #ifdef USE_FLT_ALT_NOISE
165 u2 = u2 + port_rand_norm()*flt_noise
166 v2 = v2 + port_rand_norm()*flt_noise
167 #ifdef ALLOW_3D_FLT
168 #ifdef ALLOW_FLT_3D_NOISE
169 IF (iup(ip,bi,bj).EQ.-1.) THEN
170 w2 = w2 + port_rand_norm()*flt_noise
171 ENDIF
172 #endif
173 #endif /* ALLOW_3D_FLT */
174
175 #else /* USE_FLT_ALT_NOISE */
176 u2 = u2 + u2*(PORT_RAND(seed)-0.5)*flt_noise
177 v2 = v2 + v2*(PORT_RAND(seed)-0.5)*flt_noise
178 #ifdef ALLOW_3D_FLT
179 #ifdef ALLOW_FLT_3D_NOISE
180 IF (iup(ip,bi,bj).EQ.-1.) THEN
181 w2 = w2 + w2*(PORT_RAND(seed)-0.5)*flt_noise
182 ENDIF
183 #endif
184 #endif /* ALLOW_3D_FLT */
185
186 #endif /* USE_FLT_ALT_NOISE */
187 ENDIF
188
189 itx2=ix+0.5*flt_deltaT*u2*scalex
190 jty2=jy+0.5*flt_deltaT*v2*scaley
191
192 C Third step
193
194 #ifdef ALLOW_3D_FLT
195 IF (iup(ip,bi,bj).EQ.-1.) THEN
196 ktz2=kz+0.5*flt_deltaT*w2*scalez
197 CALL FLT_TRILINEAR(itx2,jty2,ktz2,u3,uVel,
198 & 1,bi,bj,myThid)
199 CALL FLT_TRILINEAR(itx2,jty2,ktz2,v3,vVel,
200 & 2,bi,bj,myThid)
201 CALL FLT_TRILINEAR(itx2,jty2,ktz2,w3,wVel,
202 & 4,bi,bj,myThid)
203 ELSE
204 #else /* ALLOW_3D_FLT */
205 IF ( .TRUE. ) THEN
206 #endif /* ALLOW_3D_FLT */
207 CALL FLT_BILINEAR(itx2,jty2,u3,uVel,
208 & kc,1,bi,bj,myThid)
209 CALL FLT_BILINEAR(itx2,jty2,v3,vVel,
210 & kc,2,bi,bj,myThid)
211 ENDIF
212
213 IF (iup(ip,bi,bj).NE.-2.) THEN
214 #ifdef USE_FLT_ALT_NOISE
215 u3 = u3 + port_rand_norm()*flt_noise
216 v3 = v3 + port_rand_norm()*flt_noise
217 #ifdef ALLOW_3D_FLT
218 #ifdef ALLOW_FLT_3D_NOISE
219 IF (iup(ip,bi,bj).EQ.-1.) THEN
220 w3 = w3 + port_rand_norm()*flt_noise
221 ENDIF
222 #endif
223 #endif /* ALLOW_3D_FLT */
224
225 #else /* USE_FLT_ALT_NOISE */
226 u3 = u3 + u3*(PORT_RAND(seed)-0.5)*flt_noise
227 v3 = v3 + v3*(PORT_RAND(seed)-0.5)*flt_noise
228 #ifdef ALLOW_3D_FLT
229 #ifdef ALLOW_FLT_3D_NOISE
230 IF (iup(ip,bi,bj).EQ.-1.) THEN
231 w3 = w3 + w3*(PORT_RAND(seed)-0.5)*flt_noise
232 ENDIF
233 #endif
234 #endif /* ALLOW_3D_FLT */
235
236 #endif /* USE_FLT_ALT_NOISE */
237 ENDIF
238
239 itx3=ix+flt_deltaT*u3*scalex
240 jty3=jy+flt_deltaT*v3*scaley
241
242 C Fourth step
243
244 #ifdef ALLOW_3D_FLT
245 IF (iup(ip,bi,bj).EQ.-1.) THEN
246 ktz3=kz+0.5*flt_deltaT*w2*scalez
247 CALL FLT_TRILINEAR(itx3,jty3,ktz3,u4,uVel,
248 & 1,bi,bj,myThid)
249 CALL FLT_TRILINEAR(itx3,jty3,ktz3,v4,vVel,
250 & 2,bi,bj,myThid)
251 CALL FLT_TRILINEAR(itx3,jty3,ktz3,w4,wVel,
252 & 4,bi,bj,myThid)
253 ELSE
254 #else /* ALLOW_3D_FLT */
255 IF ( .TRUE. ) THEN
256 #endif /* ALLOW_3D_FLT */
257 CALL FLT_BILINEAR(itx3,jty3,u4,uVel,
258 & kc,1,bi,bj,myThid)
259 CALL FLT_BILINEAR(itx3,jty3,v4,vVel,
260 & kc,2,bi,bj,myThid)
261 ENDIF
262
263 IF (iup(ip,bi,bj).NE.-2.) THEN
264 #ifdef USE_FLT_ALT_NOISE
265 u4 = u4 + port_rand_norm()*flt_noise
266 v4 = v4 + port_rand_norm()*flt_noise
267 #ifdef ALLOW_3D_FLT
268 #ifdef ALLOW_FLT_3D_NOISE
269 IF (iup(ip,bi,bj).EQ.-1.) THEN
270 w4 = w4 + port_rand_norm()*flt_noise
271 ENDIF
272 #endif
273 #endif /* ALLOW_3D_FLT */
274
275 #else /* USE_FLT_ALT_NOISE */
276 u4 = u4 + u4*(PORT_RAND(seed)-0.5)*flt_noise
277 v4 = v4 + v4*(PORT_RAND(seed)-0.5)*flt_noise
278 #ifdef ALLOW_3D_FLT
279 #ifdef ALLOW_FLT_3D_NOISE
280 IF (iup(ip,bi,bj).EQ.-1.) THEN
281 w4 = w4 + w4*(PORT_RAND(seed)-0.5)*flt_noise
282 ENDIF
283 #endif
284 #endif /* ALLOW_3D_FLT */
285
286 #endif /* USE_FLT_ALT_NOISE */
287 ENDIF
288
289 C ipart is in coordinates. Therefore it is necessary to multiply
290 C with a grid scale factor divided by the number grid points per
291 C geographical coordinate.
292 ipart(ip,bi,bj) = ipart(ip,bi,bj) + flt_deltaT/6
293 & * (u1 + 2*u2 + 2*u3 + u4) * scalex
294 jpart(ip,bi,bj) = jpart(ip,bi,bj) + flt_deltaT/6
295 & * (v1 + 2*v2 + 2*v3 + v4) * scaley
296 #ifdef ALLOW_3D_FLT
297 IF (iup(ip,bi,bj).EQ.-1.) THEN
298 kpart(ip,bi,bj) = kpart(ip,bi,bj) + flt_deltaT/6
299 & * (w1 + 2*w2 + 2*w3 + w4) * scalez
300 ENDIF
301 #endif /* ALLOW_3D_FLT */
302
303 C-- new horizontal grid indices
304 ic = MAX( 1-Olx, MIN( NINT(ipart(ip,bi,bj)), sNx+Olx ) )
305 jc = MAX( 1-Oly, MIN( NINT(jpart(ip,bi,bj)), sNy+Oly ) )
306
307 #ifdef ALLOW_3D_FLT
308 C If float is 3D, make sure that it remains in water
309 IF (iup(ip,bi,bj).EQ.-1.) THEN
310 C reflect on surface
311 IF (kpart(ip,bi,bj).LT.kzlo) kpart(ip,bi,bj)=kzlo
312 & +kzlo-kpart(ip,bi,bj)
313 C stop at bottom
314 IF (kpart(ip,bi,bj).GT.kzhi) kpart(ip,bi,bj)=kzhi
315 C-to work also with non flat-bottom set-up:
316 c IF ( kpart(ip,bi,bj).GT.kLowC(ic,jc,bi,bj)+0.5 )
317 c & kpart(ip,bi,bj) = kLowC(ic,jc,bi,bj)+0.5
318 ENDIF
319 #endif /* ALLOW_3D_FLT */
320
321 #ifdef ALLOW_OBCS
322 IF ( useOBCS ) THEN
323 C-- stop floats which enter the OB region:
324 IF ( maskInC(ic,jc,bi,bj).EQ.0. .AND.
325 & maskC(ic,jc,1,bi,bj).EQ.1. ) THEN
326 C for now, just reset "tend" to myTime-deltaT
327 C (a better way would be to remove this one & re-order the list of floats)
328 tend(ip,bi,bj) = myTime - flt_deltaT
329 ENDIF
330 ENDIF
331 #endif /* ALLOW_OBCS */
332
333 ENDIF
334 ENDIF
335
336 C- end ip loop
337 ENDDO
338 C- end bi,bj loops
339 ENDDO
340 ENDDO
341
342 RETURN
343 END

  ViewVC Help
Powered by ViewVC 1.1.22