model.new_unit_adoption

class NewUnitAdoption:

This is the base class that contains the calculations for Ocean-related Unit Adoption scenarios. Used for both PDS adoption and REF adoption.

NewUnitAdoption( base_year: int, start_year: int, end_year: int, adoption_scenario_to_load: str, adoption_input_file: str)

Initialise with base year, start year, end year, the name of the adoption scenario to load, and the adoption input file (either pds scenario or reference scenario).

"base year" specifies the year the time series should start. Start year is the start of the reporting period, end year specifies the end of the reporting period. adoption_scenario_to_load is a string used to load the relevant scenario - e.g. for the pds scenario "AverageOfAllScenarios". adoption_input_file is a path to the file used to store the data for this adoption_scenario_to_load.

def get_area_units(self) -> pandas.core.series.Series:

Return a copy of the total land or ocean area time series.

def get_skeleton(self) -> pandas.core.series.Series:

Return a deep copy of the unit adoption time series with all values replaced with zeroes.

def get_units_adopted(self) -> pandas.core.series.Series:

Return a copy of the implementation units adopted.

def annual_breakout(self, expected_lifetime) -> pandas.core.series.Series:

Return a time series breakout of new units per year, including replacements. Use to calculate operating cost, lifetime operating savings, and net profit margin.

Calculate the number of new sets of SOLUTION implementation units installed over the lifetime of the units, but only for new or replacement units installed during the analysis period. Fixed and Variable costs are not applied here, but can then be applied by the function caller.

This calculation assumes that:

  1. No units installed after the end year are included
  2. Only units installed in year X are accounted for in year X.

Note:

  1. Each column represents the sum of all units (and their replacements) initially installed in the year at top of column.
  2. Each row represents a particular year of attribution
  3. Number of units depends on year of installation, and restarts for replacement units
  4. For the last year, calculates the fraction of a year remaining in the lifetime

Implementation: Include installed units for this column in this row year if all are true:

  1. row year >= Initial Installation Year + delay years required until start of period
  2. row year < final lifetime year of all initial and replacement units for this column (=period of analysis + # years this column expected to last past end of period)
def get_operating_cost(self, expected_lifetime, operating_cost) -> pandas.core.series.Series:

Return a time series of the operating costs, summed by year.

def get_incremental_units_per_period(self, expected_lifetime) -> pandas.core.series.Series:

Return a time series of implementation units for each year

def get_install_cost_per_land_unit(self, first_cost) -> pandas.core.series.Series:

Return a time series of installation costs per year.

def get_annual_world_first_cost(self, expected_lifetime, first_cost) -> pandas.core.series.Series:

Return a time series of the number of units implemented per year multiplied by the first cost

def get_lifetime_operating_savings(self, expected_lifetime, operating_cost) -> pandas.core.series.Series:

Return a time series of operating savings over the reporting period by year, multiplied by the operating cost.

def get_lifetime_cashflow_npv( self, purchase_year, discount_rate, conventional_expected_lifetime, solution_expected_lifetime, operating_cost, conventional_first_cost, solution_first_cost) -> pandas.core.series.Series:

Return a time series of discounted cash flows for the solution expected lifetime. Calculate using first cost and operating cost.

def get_net_profit_margin(self, expected_lifetime, net_profit_margin) -> pandas.core.series.Series:

Return a time series breakdown of net profit margin per year over the reporting period.

def set_area_units_linear( self, total_area, change_per_period, total_area_as_of_period=None) -> None:

Apply a straight line formula to the time series representing the total land/ocean area.

def apply_linear_regression(self) -> None:

Apply a linear regression to the time series representing the total land/ocean area.

def apply_clip(self, lower=None, upper=None) -> None:

Apply upper and lower bounds to the time series representing the total land/ocean area.

def get_cumulative_degraded_unprotected_area( self, delay_impact_of_protection_by_one_year: bool, growth_rate_of_ocean_degradation: float) -> pandas.core.series.Series:

Return a time series representing the total degraded area. (Millions ha)

Calculation uses the rate supplied by the degradation_rate parameter. This rate is applied only to the area that is not covered by the solution (ie not protected) and that is not degraded.

Calculation

Area Degraded in Previous Year + (Total Area - Protected Area - Area Degraded in Previous Year) * Degradation Rate

def get_total_at_risk_area( self, growth_rate_of_ocean_degradation: float, delay_impact_of_protection_by_one_year: bool) -> pandas.core.series.Series:

Return a time series representing the total area at risk of degradation by anthropogenic or other means. (Millions ha.)

Calculated by identifying how much land is degraded, and how much remains undegraded.

Calculation

Total Area - Area Protected in Current Year - Area Degraded in Current Year

def get_cumulative_degraded_area_under_protection( self, delay_impact_of_protection_by_one_year: bool, disturbance_rate: float) -> pandas.core.series.Series:

Return a time series representing the cumulative degraded area under protection. (Millions ha)

Even protected areas suffer from degradation via disturbances (e.g. natural degradation, logging, storms, fires or human settlement). The disturbance rate is usually equal in the PDS adoption and reference adoption. This disturbance rate represents the degradation of protected area, and is expected to be much less than the degradation rate of unprotected area. Use this to calculate the carbon sequestration, direct emissions, fuel and grid emissions, indirect emissions and total reduction in area degradation result.

Calculation

Protected area that was degraded in Previous Year + (area protected by soln - protected area degraded in previous year) * disturbance tate

def get_total_undegraded_area( self, growth_rate_of_ocean_degradation, disturbance_rate: float = 1.0, delay_impact_of_protection_by_one_year: bool = True) -> pandas.core.series.Series:

Return a time series representing the total area that is not degraded in any particular year. (Millions ha)

Calculated by taking the Total Area and removing the degraded area, which is the same as summing the undegraded area and at-risk area.

Calculation

Total Area - Area Degraded that was Unprotected - Protected Land that is Degraded (via a Disturbance) in Current Year

def get_annual_reduction_in_total_degraded_area( self, disturbance_rate, growth_rate_of_ocean_degradation, delay_impact_of_protection_by_one_year) -> pandas.core.series.Series:

Return a time series representing the change in total degraded area in the adoption each year, added to the total undegraded area for t-1. (Millions ha.)

Used to combine two adoptions, usually pds and reference solution (PDS - REF) like this: annual_reduction_in_total_degraded_area (REF) - annual_reduction_in_total_degraded_area (PDS).

This is equivalent to

Cumulative Area Degraded in REF Scenario for year x - Cumulative Area Degraded in PDS Scenario for year x - Cumulative Degradation Change (PDS - REF) for Year [x-1]

def get_emissions_reduction_series( self, disturbance_rate, growth_rate_of_ocean_degradation, delay_impact_of_protection_by_one_year, emissions_reduced_per_unit_area, use_aggregate_CO2_equivalent_instead_of_individual_GHG: bool) -> pandas.core.series.Series:

Return a time series representing the amount of emissions reduced for each year in the reporting period. (MMT CO2 equivalent).

Calculated by taking the total undegraded area and muliplying by the emissions reduced per unit area.

def get_carbon_sequestration( self, sequestration_rate, disturbance_rate, growth_rate_of_ocean_degradation, delay_impact_of_protection_by_one_year, delay_regrowth_of_degraded_land_by_one_year, use_adoption) -> pandas.core.series.Series:

Return a time series representing the total carbon sequestered by year across the reporting period.

Calculates the total undegraded area and muliplying by sequestration rate multiplied by (1-disturbance rate)