Source code for TidalPy.rheology.viscosity.viscosity

from typing import TYPE_CHECKING

import numpy as np

from TidalPy.exceptions import (IncorrectMethodToSetStateProperty, InitiatedPropertyChangeError,
                                OuterscopePropertySetError)
from TidalPy.utilities.classes.model import LayerModelHolder

from . import known_model_const_args, known_model_live_args, known_models
if TYPE_CHECKING:
    from TidalPy.utilities.types import FloatArray
    from TidalPy.rheology import Rheology
    from TidalPy.structures.layers import PhysicalLayerType


[docs] class ViscosityParentClass(LayerModelHolder): """ ViscosityParentClass Common Viscosity class for liquid and solid viscosity models. See Also -------- TidalPy.utilities.methods.model.LayerModelHolder TidalPy.rheology.Rheology TidalPy.rheology.viscosity.LiquidViscosityParent TidalPy.rheology.viscosity.SolidViscosityParent """ is_liquid = False def __init__( self, layer: 'PhysicalLayerType', rheology_class: 'Rheology', model_name: str = None, store_config_in_layer: bool = True, initialize: bool = True ): """ Constructor for Parent Viscosity class Common Viscosity class for liquid and solid viscosity models. Parameters ---------- layer : PhysicalLayerType The layer instance which the complex compliance should perform calculations on. rheology_class : Rheology Rheology class instance where the complex compliance model is stored. model_name : str = None The user-provided complex compliance name. store_config_in_layer: bool = True Flag that determines if the final complex compliance model's configuration dictionary should be copied into the `layer.config` dictionary. initialize : bool = True Determines if initial reinit should be performed on the model (loading in data from its `self.config`). """ super().__init__(layer, model_name, store_config_in_layer, initialize=False) # Initialized properties self._rheology_class = rheology_class # State properties self._viscosity = None if initialize: self.reinit(initial_init=True)
[docs] def clear_state(self): super().clear_state() self._viscosity = None
def _calculate(self) -> 'FloatArray': """ Wrapper for the viscosity calculator Returns ------- viscosity : FloatArray Viscosity of the layer [Pa s] """ if type(self.temperature) is np.ndarray: viscosity = self.func_array(*self.live_inputs, *self.inputs) else: viscosity = self.func(*self.live_inputs, *self.inputs) self._viscosity = viscosity return viscosity # # Initialized properties @property def rheology_class(self) -> 'Rheology': """ The rheology class instance where the complex compliance model is stored """ return self._rheology_class @rheology_class.setter def rheology_class(self, value): raise InitiatedPropertyChangeError # # State properties @property def viscosity(self) -> 'FloatArray': """ Viscosity (Solid or Liquid depending on the class type) no partial melting effects have been applied """ return self._viscosity @viscosity.setter def viscosity(self, value): raise IncorrectMethodToSetStateProperty # # Outer-scope references @property def temperature(self): """ Outer-scope wrapper for layer.temperature """ return self.layer.temperature @temperature.setter def temperature(self, value): raise OuterscopePropertySetError @property def pressure(self) -> 'FloatArray': """ Outer-scope wrapper for layer.pressure """ # Pressure is often turned off in various model runs, so it may not be set. If that is the case let's make sure # that zeros are provided. _pressure = self.layer.pressure if _pressure is None or not self.layer.use_pressure_in_strength_calc: _pressure = np.zeros_like(self.temperature) return _pressure @pressure.setter def pressure(self, value): raise OuterscopePropertySetError
[docs] class LiquidViscosity(ViscosityParentClass): """ LiquidViscosity Model for calculating viscosity of a liquid. See Also -------- TidalPy.utilities.methods.model.LayerModelHolder TidalPy.rheology.Rheology TidalPy.rheology.viscosity.ViscosityParentClass """ known_models = known_models known_model_const_args = known_model_const_args known_model_live_args = known_model_live_args model_config_key = 'liquid_viscosity' is_liquid = True
[docs] class SolidViscosity(ViscosityParentClass): """ SolidViscosity Model for calculating viscosity of a solid. See Also -------- TidalPy.utilities.methods.model.LayerModelHolder TidalPy.rheology.Rheology TidalPy.rheology.viscosity.ViscosityParentClass """ known_models = known_models known_model_const_args = known_model_const_args known_model_live_args = known_model_live_args model_config_key = 'solid_viscosity' is_liquid = False