update meteolib functions

This commit is contained in:
wyq 2022-02-23 17:13:50 +08:00
parent 45ca566145
commit d2de12c825
18 changed files with 350 additions and 194 deletions

View File

@ -1,30 +1,30 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<MeteoInfo File="milconfig.xml" Type="configurefile"> <MeteoInfo File="milconfig.xml" Type="configurefile">
<Path OpenPath="D:\Working\MIScript\Jython\mis\io\grib"> <Path OpenPath="D:\Working\MIScript\Jython\mis\meteo\wrf">
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\city"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\contour"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\streamplot"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\isosurface"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\surf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\burf"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\bar"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\geoshow"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\geoshow"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d_earth"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d_earth"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\grib"/> <RecentFolder Folder="D:\Working\MIScript\Jython\mis\io\grib"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\io"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\contour"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite\FY"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\calc"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\interpolation"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\data"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
</Path> </Path>
<File> <File>
<OpenedFiles> <OpenedFiles>
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d_earth\CALIPSO_L1_3d_axis.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\vort_advection_2.py"/>
<OpenedFile File="D:\Working\MIScript\Jython\mis\io\grib\grib_ensemble.py"/> <OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\wrf\typhoon_path_trace.py"/>
</OpenedFiles> </OpenedFiles>
<RecentFiles> <RecentFiles>
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d_earth\CALIPSO_L1_3d_axis.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\meteo\vort_advection_2.py"/>
<RecentFile File="D:\Working\MIScript\Jython\mis\io\grib\grib_ensemble.py"/> <RecentFile File="D:\Working\MIScript\Jython\mis\meteo\wrf\typhoon_path_trace.py"/>
</RecentFiles> </RecentFiles>
</File> </File>
<Font> <Font>
@ -32,5 +32,5 @@
</Font> </Font>
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/> <LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
<Figure DoubleBuffering="true"/> <Figure DoubleBuffering="true"/>
<Startup MainFormLocation="-7,0" MainFormSize="1361,845"/> <Startup MainFormLocation="-7,0" MainFormSize="1364,783"/>
</MeteoInfo> </MeteoInfo>

View File

@ -1,9 +1,10 @@
from .meteo import * from .meteo import *
import wrf from . import wrf
from . import constants
from .calc import * from .calc import *
from .interpolate import * from .interpolate import *
__all__ = [] __all__ = ['wrf','constants','meteo','calc','interpolate']
__all__ += meteo.__all__ __all__ += meteo.__all__
__all__ += calc.__all__ __all__ += calc.__all__
__all__ += interpolate.__all__ __all__ += interpolate.__all__

View File

