# Path: dipplanner/settings.py
# __VERSION__ = None
# FRESH_WATER_DENSITY = 1.0  #: water density kg/l
# SEA_WATER_DENSITY = 1.03  #: water density kg/l
# ABSOLUTE_MAX_PPO2 = 2.0  #: in bar
# ABSOLUTE_MIN_PPO2 = 0.16  #: in bar
# ABSOLUTE_MAX_TANK_PRESSURE = 300  #: in bar
# ABSOLUTE_MAX_TANK_SIZE = 2 * 20  #: in liter
# SURFACE_TEMP = 37
# HE_NARCOTIC_VALUE = 0.23  #: helium narcotic value
# N2_NARCOTIC_VALUE = 1.0  #: nitrogen narcotic value
# O2_NARCOTIC_VALUE = 1.0  #: oxygen narcotic value
# AR_NARCOTIC_VALUE = 2.33  #: argon narcotic value
# DEFAULT_AIR_FH2 = 0.0  #: fraction of HE in standard AIR
# DEFAULT_AIR_FN2 = 0.7808  #: fraction of N2 in standard AIR
# DEFAULT_AIR_FO2 = 0.2095  #: fraction of O2 in standard AIR
# DEFAULT_AIR_FAR = 0.00934  #: fraction of AR (argon) in standard AIR
# DEFAULT_AIR_F_INNERT_GAS = DEFAULT_AIR_FH2 + DEFAULT_AIR_FN2 + DEFAULT_AIR_FAR
# STOP_DEPTH_INCREMENT = 3  #: in meter
# LAST_STOP_DEPTH = 3  #: in meter : last stop before surfacing
# STOP_TIME_INCREMENT = 1  #: in second
# FORCE_ALL_STOPS = True
# AMBIANT_PRESSURE_SEA_LEVEL = 1.01325  #: surface pressure (in bar)
# METHOD_FOR_DEPTH_CALCULATION = 'complex'  #: either simple (/10) or complex
# TRAVEL_SWITCH = 'late'  #: "late" or "early"
# FLIGHT_ALTITUDE = 2450
# TEMPLATE = "default-color.tpl"  #: template should be in templates/ directory
# DECO_MODEL = "ZHL16c"  #: ZHL16c or ZHL16b or ZHL16a
# BUHLMANN_VALUES = "1a"  #: 1a (4 mins for 1st comp) or 1b (5 mins)
# WATER_DENSITY = SEA_WATER_DENSITY  #: water density kg/l
# AMBIANT_PRESSURE_SURFACE = AMBIANT_PRESSURE_SEA_LEVEL
# DEFAULT_MAX_PPO2 = 1.6  #: in bar
# DEFAULT_MIN_PPO2 = 0.16  #: in bar
# DEFAULT_MAX_END = 30  #: in meter
# DIVE_CONSUMPTION_RATE = 20.0 / 60  #: liter/s
# DECO_CONSUMPTION_RATE = 17.0 / 60  #: liter/s
# DESCENT_RATE = 20 / 60   #: m/s
# ASCENT_RATE = 10 / 60   #: m/s
# DECO_ASCENT_RATE = 3 / 60   #: m/s
# RUN_TIME = True
# USE_OC_DECO = True  #: if True, use enabled gases of decomp in oc or bailout
# GF_LOW = 0.30  #: % between 0.0 and 1.0
# GF_HIGH = 0.80  #: % between 0.0 and 1.0
# MULTILEVEL_MODE = False
# AUTOMATIC_TANK_REFILL = True  #: automatic refill of tanks between dives
# 
# Path: dipplanner/model/buhlmann/model_exceptions.py
# class ModelStateException(ModelException):
#     """Model State Exception."""
# 
#     def __init__(self, description):
#         """Init of ModelStateException.
# 
#         :param str description: text describing the error
#         """
#         super().__init__(description)
#         self.logger.error(
#             "Raising an exception: ModelStateException ! (%s)", description)


import math
import logging
from dipplanner import settings
from dipplanner.model.buhlmann.model_exceptions import ModelStateException
            raise ModelStateException(
                "Error in argument: negative value is not allowed")
        else:
            new_pp_he = self.pp_he + ((pp_he_inspired - self.pp_he) *
                                      self.const_exp_const_depth_he)
            new_pp_n2 = self.pp_n2 + ((pp_n2_inspired - self.pp_n2) *
                                      self.const_exp_const_depth_n2)
            self.set_pp(new_pp_he, new_pp_n2)

    def asc_desc(self, pp_he_inspired, pp_n2_inspired,
                 rate_he, rate_n2, seg_time):
        """Ascend or descent calculations.

        Uses Schreiner equation : P=Pio+R(t -1/k)-[Pio-Po-(R/k)]e^-kt
        store the new values in self.pp_he and self.pp_n2

        :param float pp_he_inspired: partial pressure of inspired helium
        :param float pp_n2_inspired: partial pressure of inspired nitrogen
        :param float rate_he: rate of change of pp_he
        :param float rate_n2: rate of change of pp_n2
        :param float seg_time: segment time in minutes

        :raises ModelStateException: if pp or time < 0
        """
        # transform rate and time from second to minute
        rate_he = rate_he * 60
        rate_n2 = rate_n2 * 60
        seg_time = seg_time / 60

        if pp_he_inspired < 0 or pp_n2_inspired < 0 or seg_time < 0:

