Skip to content

Instantly share code, notes, and snippets.

@dangunter
Last active May 7, 2021 23:22
Show Gist options
  • Save dangunter/f07f9236d2f1c9e0c546e9714199c765 to your computer and use it in GitHub Desktop.
Save dangunter/f07f9236d2f1c9e0c546e9714199c765 to your computer and use it in GitHub Desktop.
IDAES flowsheet with large number of streams
# 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