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

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 

8 

9 

10 

11@declare_process_block_class("ReverseOsmosis0D") 

12class ReverseOsmosis0DData(ReverseOsmosisData): 

13 """ 

14 Ahuora wrapper around WaterTAP's ReverseOsmosis0D unit model. 

15 """ 

16 

17 def build(self): 

18 super().build() 

19 

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) 

24 

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) 

30 

31 if iscale.get_scaling_factor(self.A_comp) is None: 

32 iscale.set_scaling_factor(self.A_comp, 1e12) 

33 

34 if iscale.get_scaling_factor(self.B_comp) is None: 

35 iscale.set_scaling_factor(self.B_comp, 1e8) 

36 

37 if iscale.get_scaling_factor(self.recovery_vol_phase) is None: 

38 iscale.set_scaling_factor(self.recovery_vol_phase, 1) 

39 

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) 

43 

44 if iscale.get_scaling_factor(self.reflect_coeff) is None: 

45 iscale.set_scaling_factor(self.reflect_coeff, 1) 

46 

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) 

54 

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) 

58 

59 if not hasattr(self, "_permeate_scaled_properties"): 

60 self._permeate_scaled_properties = ComponentSet() 

61 

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"]) 

82 

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)