OpenLB 1.7
Loading...
Searching...
No Matches
Public Member Functions | List of all members
olb::MultiComponentPengRobinson Class Reference

#include <interactionPotential.h>

+ Collaboration diagram for olb::MultiComponentPengRobinson:

Public Member Functions

 MultiComponentPengRobinson (double p_, double T_, std::vector< double > z_, std::vector< double > a_L, std::vector< double > b_L, std::vector< double > M_L, std::vector< double > Tc_L, std::vector< double > pc_L, std::vector< double > omega_, std::vector< double > devi, std::vector< double > alpha_, std::vector< double > gI_L, std::vector< double > gII_L)
 
double G_Excess (std::vector< double > x_i, std::vector< double > g_jk, std::vector< double > beta_jk)
 
double b_mix (std::vector< double > x_i)
 
double a_mix (std::vector< double > x_i, std::vector< double > a_i, double b, double G_E)
 
double p_PR (double v, double a_m, double b_m)
 
double gamma_i (std::vector< double > x_i, double a_i, std::vector< double > g_jk, std::vector< double > beta_jk, double _T, int i)
 
double lnfugacity_i (std::vector< double > x_i, double v, double a_m, double b_m, double gamma_i, double _T, int i)
 
std::vector< double > iterate_VLE (double residuum, double beta0)
 
std::vector< double > getChis (int n)
 

Detailed Description

Definition at line 38 of file interactionPotential.h.

Constructor & Destructor Documentation

◆ MultiComponentPengRobinson()

olb::MultiComponentPengRobinson::MultiComponentPengRobinson ( double p_,
double T_,
std::vector< double > z_,
std::vector< double > a_L,
std::vector< double > b_L,
std::vector< double > M_L,
std::vector< double > Tc_L,
std::vector< double > pc_L,
std::vector< double > omega_,
std::vector< double > devi,
std::vector< double > alpha_,
std::vector< double > gI_L,
std::vector< double > gII_L )

Definition at line 191 of file interactionPotential.hh.

193 :
194p(p_), T(T_), z(z_), num_comp(z.size()), a_c(a_L), b(b_L), M(M_L), T_c(Tc_L), p_c(pc_L), omega(omega_), m(devi), alpha(alpha_), g_I(gI_L), g_II(gII_L)
195{ }

Member Function Documentation

◆ a_mix()

double olb::MultiComponentPengRobinson::a_mix ( std::vector< double > x_i,
std::vector< double > a_i,
double b,
double G_E )

Definition at line 216 of file interactionPotential.hh.

216 {
217 double a_sum = 0;
218 for(int i = 0; i < num_comp; i++){
219 a_sum = a_sum + x_i[i]*a_i[i]/b[i];
220 }
221 /*double a_m = 0;
222 for(int i = 0; i < num_comp; i++){
223 a_i[i] = a_c[i] * util::pow((1 + m[i] * (1 - util::pow((_T/T_c[i]),0.5))),2);
224 for(int j = 0; j < num_comp; j++){
225 a_m += x_i[i]*x_i[j]*util::pow(a_i[i]*a_i[j],0.5);
226 }
227 }
228 return a_m;*/
229 return b_m * (a_sum - G_E / lambda);
230}
+ Here is the caller graph for this function:

◆ b_mix()

double olb::MultiComponentPengRobinson::b_mix ( std::vector< double > x_i)

Definition at line 209 of file interactionPotential.hh.

209 {
210 double b_m = 0;
211 for(int i = 0; i < num_comp; i++){
212 b_m = b_m + b[i]*x_i[i];
213 }
214 return b_m;
215}
+ Here is the caller graph for this function:

◆ G_Excess()

double olb::MultiComponentPengRobinson::G_Excess ( std::vector< double > x_i,
std::vector< double > g_jk,
std::vector< double > beta_jk )

Definition at line 196 of file interactionPotential.hh.

196 {
197 double G_E = 0;
198 for(int i = 0; i < num_comp; i++){
199 double sum1 = 0;
200 double sum2 = 0;
201 for(int j = 0; j < num_comp; j++){
202 sum1 = sum1 + x_i[j]*g_jk[i+num_comp*j]*beta_jk[i+num_comp*j];
203 sum2 = sum2 + x_i[j]*beta_jk[i+num_comp*j];
204 }
205 G_E = G_E + x_i[i] * sum1/sum2;
206 }
207 return G_E;
208}
+ Here is the caller graph for this function:

◆ gamma_i()

double olb::MultiComponentPengRobinson::gamma_i ( std::vector< double > x_i,
double a_i,
std::vector< double > g_jk,
std::vector< double > beta_jk,
double _T,
int i )

Definition at line 234 of file interactionPotential.hh.

234 {
235 double sum1 = 0;
236 double sum2 = 0;
237 double sum3 = 0;
238 double sum4 = 0;
239 for(int j = 0; j < num_comp; j++){
240 sum1 = sum1 + x_i[j]*g_jk[num_comp*j+i]*beta_jk[num_comp*j+i];
241 sum2 = sum2 + x_i[j]*beta_jk[num_comp*j+i];
242 double sub31 = 0;
243 double sub41 = 0;
244 double sub42 = 0;
245 for(int k = 0; k < num_comp; k++){
246 sub31 = sub31 + x_i[k]*beta_jk[j+num_comp*k];
247 sub41 = sub41 + x_i[k]*g_jk[j+num_comp*k]*beta_jk[j+num_comp*k];
248 sub42 = sub42 + x_i[k]*beta_jk[j+num_comp*k];
249 }
250 sum3 = sum3 + x_i[j]*g_jk[num_comp*i+j]*beta_jk[num_comp*i+j] / sub31;
251 sum4 = sum4 + x_i[j]*beta_jk[num_comp*i+j]*sub41/util::pow(sub42,2);
252 }
253 return 1/(R*_T) * (a_i / b[i] - 1/lambda * (sum1/sum2 + sum3 - sum4));
254}
cpu::simd::Pack< T > pow(cpu::simd::Pack< T > base, cpu::simd::Pack< T > exp)
Definition pack.h:112

References olb::util::pow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getChis()

std::vector< double > olb::MultiComponentPengRobinson::getChis ( int n)

Definition at line 369 of file interactionPotential.hh.

369 {
370 std::vector<double> n_chis(n);
371 for(int i = 0; i<n; i++){
372 n_chis[i] = chis[i];
373 }
374 return n_chis;
375}

◆ iterate_VLE()

std::vector< double > olb::MultiComponentPengRobinson::iterate_VLE ( double residuum,
double beta0 )

Definition at line 275 of file interactionPotential.hh.

275 {
276 std::vector<double> a_i(num_comp), g_jk(num_comp*num_comp), beta_jk(num_comp*num_comp);
277 for(int i = 0; i < num_comp; i++){
278 a_i[i] = a_c[i] * util::pow((1 + m[i] * (1 - util::pow((T/T_c[i]),0.5))),2);
279 for(int j = 0; j < num_comp; j++){
280 g_jk[num_comp*i+j] = g_I[num_comp*i+j] + g_II[num_comp*i+j] * T;
281 beta_jk[num_comp*i+j] = b[j] * util::exp(-alpha[num_comp*i+j]*g_jk[num_comp*i+j]/(R*T));
282 }
283 }
284 std::vector<double> vx(2+2*num_comp), K(num_comp), x(num_comp), y(num_comp), G_E(2), b_m(2), a_m(2), gammas(2*num_comp);
285 std::vector<double> deltaLogFugacity(num_comp), errorFugacity(num_comp);
286 double totalError = 0;
287 for(int i = 0; i < num_comp; i++){
288 //adjust prefactor or initial values for partition coefficients, 0.9 for hydrocarbons
289 K[i] = 1.0*(p_c[i]/(p))*util::exp(5.373*(1+omega[i])*(1-T_c[i]/T));
290 errorFugacity[i] = 1;
291 }
292 for(int i = 0; i < 2; i++){
293 vx[i] = init_v[i];
294 }
295 double beta = beta0;
296 double f = 0;
297 do{
298 totalError = 0;
299 f = 0;
300 for(int i = 0; i < num_comp; i++){
301 f += (K[i]-1)*z[i]/(1+(K[i]-1)*beta);
302 }
303 while(abs(f) > residuum){
304 double dfdbeta = 0;
305 for(int i = 0; i < num_comp; i++){
306 dfdbeta += -1*(K[i]-1)*(K[i]-1)*z[i]/((1+(K[i]-1)*beta)*(1+(K[i]-1)*beta));
307 }
308 beta = beta - f / dfdbeta;
309 f = 0;
310 for(int i = 0; i < num_comp; i++){
311 f += (K[i]-1)*z[i]/(1+(K[i]-1)*beta);
312 }
313 }
314 double x_sum = 0;
315 double y_sum = 0;
316 for(int i = 0; i < num_comp; i++){
317 x[i] = z[i]/(1+(K[i]-1)*beta);
318 y[i] = K[i]*x[i];
319 x_sum += x[i];
320 y_sum += y[i];
321 }
322 if(x_sum != 1 || y_sum != 1){
323 for(int i = 0; i < num_comp; i++){
324 vx[i+2] = x[i]/x_sum;
325 x[i] = vx[i+2];
326 vx[i+2+num_comp] = y[i]/y_sum;
327 y[i] = vx[i+2+num_comp];
328 }
329 }
330
331 G_E[0] = G_Excess(x, g_jk, beta_jk);
332 G_E[1] = G_Excess(y, g_jk, beta_jk);
333 b_m[0] = b_mix(x);
334 b_m[1] = b_mix(y);
335 a_m[0] = a_mix(x, a_i, b_m[0], G_E[0]);
336 a_m[1] = a_mix(y, a_i, b_m[1], G_E[1]);
337 for(int i = 0; i < num_comp; i++){
338 gammas[i] = gamma_i(x, a_i[i], g_jk, beta_jk, T, i);
339 gammas[i+num_comp] = gamma_i(y, a_i[i], g_jk, beta_jk, T, i);
340 }
341
342 for(int i = 0; i < 2; i++){
343 while(abs(p-p_PR(vx[i], a_m[i], b_m[i])) > residuum){
344 double dpdv = -R*T/util::pow(vx[i]-b_m[i],2) +
345 2*a_m[i]*(vx[i]+b_m[i])/util::pow(util::pow(vx[i],2) + 2*vx[i]*b_m[i] - util::pow(b_m[i],2),2);
346 vx[i] = vx[i] - (p - p_PR(vx[i], a_m[i], b_m[i])) / (-dpdv);
347 }
348 }
349 for(int i = 0; i < num_comp; i++){
350 deltaLogFugacity[i] = lnfugacity_i(x, vx[0], a_m[0], b_m[0], gammas[i], T, i) -
351 lnfugacity_i(y, vx[1], a_m[1], b_m[1], gammas[i+num_comp], T, i);
352 errorFugacity[i] = util::exp(deltaLogFugacity[i]) - 1;
353 K[i] = util::exp(deltaLogFugacity[i]) / (x[i]/y[i]);
354 totalError += util::pow(errorFugacity[i],2);
355 }
356 }while(util::pow(totalError,0.5) > residuum);
357 for(int i = 1; i<num_comp; i++){
358 volatilities[i] = (M[i]*(vx[i+2]/vx[0] - vx[i+2+num_comp]/vx[1])) / (M[0]*(vx[2]/vx[0] - vx[2+num_comp]/vx[1]));
359 }
360 double vol_sum = 0;
361 for(int i = 0; i<num_comp; i++){
362 vol_sum += volatilities[i];
363 }
364 for(int i = 0; i<num_comp; i++){
365 chis[i] = volatilities[i] / vol_sum;
366 }
367 return vx;
368}
double a_mix(std::vector< double > x_i, std::vector< double > a_i, double b, double G_E)
double b_mix(std::vector< double > x_i)
double p_PR(double v, double a_m, double b_m)
double G_Excess(std::vector< double > x_i, std::vector< double > g_jk, std::vector< double > beta_jk)
double lnfugacity_i(std::vector< double > x_i, double v, double a_m, double b_m, double gamma_i, double _T, int i)
double gamma_i(std::vector< double > x_i, double a_i, std::vector< double > g_jk, std::vector< double > beta_jk, double _T, int i)
ADf< T, DIM > exp(const ADf< T, DIM > &a)
Definition aDiff.h:455
std::enable_if_t< std::is_arithmetic< T >::type::value, T > abs(T x)
Definition util.h:396

References a_mix(), olb::abs(), b_mix(), olb::util::exp(), G_Excess(), gamma_i(), lnfugacity_i(), p_PR(), and olb::util::pow().

+ Here is the call graph for this function:

◆ lnfugacity_i()

double olb::MultiComponentPengRobinson::lnfugacity_i ( std::vector< double > x_i,
double v,
double a_m,
double b_m,
double gamma_i,
double _T,
int i )

Definition at line 255 of file interactionPotential.hh.

255 {
256 //TODO change inputs for non-isothermal cases!!!
257 double term1 = b[i]/(v-b_m) + util::log(x_i[i]*R*_T/(v-b_m));
258 double term2 = -gamma_i / util::pow(2,1.5) * util::log((v + (util::pow(2,0.5)+1)*b_m)/(v-(util::pow(2,0.5)-1)*b_m));
259 double term3 = -b[i]*a_m/(util::pow(2,1.5)*b_m*R*_T)*
260 ((util::pow(2,0.5)+1)/(v+(util::pow(2,0.5)+1)*b_m)+(util::pow(2,0.5)-1)/(v-(util::pow(2,0.5)-1)*b_m));
261 /*std::vector<double> a_i(num_comp);
262 a_m = 0;
263 for(int i = 0; i < num_comp; i++){
264 a_i[i] = a_c[i] * util::pow((1 + m[i] * (1 - util::pow((_T/T_c[i]),0.5))),2);
265 for(int j = 0; j < num_comp; j++){
266 a_m += x_i[i]*x_i[j]*util::pow(a_i[i]*a_i[j],0.5);
267 }
268 }
269 gamma_i = -a_m/(b_m*R*_T)*(b[i]/b_m-2/a_m*(x_i[0]*util::pow(a_i[0]*a_i[i],0.5)+x_i[1]*util::pow(a_i[1]*a_i[i],0.5)));
270 term1 = b[i]/(v-b_m) + util::log(x_i[i]*R*_T/(v-b_m));
271 term2 = -gamma_i / util::pow(2,1.5) * util::log((v + (util::pow(2,0.5)+1)*b_m)/(v-(util::pow(2,0.5)-1)*b_m));
272 term3 = -b[i]*a_m/(util::pow(2,1.5)*b_m*R*_T)*((util::pow(2,0.5)+1)/(v+(util::pow(2,0.5)+1)*b_m)+(util::pow(2,0.5)-1)/(v-(util::pow(2,0.5)-1)*b_m));*/
273 return term1 + term2 + term3;
274}
ADf< T, DIM > log(const ADf< T, DIM > &a)
Definition aDiff.h:475

References gamma_i(), olb::util::log(), and olb::util::pow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ p_PR()

double olb::MultiComponentPengRobinson::p_PR ( double v,
double a_m,
double b_m )

Definition at line 231 of file interactionPotential.hh.

231 {
232 return R*T/(v - b_m) - a_m/(util::pow(v,2) + 2*v*b_m - util::pow(b_m,2));
233}

References olb::util::pow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

The documentation for this class was generated from the following files: