/[MITgcm]/MITgcm_contrib/darwin2/pkg/monod/monod_radtrans_iter.F
ViewVC logotype

Annotation of /MITgcm_contrib/darwin2/pkg/monod/monod_radtrans_iter.F

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


Revision 1.1 - (hide annotations) (download)
Wed Apr 13 18:56:25 2011 UTC (14 years, 4 months ago) by jahn
Branch: MAIN
CVS Tags: ctrb_darwin2_ckpt63l_20120405, ctrb_darwin2_ckpt62v_20110413, ctrb_darwin2_ckpt63f_20111201, ctrb_darwin2_ckpt62y_20110526, ctrb_darwin2_ckpt62x_20110513, ctrb_darwin2_ckpt62w_20110426, ctrb_darwin2_ckpt63o_20120629, ctrb_darwin2_ckpt63c_20111011, ctrb_darwin2_ckpt63i_20120124, ctrb_darwin2_ckpt63m_20120506, ctrb_darwin2_ckpt63e_20111107, ctrb_darwin2_ckpt63b_20110830, ctrb_darwin2_ckpt63j_20120217, ctrb_darwin2_ckpt63g_20111220, ctrb_darwin2_ckpt63a_20110804, ctrb_darwin2_ckpt63h_20111230, ctrb_darwin2_ckpt63p_20120707, ctrb_darwin2_ckpt63d_20111107, ctrb_darwin2_ckpt63_20110728, ctrb_darwin2_baseline, ctrb_darwin2_ckpt63n_20120604, ctrb_darwin2_ckpt63k_20120317, ctrb_darwin2_ckpt62z_20110622
darwin2 initial checkin

