ROMS
Loading...
Searching...
No Matches
mod_floats.F
Go to the documentation of this file.
1#include "cppdefs.h"
2 MODULE mod_floats
3#ifdef FLOATS
4!
5!git $Id$
6!================================================== Hernan G. Arango ===
7! Copyright (c) 2002-2025 The ROMS Group !
8! Licensed under a MIT/X style license !
9! See License_ROMS.md !
10!=======================================================================
11! !
12! Findex Indices of spherical coordinates entries in initial !
13! location arrays, if any. !
14! Flon Initial longitude locations, if any. !
15! Flat Initial latitude locations, if any. !
16! Ftype Float trajectory type: !
17! Ftype(:) = 1, neutral density 3D Lagrangian !
18! Ftype(:) = 2, isobaric (constant depth) float. !
19! Tinfo Float trajectory initial information. !
20! bounded Float bounded status switch. !
21# if defined SOLVE3D && defined FLOAT_VWALK
22! rwalk Normally distributed random deviates used in vertical !
23! random walk. !
24# endif
25# if defined SOLVE3D && defined FLOAT_STICKY
26! stuck Reflection switch. Floats that hit the surface are !
27! reflected and floats that hitthe bottom get stick !
28# endif
29! track Multivariate float trajectory data at several time !
30! time levels. !
31! !
32!=======================================================================
33!
34 USE mod_param
35!
36 implicit none
37!
38 PUBLIC :: allocate_floats
39 PUBLIC :: deallocate_floats
40!
41!-----------------------------------------------------------------------
42! Define T_DRIFTER structure.
43!-----------------------------------------------------------------------
44!
46
47 logical, pointer :: bounded(:)
48
49# if defined SOLVE3D && defined FLOAT_STICKY
50 logical, pointer :: stuck(:)
51# endif
52
53 integer, pointer :: findex(:)
54 integer, pointer :: ftype(:)
55
56 real(r8), pointer :: flon(:)
57 real(r8), pointer :: flat(:)
58 real(r8), pointer :: fz0(:)
59 real(r8), pointer :: tinfo(:,:)
60# if defined SOLVE3D && defined FLOAT_VWALK
61 real(r8), pointer :: rwalk(:)
62# endif
63 real(r8), pointer :: track(:,:,:)
64
65 END TYPE t_drifter
66!
67 TYPE (t_drifter), allocatable :: drifter(:)
68!
69!-----------------------------------------------------------------------
70! Lagrangian drifters parameters.
71!-----------------------------------------------------------------------
72!
73! Switch to control the printing of floats positions to standard output
74! file.
75!
76 logical, allocatable :: fprint(:)
77!
78! Identification indices.
79!
80 integer, parameter :: itstr = 0 ! release time
81 integer, parameter :: ixgrd = 1 ! x-grid location
82 integer, parameter :: iygrd = 2 ! y-grid location
83 integer, parameter :: izgrd = 3 ! z-grid location
84 integer, parameter :: iflon = 4 ! longitude location
85 integer, parameter :: iflat = 5 ! latitude location
86 integer, parameter :: idpth = 6 ! depth
87 integer, parameter :: ixrhs = 7 ! x-slope
88 integer, parameter :: iyrhs = 8 ! y-slope
89 integer, parameter :: izrhs = 9 ! z-slope
90 integer, parameter :: ifden = 10 ! density anomaly
91# ifdef FLOAT_VWALK
92 integer, parameter :: ifakt = 11 ! diffusivity, Akt
93 integer, parameter :: ifdak = 12 ! d(Akt)/d(s)
94# endif
95# ifdef FLOAT_OYSTER
96# ifdef FLOAT_VWALK
97 integer, parameter :: i1ohz = 13 ! 1/Hz
98 integer, parameter :: isizf = 14 ! larvae size (length)
99 integer, parameter :: ibrhs = 15 ! behavior RHS
100 integer, parameter :: iswim = 16 ! swimming time
101 integer, parameter :: iwbio = 17 ! biological w-velocity
102 integer, parameter :: iwsin = 18 ! sinking velocity
103# else
104 integer, parameter :: i1ohz = 11 ! 1/Hz
105 integer, parameter :: isizf = 12 ! larvae size (length)
106 integer, parameter :: ibrhs = 13 ! behavior RHS
107 integer, parameter :: iswim = 14 ! swimming time
108 integer, parameter :: iwbio = 15 ! biological w-velocity
109 integer, parameter :: iwsin = 16 ! sinking velocity
110# endif
111# endif
112# ifdef SOLVE3D
113!
114! Tracer variables indices in the track array.
115!
116 integer, allocatable :: iftvar(:)
117# endif
118!
119! Set float tracjectory types:
120!
121! flt_Lagran: 3D Lagrangian floats
122! flt_Isobar: Isobaric floats, p=g*(z+zeta)=constant
123! flt_Geopot: Geopotential floats, constant depth
124!
125 integer, parameter :: flt_lagran = 1
126 integer, parameter :: flt_isobar = 2
127 integer, parameter :: flt_geopot = 3
128
129# ifdef FLOAT_VWALK
130!
131! Vertical random walk, initial seed state.
132!
133 integer :: flt_iseed
134# endif
135!
136! Floats restart switch.
137!
138 integer, allocatable :: frrec(:)
139!
140 CONTAINS
141!
142 SUBROUTINE allocate_floats (Ldrifter)
143!
144!=======================================================================
145! !
146! This routine eihter allocates and initialize all variables in !
147! the DRIFTER structure (Ldrifter=.TRUE.) or other parameters in !
148! the module that are independent of Nfloats (Ldrifter=.FALSE.). !
149! !
150!=======================================================================
151!
152 USE mod_scalars
153!
154! Imported variable declarations.
155!
156 logical, intent(in) :: ldrifter
157!
158! Local variable declarations.
159!
160 integer :: ng, i, ic, iflt
161
162 real(r8), parameter :: inival = 0.0_r8
163!
164!-----------------------------------------------------------------------
165! Allocate Langrangian drifters structure.
166!-----------------------------------------------------------------------
167!
168 IF (ldrifter) THEN
169
170 allocate ( drifter(ngrids) )
171!
172! Allocate variables.
173!
174 DO ng=1,ngrids
175 allocate ( drifter(ng) % bounded(nfloats(ng)) )
176 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
177
178# if defined SOLVE3D && defined FLOAT_STICKY
179 allocate ( drifter(ng) % stuck(nfloats(ng)) )
180 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
181# endif
182
183 allocate ( drifter(ng) % Findex(0:nfloats(ng)) )
184 dmem(ng)=dmem(ng)+real(nfloats(ng)+1,r8)
185
186 allocate ( drifter(ng) % Ftype(nfloats(ng)) )
187 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
188
189 allocate ( drifter(ng) % Flon(nfloats(ng)) )
190 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
191
192 allocate ( drifter(ng) % Flat(nfloats(ng)) )
193 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
194
195 allocate ( drifter(ng) % Fz0(nfloats(ng)) )
196 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
197
198 allocate ( drifter(ng) % Tinfo(0:izrhs,nfloats(ng)) )
199 dmem(ng)=dmem(ng)+real((izrhs+1)*nfloats(ng),r8)
200
201# if defined SOLVE3D && defined FLOAT_VWALK
202 allocate ( drifter(ng) % rwalk(nfloats(ng)) )
203 dmem(ng)=dmem(ng)+real(nfloats(ng),r8)
204# endif
205
206 allocate ( drifter(ng) % track(nfv(ng),0:nft,nfloats(ng)) )
207 dmem(ng)=dmem(ng)+real(nfv(ng)*(nft+1)*nfloats(ng),r8)
208 END DO
209 END IF
210!
211!-----------------------------------------------------------------------
212! Lagrangian drifters parameters.
213!-----------------------------------------------------------------------
214!
215 IF (.not.ldrifter) THEN
216 allocate ( fprint(ngrids) )
217 allocate ( frrec(ngrids) )
218
219# ifdef SOLVE3D
220 allocate ( iftvar(mt) )
221# endif
222 END IF
223!
224!-----------------------------------------------------------------------
225! Initialize Langrangian drifters structure.
226!-----------------------------------------------------------------------
227!
228 IF (ldrifter) THEN
229 DO ng=1,ngrids
230 drifter(ng) % Findex(0) = 0
231 DO iflt=1,nfloats(ng)
232 drifter(ng) % bounded(iflt) = .false.
233# if defined SOLVE3D && defined FLOAT_STICKY
234 drifter(ng) % stuck(iflt) = .false.
235# endif
236 drifter(ng) % Findex(iflt) = 0
237 drifter(ng) % Ftype(iflt) = 0
238 drifter(ng) % Flon(iflt) = inival
239 drifter(ng) % Flat(iflt) = inival
240 drifter(ng) % Fz0(iflt) = 0
241# if defined SOLVE3D && defined FLOAT_VWALK
242 drifter(ng) % rwalk = inival
243# endif
244 DO i=0,izrhs
245 drifter(ng) % Tinfo(i,iflt) = inival
246 END DO
247 DO i=1,nfv(ng)
248 drifter(ng) % track(i,0,iflt) = inival
249 drifter(ng) % track(i,1,iflt) = inival
250 drifter(ng) % track(i,2,iflt) = inival
251 drifter(ng) % track(i,3,iflt) = inival
252 drifter(ng) % track(i,4,iflt) = inival
253 END DO
254 END DO
255 END DO
256 END IF
257!
258!-----------------------------------------------------------------------
259! Initialize Langrangian drifters parameters.
260!-----------------------------------------------------------------------
261!
262 IF (.not.ldrifter) THEN
263# ifdef FLOAT_VWALK
264 flt_iseed=149876
265# endif
266 DO ng=1,ngrids
267 fprint(ng)=.true.
268 END DO
269
270# ifdef SOLVE3D
271!
272! Indices for tracer variables in the floats array track.
273!
274# ifdef FLOAT_OYSTER
275# ifdef FLOAT_VWALK
276 ic=18
277# else
278 ic=16
279# endif
280# else
281# ifdef FLOAT_VWALK
282 ic=12
283# else
284 ic=10
285# endif
286# endif
287 DO i=1,mt
288 ic=ic+1
289 iftvar(i)=ic
290 END DO
291# endif
292 END IF
293!
294 RETURN
295 END SUBROUTINE allocate_floats
296!
297 SUBROUTINE deallocate_floats (ng)
298!
299!=======================================================================
300! !
301! This routine dealocates all variables in module for all nested !
302! grids. !
303! !
304!=======================================================================
305!
306 USE mod_param, ONLY : ngrids
307# ifdef SUBOBJECT_DEALLOCATION
308 USE destroy_mod, ONLY : destroy
309# endif
310!
311! Imported variable declarations.
312!
313 integer, intent(in) :: ng
314!
315! Local variable declarations.
316!
317 character (len=*), parameter :: myfile = &
318 & __FILE__//", deallocate_floats"
319
320# ifdef SUBOBJECT_DEALLOCATION
321!
322!-----------------------------------------------------------------------
323! Deallocate each variable in the derived-type T_DRIFTER structure
324! separately.
325!-----------------------------------------------------------------------
326!
327 IF (.not.destroy(ng, drifter(ng)%bounded, myfile, &
328 & __line__, 'DRIFTER(ng)%bounded')) RETURN
329
330# if defined SOLVE3D && defined FLOAT_STICKY
331 IF (.not.destroy(ng, drifter(ng)%stuck, myfile, &
332 & __line__, 'DRIFTER(ng)%stuck')) RETURN
333# endif
334
335 IF (.not.destroy(ng, drifter(ng)%Findex, myfile, &
336 & __line__, 'DRIFTER(ng)%Findex')) RETURN
337
338 IF (.not.destroy(ng, drifter(ng)%Ftype, myfile, &
339 & __line__, 'DRIFTER(ng)%Ftype')) RETURN
340
341 IF (.not.destroy(ng, drifter(ng)%Flon, myfile, &
342 & __line__, 'DRIFTER(ng)%Flon')) RETURN
343
344 IF (.not.destroy(ng, drifter(ng)%Flat, myfile, &
345 & __line__, 'DRIFTER(ng)%Flat')) RETURN
346
347 IF (.not.destroy(ng, drifter(ng)%Fz0, myfile, &
348 & __line__, 'DRIFTER(ng)%Fz0')) RETURN
349
350 IF (.not.destroy(ng, drifter(ng)%Tinfo, myfile, &
351 & __line__, 'DRIFTER(ng)%Tinfo')) RETURN
352
353# if defined SOLVE3D && defined FLOAT_VWALK
354 IF (.not.destroy(ng, drifter(ng)%rwalk, myfile, &
355 & __line__, 'DRIFTER(ng)%rwalk')) RETURN
356# endif
357
358 IF (.not.destroy(ng, drifter(ng)%track, myfile, &
359 & __line__, 'DRIFTER(ng)%track')) RETURN
360# endif
361!
362!-----------------------------------------------------------------------
363! Deallocate T_DRIFTER structure.
364!-----------------------------------------------------------------------
365!
366 IF (ng.eq.ngrids) THEN
367 IF (allocated(drifter)) deallocate ( drifter )
368 END IF
369!
370!-----------------------------------------------------------------------
371! Deallocate other variables in module.
372!-----------------------------------------------------------------------
373!
374 IF (allocated(fprint)) deallocate ( fprint )
375
376 IF (allocated(frrec)) deallocate ( frrec )
377
378# ifdef SOLVE3D
379 IF (allocated(iftvar)) deallocate ( iftvar )
380# endif
381!
382 RETURN
383 END SUBROUTINE deallocate_floats
384#endif
385 END MODULE mod_floats
logical, dimension(:), allocatable fprint
Definition mod_floats.F:76
integer, parameter ibrhs
Definition mod_floats.F:99
integer, dimension(:), allocatable frrec
Definition mod_floats.F:138
integer, parameter flt_isobar
Definition mod_floats.F:126
integer, parameter iflat
Definition mod_floats.F:85
integer, parameter i1ohz
Definition mod_floats.F:97
integer, parameter ifden
Definition mod_floats.F:90
subroutine, public deallocate_floats(ng)
Definition mod_floats.F:298
integer, parameter iflon
Definition mod_floats.F:84
integer, parameter idpth
Definition mod_floats.F:86
integer, parameter iwbio
Definition mod_floats.F:101
integer, parameter flt_geopot
Definition mod_floats.F:127
integer, parameter isizf
Definition mod_floats.F:98
integer flt_iseed
Definition mod_floats.F:133
integer, parameter iyrhs
Definition mod_floats.F:88
integer, parameter iygrd
Definition mod_floats.F:82
integer, dimension(:), allocatable iftvar
Definition mod_floats.F:116
integer, parameter iswim
Definition mod_floats.F:100
integer, parameter itstr
Definition mod_floats.F:80
subroutine, public allocate_floats(ldrifter)
Definition mod_floats.F:143
integer, parameter izrhs
Definition mod_floats.F:89
integer, parameter ixgrd
Definition mod_floats.F:81
type(t_drifter), dimension(:), allocatable drifter
Definition mod_floats.F:67
integer, parameter izgrd
Definition mod_floats.F:83
integer, parameter ixrhs
Definition mod_floats.F:87
integer, parameter flt_lagran
Definition mod_floats.F:125
integer, parameter ifakt
Definition mod_floats.F:92
integer, parameter iwsin
Definition mod_floats.F:102
integer, parameter ifdak
Definition mod_floats.F:93
integer, dimension(:), allocatable nfv
Definition mod_param.F:547
integer, dimension(:), allocatable nfloats
Definition mod_param.F:543
real(r8), dimension(:), allocatable dmem
Definition mod_param.F:137
integer, parameter nft
Definition mod_param.F:539
integer ngrids
Definition mod_param.F:113
integer mt
Definition mod_param.F:490