/[MITgcm]/MITgcm/pkg/bulk_force/bulkf_formula_vince.F
ViewVC logotype

Contents of /MITgcm/pkg/bulk_force/bulkf_formula_vince.F

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


Revision 1.1 - (show annotations) (download)
Thu Nov 21 19:11:42 2002 UTC (21 years, 6 months ago) by cheisey
Branch: MAIN
CVS Tags: checkpoint47b_post, checkpoint51f_post, checkpoint48i_post, checkpoint47a_post, checkpoint48d_post, checkpoint50b_post, checkpoint47i_post, checkpoint48g_post, branchpoint-genmake2, checkpoint50c_pre, checkpoint50, checkpoint51j_post, branch-exfmods-tag, checkpoint47e_post, checkpoint50f_post, checkpoint50a_post, checkpoint48e_post, checkpoint47c_post, checkpoint50f_pre, checkpoint48b_post, checkpoint47j_post, checkpoint47d_pre, checkpoint50d_pre, checkpoint47h_post, checkpoint51d_post, checkpoint51, checkpoint48c_pre, checkpoint48c_post, checkpoint50d_post, checkpoint47f_post, checkpoint51b_pre, checkpoint50e_post, checkpoint47g_post, checkpoint50h_post, checkpoint50c_post, checkpoint51a_post, checkpoint47d_post, checkpoint50e_pre, checkpoint50b_pre, checkpoint48d_pre, checkpoint50i_post, checkpoint51e_post, checkpoint51b_post, checkpoint48a_post, checkpoint51h_pre, checkpoint48f_post, checkpoint51i_pre, checkpoint50g_post, checkpoint51c_post, checkpoint51g_post, checkpoint48, checkpoint49, checkpoint51f_pre, checkpoint48h_post
Branch point for: branch-genmake2, branch-exfmods-curt
Two packages:  bulk_force (Bulk forcing)
and therm_seaice (thermodynamic_seaice) - adopted from LANL CICE.v2.0.2
Earlier integration from Stephaine Dutkiewicz
and Patrick Heimbach.

Two ifdef statements for compile time,
ALLOW_THERM_SEAICE and ALLOW_BULK_FORCE

Two switches in data.pkg to turn on at run-time:

cat data.pkg
# Packages
 &PACKAGES
 useBulkForce=.TRUE.,
 useThermSeaIce=.TRUE.,
 &

WARNING:  useSEAICE and useThermSEAICE are mutually exclusive.

The bulk package requires an additional parameter file
with two namelists, data.ice and data.blk.

c ADAPTED FROM:
c LANL CICE.v2.0.2
c-----------------------------------------------------------------------
c.. thermodynamics (vertical physics) based on M. Winton 3-layer model
c.. See Bitz, C. M. and W. H. Lipscomb, 1999:  "An energy-conserving
c..       thermodynamic sea ice model for climate study."  J. Geophys.
c..       Res., 104, 15669 - 15677.
c..     Winton, M., 1999:  "A reformulated three-layer sea ice model."
c..       Submitted to J. Atmos. Ocean. Technol.

c.. authors Elizabeth C. Hunke and William Lipscomb
c..         Fluid Dynamics Group, Los Alamos National Laboratory
c-----------------------------------------------------------------------