@ -7,7 +7,7 @@ Ported from MetPy.
from org.meteoinfo.math.meteo import MeteoMath from org.meteoinfo.math.meteo import MeteoMath
import mipylib.numeric as np import mipylib.numeric as np
from mipylib.numeric.core import NDArray, DimArray from mipylib.numeric.core import NDArray, DimArray
from .tools import first_derivative, gradient, get_layer_heights from .tools import first_derivative, gradient, get_layer_heights, lat_lon_grid_deltas
from .basic import coriolis_parameter from .basic import coriolis_parameter
from .. import constants from .. import constants
@ -77,13 +77,34 @@ def vorticity(u, v, dx=None, dy=None, x_dim=-1, y_dim=-2):
if dx is None: if dx is None:
xx = u.dimvalue(x_dim) xx = u.dimvalue(x_dim)
yy = u.dimvalue(y_dim) yy = u.dimvalue(y_dim)
xx,yy = np.meshgrid(xx, yy) xx, yy = np.meshgrid(xx, yy)
dudy = first_derivative(u, x=yy, axis=y_dim) if u.proj.isLonLat():
dvdx = first_derivative(v, x=xx, axis=x_dim) dx, dy = lat_lon_grid_deltas(xx, yy)
if dx.ndim < u.ndim:
ea = range(u.ndim - dx.ndim)
dx = np.expand_dims(dx, axis=ea)
dy = np.expand_dims(dy, axis=ea)
dudy = first_derivative(u, delta=dy, axis=y_dim)
dvdx = first_derivative(v, delta=dx, axis=x_dim)
else:
if xx.ndim < u.ndim:
ea = range(u.ndim - xx.ndim)
xx = np.expand_dims(xx, axis=ea)
yy = np.expand_dims(yy, axis=ea)
dudy = first_derivative(u, x=yy, axis=y_dim)
dvdx = first_derivative(v, x=xx, axis=x_dim)
else: else:
if dx.ndim < u.ndim:
ea = range(u.ndim - dx.ndim)
dx = np.expand_dims(dx, axis=ea)
dy = np.expand_dims(dy, axis=ea)
dudy = first_derivative(u, delta=dy, axis=y_dim) dudy = first_derivative(u, delta=dy, axis=y_dim)
dvdx = first_derivative(v, delta=dx, axis=x_dim) dvdx = first_derivative(v, delta=dx, axis=x_dim)
return dvdx - dudy r = dvdx - dudy
if isinstance(u, DimArray):
return DimArray(r, u.dims, u.fill_value, u.proj)
else:
return r
def vorticity_bak(u, v, x=None, y=None): def vorticity_bak(u, v, x=None, y=None):
""" """
@ -165,13 +186,35 @@ def divergence(u, v, dx=None, dy=None, x_dim=-1, y_dim=-2):
if dx is None: if dx is None:
xx = u.dimvalue(x_dim) xx = u.dimvalue(x_dim)
yy = u.dimvalue(y_dim) yy = u.dimvalue(y_dim)
xx,yy = np.meshgrid(xx, yy) xx, yy = np.meshgrid(xx, yy)
dudx = first_derivative(u, x=xx, axis=x_dim) if u.proj.isLonLat():
dvdy = first_derivative(v, x=yy, axis=y_dim) dx, dy = lat_lon_grid_deltas(xx, yy)
if dx.ndim < u.ndim:
ea = range(u.ndim - dx.ndim)
dx = np.expand_dims(dx, axis=ea)
dy = np.expand_dims(dy, axis=ea)
dudx = first_derivative(u, delta=dx, axis=x_dim)
dvdy = first_derivative(v, delta=dy, axis=y_dim)
else:
if xx.ndim < u.ndim:
ea = range(u.ndim - xx.ndim)
xx = np.expand_dims(xx, axis=ea)
yy = np.expand_dims(yy, axis=ea)
dudx = first_derivative(u, x=xx, axis=x_dim)
dvdy = first_derivative(v, x=yy, axis=y_dim)
else: else:
if dx.ndim < u.ndim:
ea = range(u.ndim - dx.ndim)
dx = np.expand_dims(dx, axis=ea)
dy = np.expand_dims(dy, axis=ea)
dudx = first_derivative(u, delta=dx, axis=x_dim) dudx = first_derivative(u, delta=dx, axis=x_dim)
dvdy = first_derivative(v, delta=dy, axis=y_dim) dvdy = first_derivative(v, delta=dy, axis=y_dim)
return dudx + dvdy r = dudx + dvdy
if isinstance(u, DimArray):
return DimArray(r, u.dims, u.fill_value, u.proj)
else:
return r
def divergence_bak(u, v, x=None, y=None): def divergence_bak(u, v, x=None, y=None):
''' '''

View File

