Droplet Lagrangian Transient One-dimensional Reacting Code Implementation of both liquid and gas phase governing equations.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

674 行
20KB

  1. #include "UserData.h"
  2. #include "parse.h"
  3. void freeUserData(UserData data){
  4. if(data!=NULL){
  5. /*destructor for C++ vector*/
  6. using Td = std::vector<double>;
  7. using Ts = std::vector<std::string>;
  8. using Tt = std::vector<size_t>;
  9. data->dropMole.~Td();
  10. data->dropSpec.~Ts();
  11. data->gamma.~Td();
  12. data->MW.~Td();
  13. data->k_drop.~Tt();
  14. if(data->trmix!=NULL){
  15. delete data->trmix;
  16. printf("Transport Deleted!\n");
  17. }
  18. if(data->gas!=NULL){
  19. delete data->gas;
  20. printf("Gas Deleted!\n");
  21. }
  22. if(data->adaptiveGrid){
  23. if(data->grid->xOld!=NULL){
  24. delete[] data->grid->xOld;
  25. printf("old grid array Deleted!\n");
  26. }
  27. if(data->grid->x!=NULL){
  28. delete[] data->grid->x;
  29. printf("current grid array Deleted!\n");
  30. }
  31. if(data->grid!=NULL){
  32. free(data->grid);
  33. printf("grid object Freed!\n");
  34. }
  35. }
  36. else{
  37. if(data->uniformGrid!=NULL){
  38. delete[] data->uniformGrid;
  39. printf("uniformGrid deleted!\n");
  40. }
  41. }
  42. if(data->innerMassFractions!=NULL){
  43. delete[] data->innerMassFractions;
  44. printf("innerMassFractions array Deleted!\n");
  45. }
  46. if(data->output!=NULL){
  47. fclose(data->output);
  48. printf("Output File Cleared from Memory!\n");
  49. }
  50. if(data->gridOutput!=NULL){
  51. fclose(data->gridOutput);
  52. printf("Grid Output File Cleared from Memory!\n");
  53. }
  54. //if(data->ratesOutput!=NULL){
  55. // fclose(data->ratesOutput);
  56. // printf("Rates Output File Cleared from Memory!\n");
  57. //}
  58. if(data->globalOutput!=NULL){
  59. fclose(data->globalOutput);
  60. printf("Global Output File Cleared from Memory!\n");
  61. }
  62. // if(data->timescaleOutput!=NULL){
  63. // fclose(data->timescaleOutput);
  64. // printf("Characteristic Timescale Output File Cleared from Memory!\n");
  65. // }
  66. //if(data->rxnROPOutput!=NULL){
  67. // fclose(data->rxnROPOutput);
  68. // printf("Reactions Rate of Progress Output File Cleared from Memory!\n");
  69. //}
  70. //if(data->spROPOutput!=NULL){
  71. // fclose(data->spROPOutput);
  72. // printf("Species Rate of Production Output File Cleared from Memory!\n");
  73. //}
  74. }
  75. free(data); /* Free the user data */
  76. printf("\n\n");
  77. }
  78. UserData allocateUserData(FILE *input){
  79. UserData data;
  80. data = (UserData) malloc(sizeof *data);
  81. new(&(data->dropMole)) std::vector<double>;
  82. new(&(data->dropSpec)) std::vector<std::string>;
  83. new(&(data->gamma)) std::vector<double>;
  84. new(&(data->MW)) std::vector<double>;
  85. new(&(data->k_drop)) std::vector<size_t>;
  86. if(!data){
  87. printf("Allocation Failed!\n");
  88. return(NULL);
  89. }
  90. setSaneDefaults(data);
  91. int ier;
  92. ier=parseNumber<size_t>(input, "liquidBasePts" , MAXBUFLEN, &data->l_npts);
  93. if(ier==-1 || data->l_npts<=0){
  94. printf("Enter non-zero liquidbasePts!\n");
  95. return(NULL);
  96. }
  97. ier=parseNumber<size_t>(input, "gasBasePts" , MAXBUFLEN, &data->g_npts);
  98. if(ier==-1 || data->g_npts<=0){
  99. printf("Enter non-zero gasBasePts!\n");
  100. return(NULL);
  101. }
  102. ier=parseNumber<double>(input, "domainLength", MAXBUFLEN, &data->domainLength);
  103. if(ier==-1 || data->domainLength<=0.0e0){
  104. printf("domainLength error!\n");
  105. return(NULL);
  106. }
  107. ier=parseNumber<double>(input, "Rd", MAXBUFLEN, &data->Rd);
  108. if(ier==-1 || data->Rd<=0.0e0){
  109. printf("Rd error!\n");
  110. return(NULL);
  111. }
  112. ier=parseNumber<int>(input, "constantPressure" , MAXBUFLEN, &data->constantPressure);
  113. if(ier==-1 || (data->constantPressure!=0 && data->constantPressure!=1)){
  114. printf("constantPressure error!\n");
  115. return(NULL);
  116. }
  117. ier=parseNumber<int>(input, "problemType" , MAXBUFLEN, &data->problemType);
  118. if(ier==-1 || (data->problemType!=0
  119. && data->problemType!=1
  120. && data->problemType!=2
  121. && data->problemType!=3)){
  122. printf("include valid problemType!\n");
  123. printf("0: premixed combustion with NO equilibrated ignition kernel\n");
  124. printf("1: premixed combustion WITH equilibrated ignition kernel\n");
  125. printf("2: arbitrary initial conditions\n");
  126. printf("3: Restart\n");
  127. return(NULL);
  128. }
  129. ier=parseNumber<int>(input,"dropletType",MAXBUFLEN,&data->dropType);
  130. if(ier==-1 || (data->dropType!=0
  131. && data->dropType!=1)){
  132. printf("include valid dropletType!\n");
  133. printf("0: single component droplet\n");
  134. printf("1: bi-component droplet\n");
  135. return(NULL);
  136. }
  137. ier=parseDropSpec<double>(input,"dropletMole",MAXBUFLEN,&data->dropType,data->dropMole);
  138. if(ier== -1){
  139. printf("include correct format for droplet mole fraction!\n");
  140. printf("single composition droplet: dropletMole:1.00\n");
  141. printf("binary composition droplet: dropletMole:0.3,0.7\n");
  142. return(NULL);
  143. }
  144. ier=parseDropSpec<std::string>(input,"dropletComposition",MAXBUFLEN,&data->dropType,data->dropSpec);
  145. if(ier== -1){
  146. printf("include correct format for droplet composition!\n");
  147. printf("single composition droplet: dropletComposition:n-heptane\n");
  148. printf("binary composition droplet: dropletComposition:propane,n-heptane\n");
  149. return(NULL);
  150. }
  151. ier=parseNumber<int>(input, "quasiSteady" , MAXBUFLEN, &data->quasiSteady);
  152. if(ier==-1 || (data->quasiSteady!=0
  153. && data->quasiSteady!=1)){
  154. printf("include valid quasiSteady!\n");
  155. printf("0: The droplet surface recedes and the droplet losses mass\n");
  156. printf("1: The droplet surface does not move and the droplet mass is constant\n");
  157. return(NULL);
  158. }
  159. ier=parseNumber<double>(input, "dPdt", MAXBUFLEN, &data->dPdt);
  160. ier=parseNumber<double>(input, "Rg", MAXBUFLEN, &data->Rg);
  161. if(data->Rg < 0.0){
  162. printf("Rg must be greater than 0");
  163. return(NULL);
  164. }
  165. ier=parseNumber<int> (input, "reflectProblem" , MAXBUFLEN, &data->reflectProblem);
  166. if(data->reflectProblem!=0 && data->reflectProblem!=1){
  167. printf("Invalid entry for reflectProblem! Can be only 1 or 0.\n");
  168. return(NULL);
  169. }
  170. ier=parseNumber<double>(input, "mdot" , MAXBUFLEN, &data->mdot);
  171. ier=parseNumber<double>(input, "initialTemperature", MAXBUFLEN,
  172. &data->initialTemperature);
  173. if(ier==-1 || data->initialTemperature<=0.0e0){
  174. printf("Enter positive initialTemperature in K!\n");
  175. return(NULL);
  176. }
  177. ier=parseNumber<double>(input, "initialPressure", MAXBUFLEN,
  178. &data->initialPressure);
  179. if(ier==-1 || data->initialTemperature<=0.0e0){
  180. printf("Enter positive initialPressure in atm!\n");
  181. return(NULL);
  182. }
  183. ier=parseNumber<int> (input, "metric" , MAXBUFLEN, &data->metric);
  184. if(data->metric!=0 && data->metric!=1 && data->metric!=2){
  185. printf("Invalid entry for metric!\n");
  186. printf("0: Cartesian\n");
  187. printf("1: Cylindrical\n");
  188. printf("2: Spherical\n");
  189. return(NULL);
  190. }
  191. ier=parseNumber<double>(input, "QDot", MAXBUFLEN, &data->maxQDot);
  192. if(ier==-1 && data->problemType==0){
  193. printf("Need to specify QDot for problemType 0!\n");
  194. return(NULL);
  195. }
  196. ier=parseNumber<double>(input, "kernelSize", MAXBUFLEN, &data->kernelSize);
  197. if(ier==-1 && data->problemType==0){
  198. printf("Need to specify kernelSize for problemType 0!\n");
  199. return(NULL);
  200. }
  201. ier=parseNumber<double>(input, "ignTime", MAXBUFLEN, &data->ignTime);
  202. if(ier==-1 && data->problemType==0){
  203. printf("Need to specify ignTime for problemType 0!\n");
  204. return(NULL);
  205. }
  206. ier=parseNumber<double>(input, "mixingWidth", MAXBUFLEN,
  207. &data->mixingWidth);
  208. if(ier==-1){
  209. printf("Need to specify mixingWidth!\n");
  210. return(NULL);
  211. }
  212. ier=parseNumber<double>(input, "shift", MAXBUFLEN, &data->shift);
  213. ier=parseNumber<double>(input, "firstRadius", MAXBUFLEN, &data->firstRadius);
  214. ier=parseNumber<double>(input, "wallTemperature", MAXBUFLEN, &data->wallTemperature);
  215. ier=parseNumber<int> (input, "dirichletInner" , MAXBUFLEN,
  216. &data->dirichletInner);
  217. if(data->dirichletInner!=0 && data->dirichletInner!=1){
  218. printf("dirichletInner can either be 0 or 1!\n");
  219. return(NULL);
  220. }
  221. ier=parseNumber<int> (input, "dirichletOuter" , MAXBUFLEN,
  222. &data->dirichletOuter);
  223. if(data->dirichletOuter!=0 && data->dirichletOuter!=1){
  224. printf("dirichletOuter can either be 0 or 1!\n");
  225. return(NULL);
  226. }
  227. ier=parseNumber<int> (input, "adaptiveGrid" , MAXBUFLEN,
  228. &data->adaptiveGrid);
  229. if(ier==-1 || (data->adaptiveGrid!=0 && data->adaptiveGrid!=1)){
  230. printf("specify adaptiveGrid as 0 or 1!\n");
  231. return(NULL);
  232. }
  233. ier=parseNumber<int> (input, "moveGrid" , MAXBUFLEN,
  234. &data->moveGrid);
  235. if(ier==-1 || (data->moveGrid!=0 && data->moveGrid!=1)){
  236. printf("specify moveGrid as 0 or 1!\n");
  237. return(NULL);
  238. }
  239. ier=parseNumber<double> (input, "isotherm" , MAXBUFLEN,
  240. &data->isotherm);
  241. if(ier==-1){
  242. printf("specify temperature of isotherm!\n");
  243. return(NULL);
  244. }
  245. ier=parseNumber<double>(input, "gridOffset", MAXBUFLEN, &data->gridOffset);
  246. ier=parseNumber<int> (input, "nSaves" , MAXBUFLEN, &data->nSaves);
  247. if(data->nSaves<0 ){
  248. printf("nSaves must be greater than 0!\n");
  249. return(NULL);
  250. }
  251. ier=parseNumber<int> (input, "writeRates" , MAXBUFLEN,
  252. &data->writeRates);
  253. if(data->writeRates!=0 && data->writeRates!=1){
  254. printf("writeRates must either be 0 or 1!\n");
  255. return(NULL);
  256. }
  257. ier=parseNumber<int> (input, "writeEveryRegrid", MAXBUFLEN,
  258. &data->writeEveryRegrid);
  259. if(data->writeEveryRegrid!=0 && data->writeEveryRegrid!=1){
  260. printf("writeEveryRegrid must either be 0 or 1!\n");
  261. return(NULL);
  262. }
  263. ier=parseNumber<int> (input, "setConstraints" , MAXBUFLEN,
  264. &data->setConstraints);
  265. if(data->setConstraints!=0 && data->setConstraints!=1){
  266. printf("setConstraints must either be 0 or 1!\n");
  267. return(NULL);
  268. }
  269. ier=parseNumber<int> (input, "suppressAlg" , MAXBUFLEN,
  270. &data->suppressAlg);
  271. if(data->suppressAlg!=0 && data->suppressAlg!=1){
  272. printf("suppressAlg must either be 0 or 1!\n");
  273. return(NULL);
  274. }
  275. ier=parseNumber<int> (input, "dryRun" , MAXBUFLEN,
  276. &data->dryRun);
  277. if(data->dryRun!=0 && data->dryRun!=1){
  278. printf("dryRun must either be 0 or 1!\n");
  279. return(NULL);
  280. }
  281. ier=parseNumber<double> (input, "finalTime" , MAXBUFLEN,
  282. &data->finalTime);
  283. ier=parseNumber<double> (input, "relativeTolerance" , MAXBUFLEN,
  284. &data->relativeTolerance);
  285. ier=parseNumber<double> (input, "radiusTolerance" , MAXBUFLEN,
  286. &data->radiusTolerance);
  287. ier=parseNumber<double> (input, "temperatureTolerance", MAXBUFLEN,
  288. &data->temperatureTolerance);
  289. ier=parseNumber<double> (input, "pressureTolerance", MAXBUFLEN,
  290. &data->pressureTolerance);
  291. ier=parseNumber<double> (input, "massFractionTolerance", MAXBUFLEN,
  292. &data->massFractionTolerance);
  293. ier=parseNumber<double> (input, "bathGasTolerance", MAXBUFLEN,
  294. &data->bathGasTolerance);
  295. ier=parseNumber<double> (input, "MdotTolerance", MAXBUFLEN,
  296. &data->MdotTolerance);
  297. char chem[MAXBUFLEN],mix[MAXBUFLEN],tran[MAXBUFLEN];
  298. ier=parseNumber<char>(input, "chemistryFile" , MAXBUFLEN, chem);
  299. if(ier==-1){
  300. printf("Enter chemistryFile!\n");
  301. return(NULL);
  302. }else{
  303. try{
  304. data->gas = new Cantera::IdealGasMix(chem);
  305. data->nsp=data->gas->nSpecies(); //assign no: of species
  306. } catch (Cantera::CanteraError& err) {
  307. printf("Error:\n");
  308. printf("%s\n",err.what());
  309. return(NULL);
  310. }
  311. }
  312. // /*No. of liquid phase species is determined by droplet type, either 1 or 2*/
  313. // if(data->dropType==0){
  314. // data->l_nsp=1;
  315. // }else{
  316. // data->l_nsp=2;
  317. // }
  318. ier=parseNumber<char>(input, "transportModel", MAXBUFLEN, tran);
  319. if(ier==-1){
  320. printf("Enter transportModel!\n");
  321. return(NULL);
  322. }else{
  323. try{
  324. data->trmix = Cantera::newTransportMgr(tran, data->gas);
  325. }catch (Cantera::CanteraError& err) {
  326. printf("Error:\n");
  327. printf("%s\n",err.what());
  328. return(NULL);
  329. }
  330. }
  331. ier=parseNumber<char>(input, "mixtureComposition", MAXBUFLEN, mix);
  332. if(ier==-1){
  333. printf("Enter mixtureComposition!\n");
  334. return(NULL);
  335. }else{
  336. if(data->gas!=NULL){
  337. try{
  338. data->gas->setState_TPX(data->initialTemperature,
  339. data->initialPressure*Cantera::OneAtm,
  340. mix);
  341. }catch (Cantera::CanteraError& err) {
  342. printf("Error:\n");
  343. printf("%s\n",err.what());
  344. return(NULL);
  345. }
  346. }
  347. }
  348. //ier=parseNumber<char>(input, "dropletComposition", MAXBUFLEN, data->dropSpec);
  349. //if(ier==-1){
  350. // printf("Enter composition of droplet!\n");
  351. // return(NULL);
  352. //}
  353. //ier=parseDrop(input,"dropletComposition",data->dropSpec,data->dropMole,MAXBUFLEN);
  354. //ier=parseDrop(input,"dropletDensity",data->dropSpec,data->dropDens,MAXBUFLEN);
  355. ier=parseNumber<int> (input, "nThreads", MAXBUFLEN, &data->nThreads);
  356. if(data->nThreads<0 ){
  357. printf("nThreads must be greater than 0!\n");
  358. return(NULL);
  359. }
  360. ier=parseNumber<double>(input, "PCAD", MAXBUFLEN, &data->PCAD);
  361. // if(ier==-1){
  362. // printf("Enter PCAD value!\n");
  363. // return(NULL);
  364. // }
  365. ier=parseNumber<double>(input,"RGTC", MAXBUFLEN, &data->RGTC);
  366. // if(ier==-1){
  367. // printf("Enter PGTC value!\n");
  368. // return(NULL);
  369. // }
  370. ier=parseNumber<int>(input,"JJRG", MAXBUFLEN, &data->JJRG);
  371. // if(ier==-1){
  372. // printf("Enter JJRG value!\n");
  373. // return(NULL);
  374. // }
  375. ier=parseNumber<double>(input,"deltaT", MAXBUFLEN, &data->deltaT);
  376. // if(ier==-1){
  377. // printf("Enter deltaT value!\n");
  378. // return(NULL);
  379. // }
  380. data->nr=0;
  381. //data->np=data->nr+1;
  382. data->nt=data->nr+1;
  383. data->ny=data->nt+1;
  384. data->np=data->ny+data->nsp;
  385. data->nm=data->np+1;
  386. data->nvar=data->nsp+4; //assign no: of variables (R,T,P,Mdot,nsp species)
  387. // data->l_nr=0;
  388. // data->np=data->nr+1;
  389. // data->l_nt=data->l_nr+1;
  390. // data->l_ny=data->l_nt+1;
  391. // data->l_np=data->l_ny+data->l_nsp; //l_nsp is either 1 or 2
  392. // data->l_nm=data->l_np+1;
  393. // data->l_nvar=data->l_nsp+4;
  394. data->npts = data->l_npts+data->g_npts;
  395. //std::vector<double> MW(data->dropMole.size());
  396. for(size_t ii=0;ii< data->dropMole.size();ii++){
  397. // printf("Print inside the loop.\n" ) ;
  398. // printf("Print dropSpec component :%s! \n",data->dropSpec[0].c_str());
  399. // size_t index = 0;
  400. for(size_t k = 1; k <= data->nsp; k++) {
  401. printf("spcies name :%s! \t",data->gas->speciesName(k-1).c_str());
  402. if(data->gas->speciesName(k - 1)==data->dropSpec[ii] ) {
  403. // index = k;
  404. double weight = data->gas->molecularWeight(k-1);
  405. printf("Molecular weight is: %.3f. \n",weight) ;
  406. data->MW.push_back(weight);
  407. }
  408. }
  409. }
  410. // printf("MW array size: %zu\n",data->MW.size());
  411. for(auto & arg :data->MW){
  412. printf("Molecular weight : %.3f. \n",arg) ;
  413. }
  414. // double massSum = 0.0;
  415. // for(int i=0;i<=1;i++){
  416. // massSum = massSum + data->dropMole[i] * MW[i];
  417. // }
  418. // data->dropRho = 0.0;
  419. // for(int i=0;i<=1;i++){
  420. // data->dropMassFrac[i] = data->dropMole[i]*MW[i]/massSum;
  421. // data->dropRho = data->dropRho + data->dropMassFrac[i]*data->dropDens[i];
  422. // }
  423. // printf("Density of droplet is: %.3f [kg/m^3]\n",data->dropRho);
  424. // Mass of droplet
  425. //data->massDrop=1.0/3.0*pow(data->Rd,3)*997.0; //TODO: The density of the droplet should be a user input
  426. //data->massDrop=1.0/3.0*pow(data->Rd,3)*684.00; //TODO: The density of the droplet(n-heptane) should be a user input
  427. // data->massDrop=1.0/3.0*pow(data->Rd,3)*data->dropRho;
  428. /* Update the gamma using UNIFAC method for propane and n-heptane */
  429. /*Note: gamma only need to be calculated when droplet type = 1, i.e. bi-component*/
  430. getGamma(data->dropMole,data->gamma);
  431. // printf("Gamma of Propane and n-heptane are %.3f and %.3f .\n",data->gamma[0],data->gamma[1]) ;
  432. if(data->dropType == 0){
  433. printf("Single component droplet problem, activity coeffcient is 1. \n");
  434. }else{
  435. for(auto & arg : data->gamma) {
  436. printf("Initial activity coeffcient %.3f .\n",arg);
  437. }
  438. }
  439. if(!data->adaptiveGrid){
  440. data->uniformGrid = new double [data->npts];
  441. // data->g_neq=data->g_nvar*data->g_npts;
  442. // data->l_neq=data->l_nvar*data->l_npts;
  443. data->neq=data->npts*data->nvar;
  444. }
  445. else{
  446. data->grid=(UserGrid) malloc(sizeof *data->grid);
  447. ier=getGridSettings(input,data->grid);
  448. if(ier==-1)return(NULL);
  449. ier=initializeGrid(data->grid);
  450. if(ier==-1)return(NULL);
  451. ier=reGrid(data->grid, data->grid->position);
  452. if(ier==-1)return(NULL);
  453. data->npts=data->grid->nPts;
  454. data->neq=data->nvar*data->npts;
  455. }
  456. data->output=fopen("output.dat","w");
  457. data->globalOutput=fopen("globalOutput.dat","w");
  458. data->gridOutput=fopen("grid.dat","w");
  459. // data->timescaleOutput=fopen("timeScale.dat","w") ;
  460. // data->rxnROPOutput=fopen("rxnROP.dat","w");
  461. // data->spROPOutput=fopen("spROP.dat","w");
  462. //data->ratesOutput=fopen("rates.dat","w");
  463. data->innerMassFractions = new double [data->nsp];
  464. //data->wdot_mole = new double [data->nsp] ;
  465. //data->wdot_mass = new double [data->nsp] ;
  466. data->time_scale = new double [(data->npts) * (data->nsp)] ;
  467. //data->MW = new double [data->nsp] ;
  468. return(data);
  469. }
  470. void setSaneDefaults(UserData data){
  471. data->domainLength=1.0e-02;
  472. data->Rd=100.0e-06;
  473. data->constantPressure=1;
  474. data->problemType=1;
  475. data->quasiSteady=1;
  476. data->dPdt=0.0e0;
  477. data->reflectProblem=0;
  478. data->mdot=0.0;
  479. data->initialTemperature=300.0;
  480. data->initialPressure=1.0;
  481. data->metric=0;
  482. data->ignTime=1e-09;
  483. data->maxQDot=0.0e0;
  484. data->maxTemperature=300.0e0;
  485. data->mixingWidth=1e-04;
  486. data->shift=3.0e-03;
  487. data->firstRadius=1e-04;
  488. data->wallTemperature=298.0e0;
  489. data->dirichletInner=0;
  490. data->dirichletOuter=0;
  491. data->adaptiveGrid=0;
  492. data->moveGrid=0;
  493. data->gridOffset=0.0e0;
  494. data->Rg=1.0;
  495. data->isotherm=1000.0;
  496. data->nSaves=30;
  497. data->writeRates=0;
  498. data->writeEveryRegrid=0;
  499. data->relativeTolerance=1e-06;
  500. data->radiusTolerance=1e-08;
  501. data->temperatureTolerance=1e-06;
  502. data->pressureTolerance=1e-06;
  503. data->massFractionTolerance=1e-09;
  504. data->bathGasTolerance=1e-06;
  505. data->MdotTolerance=1e-09;
  506. data->finalTime=1e-02;
  507. data->tNow=0.0e0;
  508. data->setConstraints=0;
  509. data->suppressAlg=1;
  510. data->regrid=0;
  511. data->gridDirection=1;
  512. data->dryRun=0;
  513. data->nThreads=1;
  514. data->flamePosition[0]=0.0e0;
  515. data->flamePosition[1]=0.0e0;
  516. data->flameTime[0]=0.0e0;
  517. data->flameTime[1]=0.0e0;
  518. data->nTimeSteps=0;
  519. data->PCAD=0.75;
  520. data->RGTC=1.0;
  521. data->JJRG=0;
  522. data->deltaT=200.0;
  523. }
  524. void getGamma(const double mole[],double gamma[]){
  525. /* define relevant matrix */
  526. Eigen::Matrix2d nu_ ;
  527. nu_ << 2,1,2,5;
  528. /* define relevant vectors */
  529. Eigen::Vector2d R_(0.9011,0.6744),Q_(0.8480,0.5400);
  530. Eigen::Vector2d r_,q_,x_,l_,ones_(1.0,1.0),v_,ksi_,gammaC_;
  531. double sum_q, sum_r,sum_l;
  532. r_ = nu_ * R_ ;
  533. q_ = nu_ * Q_ ;
  534. x_ << mole[0], mole[1] ;
  535. sum_q = x_.dot(q_) ;
  536. sum_r = x_.dot(r_) ;
  537. for(int i=0; i<v_.size() ; i++){
  538. v_[i] = q_[i] * x_[i] / sum_q;
  539. ksi_[i] = r_[i] * x_[i] / sum_r ;
  540. }
  541. l_ = 5 * (r_ - q_) - (r_ - ones_) ;
  542. sum_l = l_.dot(x_) ;
  543. /* calculate the gamma_c */
  544. for(int i=0; i<v_.size() ; i++){
  545. gammaC_[i] =std::exp( std::log(ksi_[i]/x_[i]) + 5*q_[i]*std::log(v_[i]/ksi_[i]) + l_[i] - ksi_[i]/x_[i]*sum_l );
  546. }
  547. /******* gamma_R for both propane and n-heptane are 0 **********/
  548. /* return the gamma */
  549. for(int i=0; i<v_.size(); i++){
  550. gamma[i] = gammaC_[i] ;
  551. }
  552. }
  553. void getGamma(const std::vector<double>& mole,std::vector<double>& gamma){
  554. size_t sz = mole.size();
  555. if (sz == 1){
  556. gamma.push_back(1);
  557. }else{
  558. gamma.reserve(mole.size());
  559. /* define relevant matrix */
  560. Eigen::Matrix2d nu_ ;
  561. nu_ << 2,1,2,5;
  562. /* define relevant vectors */
  563. Eigen::Vector2d R_(0.9011,0.6744),Q_(0.8480,0.5400);
  564. Eigen::Vector2d r_,q_,x_,l_,ones_(1.0,1.0),v_,ksi_,gammaC_;
  565. double sum_q, sum_r,sum_l;
  566. r_ = nu_ * R_ ;
  567. q_ = nu_ * Q_ ;
  568. x_ << mole[0], mole[1] ;
  569. sum_q = x_.dot(q_) ;
  570. sum_r = x_.dot(r_) ;
  571. for(size_t i=0; i<v_.size() ; i++){
  572. v_[i] = q_[i] * x_[i] / sum_q;
  573. ksi_[i] = r_[i] * x_[i] / sum_r ;
  574. }
  575. l_ = 5 * (r_ - q_) - (r_ - ones_) ;
  576. sum_l = l_.dot(x_) ;
  577. /* calculate the gamma_c */
  578. for(size_t i=0; i<v_.size() ; i++){
  579. gammaC_[i] =std::exp( std::log(ksi_[i]/x_[i]) + 5*q_[i]*std::log(v_[i]/ksi_[i]) + l_[i] - ksi_[i]/x_[i]*sum_l );
  580. }
  581. /******* gamma_R for both propane and n-heptane are 0 **********/
  582. /* return the gamma */
  583. for(size_t i=0; i<v_.size(); i++){
  584. gamma.push_back(gammaC_[i]);
  585. }
  586. }
  587. }