1 c swd -- bulkf formula used in bulkf and ice pkgs
2 c cswd -- adapted from vince/andrei surf_flux.f
3
4 #include "CPP_OPTIONS.h"
5 subroutine bulkf_formula_vince(
6 I uw, vw, us, Ta, Qa, nc, tsf_in,
7 I UFocean, flwup, flha, fsha, df0dT,
8 I ust, vst, evp, ssq,
9 I iceornot, readstress
10 & )
11
12 IMPLICIT NONE
13 c
14 #include "EEPARAMS.h"
15 #include "SIZE.h"
16 #include "PARAMS.h"
17 #include "DYNVARS.h"
18 #include "GRID.h"
19 #include "FFIELDS.h"
20 #ifdef ALLOW_BULKFORMULA
21 #include "BULKF_ICE_CONSTANTS.h"
22 #endif
23 #ifdef ALLOW_TSEAICE
24 #include "ICE.h"
25 #endif
26
27 c
28 c calculate bulk formula fluxes over open ocean or seaice
29 c
30 c input
31 _RL us ! wind speed
32 _RL uw ! zonal wind speed (at grid center)
33 _RL vw ! meridional wind speed (at grid center)
34 _RL Ta ! air temperature at ht
35 _RL Qa ! specific humidity at ht
36 _RL nc ! cloud cover
37 _RL tsf_in ! surface temperature (either ice or open water)
38 integer iceornot ! 0=open water, 1=ice cover
39 logical readstress
40 c output
41 _RL flwup ! upward long wave radiation
42 _RL flha ! latent heat flux
43 _RL fsha ! sensible heat flux
44 _RL df0dT ! derivative of heat flux with respect to Tsf
45 _RL ust ! zonal wind stress (at grid center)
46 _RL vst ! meridional wind stress (at grid center)
47 _RL evp ! evaporation rate (over open water)
48 _RL ssq ! surface specific humidity (kg/kg)
49 c
50 c input and output
51 _RL UFocean
52 c
53 c local variables
54 _RL ea
55 _RL mixratio
56 _RL stable
57 _RL tsf ! surface temperature in K
58 _RL ht ! reference height (m)
59 _RL usm ! wind speed limited
60 _RL deltap ! potential temperature diff (K)
61 _RL delq ! specific humidity difference
62 _RL lhcoef
63 _RL shcoef
64 _RL dflhdT ! derivative of latent heat with respect to T
65 _RL dfshdT ! derivative of sensible heat with respect to T
66 _RL dflwupdT ! derivative of long wave with respect to T
67 c from vinces
68 _RL elhx
69 _RL rough
70 _RL cdn
71 _RL surf_emissivity ! ocean or ice emissivity
72 _RL qg
73 _RL rigs
74 _RL dm
75 _RL dh
76 _RL cdm
77 _RL cdh
78 _RL rcdhws
79 _RL Tsv
80 _RL dqssdt
81 _RL x
82 integer lr
83
84 _RL flwdown ! part of output eventually QQ
85 #ifdef ALLOW_BULKFORMULA
86
87 _RL AROUGH(20),BROUGH(20),CROUGH(20),DROUGH(20),EROUGH(20)
88 DATA AROUGH/16.59,13.99,10.4,7.35,5.241,3.926,3.126,2.632,2.319,
89 *2.116,1.982,1.893,1.832,1.788,1.757,1.733,1.714,1.699,1.687,1.677/
90 DATA BROUGH/3.245,1.733,0.8481,0.3899,0.1832,0.9026E-1,0.4622E-1,
91 * .241E-1,.1254E-1,.6414E-2,.3199E-2,.1549E-2,.7275E-3,.3319E-3,
92 * .1474E-3,.6392E-4,.2713E-4,.1130E-4,.4630E-5,.1868E-5/
93 DATA CROUGH/5.111,3.088,1.682,.9239,.5626,.3994,.3282,.3017,.299
94 *,.3114,.3324,.3587,.3881,.4186,.4492,.4792,.5082,.5361,.5627,
95 * .5882/
96 DATA DROUGH/1.24,1.02,0.806,0.682,0.661,0.771,0.797,0.895,0.994,
97 * 1.09,1.18,1.27,1.35,1.43,1.50,1.58,1.65,1.71,1.78,1.84/
98 DATA EROUGH/0.128,0.130,0.141,0.174,0.238,0.330,0.438,0.550,0.660,
99 * 0.766,0.866,0.962,1.05,1.14,1.22,1.30,1.37,1.45,1.52,1.58/
100
101
102 c --- external functions ---
103 _RL exf_BulkCdn
104 external exf_BulkCdn
105
106 c UFocean=1e-2 !QQ what is this and what is the number?
107
108 c -- set all to zero
109 flwup = 0.d0 ! upward long wave radiation
110 flha = 0.d0 ! latent heat flux
111 fsha = 0.d0 ! sensible heat flux
112 df0dT = 0.d0 ! derivative of heat flux with respect to Tsf
113 ust = 0.d0 ! zonal wind stress (at grid center)
114 vst = 0.d0 ! meridional wind stress (at grid center)
115 evp = 0.d0 ! evaporation rate (over open water)
116 ssq = 0.d0 ! surface specific humidity (kg/kg)
117
118
119 Qa=max(Qa,1e-7)
120 Tsf=Tsf_in+Tf0kel
121 ht=10.e0
122 c Wind speed
123 if (us.eq.0.d0) then !in case we have a constant prescribed us
124 us = sqrt(uw*uw + vw*vw)
125 endif
126 usm = max(us,1.d-5)
127 cQQQ try to limit drag
128 cQQQ usm = min(usm,5.d0)
129
130 c from vinces surfflux.F
131 if (iceornot.eq.0) then
132 c for open water
133 rough=max(0.018*UFocean/gravity,0.5E-5) !QQcheck
134 elhx=Lvap !QQcheck
135 else
136 c for sea ice cover
137 rough=10**(-3.37) !QQcheck
138 elhx = Lvap_ice
139 endif
140 Qg =3.797915*exp(elhx*(7.93252e-6-2.166847E-3/Ta))/p0
141 c
142 c find stability of atmospheric surface layer stratification
143 rough=log10(ht/rough)
144 cdn=.0231/(rough*rough) !QQcheck
145 lr=rough*2.d0 - 5.d-1 !QQcheck
146 lr=max(1,min(lr,20))
147 rigs=ht*gravity*(Tsf-Ta)/(Ta*usm*usm)
148 if (rigs.le.0.d0) then
149 c unstable
150 dm=sqrt((1.d0-AROUGH(lr)*rigs)*(1.d0-BROUGH(lr)*rigs)/
151 & (1.d0-CROUGH(lr)*rigs))
152 dh=1.35*sqrt((1.d0-DROUGH(lr)*rigs)/
153 & (1.d0-EROUGH(lr)*rigs)) !QQcheck
154 else
155 c stable
156 dm=1.d0/(1.d0+(11.238+89.9*rigs)*rigs) !QQcheck
157 dh=1.35/(1.d0+1.93*rigs) !QQcheck
158 endif
159 cdm = cdn * dm
160 cdh = cdn * dm * dh
161
162 rcdhws = cdh*us*100*p0/(Rgas*Tsf) !QQ check units (take out 100)
163 ssq =3.797915*exp(elhx*(7.93252e-6-2.166847E-3/Tsf))/p0
164 cBB debugging
165 cBB print*,'ssq', qcoef, ssq
166 c
167
168 if (Qa.le.ssq) then
169 Tsv=Tsf
170 ssq=ssq !QQQQ should be ssq=qa?
171 else
172 dqssdt=ssq*elhx/(Rvap*Tsf*Tsf)
173 x=(Qa-ssq)/(dqssdt+(sha/elhx))
174 Tsv=Tsf+x
175 ssq=Qa+x*(sha/elhx)
176 endif
177
178 deltap = Ta - Tsv !tsv-Ta
179 delq = Qg - ssq !Qsv - Qg
180 cmine deltap = ta - tsf + gamma_blk*ht
181 cmine delq = Qa - ssq
182 c latent heat
183 c -------------
184 cvinc lhcoef = Lvap*rcdhws
185 cmine latent heat coeff. following Gill 2.4.6 and 2.6.2 formula
186 lhcoef =Lvap*rhoa*us*5e-3 !QQ name coeff. !QQwas 1.5e-3
187 flha = lhcoef*delq !QQQ
188 evp = lhcoef*delq/Lvap/rhosw
189 c sensible heat
190 c ----------------
191 cvinc shcoef=sha*rcdhws
192 cmine sensible heat coeff. following Gill 2.4.5 formula
193 stable = 5.d-1 + sign(5.d-1, deltap)
194 if (stable.gt.0) then
195 shcoef = 0.83e-3*rhoa*us*cpair
196 else
197 shcoef = 1.10e-3*rhoa*us*cpair
198 endif
199 fsha = shcoef*deltap
200
201 c long wave
202 c ------------
203 cvinc if (iceornot.eq.1) then
204 cvinc#ifdef ALLOW_TSEAICE
205 cvinc if (snowheight.gt.0.d0) then
206 cvinc surf_emissivity=snow_emissivity
207 cvinc else
208 cvinc surf_emissivity=ice_emissivity
209 cvinc endif
210 cvinc#endif
211 cvinc else
212 cvinc surf_emissivity=ocean_emissivity
213 cvinc endif
214 cvinc flwup = -surf_emissivity*stefan*
215 cvinc & Tsf**4.0 !QQcheck
216 cvinc flwdown = atm_emissivity*stefan *
217 cvinc & Ta**4.0 * (1.0+0.275*nc) *
218 cvinc & (1.0-0.261*exp(-7.77e-4*(273.15-Ta)**2.0)) !QQcheck
219 cvinc flwup=flwup+flwdown !QQQQQ??
220 cmine up (net) long wave radiation
221 mixratio=Qa/(1-Qa)
222 ea=p0*mixratio/(0.62197+mixratio)
223 flwup=-0.985*stefan*tsf**4
224 & *(0.39-0.05*sqrt(ea))
225 & *(1-0.6*nc**2)
226 c -------------------------
227 UFocean=cdm*us*us
228
229 #ifdef ALLOW_TSEAICE
230 if (iceornot.eq.1) then
231 c derivatives of heat flux
232 c -------------------------
233 c dflwupdT=-4.0*surf_emissivity*stefan *
234 c & Tsf**3.0 !QQcheck
235 cQQ corrected for Vince formula
236 dflhdT = -lhcoef*ssq*Lvap*2.166847E-3/(Tsf**2)
237 dfshdT = -shcoef !QQQQQQ not quite right
238 cmine derivatives with respect to Tsf
239 cmine dflhdT = -lhcoef*Tf0kel*ssq*22.47/(tsf**2)
240 cmine dfshdT = -shcoef
241 dflwupdT=-4.*0.985*stefan*tsf**3
242 & *(0.39-0.05*sqrt(ea))
243 c
244 c total derivative with respect to surface temperature
245 df0dT=dflwupdT+dfshdT+dflhdT
246 cBB
247 cBB print*,'derivatives:',df0dT,dflwupdT,dfshdT,dflhdT
248 endif
249 #endif /*ALLOW_TSEAICE*/
250 c
251 c wind stress at center points
252 c -----------------------------
253 if (.NOT.readstress) then
254 ust = rhoa*exf_BulkCdn(usm)*us*uw
255 vst = rhoa*exf_BulkCdn(usm)*us*vw
256 endif
257 #endif /*ALLOW_BULKFORMULA*/
258
259 return
260 end

  ViewVC Help
Powered by ViewVC 1.1.22