@ -4,6 +4,7 @@ Contains a collection of thermodynamic calculations.
Ported from MetPy. Ported from MetPy.
""" """
import warnings
from .. import constants from .. import constants
from ..cbook import broadcast_indices from ..cbook import broadcast_indices
from .tools import find_bounding_indices, _less_or_close from .tools import find_bounding_indices, _less_or_close
@ -16,31 +17,39 @@ __all__ = [
'mixing_ratio','mixing_ratio_from_specific_humidity','potential_temperature', 'mixing_ratio','mixing_ratio_from_specific_humidity','potential_temperature',
'relative_humidity_from_specific_humidity', 'relative_humidity_from_specific_humidity',
'saturation_mixing_ratio','saturation_vapor_pressure','temperature_from_potential_temperature', 'saturation_mixing_ratio','saturation_vapor_pressure','temperature_from_potential_temperature',
'virtual_temperature','dry_static_energy','isentropic_interpolation' 'virtual_temperature','dry_static_energy','isentropic_interpolation',
'dewpoint','dewpoint_from_relative_humidity','specific_humidity_from_dewpoint',
'specific_humidity_from_mixing_ratio','specific_humidity_from_relative_humidity'
] ]
def saturation_vapor_pressure(temperature): def saturation_vapor_pressure(temperature):
r"""Calculate the saturation water vapor (partial) pressure. r"""Calculate the saturation water vapor (partial) pressure.
Parameters Parameters
---------- ----------
temperature : `float` temperature : `float`
The temperature (celsius) The temperature (kelvin)
Returns Returns
------- -------
`float` `float`
The saturation water vapor (partial) pressure The saturation water vapor (partial) pressure
See Also See Also
-------- --------
vapor_pressure, dewpoint vapor_pressure, dewpoint
Notes Notes
----- -----
Instead of temperature, dewpoint may be used in order to calculate Instead of temperature, dewpoint may be used in order to calculate
the actual (ambient) water vapor (partial) pressure. the actual (ambient) water vapor (partial) pressure.
The formula used is that from [Bolton1980]_ for T in degrees Celsius: The formula used is that from [Bolton1980]_ for T in degrees Celsius:
.. math:: 6.112 e^\frac{17.67T}{T + 243.5} .. math:: 6.112 e^\frac{17.67T}{T + 243.5}
""" """
# Converted from original in terms of C to use kelvin. # Converted from original in terms of C to use kelvin.
return constants.sat_pressure_0c * np.exp(17.67 * (temperature - 273.15) / (temperature - 29.65)) return constants.sat_pressure_0c * np.exp(17.67 * (temperature - 273.15) /
(temperature - 29.65))
def mixing_ratio_from_specific_humidity(specific_humidity): def mixing_ratio_from_specific_humidity(specific_humidity):
r"""Calculate the mixing ratio from specific humidity. r"""Calculate the mixing ratio from specific humidity.
@ -68,18 +77,22 @@ def mixing_ratio(part_press, tot_press):
""" """
Calculates the mixing ratio of gas given its partial pressure Calculates the mixing ratio of gas given its partial pressure
and the total pressure of the air. and the total pressure of the air.
There are no required units for the input arrays, other than that There are no required units for the input arrays, other than that
they have the same units. they have the same units.
Parameters Parameters
---------- ----------
part_press : array_like part_press : array_like
Partial pressure of the constituent gas Partial pressure of the constituent gas
tot_press : array_like tot_press : array_like
Total air pressure Total air pressure
Returns Returns
------- -------
array_like array_like
The (mass) mixing ratio, dimensionless (e.g. Kg/Kg or g/g) The (mass) mixing ratio, dimensionless (e.g. Kg/Kg or g/g)
See Also See Also
-------- --------
vapor_pressure vapor_pressure
@ -91,17 +104,22 @@ def saturation_mixing_ratio(tot_press, temperature):
""" """
Calculates the saturation mixing ratio given total pressure Calculates the saturation mixing ratio given total pressure
and the temperature. and the temperature.
The implementation uses the formula outlined in [4] The implementation uses the formula outlined in [4]
Parameters Parameters
---------- ----------
tot_press: array_like tot_press: array_like
Total atmospheric pressure (hPa) Total atmospheric pressure (hPa)
temperature: array_like temperature: array_like
The temperature (celsius) The temperature (kelvin)
Returns Returns
------- -------
array_like array_like
The saturation mixing ratio, dimensionless The saturation mixing ratio, dimensionless
References References
---------- ----------
.. [4] Hobbs, Peter V. and Wallace, John M., 1977: Atmospheric Science, an Introductory .. [4] Hobbs, Peter V. and Wallace, John M., 1977: Atmospheric Science, an Introductory
@ -176,95 +194,110 @@ def exner_function(pressure, reference_pressure=constants.P0):
def potential_temperature(pressure, temperature): def potential_temperature(pressure, temperature):
""" """
Calculate the potential temperature. Calculate the potential temperature.
Uses the Poisson equation to calculation the potential temperature Uses the Poisson equation to calculation the potential temperature
given `pressure` and `temperature`. given `pressure` and `temperature`.
Parameters Parameters
---------- ----------
pressure : array_like pressure : array_like
The total atmospheric pressure The total atmospheric pressure
temperature : array_like temperature : array_like
The temperature The temperature
Returns Returns
------- -------
array_like array_like
The potential temperature corresponding to the the temperature and The potential temperature corresponding to the the temperature and
pressure. pressure.
See Also See Also
-------- --------
dry_lapse dry_lapse
Notes Notes
----- -----
Formula: Formula:
.. math:: \Theta = T (P_0 / P)^\kappa .. math:: \Theta = T (P_0 / P)^\kappa
""" """
return temperature * (constants.P0 / pressure)**constants.kappa return temperature / exner_function(pressure)
def temperature_from_potential_temperature(pressure, theta): def temperature_from_potential_temperature(pressure, potential_temperature):
r"""Calculate the temperature from a given potential temperature. r"""Calculate the temperature from a given potential temperature.
Uses the inverse of the Poisson equation to calculate the temperature from a Uses the inverse of the Poisson equation to calculate the temperature from a
given potential temperature at a specific pressure level. given potential temperature at a specific pressure level.
Parameters Parameters
---------- ----------
pressure : `pint.Quantity` pressure : `array`
The total atmospheric pressure The total atmospheric pressure (hPa)
theta : `pint.Quantity` potential_temperature : `array`
The potential temperature The potential temperature (Kelvin)
Returns Returns
------- -------
`pint.Quantity` `array` (kelvin)
The temperature corresponding to the potential temperature and pressure. The temperature corresponding to the potential temperature and pressure.
See Also See Also
-------- --------
dry_lapse dry_lapse
potential_temperature potential_temperature
Notes Notes
----- -----
Formula: Formula:
.. math:: T = \Theta (P / P_0)^\kappa .. math:: T = \Theta (P / P_0)^\kappa
""" """
return theta * exner_function(pressure) return potential_temperature * exner_function(pressure)
def equivalent_potential_temperature(pressure, temperature, dewpoint): def equivalent_potential_temperature(pressure, temperature, dewpoint):
r"""Calculate equivalent potential temperature. r"""Calculate equivalent potential temperature.
This calculation must be given an air parcel's pressure, temperature, and dewpoint. This calculation must be given an air parcel's pressure, temperature, and dewpoint.
The implementation uses the formula outlined in [Bolton1980]_: The implementation uses the formula outlined in [Bolton1980]_:
First, the LCL temperature is calculated: First, the LCL temperature is calculated:
.. math:: T_{L}=\frac{1}{\frac{1}{T_{D}-56}+\frac{ln(T_{K}/T_{D})}{800}}+56 .. math:: T_{L}=\frac{1}{\frac{1}{T_{D}-56}+\frac{ln(T_{K}/T_{D})}{800}}+56
Which is then used to calculate the potential temperature at the LCL: Which is then used to calculate the potential temperature at the LCL:
.. math:: \theta_{DL}=T_{K}\left(\frac{1000}{p-e}\right)^k .. math:: \theta_{DL}=T_{K}\left(\frac{1000}{p-e}\right)^k
\left(\frac{T_{K}}{T_{L}}\right)^{.28r} \left(\frac{T_{K}}{T_{L}}\right)^{.28r}
Both of these are used to calculate the final equivalent potential temperature: Both of these are used to calculate the final equivalent potential temperature:
.. math:: \theta_{E}=\theta_{DL}\exp\left[\left(\frac{3036.}{T_{L}} .. math:: \theta_{E}=\theta_{DL}\exp\left[\left(\frac{3036.}{T_{L}}
-1.78\right)*r(1+.448r)\right] -1.78\right)*r(1+.448r)\right]
Parameters Parameters
---------- ----------
pressure: `float` pressure: `float`
Total atmospheric pressure (hPa) Total atmospheric pressure (hPa)
temperature: `float` temperature: `float`
Temperature of parcel (celsius) Temperature of parcel (kelvin)
dewpoint: `float` dewpoint: `float`
Dewpoint of parcel (celsius) Dewpoint of parcel (kelvin)
Returns Returns
------- -------
`float` `float`
The equivalent potential temperature of the parcel (celsius) The equivalent potential temperature of the parcel (kelvin)
Notes Notes
----- -----
[Bolton1980]_ formula for Theta-e is used, since according to [Bolton1980]_ formula for Theta-e is used, since according to
[DaviesJones2009]_ it is the most accurate non-iterative formulation [DaviesJones2009]_ it is the most accurate non-iterative formulation
available. available.
""" """
t = temperature + 273.15 t = temperature
td = dewpoint + 273.15 td = dewpoint
p = pressure
e = saturation_vapor_pressure(dewpoint) e = saturation_vapor_pressure(dewpoint)
r = saturation_mixing_ratio(pressure, dewpoint) r = saturation_mixing_ratio(pressure, dewpoint)
t_l = 56 + 1. / (1. / (td - 56) + np.log(t / td) / 800.) t_l = 56 + 1. / (1. / (td - 56) + np.log(t / td) / 800.)
th_l = t * (1000 / (p - e)) ** constants.kappa * (t / t_l) ** (0.28 * r) th_l = potential_temperature(pressure - e, temperature) * (t / t_l) ** (0.28 * r)
th_e = th_l * np.exp((3036. / t_l - 1.78) * r * (1 + 0.448 * r)) return th_l * np.exp(r * (1 + 0.448 * r) * (3036. / t_l - 1.78))
return th_e - 273.15
def virtual_temperature(temperature, mixing, molecular_weight_ratio=constants.epsilon): def virtual_temperature(temperature, mixing, molecular_weight_ratio=constants.epsilon):
r"""Calculate virtual temperature. r"""Calculate virtual temperature.
@ -472,4 +505,123 @@ def isentropic_interpolation(levels, pressure, temperature, *args, **kwargs):
axis=vertical_dim, return_list_always=True) axis=vertical_dim, return_list_always=True)
ret.extend(others) ret.extend(others)
return ret return ret
def dewpoint_from_relative_humidity(temperature, rh):
r"""Calculate the ambient dewpoint given air temperature and relative humidity.
Parameters
----------
temperature : `float`
Air temperature (celsius)
rh : `float`
Relative humidity expressed as a ratio in the range 0 < rh <= 1
Returns
-------
`float`
The dew point temperature (celsius)
See Also
--------
dewpoint, saturation_vapor_pressure
"""
if np.any(rh > 1.2):
warnings.warn('Relative humidity >120%, ensure proper units.')
return dewpoint(rh * saturation_vapor_pressure(temperature))
def dewpoint(vapor_pressure):
r"""Calculate the ambient dewpoint given the vapor pressure.
Parameters
----------
vapor_pressure : `array`
Water vapor partial pressure
Returns
-------
`array`
Dew point temperature
See Also
--------
dewpoint_rh, saturation_vapor_pressure, vapor_pressure
Notes
-----
This function inverts the [Bolton1980]_ formula for saturation vapor
pressure to instead calculate the temperature. This yield the following
formula for dewpoint in degrees Celsius:
.. math:: T = \frac{243.5 log(e / 6.112)}{17.67 - log(e / 6.112)}
"""
val = np.log(vapor_pressure / constants.nounit.sat_pressure_0c)
return constants.nounit.zero_degc + 243.5 * val / (17.67 - val)
def specific_humidity_from_mixing_ratio(mixing_ratio):
r"""Calculate the specific humidity from the mixing ratio.
Parameters
----------
mixing_ratio: `array`
Mixing ratio
Returns
-------
`array`
Specific humidity
See Also
--------
mixing_ratio, mixing_ratio_from_specific_humidity
Notes
-----
Formula from [Salby1996]_ pg. 118.
.. math:: q = \frac{w}{1+w}
* :math:`w` is mixing ratio
* :math:`q` is the specific humidity
"""
return mixing_ratio / (1 + mixing_ratio)
def specific_humidity_from_dewpoint(pressure, dewpoint):
r"""Calculate the specific humidity from the dewpoint temperature and pressure.
Parameters
----------
dewpoint: `array`
Dewpoint temperature
pressure: `array`
Pressure
Returns
-------
`array`
Specific humidity
See Also
--------
mixing_ratio, saturation_mixing_ratio
"""
mixing_ratio = saturation_mixing_ratio(pressure, dewpoint)
return specific_humidity_from_mixing_ratio(mixing_ratio)
def specific_humidity_from_relative_humidity(pressure, temperature, rh):
"""Calculate specific humidity from relative humidity, pressure and temperature.
Parameters
----------
pressure: `array`
Pressure
temperature: `array`
temperature
rh: `array`
relative humidity
Returns
-------
`array`
Specific humidity
"""
dp = dewpoint_from_relative_humidity(temperature, rh)
return specific_humidity_from_dewpoint(pressure, dp)

