Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=MITgcm at /usr/local/share/lxr/lib/LXR/Common.pm line 1224.
Last-Modified: Fri, 28 Nov 2024 06:11:57 GMT
Content-Type: text/html; charset=utf-8
MITgcm/MITgcm/pkg/atm_phys/old_doc/monin_obukhov.html
672ec4d5cf Jean*0001 <HTML>
0002 <TITLE>module monin_obukhov</TITLE>
0003 <BODY BGCOLOR="#AABBCC" TEXT="#332211" >
00040005 <DIV ALIGN="CENTER"> <FONT SIZE=1>
0006 <A HREF="#INTERFACE">PUBLIC INTERFACE</A> /
0007 <A HREF="#ROUTINES">ROUTINES</A> /
0008 <A HREF="#NAMELIST">NAMELIST</A> /
0009 <A HREF="#CHANGES">CHANGES</A> /
0010 <A HREF="#ERRORS">ERRORS</A> /
0011 <A HREF="#REFERENCES">REFERENCES</A> /
0012 <A HREF="#NOTES">NOTES</A>
0013 </FONT>
0014 <BR><BR></DIV><HR>
001500160017 <H2>module monin_obukhov</H2>
0018 <A NAME="HEADER">
0019 <PRE>
0020 <B>Contact:</B> Isaac Held
0021 <B>Reviewers:</B>
00220023 <B><A HREF=".doc.log#monin_obukhov.f90">Tags/Status</A></B>
0024 </PRE>
0025 </A><!-- END HEADER -->0026<!--------------------------------------------------------------------->0027 <A NAME="OVERVIEW">
0028 <HR>
0029 <H4>OVERVIEW</H4>
0030<!-- BEGIN OVERVIEW -->0031 <PRE>
00320033 Routines for computing surface drag coefficients from
0034 data at the lowest model level using Monin-Obukhov scaling,
0035 for estimating the wind, temperature, and buoyancy profiles
0036 between the lowest model level and surface, and for computing
0037 diffusivities consistent these profiles
00380039 </PRE>
0040 </A><!-- END OVERVIEW -->0041<!--------------------------------------------------------------------->0042 <A NAME="DESCRIPTION">
0043<!-- BEGIN DESCRIPTION -->0044 <PRE>
00450046 Monin-Obukhov similarity (MOS) theory is the standard method
0047 for computing surface fluxes from the lowest level winds,
0048 temperatures, and tracer mixing ratios in GCMs. The lowest level
0049 is assumed to lie within the "surface layer" in which turbulent
0050 fluxes have negligible vertical variation, and in which MOS assumes
0051 that the wind and buoyancy profiles are a function only of the
0052 surface stress, the surface buoyancy flux, and the height z.
0053 A good reference is Garratt, J. R. "The Atmospheric Boundary Layer",
0054 Cambridge University Press, 1992. For a discussion of the detailed
0055 form of the similarity theory used in this module, see
0056 <A HREF="monin_obukhov.tech.ps">monin_obukhov.tech.ps</A>
00570058 The particular form of the monin-obukhov similarity theory utilized
0059 is defined by the similarity functions phi_m and phi_t chosen, where
0060 du/dzeta = phi_m * u_star/( vonkarm * zeta )
0061 db/dzeta( = phi_t * b_star/( vonkarm * zeta )
0062 (where b = buoyancy or specific humidity,
0063 vonkarm = Von Karman's constant0064 u_star = friction velocity (stress = density*u_star**2)0065 b_star = buoyancy scale (flux = density*u_star*b_star)0066 zeta = z/L0067 z = height of lowest model level0068 L = monin_obukhov length )0069 We use:0070 on the unstable side 0071 phi_m = (1 - 16.0*zeta)**(-0.25)0072 phi_t = (1 - 16.0*zeta)**(-0.5)00730074 on the stable side -- phi_t = phi_m0075 there are two options00760077 option_1: phi = 1.0 + zeta*(5.0 + b_stab*zeta)/(1.0 + zeta)0078 where b_stab = 1/rich_crit 0079 (rich_crit is a namelist parameter)00800081 option_2: phi = 1 + 5.0*zeta (zeta < zeta_trans)0082 = 1.0 + (5.0 - b_stab)*zeta_trans + b_stab*zeta0083 (zeta_trans also a namelist parameter)00840085 In order to change these similarity functions, one would need to 0086 1) modify the defintion of phi_m and phi_t in the internal0087 subroutines mo_derivative_m and mo_derivative_t0088 2) provide analytical versions of the integral similarity0089 functions (PHI_m = int(zeta_0 to zeta) of phi/zeta)0090 (see notes) in the subroutines mo_integral_m and mo_integral_tq0091 3) modify stable_mix to be consistent with the new similarity functions0092 (see notes) (mod_diff will take care of itself)009300940095</PRE>0096</A><!-- END DESCRIPTION -->0097<!--------------------------------------------------------------------->0098<A NAME="MODULES_USED">0099<HR>0100<H4>OTHER MODULES USED</H4>0101<!-- BEGIN MODULES_USED -->0102<PRE>01030104 This modules uses 0105 constants_mod, only : grav, vonkarm0106 utilities_mod, only : error_mesg, FATAL, file_exist, &0107 check_nml_error, open_file, &0108 get_my_pe, close_file010901100111</PRE>0112</A><!-- END MODULES_USED -->0113<!--------------------------------------------------------------------->0114<A NAME="INTERFACE">0115<HR>0116<H4>PUBLIC INTERFACE</H4>0117<!-- BEGIN INTERFACE -->0118<PRE>01190120 use monin_obukhov_mod [,only: mo_drag , &0121 mo_profile , &0122 mo_diff , &0123 stable_mix ]01240125 mo_drag : computes the drag coefficients for momentum, heat, and moisture;0126 also returns u_star (the friction velocity) and0127 b_star (the buoyancy scale)01280129 mo_profile : provides the profile of momentum, temperature, and 0130 specific humidity in the constant flux layer 0131 -- useful when one needs0132 model output at a standard level below the lowest0133 model level. For example, the term "surface wind" 0134 in meteorology often refers to 0135 the wind 10 meters above the surface.01360137 mo_diff : computes the difusivity that, acting in isolation,0138 would produce the correct profiles in ths surface layer01390140 stable_mix : returns f(Ri) under stable conditions where Ri is the 0141 local Richardson's number, from which on can compute the
0142 diffusivity that produces the correct profile in the constant
0143 flux layer from D = l**2 |dv\dz| F(Ri) where l = vonkarm*z .
0144 Useful for matching a local Ri-dependent diffusivity in the free
0145 atmosphere under stable conditions o that implied by the
0146 surface layer profile
0147014801490150 Notes:
01510152 all of the interfaces can be called with either 2d, 1d or 0d in/output.
0153 The base routines for mo_drag and mo_profile are 1d, while
0154 those for mo_diff and stable_mix are 2d, as these are the
0155 versions called within our GCMs. (mo_drag and mo_profile are
0156 called from the exchange_grid, which is 1d). Other versions call these
0157 base routines -- they are included for convenience -- the presumption is
0158 that efficiency is not of particular importance for these alternative
0159 versions)
01600161016201630164 </PRE>
0165 </A><!-- END INTERFACE -->0166<!--------------------------------------------------------------------->0167 <A NAME="ROUTINES">
0168 <HR>
0169 <H4>PUBLIC ROUTINES</H4>
0170<!-- BEGIN ROUTINES -->0171 <PRE>
01720173 ==========================================================================
01740175 call mo_drag (pt, pt0, z, z0, zt, zq, speed, drag_m, drag_t, drag_q, &0176 u_star, b_star, [mask])01770178 input: 01790180 pt, real, dimension(:) 0181 virtual potential temperature at lowest model level0182 degrees Kelvin01830184 pt0, real, dimension(:)0185 virtual potential temperature at surface0186 degrees Kelvin01870188 z, real, dimension(:) 0189 height above surface of lowest model layer 0190 meters01910192 z0, real, dimension(:)0193 surface roughness for momentum 0194 meters01950196 zt, real, dimension(:)0197 surface roughness for temperature0198 meters01990200 zq, real, dimension(:) 0201 surface roughness for moisture0202 meters02030204 speed, real, dimension(:) 0205 wind speed at lowest model level with respect to surface 0206 (any "gustiness" factor should be included in speed)0207 meters/sec02080209 output:02100211 drag_m, real, dimension(:) 0212 non-dimensional drag coefficient for momentum02130214 drag_t, real, dimension(:) 0215 non-dimensional drag coefficient for temperature02160217 drag_q, real, dimension(:) 0218 non-dimensional drag coefficient for specific humidity02190220 u_star, real, dimension(:) 0221 friction velocity 0222 meters/sec02230224 b_star, real, dimension(:) 0225 buoyancy scale 0226 (meters/sec)**2022702280229 The magnitude of the wind stress is 0230 density*(ustar**2)0231 The drag coefficient for momentum is 0232 (u_star/speed)**20233 The buoyancy flux is0234 density*ustar*bstar0235 The drag coefficient for heat etc is0236 (u_star/speed)*(b_star/delta_b)0237 where delta_b is the buoyancy difference between0238 the surface and the lowest model level0239 The buoyancy == grav*(p0 - p)/p0024002410242 optional:0243 mask : logical, dimension(:) 0244 computation performed only where mask = .true.024502460247 Also:02480249 can be called with all 1d arrays replaced by 2d arrays or by 0d scalars0250 NOTE: in the 0d and 2d cases, there is no avail optional argument0251==========================================================================02520253 subroutine mo_profile(zref_m, zref_t, z, z0, zt, zq, &0254 u_star, b_star, q_star, del_m, del_t, del_q, [mask])02550256 input:02570258 zref_m, real0259 height above surface to which interpolation is requested0260 for horizontal components of momentum0261 meters02620263 zref_t, real0264 height above surface to which interpolation is requested0265 for temperature and specific humidity0266 meters02670268 z, real, dimension(:) 0269 height of lowest model layer above surface0270 meters02710272 z0, real, dimension(:)0273 surface roughness for momentum 0274 meters02750276 zt, real, dimension(:) 0277 surface roughness for temperature0278 meters02790280 zq, real, dimension(:) 0281 surface roughness for moisture0282 meters02830284 u_star, real, dimension(:) 0285 friction velocity 0286 meters/sec02870288 b_star, real, dimension(:) 0289 buoyancy scale0290 (meters/sec)**202910292 q_star, real, dimension(:)0293 moisture scale0294 kg/kg02950296 (Note: u_star and b_star are output from mo_drag,0297 q_star = flux_q/(u_star * density)02980299 optional input:03000301 mask, logical, dimension(:) 0302 computation performed only where mask = .true.030303040305 output:03060307 del_m, real, dimension(:)0308 dimensionless ratio, as defined below, for momentum03090310 del_t, real, dimension(:)0311 dimensionless ratio, as defined below, for temperature03120313 del_q, real, dimension(:) o0314 dimensionless ratio, as defined below, for specific humidity03150316 Ratios are (f(zref) - f_surf)/(f(z) - f_surf)03170318 Also:03190320 can be called with all 1d arrays replaced by 2d arrays or by 0d scalars0321 NOTE: in the 0d and 2d cases, there is no avail optional argument03220323 in addition, this routine can be called with the interface 03240325 subroutine mo_profile(zref, z, z0, zt, zq, &0326 u_star, b_star, q_star, del_m, del_h, del_q)03270328 in which zref is a 1d array of the heights at which the profiles0329 are requested, and all other input is 0d, 1d, or 2d as above,0330 while the output del_m, del_h, del_q is dimensioned0331 in the 0d case: dimension (size(zref))0332 in the 1d case: dimension (size(input), size(zref))0333 in the 2d case: dimension (size(input,1), size(input,2), size(zref))0334 (note that the two inputs zref_m and zref_h and here replaced by0335 the input vector zref)03360337==========================================================================03380339 subroutine mo_diff(z, u_star, b_star, k_m, k_h)03400341 input: 03420343 u_star, real, dimension(:,:) -- 2d horizontal array0344 surface friction velocity0345 (meters/sec)03460347 b_star, real, dimension(:,:) -- 2d horizontal array0348 buoyancy scale 0349 (meters/sec**2)03500351 (Note: u_star and b_star are output from mo_drag)03520353 z, real, dimension(:,:,:) 0354 (first two dimensions conform to u_star, b_star)0355 height above surface at which diffusivities 0356 are desired -- i.e., diffusivities returned at 0357 z(i,j,:) for each point (i,j) 0358 (meters)03590360 output:03610362 k_m : real, dimension(:,:,:) conforms to z0363 kinematic diffusivity for momentum 0364 (meters**2/sec)03650366 k_h : real, dimension(:,:,:)0367 kinematic diffusivity for temperature0368 (meters**2/sec)03690370Also 0d and 1d versions available0371 0d: u_star, b_star = scalars;0372 z, k_m, k_h = dimension(:)
0373 1d u_star, b_star = dimension(:),
0374 z, k_m, k_h = dimension(size(u_star), :)
03750376 Also, can be called so as to return diffusivities at one level
0377 (the height of this level can still vary from column to column)
0378 0d: u_star, b_star, z, k_m, k_h = scalars
0379 1d: u_star, b_star, z, k_m, k_h = dimension(:)
0380 2d u_star, b_star, z, k_m, k_h = dimension(:,:)
03810382 ==========================================================================
03830384 subroutine stable_mix(rich, mix)
03850386 input:
03870388 rich, real, dimension(:,:,:)
0389 local Richardson's number0390 (none)03910392 output:03930394 mix, real, dimension(:,:,:)0395 dimensional factor that produces the diffusivity0396 consistent with the similarity profile0397 under stable conditions when multiplied by 0398 (L**2) * |dv/dz| where v is the vector horizontal wind0399 and L = vonkarm*z04000401Also 0d, 1d, and 2d versions vailable04020403</PRE>0404</A><!-- END ROUTINES -->0405<!--------------------------------------------------------------------->0406<A NAME="NAMELIST">0407<HR>0408<H4>NAMELIST</H4>0409<!-- BEGIN NAMELIST -->0410<PRE>04110412 (default values provided)04130414 logical :: neutral = .false.04150416 If set to .true., all stability dependence is suppressed and 0417 neutral logarithmic profiles are used for all calculations;0418 all other namelist parameters ignored04190420 real :: drag_min = 1.e-05 (non-dimensional)04210422 The drag coefficients (for both momentum and temperature) 0423 are not allowed to fall below drag_min042404250426 integer :: stable_option = 104270428 must equal either 1 or 20429 two version for the similarity functions on the stable side04300431 real :: rich_crit = 2.0 (non-dimensional)04320433 The first step in applying the similarity theory is computing0434 the bulk Richardson's number Ri between the lowest model level
0435 and the surface. If Ri is greater than rich_crit, the drag
0436 coefficients are set to drag_min.
04370438 This value also affects the drag coefficients under stable conditions
0439 for either choice of stable_option, as the drag is arranged to
0440 becomes very small as rich_crit is approached
04410442 real :: zeta_trans = 0.5 (non-dimensional)
04430444 A parameter in the stable-option = 2 piecewise linear similarity
0445 function for the stable side. Increasing zeta_trans reduces
0446 the drag and the implied diffusivities
044704480449 </PRE>
0450 </A><!-- END NAMELIST -->0451<!--------------------------------------------------------------------->0452 <A NAME="CHANGES">
0453 <HR>
0454 <H4>CHANGE HISTORY</H4>
0455<!-- BEGIN CHANGES -->0456 <PRE>
0457 <B><A HREF=".doc.log#monin_obukhov.f90">Revision history</A></B>
04580459 <b>changes</b> (10/4/1999)
04600461 MPP version created. Minor changes for open_file, error_mesg,
0462 and Fortran write statements. Answers should reproduce the
0463 previous version.
04640465 <b>more changes</b> (10/01)
04660467 -- time smoothing option removed
0468 -- second optional similarity function on stable side added
0469 -- stable_mix interface added
0470 -- code rearranged substantially for clarity, removing initial
0471 aggregation of points into unstable and stable sets
0472 -- answers reproduce for stable_option = 1 except in the very
0473 rare instance of points that are very close to neutral.
0474 These need to be treated separately to avoid a divide by sero.
0475 In this version, the drag coefficients at these points are simply
0476 set to the neutral value
04770478 </PRE>
0479 </A><!-- END CHANGES -->0480<!--------------------------------------------------------------------->0481 <A NAME="ERRORS">
0482 <HR>
0483 <H4>ERROR MESSAGES</H4>
0484<!-- BEGIN ERRORS -->0485 <PRE>
04860487 FATAL ERRORS in MONIN_OBUKHOV_INIT in MONIN_OBUKHOV_MOD
04880489 -- rich_crit in monin_obukhov_mod must be > 0.25
04900491 -- drag_min in monin_obukhov_mod must be >= 0.0
04920493 -- the only allowable values of stable_option are 1 and 2
04940495 -- zeta_trans must be positive
049604970498 FATAL ERROR in solve_zeta in monin_obukhov_mod
04990500 -- surface drag iteration did not converge
05010502 </PRE>
0503 </A><!-- END ERRORS -->0504<!--------------------------------------------------------------------->0505 <A NAME="REFERENCES">
0506 <HR>
0507 <H4>REFERENCES</H4>
0508<!-- BEGIN REFERENCES -->0509 <PRE>
05100511 </PRE>
0512 </A><!-- END REFERENCES -->0513<!--------------------------------------------------------------------->0514 <A NAME="BUGS">
0515 <HR>
0516 <H4>KNOWN BUGS</H4>
0517<!-- BEGIN BUGS -->0518 <PRE>
0519 None known
0520 </PRE>
0521 </A><!-- END BUGS -->0522<!--------------------------------------------------------------------->0523 <A NAME="NOTES">
0524 <HR>
0525 <H4>NOTES</H4>
0526<!-- BEGIN NOTES -->0527 <PRE>
05280529 If iteration convergence is ever a problem, one can consider
0530 precomputation and table interpolation
05310532 It would be convenient if changing the derivative similarity functions
0533 automatically modified the integral functions and stable_mix
0534 (this would presumably require numerical integration and table look-ups
0535 as opposed to analytical expressions)
053605370538 </PRE>
0539 </A><!-- END NOTES -->0540<!--------------------------------------------------------------------->0541 <A NAME="PLANS">
0542 <HR>
0543 <H4>FUTURE PLANS</H4>
0544<!-- BEGIN PLANS -->0545 <PRE>
054605470548 </PRE>
0549 </A><!-- END PLANS -->0550<!--------------------------------------------------------------------->05510552 <HR>
0553 </BODY>
0554 </HTML>