Example #1
0
class SimulatedCogenerationUnitTest(unittest.TestCase):

    def setUp(self):
        self.env = BaseEnvironment()
        self.heat_storage = Mock(spec=SimulatedHeatStorage)()
        self.power_meter = Mock(spec=SimulatedPowerMeter)
        self.cu = SimulatedCogenerationUnit(1, self.env)
        self.cu.heat_storage = self.heat_storage
        self.cu.power_meter = self.power_meter


    def test_creation(self):
        self.assertGreaterEqual(self.cu._workload, 0)
        self.assertGreater(self.cu.config['max_gas_input'], 0)
        self.assertTrue(0 <= self.cu.config['electrical_efficiency'] <= 1)
        self.assertTrue(0 <=  self.cu.config['thermal_efficiency'] <= 1)

        self.assertTrue(0 <= self.cu.max_efficiency_loss <= 1)
        self.assertGreaterEqual(self.cu.config['maintenance_interval_hours'], 0)

        self.assertTrue(0 <= self.cu.config['minimal_workload'] <= 1)

        self.assertGreaterEqual(self.cu.config['minimal_off_time'], 0)

        self.assertEqual(self.cu.off_time, self.env.now)

        self.assertEqual(self.cu.current_electrical_production, 0)
        self.assertEqual(self.cu.total_electrical_production, 0)
        self.assertTrue(self.cu.thermal_driven)

        self.assertIsNone(self.cu.overwrite_workload)

    def test_get_electrical_energy_production(self):
        # the method should return the energy produced in one time intervall
        self.cu.current_electrical_production = 20.0 # Energy per hour
        expected_energy = self.cu.current_electrical_production * self.env.step_size / 3600.0

        result_energy = self.cu.get_electrical_energy_production()

        self.assertEqual(expected_energy, result_energy)

    def test_get_thermal_energy_production(self):
        # the method should return the energy produced in one time intervall
        self.cu.current_thermal_production = 20.0 # Energy per hour
        expected_energy = self.cu.current_thermal_production * self.env.step_size / 3600.0
        result_energy = self.cu.get_thermal_energy_production()

        self.assertEqual(expected_energy, result_energy)

    def test_calculate_new_workload(self):
        # calculates a workload
        # it considers overwrites workload and
        # the mode and
        # offtime

        #consider mode thermal
        self.heat_storage.get_required_energy.return_value = 3
        expected_workload = self.cu.get_calculated_workload_thermal()
        self.cu.thermal_driven = True
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(calculated_workload, expected_workload,
            "thermal workload is wrong")

        #consider mode electric
        self.heat_storage.target_temperature = 1000
        self.power_meter.current_power_consum = 3
        expected_workload = self.cu.get_calculated_workload_electric()
        self.cu.thermal_driven = False
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(calculated_workload, expected_workload,
                            "electrical workload is wrong expected: \
                            {0}. got: {1}"\
                            .format(expected_workload, calculated_workload))

        #consider overwrite of workload
        self.heat_storage.get_required_energy.return_value = 3
        expected_workload = self.cu.get_calculated_workload_thermal()
        self.cu.thermal_driven = True
        self.cu.overwrite_workload = 0.25
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(calculated_workload, 0.25,
            "overwritten workload is wrong expected: {0}. got: {1}"
            .format(0.25, calculated_workload))

        #consider offtime
        self.cu.overwrite_workload = None
        self.heat_storage.get_required_energy.return_value = 3
        expected_workload = 0
        self.cu.thermal_driven = True
        self.cu.off_time = self.env.now + 1
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(calculated_workload, expected_workload,
            "overwritten workload is wrong expected: {0}. got: {1}"
            .format(expected_workload, calculated_workload))

    def test_get_operating_costs(self):
        # are sum of gas_costs and maintenance
        self.cu.total_gas_consumption = 6.0
        self.cu.total_electrical_production = 3
        # needed, because the maintenance_costs are calculated
        # out of the electrical_production

        result = self.cu.get_operating_costs()

        # greater because of additional maintenance costs
        self.assertGreater(result, gas_price_per_kwh*6.0)

    def test_get_efficiency_loss_factor(self):
        # given efficiency is reached only on maximum workload
        # at minumum workload the efficiency is decreased with
        # max_efficiency_loss
        # the method returns the remaining efficiency
        self.cu._workload = 0.40
        self.cu.config['minimal_workload'] = 0.40
        self.cu.max_efficiency_loss = 0.05

        calculated_loss = self.cu.get_efficiency_loss_factor()

        self.assertEqual(calculated_loss, 0.95)

    def test_get_calculated_workload_thermal(self):
        # the function returns the needed workload based on the thermal demand
        # dont't know why but the workload is mapped to 0-99
        required_energy = 5
        gas_input = 20 # unit is energy: kWh
        thermal_efficiency = 0.6

        self.heat_storage.get_required_energy.return_value = required_energy
        self.cu.config['max_gas_input'] = gas_input
        self.cu.config['thermal_efficiency'] = thermal_efficiency

        max_energy = thermal_efficiency * gas_input
        expected_workload = required_energy / max_energy

        calculated_result = self.cu.get_calculated_workload_thermal()

        self.assertEqual(calculated_result, expected_workload)

    def test_get_calculated_workload_electric(self):
        # the function returns the needed workload based on the electric demand
        # dont't know why but the workload is mapped to 0-99
        self.heat_storage.target_temperature = 100
        self.heat_storage.get_temperature.return_value = 0

        required_energy = 5.0
        gas_input = 20.0 # unit is energy: kWh
        electrical_efficiency = 0.6
        minimal_workload = 20.0

        self.power_meter.current_power_consum = required_energy
        self.cu.config['max_gas_input'] = gas_input
        self.cu.config['electrical_efficiency'] = electrical_efficiency

        max_energy = electrical_efficiency*gas_input
        expected_workload = required_energy/max_energy

        calculated_result = self.cu.get_calculated_workload_electric()

        self.assertAlmostEqual(calculated_result, expected_workload)

    def test_get_calculated_workload_electric_heat_storage_filled(self):
        # if the target_temperature of the heat-storage is reached
        # the workload has to be zero
        self.heat_storage.target_temperature = 100
        self.heat_storage.temperature = 100

        self.power_meter.current_power_consum = 5.0
        self.cu.config['max_gas_input'] = 20.0 # unit is energy: kWh
        self.cu.config['electrical_efficiency'] = 0.60

        calculated_result = self.cu.get_calculated_workload_electric()

        self.assertAlmostEqual(calculated_result, 0)
