Last active
May 7, 2021 23:22
-
-
Save dangunter/f07f9236d2f1c9e0c546e9714199c765 to your computer and use it in GitHub Desktop.
IDAES flowsheet with large number of streams
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Imports | |
from pyomo.environ import (Constraint, | |
Var, | |
ConcreteModel, | |
Expression, | |
Objective, | |
SolverFactory, | |
TransformationFactory, | |
value) | |
from pyomo.network import Arc, SequentialDecomposition | |
from idaes.core import FlowsheetBlock | |
from idaes.generic_models.unit_models import (PressureChanger, | |
Mixer, | |
Separator as Splitter, | |
Heater, | |
StoichiometricReactor) | |
from idaes.generic_models.unit_models.pressure_changer import ThermodynamicAssumption | |
from idaes.core.util.model_statistics import degrees_of_freedom | |
# Import idaes logger to set output levels | |
import idaes.logger as idaeslog | |
import hda_ideal_VLE as thermo_props | |
import hda_reaction as reaction_props | |
# Build repetitive flowsheet | |
repeat = 20 # choose how many times to repeat mixer->splitter pattern | |
n = ConcreteModel() | |
n.fs = FlowsheetBlock(default={"dynamic": False}) | |
n.fs.thermo_params = thermo_props.HDAParameterBlock() | |
n.fs.M100 = Mixer(default={"property_package": n.fs.thermo_params, | |
"inlet_list": ["toluene_feed", "hydrogen_feed", "vapor_recycle"]}) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Vap", "benzene"].fix(1e-5) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Vap", "toluene"].fix(1e-5) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Vap", "hydrogen"].fix(1e-5) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Vap", "methane"].fix(1e-5) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Liq", "benzene"].fix(1e-5) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Liq", "toluene"].fix(0.30) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Liq", "hydrogen"].fix(1e-5) | |
n.fs.M100.toluene_feed.flow_mol_phase_comp[0, "Liq", "methane"].fix(1e-5) | |
n.fs.M100.toluene_feed.temperature.fix(303.2) | |
n.fs.M100.toluene_feed.pressure.fix(350000) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "benzene"].fix(1e-5) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "toluene"].fix(1e-5) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "hydrogen"].fix(0.30) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Vap", "methane"].fix(0.02) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "benzene"].fix(1e-5) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "toluene"].fix(1e-5) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "hydrogen"].fix(1e-5) | |
n.fs.M100.hydrogen_feed.flow_mol_phase_comp[0, "Liq", "methane"].fix(1e-5) | |
n.fs.M100.hydrogen_feed.temperature.fix(303.2) | |
n.fs.M100.hydrogen_feed.pressure.fix(350000) | |
mixer0 = n.fs.M100 | |
for i in range(1, repeat + 1): | |
setattr(n.fs, f"M10{i}", Mixer(default={"property_package": n.fs.thermo_params, | |
"inlet_list": ["toluene_feed", "hydrogen_feed", "vapor_recycle"]})) | |
setattr(n.fs, f"S10{i}", Splitter(default={"property_package": n.fs.thermo_params, | |
"ideal_separation": False, | |
"outlet_list": ["purge", "recycle"]})) | |
setattr(n.fs, f"S20{i}", Splitter(default={"property_package": n.fs.thermo_params, | |
"ideal_separation": False, | |
"outlet_list": ["purge", "recycle"]})) | |
mixer = getattr(n.fs, f"M10{i}") | |
split1, split2 = getattr(n.fs, f"S10{i}"), getattr(n.fs, f"S20{i}") | |
streams = [Arc(source=mixer0.outlet, destination=split1.inlet), | |
Arc(source=split1.purge, destination=split2.inlet), | |
Arc(source=split1.recycle, destination=mixer.vapor_recycle), | |
Arc(source=split2.purge, destination=mixer.toluene_feed), | |
Arc(source=split2.recycle, destination=mixer.hydrogen_feed)] | |
for j, stream in enumerate(streams): | |
setattr(n.fs, f"s{i}-{j}", stream) | |
split1.split_fraction[0, "purge"].fix(0.2) | |
split2.split_fraction[0, "purge"].fix(0.2) | |
mixer0 = mixer | |
TransformationFactory("network.expand_arcs").apply_to(n) | |
n.fs.visualize(f"splitter-mixer x {repeat}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment