@@ 1371-1418 (lines=48) @@ | ||
1368 | mean_dewpoint.to(dewpt.units)) |
|
1369 | ||
1370 | ||
1371 | @exporter.export |
|
1372 | @check_units('[pressure]') |
|
1373 | def mixed_layer(p, *args, **kwargs): |
|
1374 | r"""Mix variable(s) over a layer, yielding a mass-weighted average. |
|
1375 | ||
1376 | This function will integrate a data variable with respect to pressure and determine the |
|
1377 | average value using the mean value theorem. |
|
1378 | ||
1379 | Parameters |
|
1380 | ---------- |
|
1381 | p : array-like |
|
1382 | Atmospheric pressure profile |
|
1383 | datavar : array-like |
|
1384 | Atmospheric variable measured at the given pressures |
|
1385 | heights: array-like, optional |
|
1386 | Atmospheric heights corresponding to the given pressures (default None) |
|
1387 | bottom : `pint.Quantity`, optional |
|
1388 | The bottom of the layer as a pressure or height above the surface pressure |
|
1389 | (default None) |
|
1390 | depth : `pint.Quantity`, optional |
|
1391 | The thickness of the layer as a pressure or height above the bottom of the layer |
|
1392 | (default 100 hPa) |
|
1393 | interpolate : bool, optional |
|
1394 | Interpolate the top and bottom points if they are not in the given data |
|
1395 | ||
1396 | Returns |
|
1397 | ------- |
|
1398 | `pint.Quantity` |
|
1399 | The mixed value of the data variable. |
|
1400 | ||
1401 | """ |
|
1402 | # Pull out keyword arguments, remove when we drop Python 2.7 |
|
1403 | heights = kwargs.pop('heights', None) |
|
1404 | bottom = kwargs.pop('bottom', None) |
|
1405 | depth = kwargs.pop('depth', 100 * units.hPa) |
|
1406 | interpolate = kwargs.pop('interpolate', True) |
|
1407 | ||
1408 | layer = get_layer(p, *args, heights=heights, bottom=bottom, |
|
1409 | depth=depth, interpolate=interpolate) |
|
1410 | p_layer = layer[0] |
|
1411 | datavars_layer = layer[1:] |
|
1412 | ||
1413 | ret = [] |
|
1414 | for datavar_layer in datavars_layer: |
|
1415 | actual_depth = abs(p_layer[0] - p_layer[-1]) |
|
1416 | ret.append((-1. / actual_depth.m) * np.trapz(datavar_layer, p_layer) * |
|
1417 | datavar_layer.units) |
|
1418 | return ret |
|
1419 |
@@ 56-103 (lines=48) @@ | ||
53 | bottom = np.nanmax(pressure) * pressure.units |
|
54 | ||
55 | pres_layer, dewpt_layer = get_layer(pressure, dewpt, bottom=bottom, depth=bottom - top) |
|
56 | ||
57 | w = mixing_ratio(saturation_vapor_pressure(dewpt_layer), pres_layer) |
|
58 | ||
59 | # Since pressure is in decreasing order, pw will be the opposite sign of that expected. |
|
60 | pw = -1. * (np.trapz(w.magnitude, pres_layer.magnitude) * (w.units * pres_layer.units) / |
|
61 | (g * rho_l)) |
|
62 | return pw.to('millimeters') |
|
63 | ||
64 | ||
65 | @exporter.export |
|
66 | @check_units('[pressure]') |
|
67 | def mean_pressure_weighted(pressure, *args, **kwargs): |
|
68 | r"""Calculate pressure-weighted mean of an arbitrary variable through a layer. |
|
69 | ||
70 | Layer top and bottom specified in height or pressure. |
|
71 | ||
72 | Parameters |
|
73 | ---------- |
|
74 | pressure : `pint.Quantity` |
|
75 | Atmospheric pressure profile |
|
76 | *args : `pint.Quantity` |
|
77 | Parameters for which the pressure-weighted mean is to be calculated. |
|
78 | heights : `pint.Quantity`, optional |
|
79 | Heights from sounding. Standard atmosphere heights assumed (if needed) |
|
80 | if no heights are given. |
|
81 | bottom: `pint.Quantity`, optional |
|
82 | The bottom of the layer in either the provided height coordinate |
|
83 | or in pressure. Don't provide in meters AGL unless the provided |
|
84 | height coordinate is meters AGL. Default is the first observation, |
|
85 | assumed to be the surface. |
|
86 | depth: `pint.Quantity`, optional |
|
87 | The depth of the layer in meters or hPa. |
|
88 | ||
89 | Returns |
|
90 | ------- |
|
91 | `pint.Quantity` |
|
92 | u_mean: u-component of layer mean wind. |
|
93 | `pint.Quantity` |
|
94 | v_mean: v-component of layer mean wind. |
|
95 | ||
96 | """ |
|
97 | heights = kwargs.pop('heights', None) |
|
98 | bottom = kwargs.pop('bottom', None) |
|
99 | depth = kwargs.pop('depth', None) |
|
100 | ret = [] # Returned variable means in layer |
|
101 | layer_arg = get_layer(pressure, *args, heights=heights, |
|
102 | bottom=bottom, depth=depth) |
|
103 | layer_p = layer_arg[0] |
|
104 | layer_arg = layer_arg[1:] |
|
105 | # Taking the integral of the weights (pressure) to feed into the weighting |
|
106 | # function. Said integral works out to this function: |