2
3
4
5
6
7
8
9
10
11
12
13
14
15
21
23
24 implicit none
25
26
27
28 logical, intent(in) :: Lwrite
29 integer, intent(in) :: model, inp, out
30
31
32
33 integer :: Npts, Nval
34 integer :: iTrcStr, iTrcEnd
35 integer :: i, ifield, igrid, itracer, itrc, ng, nline, status
36
37 logical, dimension(NBT,Ngrids) :: Ltrc
38
39 real(r8), dimension(NBT,Ngrids) :: Rbio
40
41 real(dp), dimension(nRval) :: Rval
42
43 character (len=40 ) :: KeyWord
44 character (len=256) :: line
45 character (len=256), dimension(nCval) :: Cval
46
47
48
49
50
51 igrid=1
52 itracer=0
53 itrcstr=1
55 nline=0
56
57
58
59
60
61
62#ifdef ANA_BIOLOGY
64#endif
65 DO WHILE (.true.)
66 READ (inp,'(a)',err=10,END=20) line
68 IF (status.gt.0) THEN
69 SELECT CASE (trim(keyword))
70 CASE ('Lbiology')
72 CASE ('BioIter')
74 CASE ('ResRate')
76 CASE ('TNU2')
82 END DO
83 END DO
84 CASE ('TNU4')
90 END DO
91 END DO
92 CASE ('ad_TNU2')
99 END DO
100 END DO
101 CASE ('ad_TNU4')
108 END DO
109 END DO
110 CASE ('LtracerSponge')
116 END DO
117 END DO
118 CASE ('AKT_BAK')
124 END DO
125 END DO
126 CASE ('ad_AKT_fac')
133 END DO
134 END DO
135 CASE ('TNUDG')
140 tnudg(i,ng)=rbio(itrc,ng)
141 END DO
142 END DO
143 CASE ('Hadvection')
144 IF (itracer.lt.
nbt)
THEN
145 itracer=itracer+1
146 ELSE
147 itracer=1
148 END IF
150 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
154 CASE ('Vadvection')
155 IF (itracer.lt.
nbt)
THEN
156 itracer=itracer+1
157 ELSE
158 itracer=1
159 END IF
161 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
165#if defined ADJOINT || defined TANGENT || defined TL_IOMS
166 CASE ('ad_Hadvection')
167 IF (itracer.lt.
nbt)
THEN
168 itracer=itracer+1
169 ELSE
170 itracer=1
171 END IF
173 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
177 CASE ('Vadvection')
178 IF (itracer.lt.(
nbt)
THEN
179 itracer=itracer+1
180 ELSE
181 itracer=1
182 END IF
184 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
188#endif
189 CASE ('LBC(isTvar)')
190 IF (itracer.lt.
nbt)
THEN
191 itracer=itracer+1
192 ELSE
193 itracer=1
194 END IF
196 npts=
load_lbc(nval, cval, line, nline, ifield, igrid, &
199#if defined ADJOINT || defined TANGENT || defined TL_IOMS
200 CASE ('ad_LBC(isTvar)')
201 IF (itracer.lt.
nbt)
THEN
202 itracer=itracer+1
203 ELSE
204 itracer=1
205 END IF
207 npts=
load_lbc(nval, cval, line, nline, ifield, igrid, &
210#endif
211 CASE ('LtracerSrc')
217 END DO
218 END DO
219 CASE ('LtracerCLM')
225 END DO
226 END DO
227 CASE ('LnudgeTCLM')
233 END DO
234 END DO
235 CASE ('Hout(idTvar)')
240 IF (i.eq.0) THEN
241 IF (
master)
WRITE (out,30) &
242 & 'idTvar(idbio(', itrc, '))'
244 RETURN
245 END IF
246 hout(i,ng)=ltrc(itrc,ng)
247 END DO
248 END DO
249 CASE ('Hout(idTsur)')
254 IF (i.eq.0) THEN
255 IF (
master)
WRITE (out,30) &
256 & 'idTsur(idbio(', itrc, '))'
258 RETURN
259 END IF
260 hout(i,ng)=ltrc(itrc,ng)
261 END DO
262 END DO
263 CASE ('Qout(idTvar)')
268 qout(i,ng)=ltrc(itrc,ng)
269 END DO
270 END DO
271 CASE ('Qout(idsurT)')
276 IF (i.eq.0) THEN
277 IF (
master)
WRITE (out,30) &
278 & 'idsurT(idbio(', itrc, '))'
280 RETURN
281 END IF
282 qout(i,ng)=ltrc(itrc,ng)
283 END DO
284 END DO
285 CASE ('Qout(idTsur)')
290 qout(i,ng)=ltrc(itrc,ng)
291 END DO
292 END DO
293#if defined AVERAGES || \
294 (defined ad_averages && defined adjoint) || \
295 (defined rp_averages && defined tl_ioms) || \
296 (defined tl_averages && defined tangent)
297 CASE ('Aout(idTvar)')
302 aout(i,ng)=ltrc(itrc,ng)
303 END DO
304 END DO
305 CASE ('Aout(idTTav)')
310 aout(i,ng)=ltrc(itrc,ng)
311 END DO
312 END DO
313 CASE ('Aout(idUTav)')
318 aout(i,ng)=ltrc(itrc,ng)
319 END DO
320 END DO
321 CASE ('Aout(idVTav)')
326 aout(i,ng)=ltrc(itrc,ng)
327 END DO
328 END DO
329 CASE ('Aout(iHUTav)')
334 aout(i,ng)=ltrc(itrc,ng)
335 END DO
336 END DO
337 CASE ('Aout(iHVTav)')
342 aout(i,ng)=ltrc(itrc,ng)
343 END DO
344 END DO
345#endif
346#ifdef DIAGNOSTICS_TS
347 CASE ('Dout(iTrate)')
353 END DO
354 END DO
355 CASE ('Dout(iThadv)')
361 END DO
362 END DO
363 CASE ('Dout(iTxadv)')
369 END DO
370 END DO
371 CASE ('Dout(iTyadv)')
377 END DO
378 END DO
379 CASE ('Dout(iTvadv)')
385 END DO
386 END DO
387# if defined TS_DIF2 || defined TS_DIF4
388 CASE ('Dout(iThdif)')
394 END DO
395 END DO
396 CASE ('Dout(iTxdif)')
402 END DO
403 END DO
404 CASE ('Dout(iTydif)')
410 END DO
411 END DO
412# if defined MIX_GEO_TS || defined MIX_ISO_TS
413 CASE ('Dout(iTsdif)')
419 END DO
420 END DO
421# endif
422# endif
423 CASE ('Dout(iTvdif)')
429 END DO
430 END DO
431#endif
432 END SELECT
433 END IF
434 END DO
435 10
IF (
master)
WRITE (out,40) line
437 RETURN
438 20 CONTINUE
439
440
441
442
443
444 IF (
master.and.lwrite)
THEN
447 WRITE (out,50) ng
448 WRITE (out,60)
bioiter(ng),
'BioIter', &
449 & 'Number of iterations for nonlinear convergence.'
450 WRITE (out,70)
resrate(ng),
'ResRate', &
451 & 'Constant biological respiration rate (1/day).'
452#ifdef TS_DIF2
455 WRITE (out,90)
nl_tnu2(i,ng),
'nl_tnu2', i, &
456 & 'NLM Horizontal, harmonic mixing coefficient', &
457 &
'(m2/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
458# ifdef ADJOINT
459 WRITE (out,90)
ad_tnu2(i,ng),
'ad_tnu2', i, &
460 & 'ADM Horizontal, harmonic mixing coefficient', &
461 &
'(m2/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
462# endif
463# if defined TANGENT || defined TL_IOMS
464 WRITE (out,90)
tl_tnu2(i,ng),
'tl_tnu2', i, &
465 & 'TLM Horizontal, harmonic mixing coefficient', &
466 &
'(m2/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
467# endif
468 END DO
469#endif
470#ifdef TS_DIF4
473 WRITE (out,90)
nl_tnu4(i,ng),
'nl_tnu4', i, &
474 & 'NLM Horizontal, biharmonic mixing coefficient', &
475 &
'(m4/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
476# ifdef ADJOINT
477 WRITE (out,90)
ad_tnu4(i,ng),
'ad_tnu4', i, &
478 & 'ADM Horizontal, biharmonic mixing coefficient', &
479 &
'(m4/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
480# endif
481# if defined TANGENT || defined TL_IOMS
482 WRITE (out,90)
tl_tnu4(i,ng),
'tl_tnu4', i, &
483 & 'TLM Horizontal, biharmonic mixing coefficient', &
484 &
'(m4/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
485# endif
486 END DO
487#endif
492 & i, 'Turning ON sponge on tracer ', i, &
494 ELSE
496 & i, 'Turning OFF sponge on tracer ', i, &
498 END IF
499 END DO
502 WRITE(out,90)
akt_bak(i,ng),
'Akt_bak', i, &
503 & 'Background vertical mixing coefficient (m2/s)', &
505 END DO
506#ifdef FORWARD_MIXING
509# ifdef ADJOINT
510 WRITE (out,90)
ad_akt_fac(i,ng),
'ad_Akt_fac', i, &
511 & 'ADM basic state vertical mixing scale factor', &
513# endif
514# if defined TANGENT || defined TL_IOMS
515 WRITE (out,90)
tl_akt_fac(i,ng),
'tl_Akt_fac', i, &
516 & 'TLM basic state vertical mixing scale factor', &
518# endif
519 END DO
520#endif
523 WRITE (out,90)
tnudg(i,ng),
'Tnudg', i, &
524 & 'Nudging/relaxation time scale (days)', &
526 END DO
530 WRITE (out,100)
ltracersrc(i,ng),
'LtracerSrc', &
531 & i, 'Turning ON point sources/Sink on tracer ', i, &
533 ELSE
534 WRITE (out,100)
ltracersrc(i,ng),
'LtracerSrc', &
535 & i, 'Turning OFF point sources/Sink on tracer ', i, &
537 END IF
538 END DO
542 WRITE (out,100)
ltracerclm(i,ng),
'LtracerCLM', i, &
543 & 'Turning ON processing of climatology tracer ', i, &
545 ELSE
546 WRITE (out,100)
ltracerclm(i,ng),
'LtracerCLM', i, &
547 & 'Turning OFF processing of climatology tracer ', i, &
549 END IF
550 END DO
554 WRITE (out,100)
lnudgetclm(i,ng),
'LnudgeTCLM', i, &
555 & 'Turning ON nudging of climatology tracer ', i, &
557 ELSE
558 WRITE (out,100)
lnudgetclm(i,ng),
'LnudgeTCLM', i, &
559 & 'Turning OFF nudging of climatology tracer ', i, &
561 END IF
562 END DO
563 IF ((
nhis(ng).gt.0).and.any(
hout(:,ng)))
THEN
564 WRITE (out,'(1x)')
570 END DO
575 & 'Write out tracer flux ', i, &
577 END DO
578 END IF
579 IF ((
nqck(ng).gt.0).and.any(
qout(:,ng)))
THEN
580 WRITE (out,'(1x)')
586 END DO
591 & 'Write out surface tracer ', i, &
593 END DO
598 & 'Write out tracer flux ', i, &
600 END DO
601 END IF
602#if defined AVERAGES || \
603 (defined ad_averages && defined adjoint) || \
604 (defined rp_averages && defined tl_ioms) || \
605 (defined tl_averages && defined tangent)
606 IF ((
navg(ng).gt.0).and.any(
aout(:,ng)))
THEN
607 WRITE (out,'(1x)')
612 & 'Write out averaged tracer ', i, &
614 END DO
619 & 'Write out averaged <t*t> for tracer ', i, &
621 END DO
626 & 'Write out averaged <u*t> for tracer ', i, &
628 END DO
633 & 'Write out averaged <v*t> for tracer ', i, &
635 END DO
640 & 'Write out averaged <Huon*t> for tracer ', i, &
642 END DO
647 & 'Write out averaged <Hvom*t> for tracer ', i, &
649 END DO
650 END IF
651#endif
652#ifdef DIAGNOSTICS_TS
653 IF ((
ndia(ng).gt.0).and.any(
dout(:,ng)))
THEN
654 WRITE (out,'(1x)')
658 & WRITE (out,110) .true., 'Dout(iTrate)', &
659 & 'Write out rate of change of tracer ', itrc, &
661 END DO
665 & WRITE (out,110) .true., 'Dout(iThadv)', &
666 & 'Write out horizontal advection, tracer ', itrc, &
668 END DO
672 & WRITE (out,110) .true., 'Dout(iTxadv)', &
673 & 'Write out horizontal X-advection, tracer ', itrc, &
675 END DO
679 & WRITE (out,110) .true., 'Dout(iTyadv)', &
680 & 'Write out horizontal Y-advection, tracer ', itrc, &
682 END DO
686 & WRITE (out,110) .true., 'Dout(iTvadv)', &
687 & 'Write out vertical advection, tracer ', itrc, &
689 END DO
690# if defined TS_DIF2 || defined TS_DIF4
694 & WRITE (out,110) .true., 'Dout(iThdif)', &
695 & 'Write out horizontal diffusion, tracer ', itrc, &
697 END DO
701 & WRITE (out,110) .true., 'Dout(iTxdif)', &
702 & 'Write out horizontal X-diffusion, tracer ', itrc, &
704 END DO
708 & WRITE (out,110) .true., 'Dout(iTydif)', &
709 & 'Write out horizontal Y-diffusion, tracer ', itrc, &
711 END DO
712# if defined MIX_GEO_TS || defined MIX_ISO_TS
716 & WRITE (out,110) .true., 'Dout(iTsdif)', &
717 & 'Write out horizontal S-diffusion, tracer ', itrc, &
719 END DO
720# endif
721# endif
725 & WRITE (out,110) .true., 'Dout(iTvdif)', &
726 & 'Write out vertical diffusion, tracer ', itrc, &
728 END DO
729 END IF
730#endif
731 END IF
732 END DO
733 END IF
734
735
736
737
738
740
741
742
743
747#ifdef ADJOINT
749#endif
750#if defined TANGENT || defined TL_IOMS
752#endif
753
754
755
756 IF (
tnudg(i,ng).gt.0.0_r8)
THEN
758 ELSE
760 END IF
761 END DO
762 END DO
763
764 30 FORMAT (/,' read_BioPar - variable info not yet loaded, ', &
765 & a,i2.2,a)
766 40 FORMAT (/,' read_BioPar - Error while processing line: ',/,a)
767 50 FORMAT (/,/,' Hypoxia-SRM Parameters, Grid: ',i2.2, &
768 & /, ' ================================',/)
769 60 FORMAT (1x,i10,2x,a,t32,a)
770 70 FORMAT (1p,e11.4,2x,a,t32,a)
771 80 FORMAT (1p,e11.4,2x,a,t32,a,/,t34,a)
772 90 FORMAT (1p,e11.4,2x,a,'(',i2.2,')',t32,a,/,t34,a,i2.2,':',1x,a)
773 100 FORMAT (10x,l1,2x,a,'(',i2.2,')',t32,a,i2.2,':',1x,a)
774 110 FORMAT (10x,l1,2x,a,t32,a,i2.2,':',1x,a)
775
776 RETURN
integer function decode_line(line_text, keyword, nval, cval, rval)
integer function load_lbc(ninp, vinp, line, nline, ifield, igrid, itrcstr, itrcend, svname, s)
integer function load_tadv(ninp, vinp, line, nline, itrc, igrid, itracer, itrcstr, itrcend, svname, s)
real(r8), dimension(:), allocatable resrate
integer, dimension(:), allocatable bioiter
real(r8), dimension(:,:), allocatable bioini
integer, dimension(:), allocatable idbio
integer, dimension(:), allocatable idttav
logical, dimension(:,:), allocatable hout
integer, dimension(:), allocatable ihvtav
integer, dimension(:), allocatable ihutav
integer, dimension(:), allocatable idutav
integer, dimension(:), allocatable idsurt
integer, dimension(:), allocatable idtsur
integer, dimension(:), allocatable idtvar
integer, dimension(:), allocatable istvar
logical, dimension(:,:), allocatable qout
character(len=maxlen), dimension(6, 0:nv) vname
integer, dimension(:), allocatable idvtav
logical, dimension(:,:), allocatable dout
logical, dimension(:,:), allocatable aout
integer, dimension(:,:), allocatable iddtrc
type(t_adv), dimension(:,:), allocatable hadvection
type(t_lbc), dimension(:,:,:), allocatable ad_lbc
type(t_adv), dimension(:,:), allocatable ad_hadvection
type(t_lbc), dimension(:,:,:), allocatable lbc
type(t_adv), dimension(:,:), allocatable vadvection
type(t_adv), dimension(:,:), allocatable ad_vadvection
real(r8), dimension(:,:), allocatable tl_tnu2
logical, dimension(:,:), allocatable ltracersrc
real(r8), dimension(:,:), allocatable nl_tnu2
integer, dimension(:), allocatable nqck
real(dp), dimension(:,:), allocatable tnudg
logical, dimension(:,:), allocatable ltracersponge
real(r8), dimension(:,:), allocatable tl_tnu4
integer, dimension(:), allocatable navg
real(r8), dimension(:,:), allocatable ad_akt_fac
real(r8), dimension(:,:), allocatable ad_tnu2
real(r8), dimension(:,:), allocatable akt_bak
integer, dimension(:), allocatable nhis
real(r8), dimension(:,:), allocatable ad_tnu4
real(r8), dimension(:,:), allocatable nl_tnu4
logical, dimension(:), allocatable lbiology
logical, dimension(:,:), allocatable ltracerclm
integer, dimension(:), allocatable ndia
logical, dimension(:,:), allocatable lnudgetclm
real(r8), dimension(:,:), allocatable tl_akt_fac