Source code for opendrift.models.openoil.adios.models.oil.cleanup.density

"""
cleanups that work with density
"""
import math
from operator import itemgetter

import unit_conversion as uc

from .cleanup import Cleanup

from ....computation.physical_properties import Density

[docs]class FixAPI(Cleanup): """ adds (or replaces) the API value, from the density measurements NOTE: this could be extended to interpolate, but it that actually needed? There is code in the computation.physical_properties package to help, if needed. """ ID = "001"
[docs] def check(self): """ checks to see if there is something to fix returns: flag, msg if nothing is needed, flag is None if something can be cleaned up, flag is True if something is wrong, but can not be cleaned up, flag is False fixme: -- maybe cleanup and validation should be better integrated? """ API = self.oil.metadata.API # densities = oil.sub_samples[0].physical_properties.densities if API is None: density = self.find_density_near_15C() if density: return (True, f"Cleanup: {self.ID}: No API value provided for {self.oil.oil_id}" " -- can be computed from density") else: return (False, f"Cleanup: {self.ID}: No API value provided for {self.oil.oil_id}" " -- can NOT be computed from density") return None, "API is fine"
[docs] def cleanup(self): """ run this particular cleanup option :param oil: an Oil object to act on :param do_it=False: flag to tell the cleanup to do its thing. If False, the method returns a message. If True, the action is taken, and the Oil object is altered. :returns: a message of what could be done, or what was done. """ density_at_15 = self.find_density_near_15C() if density_at_15: API = uc.convert("density", "kg/m^3", "API", density_at_15) self.oil.metadata.API = round(API, 2) return f"Cleanup: {self.ID}: Set API for {self.oil.oil_id} to {API}."
[docs] def check_for_valid_api(self): """ check is the API value is already valid """ API = self.oil.metadata.API density_at_15 = self.find_density_near_15C() if uc.convert("density", "kg/m^3", "API", density_at_15) == API: return True else: return False
[docs] def find_density_near_15C(self): """ Returns the density (in kg/m3) It will interpolate and extrapolate as needed """ try: return Density(self.oil).at_temp(uc.convert("C", "K", 15)) except ValueError: return None