Coverage for backend/ahuora-builder/src/ahuora_builder/custom/watertap/reverse_osmosis_0d.py: 89%
65 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-03-26 20:57 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-03-26 20:57 +0000
1from idaes.core import declare_process_block_class
2from idaes.core.util.misc import add_object_reference
3from watertap.unit_models.reverse_osmosis_0D import ReverseOsmosisData
4from pyomo.common.collections import ComponentSet
5from idaes.core.util import scaling as iscale
6from watertap.core.membrane_channel_base import TransportModel
7from ahuora_builder.methods.scaling_suffix import sanitize_scaling_suffix
11@declare_process_block_class("ReverseOsmosis0D")
12class ReverseOsmosis0DData(ReverseOsmosisData):
13 """
14 Ahuora wrapper around WaterTAP's ReverseOsmosis0D unit model.
15 """
17 def build(self):
18 super().build()
20 def initialize_build(self, *args, **kwargs):
21 iscale.calculate_scaling_factors(self)
22 sanitize_scaling_suffix(self)
23 return super().initialize_build(*args, **kwargs)
25 def calculate_scaling_factors(self):
26 # these variables should have user input, if not there will be a warning
27 if iscale.get_scaling_factor(self.area) is None:
28 sf = iscale.get_scaling_factor(self.area, default=10, warning=True)
29 iscale.set_scaling_factor(self.area, sf)
31 if iscale.get_scaling_factor(self.A_comp) is None:
32 iscale.set_scaling_factor(self.A_comp, 1e12)
34 if iscale.get_scaling_factor(self.B_comp) is None:
35 iscale.set_scaling_factor(self.B_comp, 1e8)
37 if iscale.get_scaling_factor(self.recovery_vol_phase) is None:
38 iscale.set_scaling_factor(self.recovery_vol_phase, 1)
40 if self.config.transport_model == TransportModel.SKK: 40 ↛ 41line 40 didn't jump to line 41 because the condition on line 40 was never true
41 if iscale.get_scaling_factor(self.alpha) is None:
42 iscale.set_scaling_factor(self.alpha, 1e-8)
44 if iscale.get_scaling_factor(self.reflect_coeff) is None:
45 iscale.set_scaling_factor(self.reflect_coeff, 1)
47 for (t, p, j), v in self.recovery_mass_phase_comp.items():
48 if j in self.config.property_package.solvent_set:
49 sf = 1
50 elif j in self.config.property_package.solute_set: 50 ↛ 52line 50 didn't jump to line 52 because the condition on line 50 was always true
51 sf = 100
52 if iscale.get_scaling_factor(v) is None:
53 iscale.set_scaling_factor(v, sf)
55 for v in self.rejection_phase_comp.values():
56 if iscale.get_scaling_factor(v) is None:
57 iscale.set_scaling_factor(v, 1)
59 if not hasattr(self, "_permeate_scaled_properties"):
60 self._permeate_scaled_properties = ComponentSet()
62 for sb in (self.permeate_side, self.mixed_permeate):
63 for blk in sb.values():
64 for j in self.config.property_package.solute_set:
65 self._rescale_permeate_variable(blk.flow_mass_phase_comp["Liq", j])
66 if blk.is_property_constructed("mass_frac_phase_comp"): 66 ↛ 70line 66 didn't jump to line 70 because the condition on line 66 was always true
67 self._rescale_permeate_variable(
68 blk.mass_frac_phase_comp["Liq", j]
69 )
70 if blk.is_property_constructed("conc_mass_phase_comp"): 70 ↛ 74line 70 didn't jump to line 74 because the condition on line 70 was always true
71 self._rescale_permeate_variable(
72 blk.conc_mass_phase_comp["Liq", j]
73 )
74 if blk.is_property_constructed("mole_frac_phase_comp"):
75 self._rescale_permeate_variable(blk.mole_frac_phase_comp["Liq",j])
76 if blk.is_property_constructed("molality_phase_comp"):
77 self._rescale_permeate_variable(
78 blk.molality_phase_comp["Liq", j]
79 )
80 if blk.is_property_constructed("pressure_osm_phase"):
81 self._rescale_permeate_variable(blk.pressure_osm_phase["Liq"])
83 for (t, x, p, j), v in self.flux_mass_phase_comp.items():
84 if iscale.get_scaling_factor(v) is None:
85 comp = self.config.property_package.get_component(j)
86 if comp.is_solvent(): # scaling based on solvent flux equation
87 sf = (
88 iscale.get_scaling_factor(self.A_comp[t, j])
89 * iscale.get_scaling_factor(self.dens_solvent)
90 * iscale.get_scaling_factor(
91 self.feed_side.properties[t, x].pressure
92 )
93 )
94 iscale.set_scaling_factor(v, sf)
95 elif comp.is_solute(): # scaling based on solute flux equation 95 ↛ 83line 95 didn't jump to line 83 because the condition on line 95 was always true
96 sf = iscale.get_scaling_factor(
97 self.B_comp[t, j]
98 ) * iscale.get_scaling_factor(
99 self.feed_side.properties[t, x].conc_mass_phase_comp[p, j]
100 )
101 iscale.set_scaling_factor(v, sf)