A low Mach, 1D, reacting flow code.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

410 lines
11KB

  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. }
  54. free(data); /* Free the user data */
  55. printf("\n\n");
  56. }
  57. UserData allocateUserData(FILE *input){
  58. UserData data;
  59. data = (UserData) malloc(sizeof *data);
  60. if(!data){
  61. printf("Allocation Failed!\n");
  62. return(NULL);
  63. }
  64. setSaneDefaults(data);
  65. int ier;
  66. ier=parseNumber<size_t>(input, "basePts" , MAXBUFLEN, &data->npts);
  67. if(ier==-1 || data->npts<=0){
  68. printf("Enter non-zero basePts!\n");
  69. return(NULL);
  70. }
  71. ier=parseNumber<double>(input, "domainLength", MAXBUFLEN, &data->domainLength);
  72. if(ier==-1 || data->domainLength<=0.0e0){
  73. printf("domainLength error!\n");
  74. return(NULL);
  75. }
  76. ier=parseNumber<int>(input, "constantPressure" , MAXBUFLEN, &data->constantPressure);
  77. if(ier==-1 || (data->constantPressure!=0 && data->constantPressure!=1)){
  78. printf("constantPressure error!\n");
  79. return(NULL);
  80. }
  81. ier=parseNumber<int>(input, "problemType" , MAXBUFLEN, &data->problemType);
  82. if(ier==-1 || (data->problemType!=0
  83. && data->problemType!=1
  84. && data->problemType!=2
  85. && data->problemType!=3)){
  86. printf("include valid problemType!\n");
  87. printf("0: premixed combustion with NO equilibrated ignition kernel\n");
  88. printf("1: premixed combustion WITH equilibrated ignition kernel\n");
  89. printf("2: arbitrary initial conditions\n");
  90. printf("3: Restart\n");
  91. return(NULL);
  92. }
  93. ier=parseNumber<double>(input, "dPdt" , MAXBUFLEN, &data->dPdt);
  94. ier=parseNumber<int> (input, "reflectProblem" , MAXBUFLEN, &data->reflectProblem);
  95. if(data->reflectProblem!=0 && data->reflectProblem!=1){
  96. printf("Invalid entry for reflectProblem! Can be only 1 or 0.\n");
  97. return(NULL);
  98. }
  99. ier=parseNumber<double>(input, "mdot" , MAXBUFLEN, &data->mdot);
  100. ier=parseNumber<double>(input, "initialTemperature", MAXBUFLEN,
  101. &data->initialTemperature);
  102. if(ier==-1 || data->initialTemperature<=0.0e0){
  103. printf("Enter positive initialTemperature in K!\n");
  104. return(NULL);
  105. }
  106. ier=parseNumber<double>(input, "initialPressure", MAXBUFLEN,
  107. &data->initialPressure);
  108. if(ier==-1 || data->initialTemperature<=0.0e0){
  109. printf("Enter positive initialPressure in atm!\n");
  110. return(NULL);
  111. }
  112. ier=parseNumber<int> (input, "metric" , MAXBUFLEN, &data->metric);
  113. if(data->metric!=0 && data->metric!=1 && data->metric!=2){
  114. printf("Invalid entry for metric!\n");
  115. printf("0: Cartesian\n");
  116. printf("1: Cylindrical\n");
  117. printf("2: Spherical\n");
  118. return(NULL);
  119. }
  120. ier=parseNumber<double>(input, "QDot", MAXBUFLEN, &data->maxQDot);
  121. if(ier==-1 && data->problemType==0){
  122. printf("Need to specify QDot for problemType 0!\n");
  123. return(NULL);
  124. }
  125. ier=parseNumber<double>(input, "kernelSize", MAXBUFLEN, &data->kernelSize);
  126. if(ier==-1 && data->problemType==0){
  127. printf("Need to specify kernelSize for problemType 0!\n");
  128. return(NULL);
  129. }
  130. ier=parseNumber<double>(input, "ignTime", MAXBUFLEN, &data->ignTime);
  131. if(ier==-1 && data->problemType==0){
  132. printf("Need to specify ignTime for problemType 0!\n");
  133. return(NULL);
  134. }
  135. ier=parseNumber<double>(input, "mixingWidth", MAXBUFLEN,
  136. &data->mixingWidth);
  137. if(ier==-1){
  138. printf("Need to specify mixingWidth!\n");
  139. return(NULL);
  140. }
  141. ier=parseNumber<double>(input, "shift", MAXBUFLEN, &data->shift);
  142. ier=parseNumber<double>(input, "firstRadius", MAXBUFLEN, &data->firstRadius);
  143. ier=parseNumber<double>(input, "wallTemperature", MAXBUFLEN, &data->wallTemperature);
  144. ier=parseNumber<int> (input, "dirichletInner" , MAXBUFLEN,
  145. &data->dirichletInner);
  146. if(data->dirichletInner!=0 && data->dirichletInner!=1){
  147. printf("dirichletInner can either be 0 or 1!\n");
  148. return(NULL);
  149. }
  150. ier=parseNumber<int> (input, "dirichletOuter" , MAXBUFLEN,
  151. &data->dirichletOuter);
  152. if(data->dirichletOuter!=0 && data->dirichletOuter!=1){
  153. printf("dirichletOuter can either be 0 or 1!\n");
  154. return(NULL);
  155. }
  156. ier=parseNumber<int> (input, "adaptiveGrid" , MAXBUFLEN,
  157. &data->adaptiveGrid);
  158. if(ier==-1 || (data->adaptiveGrid!=0 && data->adaptiveGrid!=1)){
  159. printf("specify adaptiveGrid as 0 or 1!\n");
  160. return(NULL);
  161. }
  162. ier=parseNumber<int> (input, "moveGrid" , MAXBUFLEN,
  163. &data->moveGrid);
  164. if(ier==-1 || (data->moveGrid!=0 && data->moveGrid!=1)){
  165. printf("specify moveGrid as 0 or 1!\n");
  166. return(NULL);
  167. }
  168. ier=parseNumber<double> (input, "isotherm" , MAXBUFLEN,
  169. &data->isotherm);
  170. if(ier==-1){
  171. printf("specify temperature of isotherm!\n");
  172. return(NULL);
  173. }
  174. ier=parseNumber<double>(input, "gridOffset", MAXBUFLEN, &data->gridOffset);
  175. ier=parseNumber<int> (input, "nSaves" , MAXBUFLEN, &data->nSaves);
  176. if(data->nSaves<0 ){
  177. printf("nSaves must be greater than 0!\n");
  178. return(NULL);
  179. }
  180. ier=parseNumber<int> (input, "writeRates" , MAXBUFLEN,
  181. &data->writeRates);
  182. if(data->writeRates!=0 && data->writeRates!=1){
  183. printf("writeRates must either be 0 or 1!\n");
  184. return(NULL);
  185. }
  186. ier=parseNumber<int> (input, "writeEveryRegrid", MAXBUFLEN,
  187. &data->writeEveryRegrid);
  188. if(data->writeEveryRegrid!=0 && data->writeEveryRegrid!=1){
  189. printf("writeEveryRegrid must either be 0 or 1!\n");
  190. return(NULL);
  191. }
  192. ier=parseNumber<double> (input, "writeDeltaT", MAXBUFLEN,
  193. &data->writeDeltaT);
  194. ier=parseNumber<int> (input, "setConstraints" , MAXBUFLEN,
  195. &data->setConstraints);
  196. if(data->setConstraints!=0 && data->setConstraints!=1){
  197. printf("setConstraints must either be 0 or 1!\n");
  198. return(NULL);
  199. }
  200. ier=parseNumber<int> (input, "suppressAlg" , MAXBUFLEN,
  201. &data->suppressAlg);
  202. if(data->setConstraints!=0 && data->suppressAlg!=1){
  203. printf("suppressAlg must either be 0 or 1!\n");
  204. return(NULL);
  205. }
  206. ier=parseNumber<int> (input, "dryRun" , MAXBUFLEN,
  207. &data->dryRun);
  208. if(data->dryRun!=0 && data->dryRun!=1){
  209. printf("dryRun must either be 0 or 1!\n");
  210. return(NULL);
  211. }
  212. ier=parseNumber<double> (input, "finalTime" , MAXBUFLEN,
  213. &data->finalTime);
  214. ier=parseNumber<double> (input, "relativeTolerance" , MAXBUFLEN,
  215. &data->relativeTolerance);
  216. ier=parseNumber<double> (input, "radiusTolerance" , MAXBUFLEN,
  217. &data->radiusTolerance);
  218. ier=parseNumber<double> (input, "temperatureTolerance", MAXBUFLEN,
  219. &data->temperatureTolerance);
  220. ier=parseNumber<double> (input, "pressureTolerance", MAXBUFLEN,
  221. &data->pressureTolerance);
  222. ier=parseNumber<double> (input, "massFractionTolerance", MAXBUFLEN,
  223. &data->massFractionTolerance);
  224. ier=parseNumber<double> (input, "bathGasTolerance", MAXBUFLEN,
  225. &data->bathGasTolerance);
  226. char chem[MAXBUFLEN],mix[MAXBUFLEN],tran[MAXBUFLEN];
  227. ier=parseNumber<char>(input, "chemistryFile" , MAXBUFLEN, chem);
  228. if(ier==-1){
  229. printf("Enter chemistryFile!\n");
  230. return(NULL);
  231. }else{
  232. try{
  233. data->gas = new Cantera::IdealGasMix(chem);
  234. data->nsp=data->gas->nSpecies(); //assign no: of species
  235. } catch (Cantera::CanteraError& err) {
  236. printf("Error:\n");
  237. printf("%s\n",err.what());
  238. return(NULL);
  239. }
  240. }
  241. ier=parseNumber<char>(input, "transportModel", MAXBUFLEN, tran);
  242. if(ier==-1){
  243. printf("Enter transportModel!\n");
  244. return(NULL);
  245. }else{
  246. try{
  247. data->trmix = Cantera::newTransportMgr(tran, data->gas);
  248. }catch (Cantera::CanteraError& err) {
  249. printf("Error:\n");
  250. printf("%s\n",err.what());
  251. return(NULL);
  252. }
  253. }
  254. ier=parseNumber<char>(input, "mixtureComposition", MAXBUFLEN, mix);
  255. if(ier==-1){
  256. printf("Enter mixtureComposition!\n");
  257. return(NULL);
  258. }else{
  259. if(data->gas!=NULL){
  260. try{
  261. data->gas->setState_TPX(data->initialTemperature,
  262. data->initialPressure*Cantera::OneAtm,
  263. mix);
  264. }catch (Cantera::CanteraError& err) {
  265. printf("Error:\n");
  266. printf("%s\n",err.what());
  267. return(NULL);
  268. }
  269. }
  270. }
  271. ier=parseNumber<int> (input, "nThreads" , MAXBUFLEN, &data->nThreads);
  272. if(data->nThreads<0 ){
  273. printf("nThreads must be greater than 0!\n");
  274. return(NULL);
  275. }
  276. data->nr=0;
  277. //data->np=data->nr+1;
  278. data->nt=data->nr+1;
  279. data->ny=data->nt+1;
  280. data->np=data->ny+data->nsp;
  281. data->nvar=data->nsp+3; //assign no: of variables (R,T,P,nsp species)
  282. if(!data->adaptiveGrid){
  283. data->uniformGrid = new double [data->npts];
  284. data->neq=data->nvar*data->npts;
  285. }
  286. else{
  287. data->grid=(UserGrid) malloc(sizeof *data->grid);
  288. ier=getGridSettings(input,data->grid);
  289. if(ier==-1)return(NULL);
  290. ier=initializeGrid(data->grid);
  291. if(ier==-1)return(NULL);
  292. ier=reGrid(data->grid, data->grid->position);
  293. if(ier==-1)return(NULL);
  294. data->npts=data->grid->nPts;
  295. data->neq=data->nvar*data->npts;
  296. }
  297. data->output=fopen("output.dat","w");
  298. data->globalOutput=fopen("globalOutput.dat","w");
  299. data->gridOutput=fopen("grid.dat","w");
  300. //data->ratesOutput=fopen("rates.dat","w");
  301. data->innerMassFractions = new double [data->nsp];
  302. return(data);
  303. }
  304. void setSaneDefaults(UserData data){
  305. data->domainLength=1.0e-02;
  306. data->constantPressure=1;
  307. data->problemType=1;
  308. data->dPdt=0.0e0;
  309. data->reflectProblem=0;
  310. data->mdot=0.0;
  311. data->initialTemperature=300.0;
  312. data->initialPressure=1.0;
  313. data->metric=0;
  314. data->ignTime=1e-09;
  315. data->maxQDot=0.0e0;
  316. data->maxTemperature=300.0e0;
  317. data->mixingWidth=1e-04;
  318. data->shift=3.0e-03;
  319. data->firstRadius=1e-04;
  320. data->wallTemperature=298.0e0;
  321. data->dirichletInner=0;
  322. data->dirichletOuter=0;
  323. data->adaptiveGrid=0;
  324. data->moveGrid=0;
  325. data->gridOffset=0.0e0;
  326. data->isotherm=1000.0;
  327. data->nSaves=30;
  328. data->writeRates=0;
  329. data->writeEveryRegrid=0;
  330. data->writeDeltaT=1e-04;
  331. data->relativeTolerance=1e-06;
  332. data->radiusTolerance=1e-08;
  333. data->temperatureTolerance=1e-06;
  334. data->pressureTolerance=1e-06;
  335. data->massFractionTolerance=1e-09;
  336. data->bathGasTolerance=1e-06;
  337. data->finalTime=1e-02;
  338. data->tNow=0.0e0;
  339. data->setConstraints=0;
  340. data->suppressAlg=1;
  341. data->regrid=0;
  342. data->gridDirection=1;
  343. data->dryRun=0;
  344. data->nThreads=1;
  345. data->flamePosition[0]=0.0e0;
  346. data->flamePosition[1]=0.0e0;
  347. data->flameTime[0]=0.0e0;
  348. data->flameTime[1]=0.0e0;
  349. data->nTimeSteps=0;
  350. }