View File

@ -0,0 +1,2 @@
from . import nounit
from .default import *

View File

@ -1,10 +1,3 @@
#-----------------------------------------------------
# Author: Yaqiang Wang
# Date: 2018-11-23
# Purpose: MeteoInfoLab constants module
# Note: Jython
#-----------------------------------------------------
P0 = 1000. #reference pressure for potential temperature (hPa) P0 = 1000. #reference pressure for potential temperature (hPa)
R = 8.3144598 #molar gas constant (J / K / mol) R = 8.3144598 #molar gas constant (J / K / mol)
Mw = 18.01528 #Molecular weight of water (g / mol) Mw = 18.01528 #Molecular weight of water (g / mol)
@ -16,6 +9,6 @@ epsilon = Mw / Md
kappa = 0.286 kappa = 0.286
degCtoK = 273.15 # Temperature offset between K and C (deg C) degCtoK = 273.15 # Temperature offset between K and C (deg C)
g = 9.8 # Gravitational acceleration (m / s^2) g = 9.8 # Gravitational acceleration (m / s^2)
sat_pressure_0c = 6.112 #Saturation presssure at 0 degree (hPa) sat_pressure_0c = 6.112 #Saturation pressure at 0 degree (hPa)
T_BASE = 300. T_BASE = 300.
omega = 7292115e-11 # Avg. angular velocity of Earth (rad / s) omega = 7292115e-11 # Avg. angular velocity of Earth (rad / s)

View File

@ -0,0 +1,4 @@
from . import default
zero_degc = 273.15 # K
sat_pressure_0c = default.sat_pressure_0c * 100 # Pa

View File

@ -258,50 +258,7 @@ def rh2dewpoint(rh, temp):
r = DimArray(r, rh.dims, rh.fill_value, rh.proj) r = DimArray(r, rh.dims, rh.fill_value, rh.proj)
return r return r
else: else:
return MeteoMath.rh2dewpoint(rh, temp) return MeteoMath.rh2dewpoint(rh, temp)
def dewpoint(e):
r"""Calculate the ambient dewpoint given the vapor pressure.
Parameters
----------
e : `pint.Quantity`
Water vapor partial pressure
Returns
-------
`pint.Quantity`
Dew point temperature
See Also
--------
dewpoint_rh, saturation_vapor_pressure, vapor_pressure
Notes
-----
This function inverts the [Bolton1980]_ formula for saturation vapor
pressure to instead calculate the temperature. This yield the following
formula for dewpoint in degrees Celsius:
.. math:: T = \frac{243.5 log(e / 6.112)}{17.67 - log(e / 6.112)}
"""
val = np.log(e / constants.sat_pressure_0c)
return 243.5 * val / (17.67 - val)
def dewpoint_from_relative_humidity(temperature, rh):
r"""Calculate the ambient dewpoint given air temperature and relative humidity.
Parameters
----------
temperature : `float`
Air temperature (celsius)
rh : `float`
Relative humidity expressed as a ratio in the range 0 < rh <= 1
Returns
-------
`float`
The dew point temperature (celsius)
See Also
--------
dewpoint, saturation_vapor_pressure
"""
#if np.any(rh > 1.2):
# warnings.warn('Relative humidity >120%, ensure proper units.')
return dewpoint(rh * saturation_vapor_pressure(temperature))
def dewpoint_rh(temperature, rh): def dewpoint_rh(temperature, rh):
r"""Calculate the ambient dewpoint given air temperature and relative humidity. r"""Calculate the ambient dewpoint given air temperature and relative humidity.
@ -424,16 +381,20 @@ def vapor_pressure(pressure, mixing):
def cumsimp(y): def cumsimp(y):
""" """
Simpson-rule column-wise cumulative summation. Simpson-rule column-wise cumulative summation.
Numerical approximation of a function F(x) such that Numerical approximation of a function F(x) such that
Y(X) = dF/dX. Each column of the input matrix Y represents Y(X) = dF/dX. Each column of the input matrix Y represents
the value of the integrand Y(X) at equally spaced points the value of the integrand Y(X) at equally spaced points
X = 0,1,...size(Y,1). X = 0,1,...size(Y,1).
The output is a matrix F of the same size as Y. The output is a matrix F of the same size as Y.
The first row of F is equal to zero and each following row The first row of F is equal to zero and each following row
is the approximation of the integral of each column of matrix is the approximation of the integral of each column of matrix
Y up to the givem row. Y up to the given row.
CUMSIMP assumes continuity of each column of the function Y(X) CUMSIMP assumes continuity of each column of the function Y(X)
and uses Simpson rule summation. and uses Simpson rule summation.
Similar to the command F = CUMSUM(Y), exept for zero first Similar to the command F = CUMSUM(Y), exept for zero first
row and more accurate summation (under the assumption of row and more accurate summation (under the assumption of
continuous integrand Y(X)). continuous integrand Y(X)).

