def model(self): m = ConcreteModel() m.db = Database() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={ "solute_list": [ "cryptosporidium", "toc", "giardia_lamblia", "eeq", "total_coliforms_fecal_ecoli", "viruses_enteric", "tss", ] }) m.fs.unit = OzoneZO(default={ "property_package": m.fs.params, "database": m.db }) m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(100) m.fs.unit.inlet.flow_mass_comp[0, "cryptosporidium"].fix(1) m.fs.unit.inlet.flow_mass_comp[0, "toc"].fix(1) m.fs.unit.inlet.flow_mass_comp[0, "giardia_lamblia"].fix(1) m.fs.unit.inlet.flow_mass_comp[0, "eeq"].fix(1) m.fs.unit.inlet.flow_mass_comp[0, "total_coliforms_fecal_ecoli"].fix(1) m.fs.unit.inlet.flow_mass_comp[0, "viruses_enteric"].fix(1) m.fs.unit.inlet.flow_mass_comp[0, "tss"].fix(1) return m
def test_toc_in_solute_list(self): model = ConcreteModel() model.db = Database() model.fs = FlowsheetBlock(default={"dynamic": False}) model.fs.params = WaterParameterBlock(default={ "solute_list": ["cryptosporidium", "giardia_lamblia", "eeq"] }) with pytest.raises(ConfigurationError, match="TOC must be in solute list for Ozonation " "or Ozone/AOP"): model.fs.unit = OzoneZO(default={ "property_package": model.fs.params, "database": model.db })
def test_costing(): m = ConcreteModel() m.db = Database() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["sulfur", "toc", "tss"]}) m.fs.costing = ZeroOrderCosting() m.fs.unit1 = OzoneZO(default={ "property_package": m.fs.params, "database": m.db }) m.fs.unit1.inlet.flow_mass_comp[0, "H2O"].fix(10000) m.fs.unit1.inlet.flow_mass_comp[0, "sulfur"].fix(1) m.fs.unit1.inlet.flow_mass_comp[0, "toc"].fix(2) m.fs.unit1.inlet.flow_mass_comp[0, "tss"].fix(3) m.fs.unit1.load_parameters_from_database(use_default_removal=True) assert degrees_of_freedom(m.fs.unit1) == 0 m.fs.unit1.costing = UnitModelCostingBlock( default={"flowsheet_costing_block": m.fs.costing}) assert isinstance(m.fs.costing.ozonation, Block) assert isinstance(m.fs.costing.ozonation.ozone_capital_a_parameter, Var) assert isinstance(m.fs.costing.ozonation.ozone_capital_b_parameter, Var) assert isinstance(m.fs.costing.ozonation.ozone_capital_c_parameter, Var) assert isinstance(m.fs.costing.ozonation.ozone_capital_d_parameter, Var) assert isinstance(m.fs.unit1.costing.capital_cost, Var) assert isinstance(m.fs.unit1.costing.capital_cost_constraint, Constraint) assert_units_consistent(m.fs) assert degrees_of_freedom(m.fs.unit1) == 0 assert m.fs.unit1.electricity[0] in m.fs.costing._registered_flows[ "electricity"]
def build(): # flowsheet set up m = ConcreteModel() m.db = Database() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.prop = prop_ZO.WaterParameterBlock( default={"solute_list": ["tds", "tss", "toc"]}) # unit models m.fs.feed = FeedZO(default={"property_package": m.fs.prop}) m.fs.intake_pump = WaterPumpingStationZO( default={ "property_package": m.fs.prop, "database": m.db, "process_subtype": "raw", }) m.fs.coag_and_floc = CoagulationFlocculationZO(default={ "property_package": m.fs.prop, "database": m.db }) m.fs.sedimentation = SedimentationZO(default={ "property_package": m.fs.prop, "database": m.db }) m.fs.ozonation = OzoneZO(default={ "property_package": m.fs.prop, "database": m.db }) m.fs.gravity_basin = FixedBedZO( default={ "property_package": m.fs.prop, "database": m.db, "process_subtype": "gravity_basin", }) m.fs.gac = GACZO( default={ "property_package": m.fs.prop, "database": m.db, "process_subtype": "pressure_vessel", }) m.fs.backwash_pump = WaterPumpingStationZO( default={ "property_package": m.fs.prop, "database": m.db, "process_subtype": "treated", }) m.fs.uv = UVZO(default={"property_package": m.fs.prop, "database": m.db}) m.fs.anion_exchange = IonExchangeZO( default={ "property_package": m.fs.prop, "database": m.db, "process_subtype": "anion_exchange", }) m.fs.chlorination = ChlorinationZO(default={ "property_package": m.fs.prop, "database": m.db }) m.fs.storage = StorageTankZO(default={ "property_package": m.fs.prop, "database": m.db }) m.fs.recharge_pump = WaterPumpingStationZO( default={ "property_package": m.fs.prop, "database": m.db, "process_subtype": "treated", }) m.fs.product = Product(default={"property_package": m.fs.prop}) # connections m.fs.s01 = Arc(source=m.fs.feed.outlet, destination=m.fs.intake_pump.inlet) m.fs.s02 = Arc(source=m.fs.intake_pump.outlet, destination=m.fs.coag_and_floc.inlet) m.fs.s03 = Arc(source=m.fs.coag_and_floc.outlet, destination=m.fs.sedimentation.inlet) m.fs.s04 = Arc(source=m.fs.sedimentation.treated, destination=m.fs.ozonation.inlet) m.fs.s05 = Arc(source=m.fs.ozonation.treated, destination=m.fs.gravity_basin.inlet) m.fs.s06 = Arc(source=m.fs.gravity_basin.treated, destination=m.fs.gac.inlet) m.fs.s07 = Arc(source=m.fs.gac.treated, destination=m.fs.uv.inlet) m.fs.s08 = Arc(source=m.fs.gac.byproduct, destination=m.fs.backwash_pump.inlet) m.fs.s09 = Arc(source=m.fs.uv.treated, destination=m.fs.anion_exchange.inlet) m.fs.s10 = Arc(source=m.fs.anion_exchange.treated, destination=m.fs.chlorination.inlet) m.fs.s11 = Arc(source=m.fs.chlorination.treated, destination=m.fs.storage.inlet) m.fs.s12 = Arc(source=m.fs.storage.outlet, destination=m.fs.recharge_pump.inlet) m.fs.s13 = Arc(source=m.fs.recharge_pump.outlet, destination=m.fs.product.inlet) TransformationFactory("network.expand_arcs").apply_to(m) # scaling iscale.calculate_scaling_factors(m) return m