adios_db.computation package

Utilities for doing computation with the oil data

For the most part, what these do is extract the actual data in an Oil object with specified units, etc.

There are also some facilities for working with the data, such as interpolating, etc.

Submodules

adios_db.computation.estimations module

Code for estimating various properties that aren’t in a oil record.

These can be used to generate complete oil specifications for modeling, etc.

Note: there is code in here to make various estimations of

SARA fractionations – be warned, these are of unceratain use, and not very accurate

adios_db.computation.estimations.aromatic_densities(boiling_points)
adios_db.computation.estimations.aromatic_mol_wt(boiling_point)
Source: Dr. M. R. Riazi,

Characterization and Properties of Petroleum Fractions eq. 2.48 and table 2.6

Note: for this to actually work in every case, we need to limit

our temperature to: - T_i < 1015.0 - T_i > 1015.0 - exp(6.911) (roughly about == 11.76)

adios_db.computation.estimations.aromatics_fraction(f_res, f_asph, f_sat)
adios_db.computation.estimations.asphaltene_densities(boiling_points)
adios_db.computation.estimations.asphaltene_fraction(density, viscosity, f_other=0.0)
adios_db.computation.estimations.asphaltene_mol_wt(boiling_points)

Source: Recommendation from Bill Lehr

adios_db.computation.estimations.cut_temps_from_api(api, N=5)
Source: Adios2 & Jones R. (1997),

A Simplified Pseudo-component Oil Evaporation Model, Proceedings of the 20th Arctic and Marine Oil Spill Program, Vancouver, CA, Vol. 1, pp. 43-62

Generate distillation cut temperatures from the oil’s API.

adios_db.computation.estimations.emul_water(density, viscosity)

This function computes two terms used in emulsification. Ymax is the maximum water fraction of a stable emulsion. Smax is the maximum surface area of the water droplets inside the emulsion. (from ADIOS2)

adios_db.computation.estimations.flash_point_from_api(api)
Source: Reference: Chang A., K. Pashakanti, and Y. Liu (2012),

Integrated Process Modeling and Optimization, Wiley Verlag.

adios_db.computation.estimations.flash_point_from_bp(temp_k)
Source: Reference: Chang A., K. Pashakanti, and Y. Liu (2012),

Integrated Process Modeling and Optimization, Wiley Verlag.

adios_db.computation.estimations.fmasses_flat_dist(f_res=0, f_asph=0, N=5)

Generate a flat distribution of N distillation cut fractional masses.

adios_db.computation.estimations.fmasses_from_cuts(f_evap_i)

Generate distillation cut fractional masses from the cumulative distillation fractions in the cut data.

adios_db.computation.estimations.oil_water_surface_tension_from_api(api)
adios_db.computation.estimations.pour_point_from_kvis(ref_kvis, ref_temp_k)

Source: Adios2

If we have an oil kinematic viscosity at a reference temperature, then we can estimate what its pour point might be.

adios_db.computation.estimations.resin_densities(boiling_points)
adios_db.computation.estimations.resin_fraction(density, viscosity, f_other=0.0)
adios_db.computation.estimations.resin_mol_wt(boiling_points)

Source: Recommendation from Bill Lehr

adios_db.computation.estimations.saturate_densities(boiling_points)
adios_db.computation.estimations.saturate_mass_fraction(fmass_i, temp_k, total_sat=None)

Source: Dr. Robert Jones, based on average of 51 Exxon oils This assumes we do not known the SARA totals for the oil

adios_db.computation.estimations.saturate_mol_wt(boiling_point)
Source: Dr. M. R. Riazi,

Characterization and Properties of Petroleum Fractions eq. 2.48 and table 2.6

Note: for this to actually work in every case, we need to limit

our temperature to: - T_i < 1070.0 - T_i > - T_i > 1070.0 - exp(6.98291) (roughly about == -8.06)

adios_db.computation.estimations.saturates_fraction(density, viscosity, f_other=0.0)
adios_db.computation.estimations.trial_densities(boiling_points, watson_factor)
Source: Dr. M. R. Riazi,

Characterization and Properties of Petroleum Fractions eq. 2.13 and table 9.6

Generate an initial estimate of volatile oil components based on boiling points and the Watson Characterization Factor. This is only good for estimating Aromatics & Saturates.

