forked from open-atmos/PySDM
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add
FallVelocity
attribute and RelaxedVelocity
dynamic (and tests) (
open-atmos#1105) Co-authored-by: Sylwester Arabas <sylwester.arabas@agh.edu.pl> Co-authored-by: Sylwester Arabas <sylwester.arabas@uj.edu.pl>
- Loading branch information
1 parent
43b3873
commit e4d9009
Showing
24 changed files
with
525 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
""" | ||
Attributes for tracking droplet velocity | ||
""" | ||
|
||
from PySDM.attributes.impl.derived_attribute import DerivedAttribute | ||
from PySDM.attributes.impl.extensive_attribute import ExtensiveAttribute | ||
|
||
|
||
class RelativeFallMomentum(ExtensiveAttribute): | ||
def __init__(self, builder): | ||
super().__init__(builder, name="relative fall momentum", dtype=float) | ||
|
||
|
||
class RelativeFallVelocity(DerivedAttribute): | ||
def __init__(self, builder): | ||
self.momentum = builder.get_attribute("relative fall momentum") | ||
self.volume = builder.get_attribute("volume") | ||
self.rho_w = builder.formulae.constants.rho_w # TODO #798 | ||
|
||
super().__init__( | ||
builder, | ||
name="relative fall velocity", | ||
dependencies=(self.momentum, self.volume), | ||
) | ||
|
||
def recalculate(self): | ||
self.data.ratio(self.momentum.get(), self.volume.get()) | ||
self.data[:] *= 1 / self.rho_w # TODO #798 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
""" | ||
A dynamic which relaxes | ||
`PySDM.attributes.physics.relative_fall_velocity.RelativeFallVelocity` | ||
towards the terminal velocity | ||
""" | ||
|
||
from math import exp | ||
|
||
from PySDM.attributes.impl.attribute import Attribute | ||
from PySDM.particulator import Particulator | ||
|
||
|
||
class RelaxedVelocity: # pylint: disable=too-many-instance-attributes | ||
""" | ||
A dynamic which updates the fall momentum according to a relaxation timescale `tau` | ||
""" | ||
|
||
def __init__(self, tau): | ||
self.tau: float = tau | ||
|
||
self.particulator = None | ||
self.fall_momentum_attr = None | ||
self.terminal_vel_attr = None | ||
self.volume_attr = None | ||
self.rho_w = None # TODO #798 - we plan to use masses instead of volumes soon | ||
self.tmp_data = None | ||
|
||
def register(self, builder): | ||
self.particulator: Particulator = builder.particulator | ||
|
||
self.fall_momentum_attr: Attribute = builder.get_attribute( | ||
"relative fall momentum" | ||
) | ||
self.terminal_vel_attr: Attribute = builder.get_attribute("terminal velocity") | ||
self.volume_attr: Attribute = builder.get_attribute("volume") | ||
|
||
self.rho_w: float = builder.formulae.constants.rho_w # TODO #798 | ||
|
||
self.tmp_data = self.particulator.Storage.empty( | ||
(self.particulator.n_sd,), dtype=float | ||
) | ||
|
||
def __call__(self): | ||
self.tmp_data.product(self.terminal_vel_attr.get(), self.volume_attr.get()) | ||
self.tmp_data *= ( | ||
self.rho_w # TODO #798 | ||
) # TODO #798 - we plan to use masses instead of volumes soon | ||
self.tmp_data -= self.fall_momentum_attr.get() | ||
self.tmp_data *= 1 - exp(-self.particulator.dt / self.tau) | ||
|
||
self.fall_momentum_attr.data += self.tmp_data | ||
|
||
self.particulator.attributes.mark_updated("relative fall momentum") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
""" | ||
Initialize the `PySDM.attributes.physics.relative_fall_velocity.RelativeFallMomentum` | ||
of droplets | ||
""" | ||
|
||
import numpy as np | ||
|
||
from PySDM.backends import CPU | ||
from PySDM.dynamics.terminal_velocity import Interpolation | ||
from PySDM.formulae import Formulae | ||
from PySDM.particulator import Particulator | ||
|
||
|
||
def init_fall_momenta( | ||
volume: np.ndarray, | ||
rho_w: float, # TODO #798 - we plan to use masses instead of volumes soon | ||
zero: bool = False, | ||
terminal_velocity_approx=Interpolation, | ||
): | ||
""" | ||
Calculate default values of the | ||
`PySDM.attributes.physics.relative_fall_velocity.RelativeFallMomentum` attribute | ||
(needed when using | ||
`PySDM.attributes.physics.relative_fall_velocity.RelativeFallVelocity` attribute) | ||
Parameters: | ||
- volume: a numpy array of superdroplet volumes | ||
- rho_w: the density of water (generally found in formulae.constants) | ||
Returns: | ||
- a numpy array of initial momentum values | ||
""" | ||
if zero: | ||
return np.zeros_like(volume) | ||
|
||
particulator = Particulator(0, CPU(Formulae())) | ||
|
||
approximation = terminal_velocity_approx(particulator=particulator) | ||
|
||
radii_arr = particulator.formulae.trivia.radius(volume) | ||
radii = particulator.Storage.from_ndarray(radii_arr) | ||
|
||
output = particulator.Storage.empty((len(volume),), dtype=float) | ||
|
||
approximation(output=output, radius=radii) | ||
|
||
return output.to_ndarray() * volume * rho_w # TODO #798 |
Oops, something went wrong.