View File

@ -104,7 +104,7 @@ def get_rh(wrfin, timeidx=0):
full_p = p + pb full_p = p + pb
qvapor[qvapor < 0] = 0. qvapor[qvapor < 0] = 0.
tk = temperature_from_potential_temperature(full_p * 0.01, full_t) tk = temperature_from_potential_temperature(full_p * 0.01, full_t)
rh = relative_humidity_from_specific_humidity(qvapor, tk - 273.15, full_p * 0.01) * 100 rh = relative_humidity_from_specific_humidity(full_p * 0.01, tk, qvapor)
return rh return rh
@ -124,6 +124,6 @@ def get_rh2m(wrfin, timeidx=0):
psfc = wrfin['PSFC'][timeidx,:,:] psfc = wrfin['PSFC'][timeidx,:,:]
q2 = wrfin['Q2'][timeidx,:,:] q2 = wrfin['Q2'][timeidx,:,:]
q2[q2 < 0] = 0. q2[q2 < 0] = 0.
rh = relative_humidity_from_specific_humidity(q2, t2 - 273.15, psfc * 0.01) * 100 rh = relative_humidity_from_specific_humidity(psfc * 0.01, t2, q2)
return rh return rh

View File

@ -14,10 +14,9 @@ from . import signal
from . import spatial from . import spatial
from . import special from . import special
__all__ = [] __all__ = ['linalg', 'fitting', 'random', 'ma', 'stats', 'interpolate', 'optimize', 'signal', 'spatial',
'special']
__all__.extend(['__version__']) __all__.extend(['__version__'])
__all__.extend(core.__all__) __all__.extend(core.__all__)
__all__.extend(lib.__all__) __all__.extend(lib.__all__)
__all__.extend(['linalg', 'fitting', 'random', 'ma', 'stats', 'interpolate', 'optimize', 'signal', 'spatial',
'special'])
__all__.extend(['griddata']) __all__.extend(['griddata'])

View File

@ -12,100 +12,17 @@
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="meteoinfo-chart" /> <orderEntry type="module" module-name="meteoinfo-chart" />
<orderEntry type="module" module-name="meteoinfo-console" />
<orderEntry type="module" module-name="meteoinfo-geo" /> <orderEntry type="module" module-name="meteoinfo-geo" />
<orderEntry type="module" module-name="meteoinfo-math" />
<orderEntry type="module" module-name="meteoinfo-ndarray" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.0.0" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-experimental:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-core:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-ddense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-dsparse:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-zdense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-simple:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fdense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-cdense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fsparse:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ojalgo:ojalgo:48.4.1" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-interpolation:2.6.0" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-math:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp-platform:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:ios-arm64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:ios-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-armhf:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-arm64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-ppc64le:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:macosx-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas-platform:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:ios-arm64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:ios-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-armhf:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-arm64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-ppc64le:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:macosx-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="module" module-name="meteoinfo-geometry" />
<orderEntry type="library" name="Maven: org.locationtech.jts:jts-core:1.17.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-table" />
<orderEntry type="module" module-name="meteoinfo-image" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-imaging:1.0-alpha2" level="project" />
<orderEntry type="module" module-name="meteoinfo-data" />
<orderEntry type="module" module-name="meteoinfo-projection" />
<orderEntry type="library" name="Maven: org.locationtech.proj4j:proj4j:1.1.4" level="project" />
<orderEntry type="library" name="Maven: net.sf.geographiclib:GeographicLib-Java:1.52" level="project" />
<orderEntry type="module" module-name="meteoinfo-dataframe" />
<orderEntry type="library" name="Maven: edu.ucar:netcdfAll:5.5.3-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.github.albfernandez:juniversalchardet:2.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf:2.0.1" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf-extras:2.0.1" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.formdev:svgSalamander:1.1.3" level="project" />
<orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13.2" level="project" />
<orderEntry type="module" module-name="meteoinfo-ui" /> <orderEntry type="module" module-name="meteoinfo-ui" />
<orderEntry type="module" module-name="meteoinfo-common" />
<orderEntry type="library" name="Maven: com.google.guava:guava:30.1.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.8.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.5.1" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: com.toedter:jcalendar:1.4" level="project" />
<orderEntry type="library" name="Maven: org.meteothink:wContour:1.7.1" level="project" /> <orderEntry type="library" name="Maven: org.meteothink:wContour:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath:1.0.7" level="project" /> <orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-greek:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-cyrillic:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" /> <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.l2fprod:l2fprod-common-all:0.1" level="project" /> <orderEntry type="library" name="Maven: com.l2fprod:l2fprod-common-all:0.1" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-util:2.0.2" level="project" /> <orderEntry type="library" name="Maven: org.freehep:freehep-util:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.netbeans:openide-lookup:1.9-patched-1.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-emf:2.4" level="project" /> <orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-emf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-io:2.2.2" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-tests:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsbase:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-pdf:2.4" level="project" /> <orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-pdf:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphics2d:2.4" level="project" /> <orderEntry type="library" name="Maven: org.freehep:freehep-graphics2d:2.4" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-ps:2.4" level="project" /> <orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-ps:2.4" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:v2.4.0-rc4" level="project" /> <orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all:v2.4.0-rc4" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all-natives-linux-aarch64:v2.4.0-rc4" level="project" /> <orderEntry type="library" name="Maven: org.jogamp.jogl:jogl-all-natives-linux-aarch64:v2.4.0-rc4" level="project" />
@ -124,9 +41,92 @@
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-natives-windows-amd64:v2.4.0-rc4" level="project" /> <orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-natives-windows-amd64:v2.4.0-rc4" level="project" />
<orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-natives-windows-i586:v2.4.0-rc4" level="project" /> <orderEntry type="library" name="Maven: org.jogamp.gluegen:gluegen-rt-natives-windows-i586:v2.4.0-rc4" level="project" />
<orderEntry type="library" name="Maven: org.joml:joml:1.9.25" level="project" /> <orderEntry type="library" name="Maven: org.joml:joml:1.9.25" level="project" />
<orderEntry type="module" module-name="meteoinfo-console" />
<orderEntry type="library" name="Maven: org.python:jython-standalone:2.7.2" level="project" /> <orderEntry type="library" name="Maven: org.python:jython-standalone:2.7.2" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:rsyntaxtextarea:3.1.1" level="project" /> <orderEntry type="library" name="Maven: com.fifesoft:rsyntaxtextarea:3.1.1" level="project" />
<orderEntry type="library" name="Maven: com.fifesoft:autocomplete:3.1.0" level="project" /> <orderEntry type="library" name="Maven: com.fifesoft:autocomplete:3.1.0" level="project" />
<orderEntry type="module" module-name="meteoinfo-math" />
<orderEntry type="module" module-name="meteoinfo-geometry" />
<orderEntry type="module" module-name="meteoinfo-table" />
<orderEntry type="module" module-name="meteoinfo-image" />
<orderEntry type="module" module-name="meteoinfo-data" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf:2.0.1" level="project" />
<orderEntry type="library" name="Maven: com.formdev:flatlaf-extras:2.0.1" level="project" />
<orderEntry type="library" name="Maven: com.itextpdf:itextpdf:5.5.13.2" level="project" />
<orderEntry type="module" module-name="meteoinfo-common" />
<orderEntry type="library" name="Maven: com.toedter:jcalendar:1.4" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-greek:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.scilab.forge:jlatexmath-font-cyrillic:1.0.7" level="project" />
<orderEntry type="library" name="Maven: org.netbeans:openide-lookup:1.9-patched-1.0" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsio-tests:2.4" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-graphicsbase:2.4" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="module" module-name="meteoinfo-ndarray" />
<orderEntry type="library" name="Maven: org.ejml:ejml-experimental:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-simple:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ojalgo:ojalgo:48.4.1" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-interpolation:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp-platform:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas-platform:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.locationtech.jts:jts-core:1.17.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-imaging:1.0-alpha2" level="project" />
<orderEntry type="module" module-name="meteoinfo-projection" />
<orderEntry type="module" module-name="meteoinfo-dataframe" />
<orderEntry type="library" name="Maven: edu.ucar:netcdfAll:5.5.3-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.github.albfernandez:juniversalchardet:2.4.0" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.formdev:svgSalamander:1.1.3" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:30.1.1-jre" level="project" />
<orderEntry type="library" name="Maven: org.freehep:freehep-io:2.2.2" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:2.0.0" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-core:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-ddense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-dsparse:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-zdense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fdense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-cdense:0.40" level="project" />
<orderEntry type="library" name="Maven: org.ejml:ejml-fsparse:0.40" level="project" />
<orderEntry type="library" name="Maven: com.github.haifengl:smile-math:2.6.0" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-arm64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:android-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:ios-arm64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:ios-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-armhf:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-arm64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-ppc64le:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:linux-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:macosx-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:javacpp:windows-x86_64:1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-arm64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:android-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:ios-arm64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:ios-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-armhf:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-arm64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:linux-ppc64le:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:macosx-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.bytedeco:openblas:windows-x86_64:0.3.10-1.5.4" level="project" />
<orderEntry type="library" name="Maven: org.locationtech.proj4j:proj4j:1.1.4" level="project" />
<orderEntry type="library" name="Maven: net.sf.geographiclib:GeographicLib-Java:1.52" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.8.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.5.1" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
</component> </component>
</module> </module>

View File

@ -5669,6 +5669,7 @@ public class ArrayMath {
while (iter.hasNext()) { while (iter.hasNext()) {
list.add(iter.getIntNext()); list.add(iter.getIntNext());
} }
shape[i] = list.size();
} else { } else {
list = (List<Integer>) k; list = (List<Integer>) k;
shape[i] = list.size(); shape[i] = list.size();