15 |
C !ROUTINE: CHEAPAML_COARE3_FLUX |
C !ROUTINE: CHEAPAML_COARE3_FLUX |
16 |
C !INTERFACE: |
C !INTERFACE: |
17 |
SUBROUTINE CHEAPAML_COARE3_FLUX( |
SUBROUTINE CHEAPAML_COARE3_FLUX( |
18 |
I i,j,bi,bj, windSq, |
I i,j,bi,bj, iceOrNot, |
19 |
|
I tSurf, windSq, |
20 |
O hf, ef, evap, Rnl, ssqt, q100, cdq, cdu, |
O hf, ef, evap, Rnl, ssqt, q100, cdq, cdu, |
21 |
|
O dSensdTs, dEvapdTs, dLWdTs, dQAdTs, |
22 |
I myIter, myThid ) |
I myIter, myThid ) |
23 |
|
|
24 |
C !DESCRIPTION: |
C !DESCRIPTION: |
30 |
#include "EEPARAMS.h" |
#include "EEPARAMS.h" |
31 |
#include "PARAMS.h" |
#include "PARAMS.h" |
32 |
#include "CHEAPAML.h" |
#include "CHEAPAML.h" |
|
#include "DYNVARS.h" |
|
33 |
|
|
34 |
C !INPUT PARAMETERS: |
C !INPUT PARAMETERS: |
35 |
C windSq :: relative wind (vs surface motion) speed square |
C i, j :: local indices of current grid-point |
36 |
C myIter :: Current iteration number in simulation |
C bi, bj :: current tile indices |
37 |
C myThid :: My Thread Id number |
C iceOrNot :: 0=open water, 1=ice cover, 2=ice+snow |
38 |
_RL windSq |
C tSurf :: surface temperature |
39 |
|
C windSq :: relative wind (vs surface motion) speed square |
40 |
|
C myIter :: Current iteration number in simulation |
41 |
|
C myThid :: My Thread Id number |
42 |
INTEGER i,j,bi,bj |
INTEGER i,j,bi,bj |
43 |
|
INTEGER iceOrNot |
44 |
|
_RL tSurf (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
45 |
|
_RL windSq(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
46 |
INTEGER myIter, myThid |
INTEGER myIter, myThid |
47 |
C !OUTPUT PARAMETERS: |
C !OUTPUT PARAMETERS: |
48 |
C cdu :: surface drag coeff (for wind stress) |
C cdu :: surface drag coeff (for wind stress) |
49 |
_RL hf, ef, evap, Rnl, ssqt, q100, cdq, cdu |
_RL hf, ef, evap, Rnl, ssqt, q100, cdq |
50 |
|
_RL cdu |
51 |
|
C derivative vs surf. temp of Sensible, Evap, LW, q100 |
52 |
|
_RL dSensdTs, dEvapdTs, dLWdTs, dQAdTs |
53 |
CEOP |
CEOP |
54 |
|
|
55 |
C !LOCAL VARIABLES: |
C !LOCAL VARIABLES: |
75 |
QaR = 0.8 _d 0 |
QaR = 0.8 _d 0 |
76 |
|
|
77 |
C sea surface temperature without skin correction |
C sea surface temperature without skin correction |
78 |
tsw=theta(i,j,1,bi,bj) |
c tsw=theta(i,j,1,bi,bj) |
79 |
Tas=Tair(i,j,bi,bj) |
tsw = tSurf(i,j) |
80 |
|
Tas = Tair(i,j,bi,bj) |
81 |
|
|
82 |
C net upward long wave |
C net upward long wave |
83 |
Rnl = 0.96 _d 0*(stefan*(tsw+celsius2K)**4) !Net longwave (up = +). |
Rnl = 0.96 _d 0*(stefan*(tsw+celsius2K)**4) !Net longwave (up = +). |
88 |
es = es*0.98 _d 0 !reduced for salinity Kraus 1972 p. 46 |
es = es*0.98 _d 0 !reduced for salinity Kraus 1972 p. 46 |
89 |
C- convert from mb to spec. humidity kg/kg |
C- convert from mb to spec. humidity kg/kg |
90 |
qs = 0.62197 _d 0*es/(p0 -0.378 _d 0*es) |
qs = 0.62197 _d 0*es/(p0 -0.378 _d 0*es) |
91 |
|
|
92 |
tta = Tas+celsius2K |
tta = Tas+celsius2K |
93 |
c ttas=tta+gamma_blk*zt |
c ttas=tta+gamma_blk*zt |
94 |
c ttt=tta-(CheapHgrid(i,j,bi,bj) - zt)*gamma_blk |
c ttt=tta-(CheapHgrid(i,j,bi,bj) - zt)*gamma_blk |
118 |
Wg = 0.5 _d 0 !Gustiness factor initial guess |
Wg = 0.5 _d 0 !Gustiness factor initial guess |
119 |
|
|
120 |
C Air-sea differences - includes warm layer in Dt and Dq |
C Air-sea differences - includes warm layer in Dt and Dq |
121 |
c u = (uWind(i,j,bi,bj)-uVel(i,j,1,bi,bj))**2 |
c u = (uwind(i,j,bi,bj)-uVel(i,j,1,bi,bj))**2 |
122 |
c & + (vWind(i,j,bi,bj)-vVel(i,j,1,bi,bj))**2 |
c & + (vwind(i,j,bi,bj)-vVel(i,j,1,bi,bj))**2 |
123 |
u = windSq |
u = windSq(i,j) |
124 |
Du= SQRT(u + Wg**2 ) !include gustiness in wind spd. difference |
Du= SQRT(u + Wg**2 ) !include gustiness in wind spd. difference |
125 |
u = SQRT(u) |
u = SQRT(u) |
|
c Du= (u**2 + Wg**2 )**.5 !include gustiness in wind spd. difference |
|
126 |
Dt=tsw-Tas-gamma_blk*zt !potential temperature difference. |
Dt=tsw-Tas-gamma_blk*zt !potential temperature difference. |
127 |
Dq=qs-q |
Dq=qs-q |
128 |
|
|
224 |
ENDDO |
ENDDO |
225 |
|
|
226 |
C compute surface fluxes and other parameters |
C compute surface fluxes and other parameters |
|
c tau=rhoa*usr*usr*u/Du !stress N/m2 |
|
227 |
tau=rhoa*usr*usr !stress N/m2 |
tau=rhoa*usr*usr !stress N/m2 |
228 |
hf=-cpair*rhoa*usr*tsr !sensible W/m2 |
hf=-cpair*rhoa*usr*tsr !sensible W/m2 |
229 |
ef=-lath*rhoa*usr*qsr !latent W/m2 |
ef=-lath*rhoa*usr*qsr !latent W/m2 |
230 |
evap=-rhoa*usr*qsr |
evap=-rhoa*usr*qsr |
231 |
cdq = evap/Dq |
cdq = evap/Dq |
232 |
cdu = tau/Du |
cdu = tau/Du |
233 |
c IF (.NOT.useStressOption) THEN |
|
|
c ustress(i,j,bi,bj)=tau*(uWind(i,j,bi,bj)-uVel(i,j,1,bi,bj))/u |
|
|
c vstress(i,j,bi,bj)=tau*(vWind(i,j,bi,bj)-vVel(i,j,1,bi,bj))/u |
|
|
c ENDIF |
|
234 |
q100=qs+qsr*(LOG(100. _d 0/zoq)-psit(100. _d 0/L)) |
q100=qs+qsr*(LOG(100. _d 0/zoq)-psit(100. _d 0/L)) |
235 |
|
|
236 |
|
C-- compute derivative of surface fluxes relatice to Tsurf |
237 |
|
C- dSensdTs = -cpair*rhoa*usr*(tsr/Dt) |
238 |
|
dSensdTs = cpair*rhoa*usr |
239 |
|
& *xkar/(LOG(zt/zot10)-psit(zt/L10)) |
240 |
|
C- dEvapdTs = -rhoa*usr* d/dTs(qsr) |
241 |
|
C d/dTs(qsr)= (-xkar/(LOG(zq/zoq)-psit(zq/L)) )* d/dTs(qs) |
242 |
|
C d/dTs(qs) = 0.62197 _d 0*p0/(p0 -0.378 _d 0*es)**2 * d/dTs(es) |
243 |
|
C d/dTs(es) = (0.98)* es * 17.502 _d 0 * 240.97 _d 0 / (240.97 _d 0+tsw)**2 |
244 |
|
C- this simplifies (using qs) to: |
245 |
|
dEvapdTs = rhoa*usr*( xkar/(LOG(zq/zoq)-psit(zq/L)) ) |
246 |
|
& * qs*p0/(p0 -0.378 _d 0*es) |
247 |
|
c & *0.98 _d 0 |
248 |
|
& * 17.502 _d 0 * 240.97 _d 0 / (240.97 _d 0+tsw)**2 |
249 |
|
|
250 |
|
if (iceornot.EQ.0) THEN |
251 |
|
c dLWdTs = 4. _d 0*ocean_emissivity*stefan*tsr*tsr*tsr |
252 |
|
dLWdTs = 4. _d 0 * 0.96 _d 0 *stefan*tsr*tsr*tsr |
253 |
|
ELSEIF (iceornot.EQ.2) THEN |
254 |
|
c dLWdTs = 4. _d 0*snow_emissivity*stefan*tsr*tsr*tsr |
255 |
|
dLWdTs = 4. _d 0 * 0.96 _d 0 *stefan*tsr*tsr*tsr |
256 |
|
ELSEIF (iceornot.EQ.1) THEN |
257 |
|
c dLWdTs = 4. _d 0*ice_emissivity*stefan*tsr*tsr*tsr |
258 |
|
dLWdTs = 4. _d 0 * 0.96 _d 0 *stefan*tsr*tsr*tsr |
259 |
|
ENDIF |
260 |
|
|
261 |
|
C-- for now, ignores derivative of q100 relative to Tsurf: |
262 |
|
dQAdTs = 0. |
263 |
|
|
264 |
RETURN |
RETURN |
265 |
END |
END |
266 |
|
|