Example #2
0
class SimulatedCogenerationUnitTest(unittest.TestCase):
    def setUp(self):
        self.env = BaseEnvironment()
        self.heat_storage = Mock(spec=SimulatedHeatStorage)()
        self.power_meter = Mock(spec=SimulatedPowerMeter)
        self.cu = SimulatedCogenerationUnit(1, self.env)
        self.cu.heat_storage = self.heat_storage
        self.cu.power_meter = self.power_meter

    def test_creation(self):
        self.assertGreaterEqual(self.cu._workload, 0)
        self.assertGreater(self.cu.config['max_gas_input'], 0)
        self.assertTrue(0 <= self.cu.config['electrical_efficiency'] <= 1)
        self.assertTrue(0 <= self.cu.config['thermal_efficiency'] <= 1)

        self.assertTrue(0 <= self.cu.max_efficiency_loss <= 1)
        self.assertGreaterEqual(self.cu.config['maintenance_interval_hours'],
                                0)

        self.assertTrue(0 <= self.cu.config['minimal_workload'] <= 1)

        self.assertGreaterEqual(self.cu.config['minimal_off_time'], 0)

        self.assertEqual(self.cu.off_time, self.env.now)

        self.assertEqual(self.cu.current_electrical_production, 0)
        self.assertEqual(self.cu.total_electrical_production, 0)
        self.assertTrue(self.cu.thermal_driven)

        self.assertIsNone(self.cu.overwrite_workload)

    def test_get_electrical_energy_production(self):
        # the method should return the energy produced in one time intervall
        self.cu.current_electrical_production = 20.0  # Energy per hour
        expected_energy = self.cu.current_electrical_production * self.env.step_size / 3600.0

        result_energy = self.cu.get_electrical_energy_production()

        self.assertEqual(expected_energy, result_energy)

    def test_get_thermal_energy_production(self):
        # the method should return the energy produced in one time intervall
        self.cu.current_thermal_production = 20.0  # Energy per hour
        expected_energy = self.cu.current_thermal_production * self.env.step_size / 3600.0
        result_energy = self.cu.get_thermal_energy_production()

        self.assertEqual(expected_energy, result_energy)

    def test_calculate_new_workload(self):
        # calculates a workload
        # it considers overwrites workload and
        # the mode and
        # offtime

        #consider mode thermal
        self.heat_storage.get_required_energy.return_value = 3
        expected_workload = self.cu.get_calculated_workload_thermal()
        self.cu.thermal_driven = True
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(calculated_workload, expected_workload,
                         "thermal workload is wrong")

        #consider mode electric
        self.heat_storage.target_temperature = 1000
        self.power_meter.current_power_consum = 3
        expected_workload = self.cu.get_calculated_workload_electric()
        self.cu.thermal_driven = False
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(calculated_workload, expected_workload,
                            "electrical workload is wrong expected: \
                            {0}. got: {1}"\
                            .format(expected_workload, calculated_workload))

        #consider overwrite of workload
        self.heat_storage.get_required_energy.return_value = 3
        expected_workload = self.cu.get_calculated_workload_thermal()
        self.cu.thermal_driven = True
        self.cu.overwrite_workload = 0.25
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(
            calculated_workload, 0.25,
            "overwritten workload is wrong expected: {0}. got: {1}".format(
                0.25, calculated_workload))

        #consider offtime
        self.cu.overwrite_workload = None
        self.heat_storage.get_required_energy.return_value = 3
        expected_workload = 0
        self.cu.thermal_driven = True
        self.cu.off_time = self.env.now + 1
        calculated_workload = self.cu.calculate_new_workload()
        self.assertEqual(
            calculated_workload, expected_workload,
            "overwritten workload is wrong expected: {0}. got: {1}".format(
                expected_workload, calculated_workload))

    def test_get_operating_costs(self):
        # are sum of gas_costs and maintenance
        self.cu.total_gas_consumption = 6.0
        self.cu.total_electrical_production = 3
        # needed, because the maintenance_costs are calculated
        # out of the electrical_production

        result = self.cu.get_operating_costs()

        # greater because of additional maintenance costs
        self.assertGreater(result, gas_price_per_kwh * 6.0)

    def test_get_efficiency_loss_factor(self):
        # given efficiency is reached only on maximum workload
        # at minumum workload the efficiency is decreased with
        # max_efficiency_loss
        # the method returns the remaining efficiency
        self.cu._workload = 0.40
        self.cu.config['minimal_workload'] = 0.40
        self.cu.max_efficiency_loss = 0.05

        calculated_loss = self.cu.get_efficiency_loss_factor()

        self.assertEqual(calculated_loss, 0.95)

    def test_get_calculated_workload_thermal(self):
        # the function returns the needed workload based on the thermal demand
        # dont't know why but the workload is mapped to 0-99
        required_energy = 5
        gas_input = 20  # unit is energy: kWh
        thermal_efficiency = 0.6

        self.heat_storage.get_required_energy.return_value = required_energy
        self.cu.config['max_gas_input'] = gas_input
        self.cu.config['thermal_efficiency'] = thermal_efficiency

        max_energy = thermal_efficiency * gas_input
        expected_workload = required_energy / max_energy

        calculated_result = self.cu.get_calculated_workload_thermal()

        self.assertEqual(calculated_result, expected_workload)

    def test_get_calculated_workload_electric(self):
        # the function returns the needed workload based on the electric demand
        # dont't know why but the workload is mapped to 0-99
        self.heat_storage.target_temperature = 100
        self.heat_storage.get_temperature.return_value = 0

        required_energy = 5.0
        gas_input = 20.0  # unit is energy: kWh
        electrical_efficiency = 0.6
        minimal_workload = 20.0

        self.power_meter.current_power_consum = required_energy
        self.cu.config['max_gas_input'] = gas_input
        self.cu.config['electrical_efficiency'] = electrical_efficiency

        max_energy = electrical_efficiency * gas_input
        expected_workload = required_energy / max_energy

        calculated_result = self.cu.get_calculated_workload_electric()

        self.assertAlmostEqual(calculated_result, expected_workload)

    def test_get_calculated_workload_electric_heat_storage_filled(self):
        # if the target_temperature of the heat-storage is reached
        # the workload has to be zero
        self.heat_storage.target_temperature = 100
        self.heat_storage.temperature = 100

        self.power_meter.current_power_consum = 5.0
        self.cu.config['max_gas_input'] = 20.0  # unit is energy: kWh
        self.cu.config['electrical_efficiency'] = 0.60

        calculated_result = self.cu.get_calculated_workload_electric()

        self.assertAlmostEqual(calculated_result, 0)