adios_db.computation.gnome_oil module

Code for making a “GnomeOil” from an Oil Object

See the PyGNOME code for more about GNOME’s requirements

NOTE: This make s JSON compatible Python structure from which to build a GnomeOil

adios_db.computation.gnome_oil.clamp(x, M, zeta=0.03)

We make use of a generalized logistic function or Richard’s curve to generate a linear function that is clamped at x == M. We make use of a zeta value to tune the parameters nu, resulting in a smooth transition as we cross the M boundary.

adios_db.computation.gnome_oil.component_densities(boiling_points)

estimate component densities from boiling point

adios_db.computation.gnome_oil.component_mass_fractions(oil)

estimate pseudocomponent mass fractions

adios_db.computation.gnome_oil.component_mol_wt(boiling_points)

estimate component molecular weight from boiling point

adios_db.computation.gnome_oil.component_temps(cut_temps, _N=10)

component temps from boiling point

adios_db.computation.gnome_oil.component_types(cut_temps, N=10)

set component SARA types

adios_db.computation.gnome_oil.estimate_pour_point(oil)

estimate pour point from kinematic viscosity

adios_db.computation.gnome_oil.get_empty_dict()

This provides an empty dictionary with everything that is needed to generate a GNOME Oil

adios_db.computation.gnome_oil.inert_fractions(oil, density=None, viscosity=None)

resins and asphaltenes from database or estimated if None

adios_db.computation.gnome_oil.make_gnome_oil(oil)

Make a dict that a GnomeOil can be built from

A GnomeOil needs:

“name, “# Physical properties “api, “pour_point, “solubility, # kg/m^3 “# emulsification properties “bullwinkle_fraction, “bullwinkle_time, “emulsion_water_fraction_max, “densities, “density_ref_temps, “density_weathering, “kvis, “kvis_ref_temps, “kvis_weathering, “# PCs: “mass_fraction, “boiling_point, “molecular_weight, “component_density, “sara_type, “adios_oil_id=None,

adios_db.computation.gnome_oil.normalized_cut_values(oil)
adios_db.computation.gnome_oil.normalized_cut_values_adios(oil)
adios_db.computation.gnome_oil.sara_totals(oil)

get SARA from database estimate if no data

adios_db.computation.physical_properties module

utilities for doing computation on the physical properties of an oil record

class adios_db.computation.physical_properties.Density(oil)

Bases: object

class to hold and do calculations on density

data is stored internally in standard units: temperature in Kelvin density in kg/m^3

at_temp(temp, unit='K')

density(s) at the provided temperature(s)

Parameters:
  • temp – scalar or sequence of temp in K

  • unit='K' – unit of temperature

densities will be returned as kg/m^3

initialize()

Initialize the expansion coefficient

For outside the measured range

class adios_db.computation.physical_properties.KinematicViscosity(oil_or_data, k_v2=None)

Bases: object

Class to hold and do calculations on kinematic viscosity

Data is stored internally in standard units: temperature in Kelvin viscosity in m^2/s

Viscosity as a function of temp is given by:

v = A exp(k_v2 / T)

at_temp(temp, kvis_units='m^2/s', temp_units='K')

Compute the kinematic viscosity of the oil as a function of temperature

Parameters:

temp_k – temperatures to compute at: can be scalar or array of values. Should be in Kelvin

viscosity as a function of temp is given by: v = A exp(k_v2 / T)

with constants determined from measured data

default_kv2(density, product_type)

Get the coefficient of viscosity at 15C

Parameters:
  • density – density at 15C

  • product_type – density at 15C

for each oil type line fit to coefficient of viscosity vs density scatter plot: kv2 = slope * density + intercept

initialize()

viscosity as a function of temp is given by:

v = A exp(k_v2 / T)

The constants, A and k_v2 are determined from the viscosity data:

If only one data point, a default value for k_vs is used:

2100 K, based on analysis of data in the ADIOS database as of 2018

If two data points, the two constants are directly computed

If three or more, the constants are computed by a least squares fit.

