@@ -894,28 +894,32 @@ def compute_residual(
894
894
Q_in = self .Q_in [0 ]
895
895
Q_out = self .Q_out [0 ]
896
896
897
- c_feed = self .states ['inlet' ]['c' ]
898
-
899
- n_feed_dot = self .state_derivatives ['inlet' ]['n_feed' ]
897
+ c_in = self .states ['inlet' ]['c' ]
898
+ n_in_dot = self .state_derivatives ['inlet' ]['n' ]
900
899
901
- n_cake_dot = self .state_derivatives ['cake' ]['n_in' ]
900
+ c_R = self .states ['retentate' ]['c' ]
901
+ n_R_dot = self .state_derivatives ['retentate' ]['n' ]
902
+ Q_R = self .state_derivatives ['retentate' ]['V' ]
902
903
903
- c_cake_in = self .states ['cake' ]['c_in' ]
904
+ c_P = self .states ['permeate' ]['c' ]
905
+ n_P_dot = self .state_derivatives ['permeate' ]['n' ]
906
+ Q_P = self .state_derivatives ['permeate' ]['V' ]
904
907
905
- cake_vol = self .states ['cake' ]['volume' ]
906
- cake_vol_dot = self .state_derivatives ['cake' ]['volume' ]
907
908
908
- n_permeate_dot = self .state_derivatives ['permeate_tank' ]['n_in' ]
909
909
910
+ vol_cake = self .states ['cake' ]['V' ]
911
+ vol_cake_dot = self .state_derivatives ['cake' ]['V' ]
912
+ n_C_dot = self .state_derivatives ['cake' ]['n' ]
913
+ n_C = self .states ['cake' ]['n' ]
914
+ c_C = self .states ['cake' ]['c' ]
915
+ c_C_dot = self .state_derivatives ['cake' ]['c' ]
910
916
delta_p = self .states ['cake' ]['pressure' ]
911
917
912
- c_tank = self .states ['permeate_tank' ]['c' ]
913
- c_tank_dot = self .state_derivatives ['permeate_tank' ]['c' ]
914
-
915
- c_tank_in = self .states ['permeate_tank' ]['c_in' ]
916
-
917
- tank_volume = self .states ['permeate_tank' ]['volume' ]
918
- tank_volume_dot = self .state_derivatives ['permeate_tank' ]['volume' ]
918
+ c_PT = self .states ['permeate_tank' ]['c' ]
919
+ c_PT_dot = self .state_derivatives ['permeate_tank' ]['c' ]
920
+ n_PT = self .states ['permeate_tank' ]['n' ]
921
+ vol_PT = self .states ['permeate_tank' ]['V' ]
922
+ vol_PT_dot = self .state_derivatives ['permeate_tank' ]['V' ]
919
923
920
924
# parameters
921
925
molecular_weights = np .array (self .component_system .molecular_weights )
@@ -933,73 +937,77 @@ def compute_residual(
933
937
]
934
938
)
935
939
936
- # Coupling residual equation
937
- self .residuals ['inlet' ]['c' ] -= c_feed
940
+ # Inlet Equations
941
+ self .residuals ['inlet' ]['c' ] -= c_in
942
+ self .residuals ['inlet' ]['n' ] = n_in_dot - Q_in * c_in
938
943
939
- # Number of Feed
944
+ # Equations for permeate and retentate
940
945
941
- self .residuals ['inlet' ]['n_feed' ] = n_feed_dot - Q_in * c_feed
946
+ self .residuals ['retentate' ]['n' ] = n_R_dot - rejection * n_in_dot
947
+ self .residuals ['permeate' ]['n' ] = n_P_dot - (1 - rejection ) * n_in_dot
942
948
943
- # Number of cake
949
+ self .residuals ['retentate' ]['V' ] = \
950
+ Q_R - np .sum (n_R_dot * molecular_weights / densities )
951
+ self .residuals ['permeate' ]['V' ] = \
952
+ Q_P - np .sum (n_P_dot * molecular_weights / densities )
944
953
945
- self .residuals ['cake' ]['n_in' ] = n_cake_dot - rejection * n_feed_dot
954
+ if Q_R > 1e-16 :
955
+ self .residuals ['retentate' ]['c' ] = \
956
+ c_R - n_R_dot / Q_R
957
+ else :
958
+ self .residuals ['retentate' ]['c' ] = c_R
946
959
947
- # Number of Permeate
960
+ if Q_P > 1e-16 :
961
+ self .residuals ['permeate' ]['c' ] = \
962
+ c_P - n_P_dot / Q_P
963
+ else :
964
+ self .residuals ['permeate' ]['c' ] = c_P
948
965
949
- self .residuals ['permeate_tank' ]['n_in' ] = \
950
- n_permeate_dot - (1 - rejection ) * n_feed_dot
951
966
952
- # Incoming Cake Concentration
953
- for i , cake_vol_dots in enumerate (cake_vol_dot ):
954
- if cake_vol_dots > 1e-16 :
955
- self .residuals ['cake' ]['c_in' ][i ] = \
956
- c_cake_in [i ] - n_cake_dot [i ]/ cake_vol_dots
957
- else :
958
- self .residuals ['cake' ]['c_in' ][i ] = c_cake_in [i ]
967
+ # Cake equations
959
968
960
- # Cakevolume
969
+ self .residuals ['cake' ]['V' ] = \
970
+ vol_cake - np .sum (n_C * molecular_weights / densities )
971
+ self .residuals ['cake' ]['n' ] = n_C_dot - n_R_dot
961
972
962
- self .residuals ['cake' ]['volume' ] = \
963
- cake_vol_dot - n_cake_dot * molecular_weights / densities
973
+ if vol_cake > 1e-16 :
974
+ self .residuals ['cake' ]['c' ] = \
975
+ c_C_dot - (n_C_dot - c_C * vol_cake_dot ) / vol_cake
976
+ else :
977
+ self .residuals ['cake' ]['c' ] = c_C_dot
964
978
965
- # Permeate flow
979
+ # Permeate tank equations
966
980
967
- permeate_vol_dot = np .sum (n_permeate_dot * molecular_weights / densities )
981
+ c_tank_dot_new = \
982
+ (n_P_dot - Q_out * c_PT - vol_PT_dot * c_PT ) / vol_PT
968
983
969
- # Incoming Cake Concentration
970
- if permeate_vol_dot > 1e-16 :
971
- self .residuals ['permeate_tank' ]['c_in' ] = \
972
- c_tank_in - n_permeate_dot / permeate_vol_dot
973
- else :
974
- self .residuals ['permeate_tank' ]['c_in' ] = c_tank_in
984
+ self .residuals ['permeate_tank' ]['c' ] = c_PT_dot - c_tank_dot_new
975
985
976
- # Pressure equation
986
+ self .residuals ['permeate_tank' ]['V' ] = \
987
+ vol_PT_dot - Q_P + Q_out
977
988
978
- cake_resistance = \
979
- np .sum (specific_cake_resistance * densities * cake_vol / membrane_area )
989
+ self .residuals ['permeate_tank' ]['n' ] = n_PT - c_PT * vol_PT
980
990
981
- if not np . sum ( n_permeate_dot ) < 1e-16 :
991
+ #Pressure equation
982
992
983
- fractions = n_permeate_dot / sum (n_permeate_dot )
993
+ if not np .sum (n_P_dot ) < 1e-16 :
994
+
995
+ fractions = n_P_dot / sum (n_P_dot )
984
996
985
997
viscosity = \
986
998
self .viscosity_model .get_mixture_viscosity (viscosities , fractions )
987
999
1000
+ component_volume = n_C * molecular_weights / densities
1001
+ cake_resistance = np .sum (
1002
+ specific_cake_resistance * densities * component_volume / membrane_area
1003
+ )
1004
+
988
1005
self .residuals ['cake' ]['pressure' ] = \
989
- delta_p - viscosity * permeate_vol_dot \
990
- * (membrane_resistance + cake_resistance ) / membrane_area
1006
+ delta_p - viscosity * Q_P \
1007
+ * (membrane_resistance + cake_resistance ) / membrane_area
991
1008
else :
992
1009
self .residuals ['cake' ]['pressure' ] = delta_p
993
1010
994
- # Tank equations
995
-
996
- c_tank_dot_new = \
997
- (n_permeate_dot - Q_out * c_tank - tank_volume_dot * c_tank ) / tank_volume
998
-
999
- self .residuals ['permeate_tank' ]['c' ] = c_tank_dot - c_tank_dot_new
1000
-
1001
- self .residuals ['permeate_tank' ]['volume' ] = \
1002
- tank_volume_dot - permeate_vol_dot + Q_out
1003
1011
1004
1012
1005
1013
0 commit comments