ROMS
Loading...
Searching...
No Matches
npzd_Franks.h
Go to the documentation of this file.
1 MODULE biology_mod
2!
3!git $Id$
4!================================================== Hernan G. Arango ===
5! Copyright (c) 2002-2025 The ROMS Group Craig V. Lewis !
6! Licensed under a MIT/X style license !
7! See License_ROMS.md !
8!=======================================================================
9! !
10! Nutrient-Phytoplankton-Zooplankton-Detritus Model. !
11! !
12! This routine computes the biological sources and sinks and adds !
13! then the global biological fields. !
14! !
15! Reference: !
16! !
17! Franks et al, 1986: Behavior of simple plankton model with !
18! food-level acclimation by herbivores, Marine Biology, 91, !
19! 121-129. !
20! !
21! Adapted from code written originally by Craig V. Lewis. !
22! !
23!=======================================================================
24!
25 implicit none
26!
27 PRIVATE
28 PUBLIC :: biology
29!
30 CONTAINS
31!
32!***********************************************************************
33 SUBROUTINE biology (ng,tile)
34!***********************************************************************
35!
36 USE mod_param
37 USE mod_grid
38 USE mod_ncparam
39 USE mod_ocean
40 USE mod_stepping
41!
42! Imported variable declarations.
43!
44 integer, intent(in) :: ng, tile
45!
46! Local variable declarations.
47!
48 character (len=*), parameter :: MyFile = &
49 & __FILE__
50!
51#include "tile.h"
52!
53! Set header file name.
54!
55#ifdef DISTRIBUTE
56 IF (lbiofile(inlm)) THEN
57#else
58 IF (lbiofile(inlm).and.(tile.eq.0)) THEN
59#endif
60 lbiofile(inlm)=.false.
61 bioname(inlm)=myfile
62 END IF
63!
64#ifdef PROFILE
65 CALL wclock_on (ng, inlm, 15, __line__, myfile)
66#endif
67 CALL npzd_franks_tile (ng, tile, &
68 & lbi, ubi, lbj, ubj, n(ng), nt(ng), &
69 & imins, imaxs, jmins, jmaxs, &
70 & nstp(ng), nnew(ng), &
71#ifdef MASKING
72 & grid(ng) % rmask, &
73#endif
74 & grid(ng) % Hz, &
75 & grid(ng) % z_r, &
76 & grid(ng) % z_w, &
77 & ocean(ng) % t)
78
79#ifdef PROFILE
80 CALL wclock_off (ng, inlm, 15, __line__, myfile)
81#endif
82!
83 RETURN
84 END SUBROUTINE biology
85!
86!-----------------------------------------------------------------------
87 SUBROUTINE npzd_franks_tile (ng, tile, &
88 & LBi, UBi, LBj, UBj, UBk, UBt, &
89 & IminS, ImaxS, JminS, JmaxS, &
90 & nstp, nnew, &
91#ifdef MASKING
92 & rmask, &
93#endif
94 & Hz, z_r, z_w, &
95 & t)
96!-----------------------------------------------------------------------
97!
98 USE mod_param
99 USE mod_biology
100 USE mod_ncparam
101 USE mod_scalars
102!
103! Imported variable declarations.
104!
105 integer, intent(in) :: ng, tile
106 integer, intent(in) :: LBi, UBi, LBj, UBj, UBk, UBt
107 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
108 integer, intent(in) :: nstp, nnew
109
110#ifdef ASSUMED_SHAPE
111# ifdef MASKING
112 real(r8), intent(in) :: rmask(LBi:,LBj:)
113# endif
114 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
115 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
116 real(r8), intent(in) :: z_w(LBi:,LBj:,0:)
117 real(r8), intent(inout) :: t(LBi:,LBj:,:,:,:)
118#else
119# ifdef MASKING
120 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
121# endif
122 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,UBk)
123 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,UBk)
124 real(r8), intent(in) :: z_w(LBi:UBi,LBj:UBj,0:UBk)
125 real(r8), intent(inout) :: t(LBi:UBi,LBj:UBj,UBk,3,UBt)
126#endif
127!
128! Local variable declarations.
129!
130 integer, parameter :: Nsink = 1
131
132 integer :: Iter, i, ibio, isink, itrc, itrmx, j, k, ks
133
134 integer, dimension(Nsink) :: idsink
135
136 real(r8), parameter :: eps = 1.0e-16_r8
137
138 real(r8) :: cff, cff1, cff2, cff3, dtdays
139 real(r8) :: cffL, cffR, cu, dltL, dltR
140
141 real(r8), dimension(Nsink) :: Wbio
142
143 integer, dimension(IminS:ImaxS,N(ng)) :: ksource
144
145 real(r8), dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio
146
147 real(r8), dimension(IminS:ImaxS,N(ng),NT(ng)) :: Bio_old
148
149 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: FC
150
151 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hz_inv
152 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hz_inv2
153 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hz_inv3
154 real(r8), dimension(IminS:ImaxS,N(ng)) :: WL
155 real(r8), dimension(IminS:ImaxS,N(ng)) :: WR
156 real(r8), dimension(IminS:ImaxS,N(ng)) :: bL
157 real(r8), dimension(IminS:ImaxS,N(ng)) :: bR
158 real(r8), dimension(IminS:ImaxS,N(ng)) :: qc
159
160#include "set_bounds.h"
161!
162!-----------------------------------------------------------------------
163! Add biological Source/Sink terms.
164!-----------------------------------------------------------------------
165!
166! Avoid computing source/sink terms if no biological iterations.
167!
168 IF (bioiter(ng).le.0) RETURN
169!
170! Set time-stepping according to the number of iterations.
171!
172 dtdays=dt(ng)*sec2day/real(bioiter(ng),r8)
173!
174! Set vertical sinking indentification vector.
175!
176 idsink(1)=isdet ! Small detritus
177!
178! Set vertical sinking velocity vector in the same order as the
179! identification vector, IDSINK.
180!
181 wbio(1)=wdet(ng) ! Small detritus
182!
183! Compute inverse thickness to avoid repeated divisions.
184!
185 j_loop : DO j=jstr,jend
186 DO k=1,n(ng)
187 DO i=istr,iend
188 hz_inv(i,k)=1.0_r8/hz(i,j,k)
189 END DO
190 END DO
191 DO k=1,n(ng)-1
192 DO i=istr,iend
193 hz_inv2(i,k)=1.0_r8/(hz(i,j,k)+hz(i,j,k+1))
194 END DO
195 END DO
196 DO k=2,n(ng)-1
197 DO i=istr,iend
198 hz_inv3(i,k)=1.0_r8/(hz(i,j,k-1)+hz(i,j,k)+hz(i,j,k+1))
199 END DO
200 END DO
201!
202! Extract biological variables from tracer arrays, place them into
203! scratch arrays, and restrict their values to be positive definite.
204! At input, all tracers (index nnew) from predictor step have
205! transport units (m Tunits) since we do not have yet the new
206! values for zeta and Hz. These are known after the 2D barotropic
207! time-stepping.
208!
209 DO itrc=1,nbt
210 ibio=idbio(itrc)
211 DO k=1,n(ng)
212 DO i=istr,iend
213 bio_old(i,k,ibio)=t(i,j,k,nstp,ibio)
214 END DO
215 END DO
216 END DO
217!
218! Determine Correction for negativity.
219!
220 DO k=1,n(ng)
221 DO i=istr,iend
222 cff1=max(0.0_r8,eps-bio_old(i,k,ino3_))+ &
223 & max(0.0_r8,eps-bio_old(i,k,iphyt))+ &
224 & max(0.0_r8,eps-bio_old(i,k,izoop))+ &
225 & max(0.0_r8,eps-bio_old(i,k,isdet))
226!
227! If correction needed, determine the largest pool to debit.
228!
229 IF (cff1.gt.0.0) THEN
230 itrmx=idbio(1)
231 cff=t(i,j,k,nstp,itrmx)
232 DO ibio=idbio(2),idbio(nbt)
233 IF (t(i,j,k,nstp,ibio).gt.cff) THEN
234 itrmx=ibio
235 cff=t(i,j,k,nstp,ibio)
236 END IF
237 END DO
238!
239! Update new values.
240!
241 DO itrc=1,nbt
242 ibio=idbio(itrc)
243 bio(i,k,ibio)=max(eps,bio_old(i,k,ibio))- &
244 & cff1*(sign(0.5_r8, &
245 & real(itrmx-ibio,r8)**2)+ &
246 & sign(0.5_r8, &
247 & -real(itrmx-ibio,r8)**2))
248 END DO
249 ELSE
250 DO itrc=1,nbt
251 ibio=idbio(itrc)
252 bio(i,k,ibio)=bio_old(i,k,ibio)
253 END DO
254 END IF
255 END DO
256 END DO
257!
258!=======================================================================
259! Start internal iterations to achieve convergence of the nonlinear
260! backward-implicit solution.
261!=======================================================================
262!
263! During the iterative procedure a series of fractional time steps are
264! performed in a chained mode (splitting by different biological
265! conversion processes) in sequence of the main food chain. In all
266! stages the concentration of the component being consumed is treated
267! in fully implicit manner, so the algorithm guarantees non-negative
268! values, no matter how strong s the concentration of active consuming
269! component (Phytoplankton or Zooplankton). The overall algorithm,
270! as well as any stage of it, is formulated in conservative form
271! (except explicit sinking) in sense that the sum of concentration of
272! all components is conserved.
273!
274! In the implicit algorithm, we have for example (N: nutrient,
275! P: phytoplankton),
276!
277! N(new) = N(old) - uptake * P(old) uptake = mu * N / (Kn + N)
278! {Michaelis-Menten}
279! below, we set
280! The N in the numerator of
281! cff = mu * P(old) / (Kn + N(old)) uptake is treated implicitly
282! as N(new)
283!
284! so the time-stepping of the equations becomes:
285!
286! N(new) = N(old) / (1 + cff) (1) when substracting a sink term,
287! consuming, divide by (1 + cff)
288! and
289!
290! P(new) = P(old) + cff * N(new) (2) when adding a source term,
291! growing, add (cff * source)
292!
293! Notice that if you substitute (1) in (2), you will get:
294!
295! P(new) = P(old) + cff * N(old) / (1 + cff) (3)
296!
297! If you add (1) and (3), you get
298!
299! N(new) + P(new) = N(old) + P(old)
300!
301! implying conservation regardless how "cff" is computed. Therefore,
302! this scheme is unconditionally stable regardless of the conversion
303! rate. It does not generate negative values since the constituent
304! to be consumed is always treated implicitly. It is also biased
305! toward damping oscillations.
306!
307! The iterative loop below is to iterate toward an universal Backward-
308! Euler treatment of all terms. So if there are oscillations in the
309! system, they are only physical oscillations. These iterations,
310! however, do not improve the accuaracy of the solution.
311!
312 iter_loop: DO iter=1,bioiter(ng)
313!
314! Nutrient uptake by phytoplankton.
315!
316 cff1=dtdays*vm_no3(ng)
317 DO k=1,n(ng)
318 DO i=istr,iend
319 cff=bio(i,k,iphyt)* &
320 & cff1*exp(k_ext(ng)*z_r(i,j,k))/ &
321 & (k_no3(ng)+bio(i,k,ino3_))
322 bio(i,k,ino3_)=bio(i,k,ino3_)/ &
323 & (1.0_r8+cff)
324 bio(i,k,iphyt)=bio(i,k,iphyt)+ &
325 & bio(i,k,ino3_)*cff
326 END DO
327 END DO
328!
329! Phytoplankton grazing by Zooplankton and mortality to Detritus
330! (rate: PhyMR).
331!
332 cff1=dtdays*zoogr(ng)
333 cff2=dtdays*phymr(ng)
334 cff3=k_phy(ng)*k_phy(ng)
335 DO k=1,n(ng)
336 DO i=istr,iend
337 cff=bio(i,k,izoop)*bio(i,k,iphyt)*cff1/ &
338 & (cff3+bio(i,k,iphyt)*bio(i,k,iphyt))
339 bio(i,k,iphyt)=bio(i,k,iphyt)/ &
340 & (1.0_r8+cff+cff2)
341 bio(i,k,izoop)=bio(i,k,izoop)+ &
342 & bio(i,k,iphyt)*cff*(1.0_r8-zooga(ng))
343 bio(i,k,isdet)=bio(i,k,isdet)+ &
344 & bio(i,k,iphyt)* &
345 & (cff2+cff*(zooga(ng)-zooec(ng)))
346 bio(i,k,ino3_)=bio(i,k,ino3_)+ &
347 & bio(i,k,iphyt)*cff*zooec(ng)
348 END DO
349 END DO
350!
351! Zooplankton excretion to nutrients and mortality to Detritus.
352!
353 cff1=1.0_r8/(1.0_r8+dtdays*(zoomr(ng)+zoomd(ng)))
354 cff2=dtdays*zoomr(ng)
355 cff3=dtdays*zoomd(ng)
356 DO k=1,n(ng)
357 DO i=istr,iend
358 bio(i,k,izoop)=bio(i,k,izoop)*cff1
359 bio(i,k,ino3_)=bio(i,k,ino3_)+ &
360 & bio(i,k,izoop)*cff2
361 bio(i,k,isdet)=bio(i,k,isdet)+ &
362 & bio(i,k,izoop)*cff3
363 END DO
364 END DO
365!
366! Detritus breakdown to nutrients.
367!
368 cff1=dtdays*detrr(ng)
369 cff2=1.0_r8/(1.0_r8+cff1)
370 DO k=1,n(ng)
371 DO i=istr,iend
372 bio(i,k,isdet)=bio(i,k,isdet)*cff2
373 bio(i,k,ino3_)=bio(i,k,ino3_)+ &
374 & bio(i,k,isdet)*cff1
375 END DO
376 END DO
377!
378!-----------------------------------------------------------------------
379! Vertical sinking terms.
380!-----------------------------------------------------------------------
381!
382! Reconstruct vertical profile of selected biological constituents
383! "Bio(:,:,isink)" in terms of a set of parabolic segments within each
384! grid box. Then, compute semi-Lagrangian flux due to sinking.
385!
386 sink_loop: DO isink=1,nsink
387 ibio=idsink(isink)
388!
389! Copy concentration of biological particulates into scratch array
390! "qc" (q-central, restrict it to be positive) which is hereafter
391! interpreted as a set of grid-box averaged values for biogeochemical
392! constituent concentration.
393!
394 DO k=1,n(ng)
395 DO i=istr,iend
396 qc(i,k)=bio(i,k,ibio)
397 END DO
398 END DO
399!
400 DO k=n(ng)-1,1,-1
401 DO i=istr,iend
402 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
403 END DO
404 END DO
405 DO k=2,n(ng)-1
406 DO i=istr,iend
407 dltr=hz(i,j,k)*fc(i,k)
408 dltl=hz(i,j,k)*fc(i,k-1)
409 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
410 cffr=cff*fc(i,k)
411 cffl=cff*fc(i,k-1)
412!
413! Apply PPM monotonicity constraint to prevent oscillations within the
414! grid box.
415!
416 IF ((dltr*dltl).le.0.0_r8) THEN
417 dltr=0.0_r8
418 dltl=0.0_r8
419 ELSE IF (abs(dltr).gt.abs(cffl)) THEN
420 dltr=cffl
421 ELSE IF (abs(dltl).gt.abs(cffr)) THEN
422 dltl=cffr
423 END IF
424!
425! Compute right and left side values (bR,bL) of parabolic segments
426! within grid box Hz(k); (WR,WL) are measures of quadratic variations.
427!
428! NOTE: Although each parabolic segment is monotonic within its grid
429! box, monotonicity of the whole profile is not guaranteed,
430! because bL(k+1)-bR(k) may still have different sign than
431! qc(i,k+1)-qc(i,k). This possibility is excluded,
432! after bL and bR are reconciled using WENO procedure.
433!
434 cff=(dltr-dltl)*hz_inv3(i,k)
435 dltr=dltr-cff*hz(i,j,k+1)
436 dltl=dltl+cff*hz(i,j,k-1)
437 br(i,k)=qc(i,k)+dltr
438 bl(i,k)=qc(i,k)-dltl
439 wr(i,k)=(2.0_r8*dltr-dltl)**2
440 wl(i,k)=(dltr-2.0_r8*dltl)**2
441 END DO
442 END DO
443 cff=1.0e-14_r8
444 DO k=2,n(ng)-2
445 DO i=istr,iend
446 dltl=max(cff,wl(i,k ))
447 dltr=max(cff,wr(i,k+1))
448 br(i,k)=(dltr*br(i,k)+dltl*bl(i,k+1))/(dltr+dltl)
449 bl(i,k+1)=br(i,k)
450 END DO
451 END DO
452 DO i=istr,iend
453 fc(i,n(ng))=0.0_r8 ! NO-flux boundary condition
454#if defined LINEAR_CONTINUATION
455 bl(i,n(ng))=br(i,n(ng)-1)
456 br(i,n(ng))=2.0_r8*qc(i,n(ng))-bl(i,n(ng))
457#elif defined NEUMANN
458 bl(i,n(ng))=br(i,n(ng)-1)
459 br(i,n(ng))=1.5_r8*qc(i,n(ng))-0.5_r8*bl(i,n(ng))
460#else
461 br(i,n(ng))=qc(i,n(ng)) ! default strictly monotonic
462 bl(i,n(ng))=qc(i,n(ng)) ! conditions
463 br(i,n(ng)-1)=qc(i,n(ng))
464#endif
465#if defined LINEAR_CONTINUATION
466 br(i,1)=bl(i,2)
467 bl(i,1)=2.0_r8*qc(i,1)-br(i,1)
468#elif defined NEUMANN
469 br(i,1)=bl(i,2)
470 bl(i,1)=1.5_r8*qc(i,1)-0.5_r8*br(i,1)
471#else
472 bl(i,2)=qc(i,1) ! bottom grid boxes are
473 br(i,1)=qc(i,1) ! re-assumed to be
474 bl(i,1)=qc(i,1) ! piecewise constant.
475#endif
476 END DO
477!
478! Apply monotonicity constraint again, since the reconciled interfacial
479! values may cause a non-monotonic behavior of the parabolic segments
480! inside the grid box.
481!
482 DO k=1,n(ng)
483 DO i=istr,iend
484 dltr=br(i,k)-qc(i,k)
485 dltl=qc(i,k)-bl(i,k)
486 cffr=2.0_r8*dltr
487 cffl=2.0_r8*dltl
488 IF ((dltr*dltl).lt.0.0_r8) THEN
489 dltr=0.0_r8
490 dltl=0.0_r8
491 ELSE IF (abs(dltr).gt.abs(cffl)) THEN
492 dltr=cffl
493 ELSE IF (abs(dltl).gt.abs(cffr)) THEN
494 dltl=cffr
495 END IF
496 br(i,k)=qc(i,k)+dltr
497 bl(i,k)=qc(i,k)-dltl
498 END DO
499 END DO
500!
501! After this moment reconstruction is considered complete. The next
502! stage is to compute vertical advective fluxes, FC. It is expected
503! that sinking may occurs relatively fast, the algorithm is designed
504! to be free of CFL criterion, which is achieved by allowing
505! integration bounds for semi-Lagrangian advective flux to use as
506! many grid boxes in upstream direction as necessary.
507!
508! In the two code segments below, WL is the z-coordinate of the
509! departure point for grid box interface z_w with the same indices;
510! FC is the finite volume flux; ksource(:,k) is index of vertical
511! grid box which contains the departure point (restricted by N(ng)).
512! During the search: also add in content of whole grid boxes
513! participating in FC.
514!
515 cff=dtdays*abs(wbio(isink))
516 DO k=1,n(ng)
517 DO i=istr,iend
518 fc(i,k-1)=0.0_r8
519 wl(i,k)=z_w(i,j,k-1)+cff
520 wr(i,k)=hz(i,j,k)*qc(i,k)
521 ksource(i,k)=k
522 END DO
523 END DO
524 DO k=1,n(ng)
525 DO ks=k,n(ng)-1
526 DO i=istr,iend
527 IF (wl(i,k).gt.z_w(i,j,ks)) THEN
528 ksource(i,k)=ks+1
529 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
530 END IF
531 END DO
532 END DO
533 END DO
534!
535! Finalize computation of flux: add fractional part.
536!
537 DO k=1,n(ng)
538 DO i=istr,iend
539 ks=ksource(i,k)
540 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
541 fc(i,k-1)=fc(i,k-1)+ &
542 & hz(i,j,ks)*cu* &
543 & (bl(i,ks)+ &
544 & cu*(0.5_r8*(br(i,ks)-bl(i,ks))- &
545 & (1.5_r8-cu)* &
546 & (br(i,ks)+bl(i,ks)- &
547 & 2.0_r8*qc(i,ks))))
548 END DO
549 END DO
550 DO k=1,n(ng)
551 DO i=istr,iend
552 bio(i,k,ibio)=qc(i,k)+(fc(i,k)-fc(i,k-1))*hz_inv(i,k)
553 END DO
554 END DO
555
556 END DO sink_loop
557 END DO iter_loop
558!
559!-----------------------------------------------------------------------
560! Update global tracer variables: Add increment due to BGC processes
561! to tracer array in time index "nnew". Index "nnew" is solution after
562! advection and mixing and has transport units (m Tunits) hence the
563! increment is multiplied by Hz. Notice that we need to subtract
564! original values "Bio_old" at the top of the routine to just account
565! for the concentractions affected by BGC processes. This also takes
566! into account any constraints (non-negative concentrations, carbon
567! concentration range) specified before entering BGC kernel. If "Bio"
568! were unchanged by BGC processes, the increment would be exactly
569! zero. Notice that final tracer values, t(:,:,:,nnew,:) are not
570! bounded >=0 so that we can preserve total inventory of nutrients
571! when advection causes tracer concentration to go negative.
572!-----------------------------------------------------------------------
573!
574 DO itrc=1,nbt
575 ibio=idbio(itrc)
576 DO k=1,n(ng)
577 DO i=istr,iend
578 cff=bio(i,k,ibio)-bio_old(i,k,ibio)
579 t(i,j,k,nnew,ibio)=t(i,j,k,nnew,ibio)+cff*hz(i,j,k)
580 END DO
581 END DO
582 END DO
583
584 END DO j_loop
585!
586 RETURN
587 END SUBROUTINE npzd_franks_tile
588
589 END MODULE biology_mod
subroutine npzd_franks_tile(ng, tile, lbi, ubi, lbj, ubj, ubk, ubt, imins, imaxs, jmins, jmaxs, nstp, nnew, rmask, hz, z_r, z_w, t)
Definition npzd_Franks.h:96
subroutine, public biology(ng, tile)
Definition ecosim.h:57
real(r8), dimension(:), allocatable zooga
real(r8), dimension(:), allocatable zoomr
Definition fennel_mod.h:162
real(r8), dimension(:), allocatable k_phy
Definition fennel_mod.h:135
real(r8), dimension(:), allocatable detrr
real(r8), dimension(:), allocatable wdet
real(r8), dimension(:), allocatable zoomd
integer, dimension(:), allocatable bioiter
Definition ecosim_mod.h:343
integer ino3_
Definition ecosim_mod.h:277
real(r8), dimension(:), allocatable zoogr
Definition fennel_mod.h:160
real(r8), dimension(:), allocatable k_no3
Definition fennel_mod.h:133
real(r8), dimension(:), allocatable phymr
Definition fennel_mod.h:145
integer iphyt
Definition fennel_mod.h:81
real(r8), dimension(:), allocatable zooec
integer, dimension(:), allocatable idbio
Definition ecosim_mod.h:256
real(r8), dimension(:), allocatable vm_no3
integer izoop
Definition fennel_mod.h:82
real(r8), dimension(:), allocatable k_ext
type(t_grid), dimension(:), allocatable grid
Definition mod_grid.F:365
type(t_ocean), dimension(:), allocatable ocean
Definition mod_ocean.F:351
integer, parameter inlm
Definition mod_param.F:662
integer, dimension(:), allocatable n
Definition mod_param.F:479
integer nbt
Definition mod_param.F:509
integer, dimension(:), allocatable nt
Definition mod_param.F:489
real(dp), dimension(:), allocatable dt
real(dp), parameter sec2day
integer, dimension(:), allocatable nnew
integer, dimension(:), allocatable nstp
recursive subroutine wclock_off(ng, model, region, line, routine)
Definition timers.F:148
recursive subroutine wclock_on(ng, model, region, line, routine)
Definition timers.F:3