2
3
4
5
6
7
8
9
10
11
12
13
14
20
22
23 implicit none
24
25
26
27 logical, intent(in) :: Lwrite
28 integer, intent(in) :: model, inp, out
29
30
31
32 integer :: Npts, Nval
33 integer :: iTrcStr, iTrcEnd
34 integer :: i, ifield, igrid, itracer, itrc, ng, nline, status
35
36 logical, dimension(NBT,Ngrids) :: Ltrc
37
38 real(r8), dimension(NBT,Ngrids) :: Rbio
39
40 real(dp), dimension(nRval) :: Rval
41
42 character (len=40 ) :: KeyWord
43 character (len=256) :: line
44 character (len=256), dimension(nCval) :: Cval
45
46
47
48
49
50 igrid=1
51 itracer=0
52 itrcstr=1
54 nline=0
55
56
57
58
59
60#ifdef ANA_BIOLOGY
62#endif
63 DO WHILE (.true.)
64 READ (inp,'(a)',err=10,END=20) line
66 IF (status.gt.0) THEN
67 SELECT CASE (trim(keyword))
68 CASE ('Lbiology')
70 CASE ('BioIter')
72#ifdef ANA_BIOLOGY
73 CASE ('BioIni(iNO3_)')
75 CASE ('BioIni(iPhyt)')
77 CASE ('BioIni(iZoop)')
79 CASE ('BioIni(iSDet)')
81#endif
82 CASE ('PARfrac')
84 CASE ('AttSW')
86 CASE ('AttPhy')
88 CASE ('PhyIS')
90 CASE ('Vm_NO3')
92 CASE ('PhyMRD')
94 CASE ('PhyMRN')
96 CASE ('K_NO3')
98 CASE ('Ivlev')
100 CASE ('ZooGR')
102 CASE ('ZooEED')
104 CASE ('ZooEEN')
106 CASE ('ZooMRD')
108 CASE ('ZooMRN')
110 CASE ('DetRR')
112 CASE ('wPhy')
114 CASE ('wDet')
116 CASE ('TNU2')
122 END DO
123 END DO
124 CASE ('TNU4')
130 END DO
131 END DO
132 CASE ('ad_TNU2')
139 END DO
140 END DO
141 CASE ('ad_TNU4')
148 END DO
149 END DO
150 CASE ('LtracerSponge')
156 END DO
157 END DO
158 CASE ('AKT_BAK')
164 END DO
165 END DO
166 CASE ('ad_AKT_fac')
173 END DO
174 END DO
175 CASE ('TNUDG')
180 tnudg(i,ng)=rbio(itrc,ng)
181 END DO
182 END DO
183 CASE ('Hadvection')
184 IF (itracer.lt.
nbt)
THEN
185 itracer=itracer+1
186 ELSE
187 itracer=1
188 END IF
190 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
194 CASE ('Vadvection')
195 IF (itracer.lt.
nbt)
THEN
196 itracer=itracer+1
197 ELSE
198 itracer=1
199 END IF
201 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
205#if defined ADJOINT || defined TANGENT || defined TL_IOMS
206 CASE ('ad_Hadvection')
207 IF (itracer.lt.
nbt)
THEN
208 itracer=itracer+1
209 ELSE
210 itracer=1
211 END IF
213 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
217 CASE ('Vadvection')
218 IF (itracer.lt.(
nbt)
THEN
219 itracer=itracer+1
220 ELSE
221 itracer=1
222 END IF
224 npts=
load_tadv(nval, cval, line, nline, itrc, igrid, &
228#endif
229 CASE ('LBC(isTvar)')
230 IF (itracer.lt.
nbt)
THEN
231 itracer=itracer+1
232 ELSE
233 itracer=1
234 END IF
236 npts=
load_lbc(nval, cval, line, nline, ifield, igrid, &
239#if defined ADJOINT || defined TANGENT || defined TL_IOMS
240 CASE ('ad_LBC(isTvar)')
241 IF (itracer.lt.
nbt)
THEN
242 itracer=itracer+1
243 ELSE
244 itracer=1
245 END IF
247 npts=
load_lbc(nval, cval, line, nline, ifield, igrid, &
250#endif
251 CASE ('LtracerSrc')
257 END DO
258 END DO
259 CASE ('LtracerCLM')
265 END DO
266 END DO
267 CASE ('LnudgeTCLM')
273 END DO
274 END DO
275 CASE ('Hout(idTvar)')
280 IF (i.eq.0) THEN
281 IF (
master)
WRITE (out,30) &
282 & 'idTvar(idbio(', itrc, '))'
284 RETURN
285 END IF
286 hout(i,ng)=ltrc(itrc,ng)
287 END DO
288 END DO
289 CASE ('Hout(idTsur)')
294 IF (i.eq.0) THEN
295 IF (
master)
WRITE (out,30) &
296 & 'idTsur(idbio(', itrc, '))'
298 RETURN
299 END IF
300 hout(i,ng)=ltrc(itrc,ng)
301 END DO
302 END DO
303 CASE ('Qout(idTvar)')
308 qout(i,ng)=ltrc(itrc,ng)
309 END DO
310 END DO
311 CASE ('Qout(idsurT)')
316 IF (i.eq.0) THEN
317 IF (
master)
WRITE (out,30) &
318 & 'idsurT(idbio(', itrc, '))'
320 RETURN
321 END IF
322 qout(i,ng)=ltrc(itrc,ng)
323 END DO
324 END DO
325 CASE ('Qout(idTsur)')
330 qout(i,ng)=ltrc(itrc,ng)
331 END DO
332 END DO
333#if defined AVERAGES || \
334 (defined ad_averages && defined adjoint) || \
335 (defined rp_averages && defined tl_ioms) || \
336 (defined tl_averages && defined tangent)
337 CASE ('Aout(idTvar)')
342 aout(i,ng)=ltrc(itrc,ng)
343 END DO
344 END DO
345 CASE ('Aout(idTTav)')
350 aout(i,ng)=ltrc(itrc,ng)
351 END DO
352 END DO
353 CASE ('Aout(idUTav)')
358 aout(i,ng)=ltrc(itrc,ng)
359 END DO
360 END DO
361 CASE ('Aout(idVTav)')
366 aout(i,ng)=ltrc(itrc,ng)
367 END DO
368 END DO
369 CASE ('Aout(iHUTav)')
374 aout(i,ng)=ltrc(itrc,ng)
375 END DO
376 END DO
377 CASE ('Aout(iHVTav)')
382 aout(i,ng)=ltrc(itrc,ng)
383 END DO
384 END DO
385#endif
386#ifdef DIAGNOSTICS_TS
387 CASE ('Dout(iTrate)')
393 END DO
394 END DO
395 CASE ('Dout(iThadv)')
401 END DO
402 END DO
403 CASE ('Dout(iTxadv)')
409 END DO
410 END DO
411 CASE ('Dout(iTyadv)')
417 END DO
418 END DO
419 CASE ('Dout(iTvadv)')
425 END DO
426 END DO
427# if defined TS_DIF2 || defined TS_DIF4
428 CASE ('Dout(iThdif)')
434 END DO
435 END DO
436 CASE ('Dout(iTxdif)')
442 END DO
443 END DO
444 CASE ('Dout(iTydif)')
450 END DO
451 END DO
452# if defined MIX_GEO_TS || defined MIX_ISO_TS
453 CASE ('Dout(iTsdif)')
459 END DO
460 END DO
461# endif
462# endif
463 CASE ('Dout(iTvdif)')
469 END DO
470 END DO
471#endif
472 END SELECT
473 END IF
474 END DO
475 10
IF (
master)
WRITE (out,40) line
477 RETURN
478 20 CONTINUE
479
480
481
482
483
484 IF (
master.and.lwrite)
THEN
487 WRITE (out,50) ng
488 WRITE (out,60)
bioiter(ng),
'BioIter', &
489 & 'Number of iterations for nonlinear convergence.'
490#ifdef ANA_BIOLOGY
491 WRITE (out,70)
bioini(
ino3_,ng),
'BioIni(iNO3_)', &
492 & 'Nitrate initial concentration (mmol/m3).'
493 WRITE (out,70)
bioini(
iphyt,ng),
'BioIni(iPhyt)', &
494 & 'Phytoplankton initial concentration (mmol/m3).'
495 WRITE (out,70)
bioini(
izoop,ng),
'BioIni(iZoop)', &
496 & 'Zooplankton initial concentration (mmol/m3).'
497 WRITE (out,70)
bioini(
isdet,ng),
'BioIni(iSDet)', &
498 & 'Small detritus initial concentration (mmol/m3).'
499#endif
500 WRITE (out,80)
parfrac(ng),
'PARfrac', &
501 & 'Fraction of shortwave radiation that is', &
502 & 'photosynthetically active (nondimensional).'
503 WRITE (out,70)
attsw(ng),
'AttSW', &
504 & 'Light attenuation of seawater (m-1).'
505 WRITE (out,70)
attphy(ng),
'AttPhy', &
506 & 'Light attenuation by phytoplankton (m2/mmole_N).'
507 WRITE (out,80)
phyis(ng),
'PhyIS', &
508 & 'Phytoplankton growth, initial slope of P-I curve', &
509 & '(m2/W).'
510 WRITE (out,70)
vm_no3(ng),
'Vm_NO3', &
511 & 'Nitrate upatake rate (day-1).'
512 WRITE (out,70)
phymrd(ng),
'PhyMRD', &
513 & 'Phytoplankton mortality rate to Detritus (day-1)'
514 WRITE (out,70)
phymrn(ng),
'PhyMRN', &
515 & 'Phytoplankton mortality rate to Nitrogen (day-1)'
516 WRITE (out,80)
k_no3(ng),
'K_NO3', &
517 & 'Inverse half-saturation for phytoplankton NO3', &
518 & 'uptake (1/(mmol m-3)).'
519 WRITE (out,80)
ivlev(ng),
'Ivlev', &
520 & 'Ivlev constant for zooplankton grazing', &
521 & '(nondimensional).'
522 WRITE (out,70)
zoogr(ng),
'ZooGR', &
523 & 'Zooplankton maximum growth rate (day-1).'
524 WRITE (out,80)
zooeed(ng),
'ZooEED', &
525 & 'Zooplankton excretion efficiency to Detritus', &
526 & 'pool (nondimensional).'
527 WRITE (out,80)
zooeen(ng),
'ZooEEN', &
528 & 'Zooplankton excretion efficiency to Nitrogen', &
529 & 'pool (nondimensional).'
530 WRITE (out,70)
zoomrd(ng),
'ZooMRD', &
531 & 'Zooplankton mortality rate to Detritus (day-1).'
532 WRITE (out,70)
zoomrn(ng),
'ZooMRN', &
533 & 'Zooplankton mortality rate to Nitrogen (day-1).'
534 WRITE (out,70)
detrr(ng),
'DetRR', &
535 & 'Detritus remineralization rate (day-1).'
536 WRITE (out,70)
wphy(ng),
'wPhy', &
537 & 'Phytoplankton sinking rate (m/day).'
538 WRITE (out,70)
wdet(ng),
'wDet', &
539 & 'Detrital sinking rate (m/day).'
540#ifdef TS_DIF2
543 WRITE (out,90)
nl_tnu2(i,ng),
'nl_tnu2', i, &
544 & 'NLM Horizontal, harmonic mixing coefficient', &
545 &
'(m2/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
546# ifdef ADJOINT
547 WRITE (out,90)
ad_tnu2(i,ng),
'ad_tnu2', i, &
548 & 'ADM Horizontal, harmonic mixing coefficient', &
549 &
'(m2/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
550# endif
551# if defined TANGENT || defined TL_IOMS
552 WRITE (out,90)
tl_tnu2(i,ng),
'tl_tnu2', i, &
553 & 'TLM Horizontal, harmonic mixing coefficient', &
554 &
'(m2/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
555# endif
556 END DO
557#endif
558#ifdef TS_DIF4
561 WRITE (out,90)
nl_tnu4(i,ng),
'nl_tnu4', i, &
562 & 'NLM Horizontal, biharmonic mixing coefficient', &
563 &
'(m4/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
564# ifdef ADJOINT
565 WRITE (out,90)
ad_tnu4(i,ng),
'ad_tnu4', i, &
566 & 'ADM Horizontal, biharmonic mixing coefficient', &
567 &
'(m4/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
568# endif
569# if defined TANGENT || defined TL_IOMS
570 WRITE (out,90)
tl_tnu4(i,ng),
'tl_tnu4', i, &
571 & 'TLM Horizontal, biharmonic mixing coefficient', &
572 &
'(m4/s) for tracer ', i, trim(
vname(1,
idtvar(i)))
573# endif
574 END DO
575#endif
580 & i, 'Turning ON sponge on tracer ', i, &
582 ELSE
584 & i, 'Turning OFF sponge on tracer ', i, &
586 END IF
587 END DO
590 WRITE(out,90)
akt_bak(i,ng),
'Akt_bak', i, &
591 & 'Background vertical mixing coefficient (m2/s)', &
593 END DO
594#ifdef FORWARD_MIXING
597# ifdef ADJOINT
598 WRITE (out,90)
ad_akt_fac(i,ng),
'ad_Akt_fac', i, &
599 & 'ADM basic state vertical mixing scale factor', &
601# endif
602# if defined TANGENT || defined TL_IOMS
603 WRITE (out,90)
tl_akt_fac(i,ng),
'tl_Akt_fac', i, &
604 & 'TLM basic state vertical mixing scale factor', &
606# endif
607 END DO
608#endif
611 WRITE (out,90)
tnudg(i,ng),
'Tnudg', i, &
612 & 'Nudging/relaxation time scale (days)', &
614 END DO
618 WRITE (out,100)
ltracersrc(i,ng),
'LtracerSrc', &
619 & i, 'Turning ON point sources/Sink on tracer ', i, &
621 ELSE
622 WRITE (out,100)
ltracersrc(i,ng),
'LtracerSrc', &
623 & i, 'Turning OFF point sources/Sink on tracer ', i, &
625 END IF
626 END DO
630 WRITE (out,100)
ltracerclm(i,ng),
'LtracerCLM', i, &
631 & 'Turning ON processing of climatology tracer ', i, &
633 ELSE
634 WRITE (out,100)
ltracerclm(i,ng),
'LtracerCLM', i, &
635 & 'Turning OFF processing of climatology tracer ', i, &
637 END IF
638 END DO
642 WRITE (out,100)
lnudgetclm(i,ng),
'LnudgeTCLM', i, &
643 & 'Turning ON nudging of climatology tracer ', i, &
645 ELSE
646 WRITE (out,100)
lnudgetclm(i,ng),
'LnudgeTCLM', i, &
647 & 'Turning OFF nudging of climatology tracer ', i, &
649 END IF
650 END DO
651 IF ((
nhis(ng).gt.0).and.any(
hout(:,ng)))
THEN
652 WRITE (out,'(1x)')
658 END DO
663 & 'Write out tracer flux ', i, &
665 END DO
666 END IF
667 IF ((
nqck(ng).gt.0).and.any(
qout(:,ng)))
THEN
668 WRITE (out,'(1x)')
674 END DO
679 & 'Write out surface tracer ', i, &
681 END DO
686 & 'Write out tracer flux ', i, &
688 END DO
689 END IF
690#if defined AVERAGES || \
691 (defined ad_averages && defined adjoint) || \
692 (defined rp_averages && defined tl_ioms) || \
693 (defined tl_averages && defined tangent)
694 IF ((
navg(ng).gt.0).and.any(
aout(:,ng)))
THEN
695 WRITE (out,'(1x)')
700 & 'Write out averaged tracer ', i, &
702 END DO
707 & 'Write out averaged <t*t> for tracer ', i, &
709 END DO
714 & 'Write out averaged <u*t> for tracer ', i, &
716 END DO
721 & 'Write out averaged <v*t> for tracer ', i, &
723 END DO
728 & 'Write out averaged <Huon*t> for tracer ', i, &
730 END DO
735 & 'Write out averaged <Hvom*t> for tracer ', i, &
737 END DO
738 END IF
739#endif
740#ifdef DIAGNOSTICS_TS
741 IF ((
ndia(ng).gt.0).and.any(
dout(:,ng)))
THEN
742 WRITE (out,'(1x)')
746 & WRITE (out,110) .true., 'Dout(iTrate)', &
747 & 'Write out rate of change of tracer ', itrc, &
749 END DO
753 & WRITE (out,110) .true., 'Dout(iThadv)', &
754 & 'Write out horizontal advection, tracer ', itrc, &
756 END DO
760 & WRITE (out,110) .true., 'Dout(iTxadv)', &
761 & 'Write out horizontal X-advection, tracer ', itrc, &
763 END DO
767 & WRITE (out,110) .true., 'Dout(iTyadv)', &
768 & 'Write out horizontal Y-advection, tracer ', itrc, &
770 END DO
774 & WRITE (out,110) .true., 'Dout(iTvadv)', &
775 & 'Write out vertical advection, tracer ', itrc, &
777 END DO
778# if defined TS_DIF2 || defined TS_DIF4
782 & WRITE (out,110) .true., 'Dout(iThdif)', &
783 & 'Write out horizontal diffusion, tracer ', itrc, &
785 END DO
789 & WRITE (out,110) .true., 'Dout(iTxdif)', &
790 & 'Write out horizontal X-diffusion, tracer ', itrc, &
792 END DO
796 & WRITE (out,110) .true., 'Dout(iTydif)', &
797 & 'Write out horizontal Y-diffusion, tracer ', itrc, &
799 END DO
800# if defined MIX_GEO_TS || defined MIX_ISO_TS
804 & WRITE (out,110) .true., 'Dout(iTsdif)', &
805 & 'Write out horizontal S-diffusion, tracer ', itrc, &
807 END DO
808# endif
809# endif
813 & WRITE (out,110) .true., 'Dout(iTvdif)', &
814 & 'Write out vertical diffusion, tracer ', itrc, &
816 END DO
817 END IF
818#endif
819 END IF
820 END DO
821 END IF
822
823
824
825
826
827
828
829
834#ifdef ADJOINT
836#endif
837#if defined TANGENT || defined TL_IOMS
839#endif
840
841
842
843 IF (
tnudg(i,ng).gt.0.0_r8)
THEN
845 ELSE
847 END IF
848 END DO
849 END DO
850
851 30 FORMAT (/,' read_BioPar - variable info not yet loaded, ', &
852 & a,i2.2,a)
853 40 FORMAT (/,' read_BioPar - Error while processing line: ',/,a)
854 50 FORMAT (/,/,' NPZD Model Parameters, Grid: ',i2.2, &
855 & /, ' ===============================',/)
856 60 FORMAT (1x,i10,2x,a,t32,a)
857 70 FORMAT (1p,e11.4,2x,a,t32,a)
858 80 FORMAT (1p,e11.4,2x,a,t32,a,/,t34,a)
859 90 FORMAT (1p,e11.4,2x,a,'(',i2.2,')',t32,a,/,t34,a,i2.2,':',1x,a)
860 100 FORMAT (10x,l1,2x,a,'(',i2.2,')',t32,a,i2.2,':',1x,a)
861 110 FORMAT (10x,l1,2x,a,t32,a,i2.2,':',1x,a)
862
863 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 parfrac
real(r8), dimension(:), allocatable phymrd
real(r8), dimension(:), allocatable zooeed
real(r8), dimension(:), allocatable detrr
real(r8), dimension(:), allocatable wdet
integer, dimension(:), allocatable bioiter
real(r8), dimension(:), allocatable phyis
real(r8), dimension(:), allocatable attsw
real(r8), dimension(:,:), allocatable bioini
real(r8), dimension(:), allocatable zoogr
real(r8), dimension(:), allocatable k_no3
real(r8), dimension(:), allocatable ivlev
real(r8), dimension(:), allocatable attphy
integer, dimension(:), allocatable idbio
real(r8), dimension(:), allocatable wphy
real(r8), dimension(:), allocatable vm_no3
real(r8), dimension(:), allocatable zoomrn
real(r8), dimension(:), allocatable phymrn
real(r8), dimension(:), allocatable zoomrd
real(r8), dimension(:), allocatable zooeen
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