Source code for opendrift.models.openoil.adios.models.oil.distillation

'''
    Classes for storing measured values within an Oil record
'''
from dataclasses import dataclass, field

from ..common.utilities import dataclass_to_json, JSON_List
from ..common.measurement import (Time,
                                  Temperature,
                                  MassFraction,
                                  VolumeFraction,
                                  MassOrVolumeFraction,
                                  Concentration,
                                  Unitless,
                                  Dimensionless,
                                  Density,
                                  DynamicViscosity,
                                  KinematicViscosity,
                                  InterfacialTension,
                                  Pressure,
                                  AngularVelocity)

from ..common.validators import EnumValidator
from .validation.warnings import WARNINGS
from .validation.errors import ERRORS


[docs]@dataclass_to_json @dataclass class DistCut: fraction: MassOrVolumeFraction vapor_temp: Temperature
[docs]class DistCutList(JSON_List): item_type = DistCut
[docs]@dataclass_to_json @dataclass class Distillation: type: str = None method: str = None end_point: Temperature = None fraction_recovered: MassOrVolumeFraction = None cuts: DistCutList = field(default_factory=DistCutList) def validate(self): msgs = [] if self.cuts: # only need to validate if there are cuts msgs.extend(EnumValidator({"mass fraction", "volume fraction"}, ERRORS["E032"], case_insensitive=True)(self.type)) if self.fraction_recovered is None: msgs.append(WARNINGS["W009"]) else: frac_recov = self.fraction_recovered.converted_to("fraction") if frac_recov.value is not None: val = frac_recov.value elif frac_recov.max_value is not None: val = frac_recov.max_value else: val = None msgs.append(WARNINGS["W009"]) if val is not None: if not (0.0 <= val <= 1.0): msgs.append(ERRORS["E041"] .format("distillation fraction recovered", val)) for cut in self.cuts: frac = cut.fraction.converted_to('fraction').value if not (0.0 <= frac <= 1.0): msgs.append(ERRORS["E041"] .format("distillation fraction", frac)) vt = cut.vapor_temp.convert_to('C').value if vt < -100.0: t = f"{cut.vapor_temp.value:.2f} {cut.vapor_temp.unit}" msgs.append(ERRORS["E040"] .format("distillation vapor temp", t)) return msgs