slope_intercept_kv2 = {'Bio-fuel Oil': (-35.3808, 33221, 0), 'Bitumen Blend': (56.89, -46772.773, 0), 'Condensate': (149.39, -108117.618, 844), 'Crude Oil NOS': (22.14, -13547.38, 0), 'Dielectric Oil': (14.291, -8598.1815), 'Distillate Fuel Oil': (47.8421, -36442.499, 0), 'Lube Oil': (-1.851, 6432, 0), 'Residual Fuel Oil': (89.557, -75563.817, 0), 'Solvent': (3.2533, -221.49, 0), 'Tight Oil': (22.57, -13935.62, 0)}
adios_db.computation.physical_properties.bullwinkle_fraction(oil)
adios_db.computation.physical_properties.convert_dvisc_to_kvisc(dvisc, density)

convert dynamic viscosity to kinematic viscosity

Parameters:

density – an initialized Density object

dvisc is a table as returned from:

  • get_dynamic_viscosity_data

e.g. [(0.043, 275.15), (0.012, 286.15), (0.0054, 323.15)]

units: viscosity: Pa s or kg/(m s) (same thing)

density: kg/m^3

adios_db.computation.physical_properties.emul_water(oil)

This function computes two terms used in emulsification. Ymax is the maximum water fraction of a stable emulsion. Smax is the maximum surface area of the water droplets inside the emulsion. (from ADIOS2)

adios_db.computation.physical_properties.get_density_data(oil, units='kg/m^3', temp_units='K')

Return a table of density data:

list of (density, temp) pairs

Parameters:
  • oil – the oil object to get data from

  • units="kg/m^3" – units you want the density in

  • temp_units="K" – units you want the density in

adios_db.computation.physical_properties.get_distillation_cuts(oil, units='fraction', temp_units='K')

Return a table of distillation data:

list of (cut fraction, temp) pairs

Parameters:
  • oil – the oil object to get data from

  • units="fraction" – units you want the fraction in

  • temp_units="K" – units you want the temperature in

adios_db.computation.physical_properties.get_dynamic_viscosity_data(oil, units='Pas', temp_units='K', shear_rate=None)

Return a table of dynamic viscosity data:

list of (viscosity, temp) pairs

Parameters:
  • oil – the oil object to get data from

  • units="Pas" – units you want the viscosity in

  • temp_units="K" – units you want the temperature in

  • shear_rate (float or int) – what shear rate the data are for, in 1/s if None, the first shear rate found will be used, if there are more than one.

adios_db.computation.physical_properties.get_flash_point(oil)

Return oil’s FLash Point or None

adios_db.computation.physical_properties.get_frac_recovered(oil, units='fraction')

Return fraction recovered or None and whether fraction recovered is in the database T or F

Parameters:
  • oil – the oil object to get data from

  • units="fraction" – units you want the fraction in

adios_db.computation.physical_properties.get_interfacial_tension_seawater(oil, units='N/m', temp_units='K')

Return a table of interfacial tension data:

list of (interfacial tension, temp) pairs

Parameters:
  • oil – the oil object to get data from

  • units="N/m" – units you want the interfacial tension in

  • temp_units="K" – units you want the reference temperature in

adios_db.computation.physical_properties.get_interfacial_tension_water(oil, units='N/m', temp_units='K')

Return a table of interfacial tension data:

list of (interfacial tension, temp) pairs

Parameters:
  • oil – the oil object to get data from

  • units="N/m" – units you want the interfacial tension in

  • temp_units="K" – units you want the reference temperature in

adios_db.computation.physical_properties.get_kinematic_viscosity_data(oil, units='m^2/s', temp_units='K', shear_rate=None)

Return a table of kinematic viscosity data:

list of (viscosity, temp) pairs

Parameters:
  • oil – the oil object to get data from

  • units="m^2/s" – units you want the viscosity in

  • temp_units="K" – units you want the temperature in

  • shear_rate (float or int) – what shear rate the data are for, in 1/s if None, the first shear rate found will be used, if there are more than one.

adios_db.computation.physical_properties.get_pour_point(oil)

Return oil’s pour point or None

adios_db.computation.physical_properties.max_water_fraction_emulsion(oil)

This function looks for max water fraction in the database The value chosen from the database is the maximum water fraction of a stable emulsion.

adios_db.computation.utilities module

assorted utilities for querying an Oil object

adios_db.computation.utilities.get_evaporated_subsample(oil)

return the first evaporated sub_sample if there is one: