Droplet Lagrangian Transient One-dimensional Reacting Code Implementation of both liquid and gas phase governing equations.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

575 linhas
16KB

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