| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| """PhysicsSpecifications contain physical parameters of dynamical systems. |
| |
| To ensure that all model components the expected PhysicsSpecs all modules |
| (except specializing on a particular equation) must instantiate |
| PhysicsSpecs objects using `get_physics_specs`, which should be configured |
| appropriately via `gin`. |
| """ |
|
|
| from typing import Sequence, Union |
| from dinosaur import primitive_equations |
| from dinosaur import scales |
| from dinosaur import shallow_water |
| import gin |
| import numpy as np |
|
|
|
|
| |
| |
| QuantityOrStr = Union[str, scales.Quantity] |
|
|
|
|
| GET_DEFAULT_SCALE = gin.external_configurable( |
| lambda: scales.DEFAULT_SCALE, name='GET_DEFAULT_SCALE') |
| GET_ATMOSPHERIC_SCALE = gin.external_configurable( |
| lambda: scales.ATMOSPHERIC_SCALE, name='GET_ATMOSPHERIC_SCALE') |
|
|
|
|
| @gin.configurable |
| def get_physics_specs(construct_fn=gin.REQUIRED): |
| """Returns physical parameters object generated by `construct_fn`.""" |
| return construct_fn() |
|
|
|
|
| @gin.register |
| def shallow_water_specs_constructor( |
| density_vals: Union[Sequence[float], np.ndarray], |
| density_units: QuantityOrStr = scales.WATER_DENSITY, |
| radius_si: QuantityOrStr = scales.RADIUS, |
| angular_velocity_si: QuantityOrStr = scales.ANGULAR_VELOCITY, |
| gravity_acceleration_si: QuantityOrStr = scales.GRAVITY_ACCELERATION, |
| scale: scales.Scale = scales.DEFAULT_SCALE |
| ) -> shallow_water.ShallowWaterSpecs: |
| """Constructs `ShallowWaterSpecs` using gin-configurable parameters. |
| |
| Args: |
| density_vals: density values for each layer of the shallow water system. |
| density_units: units in which `density_vals` are specified. |
| radius_si: radius of the domain specified with units attached. |
| angular_velocity_si: angular velocity of the domain with units attached. |
| gravity_acceleration_si: gravity on the surface with units attached. |
| scale: a scale object specifying the scales to use for nondimensionalizing. |
| |
| Returns: |
| ShallowWaterSpecs object containing physical parameters of the system. |
| """ |
| densities = np.asarray(density_vals) * scales.Quantity(density_units) |
| return shallow_water.ShallowWaterSpecs.from_si( |
| densities=densities, |
| radius_si=scales.Quantity(radius_si), |
| angular_velocity_si=scales.Quantity(angular_velocity_si), |
| gravity_acceleration_si=scales.Quantity(gravity_acceleration_si), |
| scale=scale) |
|
|
|
|
| @gin.register |
| def primitive_eq_specs_constructor( |
| radius_si: QuantityOrStr = scales.RADIUS, |
| angular_velocity_si: QuantityOrStr = scales.ANGULAR_VELOCITY, |
| gravity_acceleration_si: QuantityOrStr = scales.GRAVITY_ACCELERATION, |
| ideal_gas_constant_si: QuantityOrStr = scales.IDEAL_GAS_CONSTANT, |
| water_vapor_gas_constant_si: QuantityOrStr = scales.IDEAL_GAS_CONSTANT_H20, |
| water_vapor_isobaric_heat_capacity_si: QuantityOrStr = ( |
| scales.WATER_VAPOR_CP), |
| kappa_si: QuantityOrStr = scales.KAPPA, |
| scale: scales.Scale = scales.DEFAULT_SCALE, |
| ) -> primitive_equations.PrimitiveEquationsSpecs: |
| """Constructs `PrimitiveEquationsSpecs` using gin-configurable parameters. |
| |
| Args: |
| radius_si: radius of the domain with units attached. |
| angular_velocity_si: angular velocity of the domain with units attached. |
| gravity_acceleration_si: gravity on the surface with units attached. |
| ideal_gas_constant_si: the gas constant with units attached. |
| water_vapor_gas_constant_si: the gas constant for vapor with units attached. |
| water_vapor_isobaric_heat_capacity_si: isobaric heat capacity of vapor with |
| units attached. |
| kappa_si: `ideal_gas_constant / Cp` where Cp is the isobaric heat capacity. |
| scale: a scale object specifying the scales to use for nondimensionalizing. |
| |
| Returns: |
| PrimitiveEquationsSpecs object containing physical parameters of the system. |
| """ |
| return primitive_equations.PrimitiveEquationsSpecs.from_si( |
| radius_si=scales.Quantity(radius_si), |
| angular_velocity_si=scales.Quantity(angular_velocity_si), |
| gravity_acceleration_si=scales.Quantity(gravity_acceleration_si), |
| ideal_gas_constant_si=scales.Quantity(ideal_gas_constant_si), |
| water_vapor_gas_constant_si=scales.Quantity(water_vapor_gas_constant_si), |
| water_vapor_isobaric_heat_capacity_si=scales.Quantity( |
| water_vapor_isobaric_heat_capacity_si), |
| kappa_si=scales.Quantity(kappa_si), |
| scale=scale) |
|
|