/[MITgcm]/MITgcm_contrib/gael/bulkMatlab/gmaze_bulk_coare.m
ViewVC logotype

Annotation of /MITgcm_contrib/gael/bulkMatlab/gmaze_bulk_coare.m

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


Revision 1.1 - (hide annotations) (download)
Tue Feb 19 21:28:58 2008 UTC (17 years, 4 months ago) by gforget
Branch: MAIN
CVS Tags: HEAD
matlab script to compute bulk formulae forcing etc.

1 gforget 1.1 function [mystruct_out]=gmaze_bulk_coare(mystruct_in,varargin);
2    
3     %varargin [hu ht hq]
4     % [hu ht hq],albedo
5     % [albedo HAS AN impact here]
6    
7     %version with shortened iteration; modified Rt and Rq
8     %uses wave information wave period in s and wave ht in m
9     %no wave, standard coare 2.6 charnock: jwave=0
10     %Oost et al. zo=50/2/pi L (u*/c)^4.5 if jwave=1
11     %taylor and yelland zo=1200 h*(L/h)^4.5 jwave=2
12    
13     %inputs:
14     atemp_in=mystruct_in.atemp;
15     aqh_in=mystruct_in.aqh;
16     uwind_in=mystruct_in.uwind;
17     vwind_in=mystruct_in.vwind;
18     swdn_in=mystruct_in.swdn;
19     lwdn_in=mystruct_in.lwdn;
20     slp_in=mystruct_in.slp;
21     precip_in=mystruct_in.precip;
22     sst_in=mystruct_in.sst;
23    
24     %compute wind speed:
25     wspeed=uwind_in.*uwind_in+vwind_in.*vwind_in;
26     wspeed=sqrt(wspeed); %wspeed=max(wspeed,0.5);
27    
28     %compute bulk water spec hum:
29     nlon=size(wspeed,1); nlat=size(wspeed,2);
30     Qs=reshape(qsee([reshape(sst_in,[nlon*nlat 1]) reshape(slp_in,[nlon*nlat 1])]),[nlon nlat]);
31     % => gives qsat in g/kg
32     %in ... exf_bulk_largeyeager04:
33     %cvapor_fac=640380;
34     %cvapor_exp=5107.4;
35     %saltsat=0.980;
36     %atmrho=1.2;
37     %Qs = cvapor_fac*exp(-cvapor_exp./(sst_in+273.16))*saltsat/atmrho;
38     % => gives qsat in kg/kg
39    
40    
41     %change name of variable:
42     u = wspeed; % wind speed (m/s) at height zu (m)
43     us = 0*ones(size(u)); % surface current speed in the wind direction (m/s)
44     ts = sst_in; % bulk water temperature (C) if jcool = 1, interface water T if jcool = 0
45     t = atemp_in-273.16; % bulk air temperature (C), height zt
46     Qs = Qs/1000;%bulk water spec hum out of qsee -> /1000 => kg/kg
47     Q = aqh_in; %bulk air spec hum is in kg/kg (from input)
48     Rs = swdn_in; % downward solar flux (W/m^2)
49     Rl = lwdn_in; % downard IR flux (W/m^2)
50     rain = precip_in/3600; % rain rate (mm/hr)
51     zi = 600*ones(size(u)); % PBL depth (m)
52     P = slp_in; % Atmos surface pressure (mb)
53     grav = 9.81*ones(size(u)); % grv(lat)
54     if nargin==4
55     albed = varargin{2}*ones(size(u)); % albed
56     else
57     albed = 0.1*ones(size(u)); % albed
58     end
59    
60     % Vectorization:
61     [ny nx] = size(u);
62     u = u(:);
63     us = us(:);
64     ts = ts(:);
65     t = t(:);
66     Qs = Qs(:);
67     Q = Q(:);
68     Rs = Rs(:);
69     Rl = Rl(:);
70     rain = rain(:);
71     zi = zi(:);
72     P = P(:);
73     grav = grav(:);
74     albed = albed(:);
75    
76     % 1D fields:
77     if nargin==1
78     zu = 10; % wind speed measurement height (m)
79     zt = 10; % air T measurement height (m)
80     zq = 10; % air q measurement height (m) (specific humidity in g/kg)
81     else
82     zu=varargin{1}(1);
83     zt=varargin{1}(2);
84     zq=varargin{1}(3);
85     end
86     jcool = 1; % implement cool calculation skin switch, 0 = no, 1 = yes
87     jwave = 0; % implement wave dependent roughness model
88     twave = 0; % wave period (s)
89     hwave = 0; % wave height (m)
90     % add the adjusted height
91     zsu = 10; %wind speed output height (m)
92     zst = 10; %air T output height (m)
93     zsq = 10; %air q output height (m)
94    
95    
96     % BEGIN THE COMPUTATION:
97    
98    
99     %******.*.*.*.*.* set constants .*.*.*.*.*.*.*.*.*.*.*.*.*
100     Beta = 1.2;
101     von = 0.4;
102     fdg = 1.00;
103     tdk = 273.16;
104     Rgas = 287.1;
105     cpa = 1004.67;
106     be = 0.026;
107     cpw = 4000;
108     rhow = 1022;
109     visw = 1e-6;
110     tcw = 0.6;
111     dter = 0.3;
112    
113     %.*.*.*.*.*.*.*.*.*.*.*.*.* air constants .*.*.*.*.*.*.*.*.*.*.*.*
114     Rgas = 287.1;
115     Le = (2.501-.00237.*ts).*1e6;
116     cpa = 1004.67;
117     cpv = cpa.*(1+0.84.*Q);
118     rhoa = P.*100./(Rgas.*(t+tdk).*(1+0.61.*Q));
119     visa = 1.326e-5.*(1+6.542e-3.*t+8.301e-6.*t.*t-4.84e-9.*t.*t.*t);
120    
121     %.*.*.*.*.*.*.*.*.*.*.*.* cool skin constants .*.*.*.*.*.*.*
122     Al = 2.1e-5.*(ts+3.2).^0.79;
123     be = 0.026;
124     cpw = 4000;
125     rhow = 1022;
126     visw = 1e-6;
127     tcw = 0.6;
128     bigc = 16.*grav.*cpw.*(rhow.*visw).^3./(tcw.*tcw.*rhoa.*rhoa);
129     wetc = 0.622.*Le.*Qs./(Rgas.*(ts+tdk).^2);
130    
131     %.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* wave parameters .*.*.*.*.*.*.*.*.*
132     lwave=grav./2./pi.*twave.^2;
133     cwave=grav./2./pi.*twave;
134    
135     %.*.*.*.*.*.*.*.*.*.*.*.*.*.* compute aux stuff .*.*.*.*.*.*.*
136     % Net short wave
137     Rns = Rs.*(1-albed);
138     % Net long wave
139     Rnl = 0.97.*(5.67e-8.*(ts-0.3.*jcool+tdk).^4-Rl);
140    
141     %.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* Begin bulk loop .*.*.*.*.*.*.*
142    
143     %.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* first guess .*.*.*.*.*.*.*.*.*.*.*.*
144     du=u-us;
145     dt=ts-t-.0098.*zt;
146     dq=Qs-Q;
147     ta=t+tdk;
148     ug=.5;
149     dter=0.3;
150     dqer=wetc.*dter;
151     ut=sqrt(du.*du+ug.*ug);
152     % whoi using zsu (could be 10 or 2m)instad of 10m
153     %u10=ut.*log(10./1e-4)./log(zu./1e-4);
154     u10=ut.*log(zsu./1e-4)./log(zu./1e-4);
155     usr=.035.*u10;
156     zo10=0.011.*usr.*usr./grav+0.11.*visa./usr;
157     Cd10=(von./log(zsu./zo10)).^2;
158     Ch10=0.00115;
159     Ct10=Ch10./sqrt(Cd10);
160     zot10=zsu./exp(von./Ct10);
161     Cd=(von./log(zu./zo10)).^2;
162     Ct=von./log(zt./zot10);
163     CC=von.*Ct./Cd;
164     Ribcu=-zu./zi./.004./Beta.^3;
165     Ribu=-grav.*zu./ta.*((dt-dter.*jcool)+.61.*ta.*dq)./ut.^2;
166     nits=3;
167     if Ribu<0;
168     zetu=CC.*Ribu./(1+Ribu./Ribcu);
169     else;
170     zetu=CC.*Ribu.*(1+27./9.*Ribu./CC);
171     end;
172     L10=zu./zetu;
173     if zetu>50;
174     nits=1;
175     end;
176     usr=ut.*von./(log(zu./zo10)-psiu_30(zu./L10));
177     tsr=-(dt-dter.*jcool).*von.*fdg./(log(zt./zot10)-psit_30(zt./L10));
178     qsr=-(dq-wetc.*dter.*jcool).*von.*fdg./(log(zq./zot10)-psit_30(zq./L10));
179    
180     tkt=.001;
181    
182     charn=0.011;
183     if ut>10
184     charn=0.011+(ut-10)./(18-10).*(0.018-0.011);
185     end;
186     if ut>18
187     charn=0.018;
188     end;
189    
190     %disp(usr)
191    
192     %.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* bulk loop .*.*.*.*.*.*.*.*.*.*.*.*
193     for i=1:nits;
194    
195     zet=von.*grav.*zu./ta.*(tsr.*(1+0.61.*Q)+.61.*ta.*qsr)./(usr.*usr)./(1+0.61.*Q);
196     if jwave==0;zo=charn.*usr.*usr./grav+0.11.*visa./usr;end;
197     if jwave==1;zo=50./2./pi.*lwave.*(usr./cwave).^4.5+0.11.*visa./usr;end;%Oost et al
198     if jwave==2;zo=1200.*hwave.*(hwave./lwave).^4.5+0.11.*visa./usr;end;%Taylor and Yelland
199     rr=zo.*usr./visa; % roughness Reynolds number
200     L=zu./zet;
201     zoq=min(1.15e-4,5.5e-5./rr.^.6);
202     zot=zoq;
203     usr=ut.*von./(log(zu./zo)-psiu_30(zu./L));
204     tsr=-(dt-dter.*jcool).*von.*fdg./(log(zt./zot)-psit_30(zt./L));
205     qsr=-(dq-wetc.*dter.*jcool).*von.*fdg./(log(zq./zoq)-psit_30(zq./L));
206     Bf=-grav./ta.*usr.*(tsr+.61.*ta.*qsr);
207     if Bf>0
208     ug=Beta.*(Bf.*zi).^.333;
209     else
210     ug=.2;
211     end;
212     ut=sqrt(du.*du+ug.*ug);
213     Rnl=0.97.*(5.67e-8.*(ts-dter.*jcool+tdk).^4-Rl);
214     hsb=-rhoa.*cpa.*usr.*tsr;
215     hlb=-rhoa.*Le.*usr.*qsr;
216     qout=Rnl+hsb+hlb;
217     dels=Rns.*(.065+11.*tkt-6.6e-5./tkt.*(1-exp(-tkt./8.0e-4))); % Eq.16 Shortwave
218     qcol=qout-dels;
219     alq=Al.*qcol+be.*hlb.*cpw./Le; % Eq. 7 Buoy flux water
220    
221     if alq>0;
222     xlamx=6./(1+(bigc.*alq./usr.^4).^.75).^.333; % Eq 13 Saunders
223     tkt=xlamx.*visw./(sqrt(rhoa./rhow).*usr); %Eq.11 Sub. thk
224     else
225     xlamx=6.0;
226     tkt=min(.01,xlamx.*visw./(sqrt(rhoa./rhow).*usr)); %Eq.11 Sub. thk
227     end;
228    
229     dter=qcol.*tkt./tcw;% Eq.12 Cool skin
230     dqer=wetc.*dter;
231    
232     end;%bulk iter loop
233    
234     tau = rhoa.*usr.*usr.*du./ut; %stress
235     hsb = -rhoa.*cpa.*usr.*tsr;
236     hlb = -rhoa.*Le.*usr.*qsr;
237     Rnl = 0.97.*(5.67e-8.*(ts-dter.*jcool+tdk).^4-Rl);
238    
239     %.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* rain heat flux .*.*.*.*.*.*.*.*
240     if 0
241     dwat=2.11e-5.*((t+tdk)./tdk).^1.94;%! water vapour diffusivity
242     dtmp=(1.+3.309e-3.*t-1.44e-6.*t.*t).*0.02411./(rhoa.*cpa); %!heat diffusivity
243     alfac= 1./(1+(wetc.*Le.*dwat)./(cpa.*dtmp)); %! wet bulb factor
244     RF= rain.*alfac.*cpw.*((ts-t-dter.*jcool)+(Qs-Q-dqer.*jcool).*Le./cpa)./3600;
245     %.*.*.*.*.*.* add the momentum flux due to rainfall by kelan .*.*.*.*.*.*
246    
247     tau_r =0.85 .*rain./3600.*du; %%du==wind spd relative to sea surface
248    
249     %.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.* Webb et al. correection .*.*.*.*.*.*.*.*.*.*.*.*
250     wbar=1.61.*hlb./Le./(1+1.61.*Q)./rhoa+hsb./rhoa./cpa./ta;%formulation in hlb already includes webb
251     %wbar=1.61.*hlb./Le./rhoa+(1+1.61.*Q).*hsb./rhoa./cpa./ta;
252     hl_webb=rhoa.*wbar.*Q.*Le;
253     %.*.*.*.*.*.*.*.*.*.*.*.*.*.* compute transfer coeffs relative to ut @meas. ht .*.*.
254     Cd=tau./rhoa./ut./max(.1,du);
255     Ch=-usr.*tsr./ut./(dt-dter.*jcool);
256     Ce=-usr.*qsr./(dq-dqer.*jcool)./ut;
257     %.*.*.*.*.*.*.*.*.*.*.*.* 10-m neutral coeff realtive to ut .*.*.*.*.*.*.*.*
258     Cdn_10=von.*von./log(zsu./zo)./log(zsu./zo); %von=0.4; == Frank's CD
259     Chn_10=von.*von.*fdg./log(zsu./zo)./log(zsu./zot);
260     Cen_10=von.*von.*fdg./log(zsu./zo)./log(zsu./zoq);
261     end % 0/1
262     Cdn_10=von.*von./log(zsu./zo)./log(zsu./zo); %von=0.4; == Frank's CD
263    
264    
265     %.*.*.*Kelan adds azeta() to adjust met variables to new heights
266     %.*.*.*copy from cor3_0af.for
267     % zsu % adjusted wind speed height
268     % zst % adjusted air temp height
269     % zsq % adjusted specific humidity height
270     % ts - dter.*jcool === sst of Bradley's;
271    
272     if 0
273     % kelan add this function call azeta.m in matlab version
274     % Frank missed this call in his cor30a.for version
275     zetU=azeta(von,grav,ta,Q,usr,tsr,qsr,zsu);
276     zetT=azeta(von,grav,ta,Q,usr,tsr,qsr,zst);
277     % same as above if zst=zsu
278     zetQ=azeta(von,grav,ta,Q,usr,tsr,qsr,zsq);
279     % same as above if zsq=zst=zsu
280    
281     u_zs=usr./von.*(log(zsu./zo)-psiu_30(zetU));
282     t_zs=(ts-dter.*jcool)+tsr./von.*(log(zst./zot)-psit_30(zetT));
283     q_zs=(Qs-dqer)+qsr./von.*(log(zsq./zoq)-psit_30(zetQ)); % !kg./kg
284     qa_zs=1000..*q_zs; % !g./kg
285    
286     e_zs=q_zs.*P./(0.62197+0.378.*q_zs); % !mb
287    
288     %call humidity(t_zs,p,esat_zs); % !mb
289     esat_zs = (1.0007+3.46e-6.*P).*6.1121.*exp(17.502.*t_zs./(240.97+t_zs));
290     rh_zs=e_zs./esat_zs;
291     end % 0/1
292    
293     % Output:
294     y(1,:,:) = -reshape(hsb,[ny nx]);
295     y(2,:,:) = -reshape(hlb,[ny nx]);
296     y(3,:,:) = -reshape(Rnl,[ny nx]);
297     y(4,:,:) = reshape(Rns,[ny nx]);
298     y(5,:,:) = reshape(tau,[ny nx]);
299     y(6,:,:) = reshape(Cdn_10,[ny nx]);
300     y(7,:,:) = reshape(rhoa,[ny nx]);
301    
302    
303     % compute wind stress in two directions:
304     ustress = rhoa.*usr.*usr.*uwind_in(:)./ut;
305     vstress = rhoa.*usr.*usr.*vwind_in(:)./ut;
306     % compute evaporation:
307     flamb=2500000;
308     evap=hlb/flamb;
309     % change sign and convert from kg/m^2/s to m/s via rhoConstFresh
310     rhoConstFresh=999.8;
311     evap = -evap/rhoConstFresh;
312     % reshape:
313     hlb=-reshape(hlb,[ny nx]);
314     hsb=-reshape(hsb,[ny nx]);
315     ustress=reshape(ustress,[ny nx]);
316     vstress=reshape(vstress,[ny nx]);
317     evap=-reshape(evap,[ny nx]);
318    
319     %mystruct_out=struct('hl',hlb,'hs',hsb,'evap',evap,'ustress',ustress,'vstress',vstress);
320     mystruct_out=struct('hl',real(hlb),'hs',real(hsb),'evap',real(evap),'ustress',real(ustress),'vstress',real(vstress));
321    
322    
323     function psi=psit_30(zet)
324     x=(1-15*zet).^.5;
325     psik=2*log((1+x)/2);
326     x=(1-34.15*zet).^.3333;
327     psic=1.5*log((1+x+x.*x)/3)-sqrt(3)*atan((1+2*x)/sqrt(3))+4*atan(1)/sqrt(3);
328     f=zet.*zet./(1+zet.*zet);
329     psi=(1-f).*psik+f.*psic;
330    
331     ii=find(zet>0);
332     if ~isempty(ii);
333     %psi=-4.7*zet;
334     c=min(50,.35*zet);
335     psi(ii)=-((1+2/3*zet(ii)).^1.5+.6667*(zet(ii)-14.28)./exp(c(ii))+8.525);
336     end;
337    
338    
339     function psi=psiu_30(zet)
340    
341     x=(1-15*zet).^.25;
342     psik=2*log((1+x)/2)+log((1+x.*x)/2)-2*atan(x)+2*atan(1);
343     x=(1-10.15*zet).^.3333;
344     psic=1.5*log((1+x+x.*x)/3)-sqrt(3)*atan((1+2*x)/sqrt(3))+4*atan(1)/sqrt(3);
345     f=zet.*zet./(1+zet.*zet);
346     psi=(1-f).*psik+f.*psic;
347     ii=find(zet>0);
348     if ~isempty(ii);
349    
350     %psi(ii)=-4.7*zet(ii);
351     %c(ii)=min(50,.35*zet(ii));
352     c=min(50,.35*zet);
353     psi(ii)=-((1+1.0*zet(ii)).^1.0+.667*(zet(ii)-14.28)./exp(c(ii))+8.525);
354     end;
355    
356     function s=qsee(y)
357     x=y(:,1);
358     p=y(:,2);
359     es=6.112.*exp(17.502.*x./(x+240.97))*.98.*(1.0007+3.46e-6*p);
360     s=es*621.97./(p-.378*es);
361    
362     function y=qsat(y)
363     x=y(:,1);%temp
364     p=y(:,2);%pressure
365     es=6.112.*exp(17.502.*x./(x+241.0)).*(1.0007+3.46e-6*p);
366     y=es*622./(p-.378*es);
367    
368    

  ViewVC Help
Powered by ViewVC 1.1.22