1 jahn 1.1 C $Header$
2     C $Name$
3    
4     #include "DARWIN_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: MONOD_RADTRANS_ITER
8    
9     C !INTERFACE: ==========================================================
10     subroutine MONOD_RADTRANS_ITER(
11     I H,rmud,Edsf,Essf,a_k,bt_k,bb_k,kmax,niter,
12     O Edbot,Esbot,Eubot,Eutop,
13     O tirrq,tirrwq,
14     I myThid)
15    
16     C !DESCRIPTION:
17     c
18     c Model of irradiance in the water column. Accounts for three
19     c irradiance streams:
20     c
21     c Edbot = direct downwelling irradiance in W/m2 per waveband
22     c Esbot = diffuse downwelling irradiance in W/m2 per waveband
23     c Eubot = diffuse upwelling irradiance in W/m2 per waveband
24     c
25     c Propagation is done in energy units, tests are done in quanta,
26     c final is quanta for phytoplankton growth.
27     c
28     c The Ed equation is integrated exactly.
29     c Es and Eu are first computed using a truncation to downward-
30     c decreasing modes a la Aas that makes Es continuous.
31     c Then niter alternating upward and downward integrations are performed,
32     c each time using Es at the top and Eu at the bottom of each layer as a
33     c boundary condition. The boundary condition in the deepest wet layer
34     c is always downward-decreasing modes only.
35     c During upward integrations, Eu is made continuous, during downward
36     c integrations, Es.
37     c At the end, Ed and Es are continuous, but Eu is so only approximately.
38     c
39     C !USES: ===============================================================
40     IMPLICIT NONE
41     #include "SIZE.h" /* Nr */
42     C#include "EEPARAMS.h"
43     #include "MONOD_SIZE.h"
44     #include "SPECTRAL_SIZE.h" /* tlam */
45     #include "SPECTRAL.h" /* WtouEin */
46     #include "WAVEBANDS_PARAMS.h" /* darwin_PAR_ilamLo/Hi
47     darwin_radmodThresh
48     darwin_rmus darwin_rmuu */
49    
50     C !INPUT PARAMETERS: ===================================================
51     C H :: layer thickness (including hFacC!)
52     C rmud :: inv.cosine of direct (underwater solar) zenith angle
53     C Edsf :: direct downwelling irradiance below surface per waveband
54     C Essf :: diffuse downwelling irradiance below surface per waveband
55     C a_k :: absorption coefficient per level and waveband (1/m)
56     C bt_k :: total scattering coefficient per level and waveband (1/m)
57     C = forward + back scattering coefficient
58     C bb_k :: backscattering coefficient per level and waveband (1/m)
59     C kmax :: maximum number of layers to compute
60     C niter :: number of up-down iterations after initial Aas integration
61     _RL H(Nr)
62     _RL rmud
63     _RL Edsf(tlam), Essf(tlam)
64     _RL a_k(Nr,tlam), bt_k(Nr,tlam), bb_k(Nr,tlam)
65     INTEGER kmax,niter
66     INTEGER myThid
67    
68     C !OUTPUT PARAMETERS: ==================================================
69     C Edbot :: direct downwelling irradiance at bottom of layer
70     C Esbot :: diffuse downwelling irradiance at bottom of layer
71     C Eubot :: diffuse upwelling irradiance at bottom of layer
72     C tirrq :: total scalar irradiance at cell center (uEin/m2/s)
73     C tirrwq :: total scalar irradiance at cell center per waveband
74     _RL Edbot(tlam,Nr),Esbot(tlam,Nr),Eubot(tlam,Nr),Eutop(tlam,Nr)
75     _RL tirrq(Nr)
76     _RL tirrwq(tlam,Nr)
77    
78     #ifdef DAR_RADTRANS
79    
80     C !LOCAL VARIABLES: ====================================================
81     INTEGER k, nl, iter, kbot
82     _RL Edtop(tlam,Nr),Estop(tlam,Nr)
83     _RL Etopwq, Ebotwq
84     _RL zd
85     _RL rmus,rmuu
86    
87     C !LOCAL VARIABLES: ================================================
88     _RL cd,au,Bu,Cu
89     _RL as,Bs,Cs,Bd,Fd
90     _RL bquad,cquad,sqarg
91     _RL a1,a2,denom
92     _RL c1,c2,tmp,Esnew,Eunew
93     _RL R2(Nr),R1(Nr),x(Nr),y(Nr)
94     _RL expAddr(Nr),expAsdr(Nr),expmAudr(Nr),idenom(Nr)
95     c
96     _RL rbot, rd, ru
97     data rbot /0.0/ !bottom reflectance (not used)
98     data rd /1.5/ !these are taken from Ackleson, et al. 1994 (JGR)
99     data ru /3.0/
100     CEOP
101     rmus = darwin_rmus
102     rmuu = darwin_rmuu
103    
104     c find deepest wet layer
105     kbot = kmax
106     DO WHILE (H(kbot).EQ.0 .AND. kbot.GT.1)
107     kbot = kbot - 1
108     ENDDO
109    
110     DO nl = 1,tlam
111     DO k=1,Nr
112     Edtop(nl,k) = 0.0
113     Estop(nl,k) = 0.0
114     Eutop(nl,k) = 0.0
115     Edbot(nl,k) = 0.0
116     Esbot(nl,k) = 0.0
117     Eubot(nl,k) = 0.0
118     ENDDO
119     IF (Edsf(nl) .GE. darwin_radmodThresh .OR.
120     & Essf(nl) .GE. darwin_radmodThresh) THEN
121     DO k=1,kbot
122     zd = H(k)
123     cd = (a_k(k,nl)+bt_k(k,nl))*rmud
124     au = a_k(k,nl)*rmuu
125     Bu = ru*bb_k(k,nl)*rmuu
126     Cu = au+Bu
127     as = a_k(k,nl)*rmus
128     Bs = rd*bb_k(k,nl)*rmus
129     Cs = as+Bs
130     Bd = bb_k(k,nl)*rmud
131     Fd = (bt_k(k,nl)-bb_k(k,nl))*rmud
132     bquad = Cs - Cu
133     cquad = Bs*Bu - Cs*Cu
134     sqarg = bquad*bquad - 4.0*cquad
135     a1 = 0.5*(-bquad + sqrt(sqarg))
136     a2 = 0.5*(-bquad - sqrt(sqarg)) ! K of Aas
137     R1(k) = (a1+Cs)/Bu
138     R2(k) = (a2+Cs)/Bu
139     denom = (cd-Cs)*(cd+Cu) + Bs*Bu
140     x(k) = -((cd+Cu)*Fd+Bu*Bd)/denom
141     y(k) = (-Bs*Fd+(cd-Cs)*Bd)/denom
142     expAddr(k) = exp(-cd*zd)
143     expmAudr(k) = exp(-a1*zd)
144     expAsdr(k) = exp(a2*zd)
145     idenom(k) = 1./(R1(k)-R2(k)*expAsdr(k)*expmAudr(k))
146     ENDDO
147    
148     C integrate Ed equation first
149     Edtop(nl,1) = Edsf(nl)
150     DO k=1,kbot-1
151     Edbot(nl,k) = Edtop(nl,k)*expAddr(k)
152     Edtop(nl,k+1) = Edbot(nl,k)
153     ENDDO
154     Edbot(nl,kbot) = Edtop(nl,kbot)*expAddr(kbot)
155    
156     C start with Aas solution (no increasing mode)
157     Estop(nl,1) = Essf(nl)
158     DO k=1,kbot-1
159     c2 = Estop(nl,k) - x(k)*Edtop(nl,k)
160     Estop(nl,k+1) = MAX(0., c2*expAsdr(k) + x(k)*Edbot(nl,k))
161     Eubot(nl,k) = MAX(0., R2(k)*c2*expAsdr(k) + y(k)*Edbot(nl,k))
162     Eutop(nl,k) = R2(k)*c2 + y(k)*Edtop(nl,k)
163     ENDDO
164     C Aas b.c. in bottom layer
165     c2 = Estop(nl,kbot) - x(kbot)*Edtop(nl,kbot)
166     Eutop(nl,kbot) = R2(kbot)*c2 + y(kbot)*Edtop(nl,kbot)
167    
168     c improve solution iteratively
169     DO iter=1,niter
170     c bottom boundary condition
171     Eubot(nl,kbot-1) = Eutop(nl,kbot)
172    
173     DO k=kbot-1,2,-1
174     c compute Eubot(k-1) from Estop(k) and Eubot(k)
175     tmp = Estop(nl,k)-x(k)*Edtop(nl,k)
176     c1 = (Eubot(nl,k)-R2(k)*expAsdr(k)*tmp-y(k)*Edbot(nl,k))
177     & *idenom(k)
178     c2 = (R1(k)*tmp + y(k)*expmAudr(k)*Edbot(nl,k)
179     & - expmAudr(k)*Eubot(nl,k))*idenom(k)
180     Eunew = R2(k)*c2 + R1(k)*expmAudr(k)*c1 + y(k)*Edtop(nl,k)
181     Eubot(nl,k-1) = MAX(0., Eunew)
182     ENDDO
183     DO k=1,kbot-1
184     c compute Estop(k+1) from Estop(k) and Eubot(k)
185     tmp = Estop(nl,k) - x(k)*Edtop(nl,k)
186     c1 = (Eubot(nl,k)-R2(k)*expAsdr(k)*tmp-y(k)*Edbot(nl,k))
187     & *idenom(k)
188     c2 = (R1(k)*tmp + y(k)*expmAudr(k)*Edbot(nl,k)
189     & - expmAudr(k)*Eubot(nl,k))*idenom(k)
190     Esnew = expAsdr(k)*c2 + c1 + x(k)*Edbot(nl,k)
191     Estop(nl,k+1) = MAX(0., Esnew)
192     Eutop(nl,k) = R2(k)*c2+R1(k)*expmAudr(k)*c1+y(k)*Edtop(nl,k)
193     ENDDO
194     C Aas b.c. in bottom layer
195     c2 = Estop(nl,kbot) - x(kbot)*Edtop(nl,kbot)
196     Eutop(nl,kbot) = R2(kbot)*c2 + y(kbot)*Edtop(nl,kbot)
197     C enddo iter
198     ENDDO
199    
200     c compute missing fields
201     C uses c2 from previous iteration!
202     Esbot(nl,kbot) = c2*expAsdr(kbot) + x(kbot)*Edbot(nl,kbot)
203     Eubot(nl,kbot) = R2(kbot)*c2*expAsdr(kbot)
204     & + y(kbot)*Edbot(nl,kbot)
205    
206     C Es is continuous now (unless negative...)
207     DO k=1,kbot-1
208     Esbot(nl,k) = Estop(nl,k+1)
209     ENDDO
210     C endif thresh
211     ENDIF
212    
213     DO k = 1,Nr
214     #ifdef DAR_RADTRANS_RMUS_PAR
215     Etopwq = (Edtop(nl,k)+Estop(nl,k)+Eutop(nl,k))*WtouEins(nl)
216     Ebotwq = (Edbot(nl,k)+Esbot(nl,k)+Eubot(nl,k))*WtouEins(nl)
217     C interpolate and convert to scalar using rmus only!?
218     tirrwq(nl,k) = sqrt(Etopwq*Ebotwq)*rmus
219     #else
220     C convert to scalar irradiance in quanta
221     Etopwq = (rmud*Edtop(nl,k)+rmus*Estop(nl,k)+rmuu*Eutop(nl,k))
222     & *WtouEins(nl)
223     Ebotwq = (rmud*Edbot(nl,k)+rmus*Esbot(nl,k)+rmuu*Eubot(nl,k))
224     & *WtouEins(nl)
225     C and interpolate
226     tirrwq(nl,k) = sqrt(Etopwq*Ebotwq)
227     #endif
228     ENDDO
229    
230     C enddo nl
231     ENDDO
232    
233     DO k = 1,Nr
234     C sum PAR range
235     tirrq(k) = 0.0
236     DO nl = darwin_PAR_ilamLo,darwin_PAR_ilamHi
237     tirrq(k) = tirrq(k) + tirrwq(nl,k)
238     ENDDO
239     ENDDO
240     c
241     #endif /* DAR_RADTRANS */
242    
243     return
244     end
245    

  ViewVC Help
Powered by ViewVC 1.1.22