:py:mod:`gnome.weatherers.evaporation` ====================================== .. py:module:: gnome.weatherers.evaporation .. autoapi-nested-parse:: model evaporation process Module Contents --------------- Classes ~~~~~~~ .. autoapisummary:: gnome.weatherers.evaporation.Evaporation gnome.weatherers.evaporation.BlobEvaporation .. py:class:: Evaporation(water=None, wind=None, **kwargs) Bases: :py:obj:`gnome.weatherers.Weatherer` Base Weathering agent. This is almost exactly like the base Mover in the way that it acts upon the model. It contains the same API as the mover as well. Not Serializable since it does is partial implementation :param conditions: gnome.environment.Conditions object which contains things like water temperature :param wind: wind object for obtaining speed at specified time :type wind: Wind API, specifically must have get_value(time) method .. py:attribute:: _schema .. py:attribute:: _ref_as :value: 'evaporation' .. py:attribute:: _req_refs :value: ['water', 'wind'] .. py:method:: prepare_for_model_run(sc) add evaporated key to mass_balance for now also add 'density' key here Assumes all spills have the same type of oil .. py:method:: _mass_transport_coeff(points, model_time) Is wind a function of only model_time? How about time_step? at present yes since wind only contains timeseries data K = c * U ** 0.78 if U <= 10 m/s K = 0.06 * c * U ** 2 if U > 10 m/s If K is expressed in m/sec, then Buchanan and Hurford set c = 0.0025 U is wind_speed 10m above the surface .. note:: wind speed is at least 1 m/s, unless there is an ice aware wind. .. note:: ice aware wind enforces minimum speed before applying coverage factor. .. py:method:: _set_evap_decay_constant(points, model_time, data, substance, time_step) .. py:method:: weather_elements(sc, time_step, model_time) weather elements over time_step - sets 'evaporation' in sc.mass_balance - currently also sets 'density' in sc.mass_balance but may update this as we add more weatherers and perhaps density gets set elsewhere Following diff eq models rate of change each pseudocomponent of oil:: dm(t)/dt = -(1 - fw) * A/B * m(t) Over a time-step, A, B, C are assumed constant. m(t) is the component mass at beginning of timestep; m(t + Dt) is mass at end of timestep:: m(t + Dt) = m(t) * exp(-L * Dt) L := (1 - fw) * A/B Define properties for each pseudocomponent of oil and constants:: vp: vapor pressure mw: molecular weight The following quantities are defined for a given blob of oil. The thickness of the blob is same for all LEs regardless of how many LEs are used to model the blob:: area: area computed from fay spreading m_i: mass of component 'i' sum_m_mw: sum(m_i/mw_i) over all components effect of wind - mass transport coefficient:: K: See _mass_transport_coeff() Finally, Evaporation of component 'i' for blob of oil:: A = area * K * vp B = gas_constant * water_temp * sum_m_mw L becomes:: L = (1 - fw) * area * K * vp/(gas_constant * water_temp * sum_m_mw) .. py:class:: BlobEvaporation(water=None, wind=None, **kwargs) Bases: :py:obj:`Evaporation` playing around with blob evaporation and time varying fay_area experimental code - not currently used by Model. Testing out the algorithm in ipython notebooks. See documentation in source code: gnome/documentation/evaporation/blob_evap.ipynb :param conditions: gnome.environment.Conditions object which contains things like water temperature :param wind: wind object for obtaining speed at specified time :type wind: Wind API, specifically must have get_value(time) method .. py:method:: _set_evap_decay_constant(model_time, data, substance, time_step) testing - for now assume only one spill and instantaneous spill