@@ -8,7 +8,7 @@ use nalgebra::{DefaultAllocator, Dim, Matrix3, OVector, SVector, U1, U2, vector}
88use num_dual:: {
99 Dual , Dual2Vec , DualNum , DualStruct , Gradients , first_derivative, implicit_derivative_sp,
1010} ;
11- use quantity:: { Dimensionless , MOL , MolarVolume , Moles , Pressure , Quantity , Temperature } ;
11+ use quantity:: { MOL , MolarVolume , Moles , Pressure , Quantity , Temperature } ;
1212
1313const MAX_ITER_TP : usize = 400 ;
1414const TOL_TP : f64 = 1e-8 ;
@@ -54,8 +54,7 @@ impl<E: Residual<U2, D>, D: DualNum<f64> + Copy> PhaseEquilibrium<E, 2, U2, D> {
5454 ) -> FeosResult < Self > {
5555 let z = feed. get ( 0 ) . convert_into ( feed. get ( 0 ) + feed. get ( 1 ) ) ;
5656 let total_moles = feed. sum ( ) ;
57- let moles = vector ! [ z. re( ) , 1.0 - z. re( ) ] * MOL ;
58- let vle_re = State :: new_npt ( & eos. re ( ) , temperature. re ( ) , pressure. re ( ) , moles, None ) ?
57+ let vle_re = State :: new_npt ( & eos. re ( ) , temperature. re ( ) , pressure. re ( ) , z. re ( ) , None ) ?
5958 . tp_flash ( None , options, None ) ?;
6059
6160 // implicit differentiation
@@ -101,7 +100,10 @@ impl<E: Residual<U2, D>, D: DualNum<f64> + Copy> PhaseEquilibrium<E, 2, U2, D> {
101100 let moles = Quantity :: new ( vector ! [ x, -x + 1.0 ] * phi * total_moles. convert_into ( MOL ) ) ;
102101 State :: new_nvt ( eos, temperature, volume, moles)
103102 } ;
104- Ok ( Self ( [ state ( y, v_v, beta) ?, state ( x, v_l, -beta + 1.0 ) ?] ) )
103+ Ok ( Self (
104+ [ state ( y, v_v, beta) ?, state ( x, v_l, -beta + 1.0 ) ?] ,
105+ [ beta, -beta + 1.0 ] ,
106+ ) )
105107 }
106108}
107109
@@ -186,12 +188,12 @@ where
186188 // check convergence
187189 // unwrap is safe here, because after the first successive substitution step the
188190 // phase amounts in new_vle_state are known.
189- let beta = new_vle_state. vapor_phase_fraction ( ) . unwrap ( ) ;
190191 let tpd = [
191192 self . tangent_plane_distance ( new_vle_state. vapor ( ) ) ,
192193 self . tangent_plane_distance ( new_vle_state. liquid ( ) ) ,
193194 ] ;
194- let dg = ( 1.0 - beta) * tpd[ 1 ] + beta * tpd[ 0 ] ;
195+ let b = new_vle_state. 1 ;
196+ let dg = b[ 0 ] * tpd[ 0 ] + b[ 1 ] * tpd[ 1 ] ;
195197
196198 // fix if only tpd[1] is positive
197199 if tpd[ 0 ] < 0.0 && dg >= 0.0 {
@@ -289,7 +291,7 @@ where
289291 }
290292
291293 // calculate total Gibbs energy before the extrapolation
292- let gibbs = self . total_gibbs_energy ( ) ;
294+ let gibbs = self . total_molar_gibbs_energy ( ) ;
293295
294296 // extrapolate K values
295297 let delta_vec = [
@@ -317,7 +319,7 @@ where
317319 // calculate new states
318320 let mut trial_vle_state = self . clone ( ) ;
319321 trial_vle_state. update_states ( feed_state, & k) ?;
320- if trial_vle_state. total_gibbs_energy ( ) < gibbs {
322+ if trial_vle_state. total_molar_gibbs_energy ( ) < gibbs {
321323 * self = trial_vle_state;
322324 }
323325 }
@@ -379,23 +381,21 @@ where
379381
380382 fn update_states ( & mut self , feed_state : & State < E , N > , k : & OVector < f64 , N > ) -> FeosResult < ( ) > {
381383 // calculate vapor phase fraction using Rachford-Rice algorithm
382- let beta = self . vapor_phase_fraction ( ) ;
383- let beta = rachford_rice ( & feed_state. molefracs , k, beta) ?;
384+ let beta = self . 1 [ 0 ] ;
385+ let b = rachford_rice ( & feed_state. molefracs , k, Some ( beta) ) ?;
384386
385387 // update VLE
386388 let v = feed_state
387- . moles ( )
388- . clone ( )
389- . component_mul ( & Dimensionless :: new (
390- k. map ( |k| beta * k / ( 1.0 - beta + beta * k) ) ,
391- ) ) ;
389+ . molefracs
390+ . component_mul ( & k. map ( |k| b * k / ( 1.0 - b + b * k) ) ) ;
392391 let l = feed_state
393- . moles ( )
394- . clone ( )
395- . component_mul ( & Dimensionless :: new (
396- k. map ( |k| ( 1.0 - beta) / ( 1.0 - beta + beta * k) ) ,
397- ) ) ;
398- self . update_moles ( feed_state. pressure ( Contributions :: Total ) , [ & v, & l] ) ?;
392+ . molefracs
393+ . component_mul ( & k. map ( |k| ( 1.0 - b) / ( 1.0 - b + b * k) ) ) ;
394+ self . update_composition (
395+ feed_state. pressure ( Contributions :: Total ) ,
396+ [ & v, & l] ,
397+ [ b, 1.0 - b] ,
398+ ) ?;
399399 Ok ( ( ) )
400400 }
401401
@@ -404,9 +404,10 @@ where
404404 let state1 = stable_states. pop ( ) ;
405405 let state2 = stable_states. pop ( ) ;
406406 if let Some ( s1) = state1 {
407- let init1 = Self :: from_states ( s1. clone ( ) , feed_state. clone ( ) ) ;
407+ // TODO: sort
408+ let init1 = Self :: two_phase ( s1. clone ( ) , feed_state. clone ( ) ) ;
408409 if let Some ( s2) = state2 {
409- Ok ( ( Self :: from_states ( s1, s2) , Some ( init1) ) )
410+ Ok ( ( Self :: two_phase ( s1, s2) , Some ( init1) ) )
410411 } else {
411412 Ok ( ( init1, None ) )
412413 }
0 commit comments