# Path: dipplanner/settings.py
# __VERSION__ = None
# FRESH_WATER_DENSITY = 1.0  #: water density kg/l
# SEA_WATER_DENSITY = 1.03  #: water density kg/l
# ABSOLUTE_MAX_PPO2 = 2.0  #: in bar
# ABSOLUTE_MIN_PPO2 = 0.16  #: in bar
# ABSOLUTE_MAX_TANK_PRESSURE = 300  #: in bar
# ABSOLUTE_MAX_TANK_SIZE = 2 * 20  #: in liter
# SURFACE_TEMP = 37
# HE_NARCOTIC_VALUE = 0.23  #: helium narcotic value
# N2_NARCOTIC_VALUE = 1.0  #: nitrogen narcotic value
# O2_NARCOTIC_VALUE = 1.0  #: oxygen narcotic value
# AR_NARCOTIC_VALUE = 2.33  #: argon narcotic value
# DEFAULT_AIR_FH2 = 0.0  #: fraction of HE in standard AIR
# DEFAULT_AIR_FN2 = 0.7808  #: fraction of N2 in standard AIR
# DEFAULT_AIR_FO2 = 0.2095  #: fraction of O2 in standard AIR
# DEFAULT_AIR_FAR = 0.00934  #: fraction of AR (argon) in standard AIR
# DEFAULT_AIR_F_INNERT_GAS = DEFAULT_AIR_FH2 + DEFAULT_AIR_FN2 + DEFAULT_AIR_FAR
# STOP_DEPTH_INCREMENT = 3  #: in meter
# LAST_STOP_DEPTH = 3  #: in meter : last stop before surfacing
# STOP_TIME_INCREMENT = 1  #: in second
# FORCE_ALL_STOPS = True
# AMBIANT_PRESSURE_SEA_LEVEL = 1.01325  #: surface pressure (in bar)
# METHOD_FOR_DEPTH_CALCULATION = 'complex'  #: either simple (/10) or complex
# TRAVEL_SWITCH = 'late'  #: "late" or "early"
# FLIGHT_ALTITUDE = 2450
# TEMPLATE = "default-color.tpl"  #: template should be in templates/ directory
# DECO_MODEL = "ZHL16c"  #: ZHL16c or ZHL16b or ZHL16a
# BUHLMANN_VALUES = "1a"  #: 1a (4 mins for 1st comp) or 1b (5 mins)
# WATER_DENSITY = SEA_WATER_DENSITY  #: water density kg/l
# AMBIANT_PRESSURE_SURFACE = AMBIANT_PRESSURE_SEA_LEVEL
# DEFAULT_MAX_PPO2 = 1.6  #: in bar
# DEFAULT_MIN_PPO2 = 0.16  #: in bar
# DEFAULT_MAX_END = 30  #: in meter
# DIVE_CONSUMPTION_RATE = 20.0 / 60  #: liter/s
# DECO_CONSUMPTION_RATE = 17.0 / 60  #: liter/s
# DESCENT_RATE = 20 / 60   #: m/s
# ASCENT_RATE = 10 / 60   #: m/s
# DECO_ASCENT_RATE = 3 / 60   #: m/s
# RUN_TIME = True
# USE_OC_DECO = True  #: if True, use enabled gases of decomp in oc or bailout
# GF_LOW = 0.30  #: % between 0.0 and 1.0
# GF_HIGH = 0.80  #: % between 0.0 and 1.0
# MULTILEVEL_MODE = False
# AUTOMATIC_TANK_REFILL = True  #: automatic refill of tanks between dives
# 
# Path: dipplanner/model/buhlmann/model_exceptions.py
# class ModelStateException(ModelException):
#     """Model State Exception."""
# 
#     def __init__(self, description):
#         """Init of ModelStateException.
# 
#         :param str description: text describing the error
#         """
#         super().__init__(description)
#         self.logger.error(
#             "Raising an exception: ModelStateException ! (%s)", description)


# Path: dipplanner/model/buhlmann/compartment.py
import math
import logging
from dipplanner import settings
from dipplanner.model.buhlmann.model_exceptions import ModelStateException

            raise ModelStateException(
                "Error in argument: negative value is not allowed")
        else:
            new_pp_he = self.pp_he + ((pp_he_inspired - self.pp_he) *
                                      self.const_exp_const_depth_he)
            new_pp_n2 = self.pp_n2 + ((pp_n2_inspired - self.pp_n2) *
                                      self.const_exp_const_depth_n2)
            self.set_pp(new_pp_he, new_pp_n2)

    def asc_desc(self, pp_he_inspired, pp_n2_inspired,
                 rate_he, rate_n2, seg_time):
        """Ascend or descent calculations.

        Uses Schreiner equation : P=Pio+R(t -1/k)-[Pio-Po-(R/k)]e^-kt
        store the new values in self.pp_he and self.pp_n2

        :param float pp_he_inspired: partial pressure of inspired helium
        :param float pp_n2_inspired: partial pressure of inspired nitrogen
        :param float rate_he: rate of change of pp_he
        :param float rate_n2: rate of change of pp_n2
        :param float seg_time: segment time in minutes

        :raises ModelStateException: if pp or time < 0
        """
        # transform rate and time from second to minute
        rate_he = rate_he * 60
        rate_n2 = rate_n2 * 60
        seg_time = seg_time / 60

        if pp_he_inspired < 0 or pp_n2_inspired < 0 or seg_time < 0:

            raise ModelStateException(