@@ -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,15 +54,14 @@ 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
6261 let t = temperature. into_reduced ( ) ;
6362 let p = pressure. into_reduced ( ) ;
64- let v_l = vle_re. liquid ( ) . density . into_reduced ( ) . recip ( ) ;
65- let v_v = vle_re. vapor ( ) . density . into_reduced ( ) . recip ( ) ;
63+ let v_l = vle_re. liquid ( ) . molar_volume . into_reduced ( ) ;
64+ let v_v = vle_re. vapor ( ) . molar_volume . into_reduced ( ) ;
6665 let x = vle_re. liquid ( ) . molefracs [ 0 ] ;
6766 let y = vle_re. vapor ( ) . molefracs [ 0 ] ;
6867 let x = implicit_derivative_sp (
@@ -88,7 +87,10 @@ impl<E: Residual<U2, D>, D: DualNum<f64> + Copy> PhaseEquilibrium<E, 2, U2, D> {
8887 let moles = Quantity :: new ( vector ! [ x, -x + 1.0 ] * phi * total_moles. convert_into ( MOL ) ) ;
8988 State :: new_nvt ( eos, temperature, volume, moles)
9089 } ;
91- Ok ( Self ( [ state ( y, v_v, beta) ?, state ( x, v_l, -beta + 1.0 ) ?] ) )
90+ Ok ( Self (
91+ [ state ( y, v_v, beta) ?, state ( x, v_l, -beta + 1.0 ) ?] ,
92+ [ beta, -beta + 1.0 ] ,
93+ ) )
9294 }
9395}
9496
@@ -173,12 +175,12 @@ where
173175 // check convergence
174176 // unwrap is safe here, because after the first successive substitution step the
175177 // phase amounts in new_vle_state are known.
176- let beta = new_vle_state. vapor_phase_fraction ( ) . unwrap ( ) ;
177178 let tpd = [
178179 self . tangent_plane_distance ( new_vle_state. vapor ( ) ) ,
179180 self . tangent_plane_distance ( new_vle_state. liquid ( ) ) ,
180181 ] ;
181- let dg = ( 1.0 - beta) * tpd[ 1 ] + beta * tpd[ 0 ] ;
182+ let b = new_vle_state. 1 ;
183+ let dg = b[ 0 ] * tpd[ 0 ] + b[ 1 ] * tpd[ 1 ] ;
182184
183185 // fix if only tpd[1] is positive
184186 if tpd[ 0 ] < 0.0 && dg >= 0.0 {
@@ -276,7 +278,7 @@ where
276278 }
277279
278280 // calculate total Gibbs energy before the extrapolation
279- let gibbs = self . total_gibbs_energy ( ) ;
281+ let gibbs = self . total_molar_gibbs_energy ( ) ;
280282
281283 // extrapolate K values
282284 let delta_vec = [
@@ -304,7 +306,7 @@ where
304306 // calculate new states
305307 let mut trial_vle_state = self . clone ( ) ;
306308 trial_vle_state. update_states ( feed_state, & k) ?;
307- if trial_vle_state. total_gibbs_energy ( ) < gibbs {
309+ if trial_vle_state. total_molar_gibbs_energy ( ) < gibbs {
308310 * self = trial_vle_state;
309311 }
310312 }
@@ -366,23 +368,21 @@ where
366368
367369 fn update_states ( & mut self , feed_state : & State < E , N > , k : & OVector < f64 , N > ) -> FeosResult < ( ) > {
368370 // calculate vapor phase fraction using Rachford-Rice algorithm
369- let beta = self . vapor_phase_fraction ( ) ;
370- let beta = rachford_rice ( & feed_state. molefracs , k, beta) ?;
371+ let beta = self . 1 [ 0 ] ;
372+ let b = rachford_rice ( & feed_state. molefracs , k, Some ( beta) ) ?;
371373
372374 // update VLE
373375 let v = feed_state
374- . moles ( )
375- . clone ( )
376- . component_mul ( & Dimensionless :: new (
377- k. map ( |k| beta * k / ( 1.0 - beta + beta * k) ) ,
378- ) ) ;
376+ . molefracs
377+ . component_mul ( & k. map ( |k| b * k / ( 1.0 - b + b * k) ) ) ;
379378 let l = feed_state
380- . moles ( )
381- . clone ( )
382- . component_mul ( & Dimensionless :: new (
383- k. map ( |k| ( 1.0 - beta) / ( 1.0 - beta + beta * k) ) ,
384- ) ) ;
385- self . update_moles ( feed_state. pressure ( Contributions :: Total ) , [ & v, & l] ) ?;
379+ . molefracs
380+ . component_mul ( & k. map ( |k| ( 1.0 - b) / ( 1.0 - b + b * k) ) ) ;
381+ self . update_composition (
382+ feed_state. pressure ( Contributions :: Total ) ,
383+ [ & v, & l] ,
384+ [ b, 1.0 - b] ,
385+ ) ?;
386386 Ok ( ( ) )
387387 }
388388
@@ -391,9 +391,10 @@ where
391391 let state1 = stable_states. pop ( ) ;
392392 let state2 = stable_states. pop ( ) ;
393393 if let Some ( s1) = state1 {
394- let init1 = Self :: from_states ( s1. clone ( ) , feed_state. clone ( ) ) ;
394+ // TODO: sort
395+ let init1 = Self :: two_phase ( s1. clone ( ) , feed_state. clone ( ) ) ;
395396 if let Some ( s2) = state2 {
396- Ok ( ( Self :: from_states ( s1, s2) , Some ( init1) ) )
397+ Ok ( ( Self :: two_phase ( s1, s2) , Some ( init1) ) )
397398 } else {
398399 Ok ( ( init1, None ) )
399400 }
0 commit comments