1 |
edhill |
1.3 |
C $Header: /u/u3/gcmpack/MITgcm/pkg/bulk_force/bulkf_formula_lanl.F,v 1.2.4.1 2003/10/02 18:18:33 adcroft Exp $ |
2 |
|
|
C $Name: $ |
3 |
cheisey |
1.1 |
c swd -- bulkf formula used in bulkf and ice pkgs |
4 |
|
|
|
5 |
|
|
c taken from exf package |
6 |
edhill |
1.3 |
#include "BULK_FORCE_OPTIONS.h" |
7 |
cheisey |
1.1 |
subroutine bulkf_formula_lanl( |
8 |
|
|
I uw, vw, us, Ta, Qa, nc, tsf_in, |
9 |
cheisey |
1.2 |
I flwupa, flha, fsha, df0dT, |
10 |
cheisey |
1.1 |
I ust, vst, evp, ssq, iceornot, windread |
11 |
|
|
& ) |
12 |
|
|
|
13 |
|
|
IMPLICIT NONE |
14 |
|
|
c |
15 |
|
|
#include "EEPARAMS.h" |
16 |
|
|
#include "SIZE.h" |
17 |
|
|
#include "PARAMS.h" |
18 |
|
|
#include "DYNVARS.h" |
19 |
|
|
#include "GRID.h" |
20 |
|
|
#include "FFIELDS.h" |
21 |
|
|
#ifdef ALLOW_BULK_FORCE |
22 |
|
|
#include "BULKF_ICE_CONSTANTS.h" |
23 |
|
|
#include "BULKF.h" |
24 |
|
|
#endif |
25 |
|
|
|
26 |
|
|
c |
27 |
|
|
c calculate bulk formula fluxes over open ocean or seaice |
28 |
|
|
c |
29 |
|
|
c input |
30 |
|
|
_RL us ! wind speed |
31 |
|
|
_RL uw ! zonal wind speed (at grid center) |
32 |
|
|
_RL vw ! meridional wind speed (at grid center) |
33 |
|
|
_RL Ta ! air temperature at ht |
34 |
|
|
_RL Qa ! specific humidity at ht |
35 |
|
|
_RL tsf_in ! surface temperature (either ice or open water) |
36 |
|
|
_RL nc ! fraction cloud cover |
37 |
|
|
integer iceornot ! 0=open water, 1=ice cover |
38 |
|
|
logical windread ! |
39 |
|
|
c output |
40 |
cheisey |
1.2 |
_RL flwupa ! upward long wave radiation |
41 |
cheisey |
1.1 |
_RL flha ! latent heat flux |
42 |
|
|
_RL fsha ! sensible heat flux |
43 |
|
|
_RL df0dT ! derivative of heat flux with respect to Tsf |
44 |
|
|
_RL ust ! zonal wind stress (at grid center) |
45 |
|
|
_RL vst ! meridional wind stress (at grid center) |
46 |
|
|
_RL evp ! evaporation rate (over open water) |
47 |
|
|
_RL ssq ! surface specific humidity (kg/kg) |
48 |
|
|
c |
49 |
|
|
c local variables |
50 |
|
|
_RL tsf ! surface temperature in K |
51 |
|
|
_RL ht ! reference height (m) |
52 |
|
|
_RL hq ! reference height for humidity (m) |
53 |
|
|
_RL hu ! reference height for wind speed (m) |
54 |
|
|
_RL zref ! reference height |
55 |
|
|
_RL czol |
56 |
|
|
_RL usm ! wind speed limited |
57 |
|
|
_RL t0 ! virtual temperature (K) |
58 |
|
|
_RL deltap ! potential temperature diff (K) |
59 |
|
|
_RL delq ! specific humidity difference |
60 |
|
|
_RL stable |
61 |
|
|
_RL rdn ,ren, rhn |
62 |
|
|
_RL ustar |
63 |
|
|
_RL tstar |
64 |
|
|
_RL qstar |
65 |
|
|
_RL huol |
66 |
|
|
_RL htol |
67 |
|
|
_RL hqol |
68 |
|
|
_RL xsq |
69 |
|
|
_RL x |
70 |
|
|
_RL re |
71 |
|
|
_RL rh |
72 |
|
|
_RL tau |
73 |
|
|
_RL psimh |
74 |
|
|
_RL psixh |
75 |
|
|
_RL rd |
76 |
|
|
_RL uzn |
77 |
|
|
_RL shn |
78 |
|
|
_RL aln |
79 |
|
|
_RL cdalton |
80 |
|
|
_RL dflhdT ! derivative of latent heat with respect to T |
81 |
|
|
_RL dfshdT ! derivative of sensible heat with respect to T |
82 |
|
|
_RL dflwupdT ! derivative of long wave with respect to T |
83 |
|
|
_RL mixratio |
84 |
|
|
_RL ea |
85 |
|
|
_RL psim_fac |
86 |
|
|
_RL umin |
87 |
|
|
_RL lath |
88 |
|
|
_RL csha |
89 |
|
|
_RL clha |
90 |
|
|
_RL zice |
91 |
|
|
integer niter_bulk, iter |
92 |
|
|
|
93 |
|
|
#ifdef ALLOW_BULK_FORCE |
94 |
|
|
|
95 |
|
|
c --- external functions --- |
96 |
|
|
_RL exf_BulkCdn |
97 |
|
|
external exf_BulkCdn |
98 |
|
|
_RL exf_BulkqSat |
99 |
|
|
external exf_BulkqSat |
100 |
|
|
_RL exf_BulkRhn |
101 |
|
|
external exf_BulkRhn |
102 |
|
|
|
103 |
|
|
cQQQQQQQQQQQQQQQQQQQQq |
104 |
|
|
c -- compute turbulent surface fluxes |
105 |
|
|
ht = 2.d0 |
106 |
|
|
hq = 2.d0 |
107 |
|
|
hu = 10.d0 |
108 |
|
|
zref = 10.d0 |
109 |
|
|
zice = 0.0005 |
110 |
|
|
aln = log(ht/zref) |
111 |
|
|
niter_bulk = 5 |
112 |
|
|
cdalton = 0.0346000 |
113 |
|
|
czol = zref*xkar*gravity |
114 |
|
|
psim_fac=5.d0 |
115 |
|
|
umin=1.d0 |
116 |
|
|
c |
117 |
|
|
lath=Lvap |
118 |
|
|
if (iceornot.gt.0) lath=Lvap+Lfresh |
119 |
|
|
Tsf=Tsf_in+Tf0kel |
120 |
|
|
c Wind speed |
121 |
|
|
if (us.eq.0) then |
122 |
|
|
us = sqrt(uw*uw + vw*vw) |
123 |
|
|
endif |
124 |
|
|
usm = max(us,umin) |
125 |
|
|
cQQQ try to limit drag |
126 |
|
|
cQQ usm = min(usm,5.d0) |
127 |
|
|
c |
128 |
|
|
t0 = Ta*(1.d0 + humid_fac*Qa) |
129 |
|
|
cQQ ssq = 0.622*6.11*exp(22.47*(1.d0-Tf0kel/tsf))/p0 |
130 |
|
|
ssq =3.797915*exp(lath*(7.93252d-6-2.166847d-3/Tsf))/p0 |
131 |
|
|
cBB debugging |
132 |
|
|
cBB print*,'ice, ssq', ssq |
133 |
|
|
c |
134 |
|
|
deltap = ta - tsf + gamma_blk*ht |
135 |
|
|
delq = Qa - ssq |
136 |
|
|
c |
137 |
|
|
c initialize estimate exchange coefficients |
138 |
|
|
rdn=xkar/(log(zref/zice)) |
139 |
|
|
rhn=rdn |
140 |
|
|
ren=rdn |
141 |
|
|
c calculate turbulent scales |
142 |
|
|
ustar=rdn*usm |
143 |
|
|
tstar=rhn*deltap |
144 |
|
|
qstar=ren*delq |
145 |
|
|
c |
146 |
|
|
c interation with psi-functions to find transfer coefficients |
147 |
|
|
do iter=1,niter_bulk |
148 |
|
|
huol = czol/ustar**2 *(tstar/t0 + |
149 |
|
|
& qstar/(1.d0/humid_fac+Qa)) |
150 |
|
|
huol = sign( min(abs(huol),10.d0), huol) |
151 |
|
|
stable = 5. _d -1 + sign(5. _d -1 , huol) |
152 |
|
|
xsq = max(sqrt(abs(1.d0 - 16.d0*huol)),1.d0) |
153 |
|
|
x = sqrt(xsq) |
154 |
|
|
psimh = -5.d0*huol*stable + (1.d0-stable)* |
155 |
|
|
& (2.d0*log(5.e-1*(1.d0+x)) + |
156 |
|
|
& 2.d0*log(5.e-1*(1.d0+xsq)) - |
157 |
|
|
& 2.d0*atan(x) + pi*.5d0) |
158 |
|
|
psixh = -5.d0*huol*stable + (1.d0-stable)* |
159 |
|
|
& (2.d0*log(5.e-1*(1.d0+xsq))) |
160 |
|
|
|
161 |
|
|
c Update the transfer coefficients |
162 |
|
|
|
163 |
|
|
rd = rdn/(1.d0 + rdn*(aln-psimh)/xkar) |
164 |
|
|
rh = rhn/(1.d0 + rhn*(aln-psixh)/xkar) |
165 |
|
|
re = rh |
166 |
|
|
c Update ustar, tstar, qstar using updated, shifted coefficients. |
167 |
|
|
ustar = rd*usm |
168 |
|
|
qstar = re*delq |
169 |
|
|
tstar = rh*deltap |
170 |
|
|
enddo |
171 |
|
|
c |
172 |
|
|
tau = rhoa*ustar**2 |
173 |
|
|
tau = tau*us/usm |
174 |
|
|
csha = rhoa*cpair*us*rh*rd |
175 |
|
|
clha = rhoa*lath*us*re*rd |
176 |
|
|
c |
177 |
|
|
fsha = csha*deltap |
178 |
|
|
flha = clha*delq |
179 |
|
|
evp = flha/lath/rhosw |
180 |
|
|
c |
181 |
|
|
c up long wave radiation |
182 |
|
|
cQQ mixratio=Qa/(1-Qa) |
183 |
|
|
cQQ ea=p0*mixratio/(0.62197+mixratio) |
184 |
cheisey |
1.2 |
cQQ flwupa=-0.985*stefan*tsf**4 |
185 |
cheisey |
1.1 |
cQQ & *(0.39-0.05*sqrt(ea)) |
186 |
|
|
cQQ & *(1-0.6*nc**2) |
187 |
|
|
if (iceornot.eq.0) then |
188 |
cheisey |
1.2 |
flwupa=-ocean_emissivity*stefan*tsf**4 |
189 |
cheisey |
1.1 |
else |
190 |
|
|
if (iceornot.eq.2) then |
191 |
cheisey |
1.2 |
flwupa=-snow_emissivity*stefan*tsf**4 |
192 |
cheisey |
1.1 |
else |
193 |
cheisey |
1.2 |
flwupa=-ice_emissivity*stefan*tsf**4 |
194 |
cheisey |
1.1 |
endif |
195 |
|
|
endif |
196 |
|
|
#ifdef ALLOW_THERM_SEAICE |
197 |
|
|
cswdcou -- remove --- |
198 |
|
|
cQQ if (iceornot.gt.0) then |
199 |
|
|
cswdcou --- end remove --- |
200 |
|
|
c derivatives with respect to Tsf |
201 |
|
|
cQQ dflhdT = -clha*Tf0kel*ssq*22.47/(tsf**2) |
202 |
|
|
c dflhdT = -clha*Lath*ssq/(Rvap*tsf**2) |
203 |
|
|
dflhdT = -clha*ssq*Lath*2.166847E-3/(Tsf**2) |
204 |
|
|
dfshdT = -csha |
205 |
|
|
if (iceornot.eq.0) then |
206 |
|
|
dflwupdT=-4.*ocean_emissivity*stefan*tsf**3 |
207 |
|
|
else |
208 |
|
|
if (iceornot.eq.2) then |
209 |
|
|
dflwupdT=-4.*snow_emissivity*stefan*tsf**3 |
210 |
|
|
else |
211 |
|
|
dflwupdT=-4.*ice_emissivity*stefan*tsf**3 |
212 |
|
|
endif |
213 |
|
|
endif |
214 |
|
|
cQQ dflwupdT=-4.*0.985*stefan*tsf**3 |
215 |
|
|
cQQ & *(0.39-0.05*sqrt(ea)) |
216 |
|
|
cQQ & *(1-0.6*nc**2) |
217 |
|
|
c total derivative with respect to surface temperature |
218 |
|
|
df0dT=dflwupdT+dfshdT+dflhdT |
219 |
|
|
cBB |
220 |
|
|
cBB print*,'derivatives:',df0dT,dflwupdT,dfshdT,dflhdT |
221 |
|
|
cswdcou -- remove --- |
222 |
|
|
cQQ endif |
223 |
|
|
cswdcou |
224 |
|
|
#endif /*ALLOW_THERM_SEAICE*/ |
225 |
|
|
c |
226 |
|
|
c wind stress at center points |
227 |
|
|
if (.NOT.windread) then |
228 |
|
|
ust = rhoa*exf_BulkCdn(usm)*us*uw |
229 |
|
|
vst = rhoa*exf_BulkCdn(usm)*us*vw |
230 |
|
|
endif |
231 |
|
|
#endif /*ALLOW_BULK_FORCE*/ |
232 |
|
|
|
233 |
|
|
return |
234 |
|
|
end |