@@ -5,35 +5,38 @@ set(CMAKE_CXX_STANDARD 11) | |||||
# Define path to header files and libraries | # Define path to header files and libraries | ||||
set(HOME /opt/scientific) | |||||
set(CANTERA_DIR ${HOME}/cantera-2.4_gnu_blas) | |||||
set(IDA_DIR ${HOME}/sundials-3.1.1_intel_mkl) | |||||
set(GSL_DIR /usr/lib) | |||||
set(COOLPROP_DIR /backup/weiye/CoolProp) | |||||
set(FMT_DIR /backup/weiye/fmt) | |||||
#set(HOME /opt/scientific) | |||||
set(CANTERA_DIR /usr/local) | |||||
set(IDA_DIR /usr/local) | |||||
set(GSL_DIR /usr/local) | |||||
set(COOLPROP_DIR /opt/CoolProp/shared_library/Linux) | |||||
set(FMT_DIR /usr/local) | |||||
set(CANTERA_INCLUDES ${CANTERA_DIR}/include) | set(CANTERA_INCLUDES ${CANTERA_DIR}/include) | ||||
set(IDA_INCLUDES ${IDA_DIR}/include) | set(IDA_INCLUDES ${IDA_DIR}/include) | ||||
set(GSL_INCLUDES /usr/include/gsl) | |||||
set(GSL_INCLUDES ${GSL_DIR}/include/gsl) | |||||
set(COOLPROP_INCLUDES ${COOLPROP_DIR}/include) | set(COOLPROP_INCLUDES ${COOLPROP_DIR}/include) | ||||
set(FMT_INCLUDES ${FMT_DIR}/include) | set(FMT_INCLUDES ${FMT_DIR}/include) | ||||
set(EIGEN_INCLUDES /backup/weiye/eigen-3.4.0) | |||||
set(EIGEN_INCLUDES /opt/eigen-3.4.0) | |||||
# Search for source files | # Search for source files | ||||
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST) | aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST) | ||||
add_executable(DropletCombustion ${SRC_LIST}) | add_executable(DropletCombustion ${SRC_LIST}) | ||||
# Set the RPATH parameter | # Set the RPATH parameter | ||||
set(CMAKE_INSTALL_RPATH "${IDA_DIR}/lib;${CANTERA_DIR}/lib;${COOLPROP_DIR}/lib;${FMT_DIR}/lib") | |||||
set(CMAKE_INSTALL_RPATH "${IDA_DIR}/lib;${CANTERA_DIR}/lib;${GSL_DIR}/lib;${COOLPROP_DIR}/lib;${FMT_DIR}/lib") | |||||
# Link libraries | # Link libraries | ||||
target_link_directories(DropletCombustion PRIVATE ${CANTERA_DIR}/lib ${IDA_DIR}/lib ${GSL_DIR} ${COOLPROP_DIR}/lib ${FMT_DIR}/lib) | |||||
target_link_directories(DropletCombustion PRIVATE ${CANTERA_DIR}/lib ${IDA_DIR}/lib ${GSL_DIR}/lib ${COOLPROP_DIR}/64bit ${FMT_DIR}/lib ) | |||||
target_link_libraries(DropletCombustion | target_link_libraries(DropletCombustion | ||||
PRIVATE cantera_shared sundials_nvecopenmp sundials_ida sundials_sunlinsollapackband gsl gslcblas CoolProp fmt) | PRIVATE cantera_shared sundials_nvecopenmp sundials_ida sundials_sunlinsollapackband gsl gslcblas CoolProp fmt) | ||||
# Include directories | # Include directories | ||||
target_include_directories(DropletCombustion | target_include_directories(DropletCombustion | ||||
PRIVATE ${PROJECT_SOURCE_DIR}/include ${CANTERA_INCLUDES} ${IDA_INCLUDES} ${GSL_INCLUDES} ${COOLPROP_INCLUDES} ${FMT_INCLUDES} ${EIGEN_INCLUDES}) | |||||
PRIVATE ${PROJECT_SOURCE_DIR}/include ${CANTERA_INCLUDES} ${IDA_INCLUDES} ${GSL_INCLUDES} ${COOLPROP_INCLUDES} ${FMT_INCLUDES} ${EIGEN_INCLUDES} ) | |||||
# Set the output path | # Set the output path | ||||
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) | set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) | ||||
@@ -1,499 +0,0 @@ | |||||
#include "UserData.h" | |||||
#include "parse.h" | |||||
void freeUserData(UserData data){ | |||||
if(data!=NULL){ | |||||
if(data->trmix!=NULL){ | |||||
delete data->trmix; | |||||
printf("Transport Deleted!\n"); | |||||
} | |||||
if(data->gas!=NULL){ | |||||
delete data->gas; | |||||
printf("Gas Deleted!\n"); | |||||
} | |||||
if(data->adaptiveGrid){ | |||||
if(data->grid->xOld!=NULL){ | |||||
delete[] data->grid->xOld; | |||||
printf("old grid array Deleted!\n"); | |||||
} | |||||
if(data->grid->x!=NULL){ | |||||
delete[] data->grid->x; | |||||
printf("current grid array Deleted!\n"); | |||||
} | |||||
if(data->grid!=NULL){ | |||||
free(data->grid); | |||||
printf("grid object Freed!\n"); | |||||
} | |||||
} | |||||
else{ | |||||
if(data->uniformGrid!=NULL){ | |||||
delete[] data->uniformGrid; | |||||
printf("uniformGrid deleted!\n"); | |||||
} | |||||
} | |||||
if(data->innerMassFractions!=NULL){ | |||||
delete[] data->innerMassFractions; | |||||
printf("innerMassFractions array Deleted!\n"); | |||||
} | |||||
if(data->output!=NULL){ | |||||
fclose(data->output); | |||||
printf("Output File Cleared from Memory!\n"); | |||||
} | |||||
if(data->gridOutput!=NULL){ | |||||
fclose(data->gridOutput); | |||||
printf("Grid Output File Cleared from Memory!\n"); | |||||
} | |||||
//if(data->ratesOutput!=NULL){ | |||||
// fclose(data->ratesOutput); | |||||
// printf("Rates Output File Cleared from Memory!\n"); | |||||
//} | |||||
if(data->globalOutput!=NULL){ | |||||
fclose(data->globalOutput); | |||||
printf("Global Output File Cleared from Memory!\n"); | |||||
} | |||||
if(data->timescaleOutput!=NULL){ | |||||
fclose(data->timescaleOutput); | |||||
printf("Characteristic Timescale Output File Cleared from Memory!\n"); | |||||
} | |||||
//if(data->rxnROPOutput!=NULL){ | |||||
// fclose(data->rxnROPOutput); | |||||
// printf("Reactions Rate of Progress Output File Cleared from Memory!\n"); | |||||
//} | |||||
//if(data->spROPOutput!=NULL){ | |||||
// fclose(data->spROPOutput); | |||||
// printf("Species Rate of Production Output File Cleared from Memory!\n"); | |||||
//} | |||||
} | |||||
free(data); /* Free the user data */ | |||||
printf("\n\n"); | |||||
} | |||||
UserData allocateUserData(FILE *input){ | |||||
UserData data; | |||||
data = (UserData) malloc(sizeof *data); | |||||
if(!data){ | |||||
printf("Allocation Failed!\n"); | |||||
return(NULL); | |||||
} | |||||
setSaneDefaults(data); | |||||
int ier; | |||||
ier=parseNumber<size_t>(input, "basePts" , MAXBUFLEN, &data->npts); | |||||
if(ier==-1 || data->npts<=0){ | |||||
printf("Enter non-zero basePts!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "domainLength", MAXBUFLEN, &data->domainLength); | |||||
if(ier==-1 || data->domainLength<=0.0e0){ | |||||
printf("domainLength error!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "Rd", MAXBUFLEN, &data->Rd); | |||||
if(ier==-1 || data->Rd<=0.0e0){ | |||||
printf("Rd error!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int>(input, "constantPressure" , MAXBUFLEN, &data->constantPressure); | |||||
if(ier==-1 || (data->constantPressure!=0 && data->constantPressure!=1)){ | |||||
printf("constantPressure error!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int>(input, "problemType" , MAXBUFLEN, &data->problemType); | |||||
if(ier==-1 || (data->problemType!=0 | |||||
&& data->problemType!=1 | |||||
&& data->problemType!=2 | |||||
&& data->problemType!=3)){ | |||||
printf("include valid problemType!\n"); | |||||
printf("0: premixed combustion with NO equilibrated ignition kernel\n"); | |||||
printf("1: premixed combustion WITH equilibrated ignition kernel\n"); | |||||
printf("2: arbitrary initial conditions\n"); | |||||
printf("3: Restart\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int>(input, "quasiSteady" , MAXBUFLEN, &data->quasiSteady); | |||||
if(ier==-1 || (data->quasiSteady!=0 | |||||
&& data->quasiSteady!=1)){ | |||||
printf("include valid quasiSteady!\n"); | |||||
printf("0: The droplet surface recedes and the droplet losses mass\n"); | |||||
printf("1: The droplet surface does not move and the droplet mass is constant\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "dPdt" , MAXBUFLEN, &data->dPdt); | |||||
ier=parseNumber<double>(input, "Rg" , MAXBUFLEN, &data->Rg); | |||||
if(data->Rg < 0.0){ | |||||
printf("Rg must be greater than 0"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "reflectProblem" , MAXBUFLEN, &data->reflectProblem); | |||||
if(data->reflectProblem!=0 && data->reflectProblem!=1){ | |||||
printf("Invalid entry for reflectProblem! Can be only 1 or 0.\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "mdot" , MAXBUFLEN, &data->mdot); | |||||
ier=parseNumber<double>(input, "initialTemperature", MAXBUFLEN, | |||||
&data->initialTemperature); | |||||
if(ier==-1 || data->initialTemperature<=0.0e0){ | |||||
printf("Enter positive initialTemperature in K!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "initialPressure", MAXBUFLEN, | |||||
&data->initialPressure); | |||||
if(ier==-1 || data->initialTemperature<=0.0e0){ | |||||
printf("Enter positive initialPressure in atm!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "metric" , MAXBUFLEN, &data->metric); | |||||
if(data->metric!=0 && data->metric!=1 && data->metric!=2){ | |||||
printf("Invalid entry for metric!\n"); | |||||
printf("0: Cartesian\n"); | |||||
printf("1: Cylindrical\n"); | |||||
printf("2: Spherical\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "QDot", MAXBUFLEN, &data->maxQDot); | |||||
if(ier==-1 && data->problemType==0){ | |||||
printf("Need to specify QDot for problemType 0!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "kernelSize", MAXBUFLEN, &data->kernelSize); | |||||
if(ier==-1 && data->problemType==0){ | |||||
printf("Need to specify kernelSize for problemType 0!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "ignTime", MAXBUFLEN, &data->ignTime); | |||||
if(ier==-1 && data->problemType==0){ | |||||
printf("Need to specify ignTime for problemType 0!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "mixingWidth", MAXBUFLEN, | |||||
&data->mixingWidth); | |||||
if(ier==-1){ | |||||
printf("Need to specify mixingWidth!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "shift", MAXBUFLEN, &data->shift); | |||||
ier=parseNumber<double>(input, "firstRadius", MAXBUFLEN, &data->firstRadius); | |||||
ier=parseNumber<double>(input, "wallTemperature", MAXBUFLEN, &data->wallTemperature); | |||||
ier=parseNumber<int> (input, "dirichletInner" , MAXBUFLEN, | |||||
&data->dirichletInner); | |||||
if(data->dirichletInner!=0 && data->dirichletInner!=1){ | |||||
printf("dirichletInner can either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "dirichletOuter" , MAXBUFLEN, | |||||
&data->dirichletOuter); | |||||
if(data->dirichletOuter!=0 && data->dirichletOuter!=1){ | |||||
printf("dirichletOuter can either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "adaptiveGrid" , MAXBUFLEN, | |||||
&data->adaptiveGrid); | |||||
if(ier==-1 || (data->adaptiveGrid!=0 && data->adaptiveGrid!=1)){ | |||||
printf("specify adaptiveGrid as 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "moveGrid" , MAXBUFLEN, | |||||
&data->moveGrid); | |||||
if(ier==-1 || (data->moveGrid!=0 && data->moveGrid!=1)){ | |||||
printf("specify moveGrid as 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double> (input, "isotherm" , MAXBUFLEN, | |||||
&data->isotherm); | |||||
if(ier==-1){ | |||||
printf("specify temperature of isotherm!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "gridOffset", MAXBUFLEN, &data->gridOffset); | |||||
ier=parseNumber<int> (input, "nSaves" , MAXBUFLEN, &data->nSaves); | |||||
if(data->nSaves<0 ){ | |||||
printf("nSaves must be greater than 0!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "writeRates" , MAXBUFLEN, | |||||
&data->writeRates); | |||||
if(data->writeRates!=0 && data->writeRates!=1){ | |||||
printf("writeRates must either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "writeEveryRegrid", MAXBUFLEN, | |||||
&data->writeEveryRegrid); | |||||
if(data->writeEveryRegrid!=0 && data->writeEveryRegrid!=1){ | |||||
printf("writeEveryRegrid must either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "setConstraints" , MAXBUFLEN, | |||||
&data->setConstraints); | |||||
if(data->setConstraints!=0 && data->setConstraints!=1){ | |||||
printf("setConstraints must either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "suppressAlg" , MAXBUFLEN, | |||||
&data->suppressAlg); | |||||
if(data->suppressAlg!=0 && data->suppressAlg!=1){ | |||||
printf("suppressAlg must either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<int> (input, "dryRun" , MAXBUFLEN, | |||||
&data->dryRun); | |||||
if(data->dryRun!=0 && data->dryRun!=1){ | |||||
printf("dryRun must either be 0 or 1!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double> (input, "finalTime" , MAXBUFLEN, | |||||
&data->finalTime); | |||||
ier=parseNumber<double> (input, "relativeTolerance" , MAXBUFLEN, | |||||
&data->relativeTolerance); | |||||
ier=parseNumber<double> (input, "radiusTolerance" , MAXBUFLEN, | |||||
&data->radiusTolerance); | |||||
ier=parseNumber<double> (input, "temperatureTolerance", MAXBUFLEN, | |||||
&data->temperatureTolerance); | |||||
ier=parseNumber<double> (input, "pressureTolerance", MAXBUFLEN, | |||||
&data->pressureTolerance); | |||||
ier=parseNumber<double> (input, "massFractionTolerance", MAXBUFLEN, | |||||
&data->massFractionTolerance); | |||||
ier=parseNumber<double> (input, "bathGasTolerance", MAXBUFLEN, | |||||
&data->bathGasTolerance); | |||||
ier=parseNumber<double> (input, "MdotTolerance", MAXBUFLEN, | |||||
&data->MdotTolerance); | |||||
char chem[MAXBUFLEN],mix[MAXBUFLEN],tran[MAXBUFLEN]; | |||||
ier=parseNumber<char>(input, "chemistryFile" , MAXBUFLEN, chem); | |||||
if(ier==-1){ | |||||
printf("Enter chemistryFile!\n"); | |||||
return(NULL); | |||||
}else{ | |||||
try{ | |||||
data->gas = new Cantera::IdealGasMix(chem); | |||||
data->nsp=data->gas->nSpecies(); //assign no: of species | |||||
} catch (Cantera::CanteraError& err) { | |||||
printf("Error:\n"); | |||||
printf("%s\n",err.what()); | |||||
return(NULL); | |||||
} | |||||
} | |||||
ier=parseNumber<char>(input, "transportModel", MAXBUFLEN, tran); | |||||
if(ier==-1){ | |||||
printf("Enter transportModel!\n"); | |||||
return(NULL); | |||||
}else{ | |||||
try{ | |||||
data->trmix = Cantera::newTransportMgr(tran, data->gas); | |||||
}catch (Cantera::CanteraError& err) { | |||||
printf("Error:\n"); | |||||
printf("%s\n",err.what()); | |||||
return(NULL); | |||||
} | |||||
} | |||||
ier=parseNumber<char>(input, "mixtureComposition", MAXBUFLEN, mix); | |||||
if(ier==-1){ | |||||
printf("Enter mixtureComposition!\n"); | |||||
return(NULL); | |||||
}else{ | |||||
if(data->gas!=NULL){ | |||||
try{ | |||||
data->gas->setState_TPX(data->initialTemperature, | |||||
data->initialPressure*Cantera::OneAtm, | |||||
mix); | |||||
}catch (Cantera::CanteraError& err) { | |||||
printf("Error:\n"); | |||||
printf("%s\n",err.what()); | |||||
return(NULL); | |||||
} | |||||
} | |||||
} | |||||
//ier=parseNumber<char>(input, "dropletComposition", MAXBUFLEN, data->dropSpec); | |||||
//if(ier==-1){ | |||||
// printf("Enter composition of droplet!\n"); | |||||
// return(NULL); | |||||
//} | |||||
ier=parseDrop(input,"dropletComposition",data->dropSpec,data->dropMole,MAXBUFLEN); | |||||
ier=parseDrop(input,"dropletDensity",data->dropSpec,data->dropDens,MAXBUFLEN); | |||||
ier=parseNumber<int> (input, "nThreads", MAXBUFLEN, &data->nThreads); | |||||
if(data->nThreads<0 ){ | |||||
printf("nThreads must be greater than 0!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "PCAD", MAXBUFLEN, &data->PCAD); | |||||
ier=parseNumber<double>(input,"RGTC", MAXBUFLEN, &data->RGTC); | |||||
ier=parseNumber<int>(input,"JJRG", MAXBUFLEN, &data->JJRG); | |||||
ier=parseNumber<double>(input,"deltaT", MAXBUFLEN, &data->deltaT); | |||||
data->nr=0; | |||||
//data->np=data->nr+1; | |||||
data->nt=data->nr+1; | |||||
data->ny=data->nt+1; | |||||
data->np=data->ny+data->nsp; | |||||
data->nm=data->np+1; | |||||
data->nvar=data->nsp+4; //assign no: of variables (R,T,P,Mdot,nsp species) | |||||
double MW[2]; | |||||
for(int i=0;i<=1;i++){ | |||||
int speciesIndex = data->gas->speciesIndex(data->dropSpec[i]); | |||||
double weight = data->gas->molecularWeight(speciesIndex); | |||||
MW[i]= weight; | |||||
} | |||||
double massSum = 0.0; | |||||
for(int i=0;i<=1;i++){ | |||||
massSum = massSum + data->dropMole[i] * MW[i]; | |||||
} | |||||
data->dropRho = 0.0; | |||||
for(int i=0;i<=1;i++){ | |||||
data->dropMassFrac[i] = data->dropMole[i]*MW[i]/massSum; | |||||
data->dropRho = data->dropRho + data->dropMassFrac[i]*data->dropDens[i]; | |||||
} | |||||
printf("Density of droplet is: %.3f [kg/m^3]\n",data->dropRho); | |||||
//Mass of droplet | |||||
//data->massDrop=1.0/3.0*pow(data->Rd,3)*997.0; //TODO: The density of the droplet should be a user input | |||||
//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 | |||||
data->massDrop=1.0/3.0*pow(data->Rd,3)*data->dropRho; | |||||
if(!data->adaptiveGrid){ | |||||
data->uniformGrid = new double [data->npts]; | |||||
data->neq=data->nvar*data->npts; | |||||
} | |||||
else{ | |||||
data->grid=(UserGrid) malloc(sizeof *data->grid); | |||||
ier=getGridSettings(input,data->grid); | |||||
if(ier==-1)return(NULL); | |||||
ier=initializeGrid(data->grid); | |||||
if(ier==-1)return(NULL); | |||||
ier=reGrid(data->grid, data->grid->position); | |||||
if(ier==-1)return(NULL); | |||||
// /**************** TEST THE data->grid->xOld *******************/ | |||||
// double* ptr = data->grid->xOld ; | |||||
// printf("allocateUserData function is called,Start print the first 5 elements of the xOld array : \n"); | |||||
// printf("1st:%.6f, 2nd:%.6f, 3rd:%.6f, 4th:%.6f, 5th:%.6f.\n",ptr[0],ptr[1],ptr[2],ptr[3],ptr[4]); | |||||
data->npts=data->grid->nPts; | |||||
data->neq=data->nvar*data->npts; | |||||
} | |||||
data->output=fopen("output.dat","w"); | |||||
data->globalOutput=fopen("globalOutput.dat","w"); | |||||
data->gridOutput=fopen("grid.dat","w"); | |||||
data->timescaleOutput=fopen("timeScale.dat","w") ; | |||||
data->rxnROPOutput=fopen("rxnROP.dat","w"); | |||||
data->spROPOutput=fopen("spROP.dat","w"); | |||||
//data->ratesOutput=fopen("rates.dat","w"); | |||||
data->innerMassFractions = new double [data->nsp]; | |||||
//data->wdot_mole = new double [data->nsp] ; | |||||
//data->wdot_mass = new double [data->nsp] ; | |||||
data->time_scale = new double [(data->npts) * (data->nsp)] ; | |||||
//data->MW = new double [data->nsp] ; | |||||
return(data); | |||||
} | |||||
void setSaneDefaults(UserData data){ | |||||
data->domainLength=1.0e-02; | |||||
data->Rd=100.0e-06; | |||||
data->constantPressure=1; | |||||
data->problemType=1; | |||||
data->quasiSteady=1; | |||||
data->dPdt=0.0e0; | |||||
data->reflectProblem=0; | |||||
data->mdot=0.0; | |||||
data->initialTemperature=300.0; | |||||
data->initialPressure=1.0; | |||||
data->metric=0; | |||||
data->ignTime=1e-09; | |||||
data->maxQDot=0.0e0; | |||||
data->maxTemperature=300.0e0; | |||||
data->mixingWidth=1e-04; | |||||
data->shift=3.0e-03; | |||||
data->firstRadius=1e-04; | |||||
data->wallTemperature=298.0e0; | |||||
data->dirichletInner=0; | |||||
data->dirichletOuter=0; | |||||
data->adaptiveGrid=0; | |||||
data->moveGrid=0; | |||||
data->gridOffset=0.0e0; | |||||
data->Rg=1.0; | |||||
data->isotherm=1000.0; | |||||
data->nSaves=30; | |||||
data->writeRates=0; | |||||
data->writeEveryRegrid=0; | |||||
data->relativeTolerance=1e-06; | |||||
data->radiusTolerance=1e-08; | |||||
data->temperatureTolerance=1e-06; | |||||
data->pressureTolerance=1e-06; | |||||
data->massFractionTolerance=1e-09; | |||||
data->bathGasTolerance=1e-06; | |||||
data->finalTime=1e-02; | |||||
data->tNow=0.0e0; | |||||
data->setConstraints=0; | |||||
data->suppressAlg=1; | |||||
data->regrid=0; | |||||
data->gridDirection=1; | |||||
data->dryRun=0; | |||||
data->nThreads=1; | |||||
data->flamePosition[0]=0.0e0; | |||||
data->flamePosition[1]=0.0e0; | |||||
data->flameTime[0]=0.0e0; | |||||
data->flameTime[1]=0.0e0; | |||||
data->nTimeSteps=0; | |||||
data->PCAD=0.75; | |||||
data->RGTC=1.0; | |||||
data->JJRG=0; | |||||
data->deltaT=200.0; | |||||
} | |||||
@@ -1,63 +0,0 @@ | |||||
UserData.o: UserData.cpp UserData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/IdealGasMix.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/IdealGasPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/ThermoPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Phase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ctexceptions.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/fmt.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ct_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/config.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/core.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format-inl.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/printf.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/ostream.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/ostream.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Elements.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ct_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Species.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/AnyMap.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/global.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/AnyMap.inl.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ValueCache.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/MultiSpeciesThermo.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/SpeciesThermoInterpType.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/speciesThermoTypes.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/GasKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/BulkKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Kinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/ThermoPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/StoichManager.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/stringUtils.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Reaction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/utilities.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/global.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RxnRates.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/reaction_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Falloff.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RateCoeffMgr.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RxnRates.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/ThirdBodyCalc.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/FalloffMgr.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/reaction_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/FalloffFactory.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/FactoryBase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Reaction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/importKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/stringUtils.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportFactory.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportBase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTransportParams.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportParams.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/numerics/DenseMatrix.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/Array.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/utilities.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTranInteraction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTransportData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LTPspecies.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/xml.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ctexceptions.h \ | |||||
gridRoutines.h parse.h parse.hpp |
@@ -1,221 +0,0 @@ | |||||
#ifndef CANTERA_DEF | |||||
#define CANTERA_DEF | |||||
#include <cantera/IdealGasMix.h> | |||||
#include <cantera/transport.h> | |||||
#endif | |||||
#include "gridRoutines.h" | |||||
#include <string> | |||||
#ifndef USER_DEF | |||||
#define USER_DEF | |||||
typedef struct UserDataTag{ | |||||
/*An ideal gas object from Cantera. Contains thermodynamic and kinetic | |||||
* info of all species.*/ | |||||
Cantera::IdealGasMix* gas; | |||||
/*A Transport object from Cantera. Contains all transport info of all | |||||
* species.*/ | |||||
Cantera::Transport* trmix; | |||||
/* Droplet species composition */ | |||||
//char dropSpec[MAXBUFLEN]; | |||||
char dropSpec[2][10]; | |||||
/* Droplet species mole fractions */ | |||||
double dropMole[2]; | |||||
/* Droplet species density at given initialTemperature*/ | |||||
double dropDens[2]; | |||||
/* Droplet species mass fractions*/ | |||||
double dropMassFrac[2]; | |||||
double dropRho; | |||||
/*Length of the domain (in meters):*/ | |||||
double domainLength; | |||||
/*Initial Droplet Radius (in meters)*/ | |||||
double Rd; | |||||
/*Droplet Mass*/ | |||||
double massDrop; | |||||
/*Mass of gas in domain (in kg):*/ | |||||
double mass; | |||||
/*Parameter that indicates the symmetry of the problem;*/ | |||||
/*metric=0:Planar*/ | |||||
/*metric=1:Cylindrical*/ | |||||
/*metric=2:Spherical*/ | |||||
int metric; | |||||
/*No: of species:*/ | |||||
size_t nsp; | |||||
/*No: of equations:*/ | |||||
size_t neq; | |||||
/*No: of variables:*/ | |||||
size_t nvar; | |||||
/*Pointer indices (see "macros.h" for aliases that use these):*/ | |||||
/*Pointer index for temperature:*/ | |||||
size_t nt; | |||||
/*Pointer index for species:*/ | |||||
size_t ny; | |||||
/*Pointer index for spatial coordinate:*/ | |||||
size_t nr; | |||||
/*Pointer index for pressure:*/ | |||||
size_t np; | |||||
/*Pointer index for mass flow rate:*/ | |||||
size_t nm; | |||||
/*Species index of bath gas:*/ | |||||
size_t k_bath; | |||||
/*Species index of oxidizer:*/ | |||||
size_t k_oxidizer; | |||||
size_t k_OH; | |||||
size_t k_HO2; | |||||
/*Species index of droplet composition*/ | |||||
/*Index starts with 1 instead of 0*/ | |||||
size_t k_drop[2]; | |||||
/*User-defined mass flux (kg/m^2/s):*/ | |||||
double mdot; | |||||
/*Flag to solve isobaric/isochoric problem;*/ | |||||
/*constantPressure=1: isobaric*/ | |||||
/*constantPressure=0: isochoric*/ | |||||
int constantPressure; | |||||
/*User-defined dPdt (Pa/s), activates when problem is "isobaric":*/ | |||||
double dPdt; | |||||
/*Initial temperature of the gas (K):*/ | |||||
double initialTemperature; | |||||
/*Initial Pressure of the gas (atm):*/ | |||||
double initialPressure; | |||||
/*Classification of problem type;*/ | |||||
/*problemType=0: Mixture is premixed and spatially uniform initially. | |||||
* In order for mixture to ignite, an external heat source (finite | |||||
* maxQDot) must be used.*/ | |||||
/*problemType=1: Mixture is premixed but spatially non-uniform | |||||
* initially. Equilibrium products are contained within a hot kernel of | |||||
* size given by "shift" and a mixing length scale given by | |||||
* "mixingWidth".*/ | |||||
/*problemType=2: User specified initial condition. Use file | |||||
* "initialCondition.dat".*/ | |||||
int problemType; | |||||
/*Quasi-Steady Assumption: | |||||
*quasiSteady=0: The droplet surface recedes and the droplet losses mass. | |||||
*quasiSteady=1: The droplet surface does not move and the droplet mass is constant.*/ | |||||
int quasiSteady; | |||||
/*Maximum External heat source (K/s):*/ | |||||
double maxQDot; | |||||
/*Ignition kernel size:*/ | |||||
double kernelSize; | |||||
double maxTemperature; | |||||
/*Maximum time for which the external heat source is applied (s):*/ | |||||
double ignTime; | |||||
/*Vector of Mass Fractions used to impose Robin Boundary Condition for | |||||
* species at the domain origin:*/ | |||||
double* innerMassFractions; | |||||
/*Value of temperature to be used if Dirichlet Boundary Conditions are | |||||
* imposed for temperature:*/ | |||||
double innerTemperature; | |||||
double wallTemperature; | |||||
/*Isotherm chosen to find the location of a "burning" front (K):*/ | |||||
double isotherm; | |||||
/*Interval of time integration:*/ | |||||
double finalTime; | |||||
/*Current time:*/ | |||||
double tNow; | |||||
/*Flag to reflect initial conditions across center of the domain:*/ | |||||
int reflectProblem; | |||||
/*Parameters for initial conditions in setting up profiles: | |||||
increasing function of x: g=0.5*(erf(x-3*w-shift)/w)+1) | |||||
decreasing function of x: f=1-g*/ | |||||
double mixingWidth; | |||||
double shift; | |||||
double firstRadius; | |||||
/*Flag to run program without time-integration i.e. simply layout the | |||||
* initial conditions and quit:*/ | |||||
int dryRun; | |||||
/*Relative Tolerance:*/ | |||||
double relativeTolerance; | |||||
/*Absolute Tolerance for spatial coordinate:*/ | |||||
double radiusTolerance; | |||||
/*Absolute Tolerance for Temperature:*/ | |||||
double temperatureTolerance; | |||||
/*Absolute Tolerance for Pressure:*/ | |||||
double pressureTolerance; | |||||
/*Absolute Tolerance for Mass Fractions:*/ | |||||
double massFractionTolerance; | |||||
/*Absolute Tolerance for bath gas mass fraction:*/ | |||||
double bathGasTolerance; | |||||
/*Absolute Tolerance for Mdot:*/ | |||||
double MdotTolerance; | |||||
/*Flag to set constraints on Mass fractions so they don't acquire | |||||
* negative values:*/ | |||||
int setConstraints; | |||||
/*Flag to suppress error checking on algebraic variables:*/ | |||||
int suppressAlg; | |||||
/*Number of time-steps elapsed before saving the solution:*/ | |||||
int nSaves; | |||||
/*Flag to set write for every regrid:*/ | |||||
int writeEveryRegrid; | |||||
/*Solution output file:*/ | |||||
FILE* output; | |||||
/*Flag to write the rates (ydot) of solution components into the | |||||
* "ratesOutput" file:*/ | |||||
int writeRates; | |||||
/*Grid output file:*/ | |||||
FILE* gridOutput; | |||||
///*Rate of change (ydot) output file (see "writeRates"):*/ | |||||
//FILE* ratesOutput; | |||||
/*Global properties (mdot, radius of flame, etc.) output file:*/ | |||||
FILE* globalOutput; | |||||
/*Flag to adapt grid:*/ | |||||
int adaptiveGrid; | |||||
/*Flag to move grid:*/ | |||||
int moveGrid; | |||||
/*Flag to initiate regrid:*/ | |||||
int regrid; | |||||
/*Integer that specifies grid movement direction: | |||||
* gridDirection = -1: Move Left | |||||
* gridDirection = +1: Move Right*/ | |||||
int gridDirection; | |||||
/*Grid Ratio: This replaces the uniform grid. dX0 and dXf are the grid | |||||
spacing at the droplet surface and right boundary, respectivly. The Grid | |||||
Ratio is equal to dXf/dX0. A Rg>1 focuses grid points on the droplet | |||||
surface while a Rg<1 focuses grid points at the right boundary. A Rg of 1 | |||||
is a uniform grid.*/ | |||||
double Rg; | |||||
/*Total number of points for grid:*/ | |||||
size_t npts; | |||||
double gridOffset; | |||||
UserGrid grid; | |||||
double* uniformGrid; | |||||
int dirichletInner,dirichletOuter; | |||||
int nThreads; | |||||
double clockStart; | |||||
/*These arrays are used to compute dr/dt, which in turn is used to | |||||
* compute the flame speed S_u:*/ | |||||
double flamePosition[2]; | |||||
double flameTime[2]; | |||||
size_t nTimeSteps; | |||||
/*Following arrays are used to compute the characteristic time scale of | |||||
species*/ | |||||
//double* wdot_mole ; | |||||
//double* wdot_mass ; | |||||
double* time_scale ; | |||||
//double* MW; | |||||
FILE* timescaleOutput; | |||||
/*Following parameters are used for REGRID function*/ | |||||
double PCAD; | |||||
double RGTC; | |||||
int JJRG; | |||||
double deltaT; | |||||
FILE* rxnROPOutput; | |||||
FILE* spROPOutput; | |||||
} *UserData; | |||||
UserData allocateUserData(FILE *input); | |||||
void setSaneDefaults(UserData data); | |||||
void freeUserData(UserData data); | |||||
#endif | |||||
@@ -1,293 +0,0 @@ | |||||
#include "gridRoutines.h" | |||||
#include <stdio.h> | |||||
inline double l(const double* x, | |||||
const double* a, | |||||
const double* w, | |||||
const double* fac, | |||||
const int* refineLeft){ | |||||
if(*refineLeft==0){ | |||||
return(tanh(-*a*(*x+*w*100.0e0))); | |||||
}else{ | |||||
double l ; | |||||
l = tanh(-*a*(*x-*w*(*fac))) ; | |||||
if(l>=0){ | |||||
return l*10.0; | |||||
}else{ | |||||
//return(tanh(-*a*(*x-*w*(*fac)))); | |||||
return l; | |||||
} | |||||
} | |||||
} | |||||
//inline double l(const double* x, | |||||
// const double* a, | |||||
// const double* c, | |||||
// const double* w, | |||||
// const double* fac, | |||||
// const int* refineLeft){ | |||||
// if(*refineLeft==0){ | |||||
// return(tanh(-*a*(*x+*w*100.0e0))); | |||||
// }else{ | |||||
// double l ; | |||||
// //l = tanh(-*a*(*x-*w*(*fac))) ; | |||||
// l = tanh(-*a*(*x-*c)); | |||||
// | |||||
// if(l>=0){ | |||||
// return l*10.0; | |||||
// }else{ | |||||
// //return(tanh(-*a*(*x-*w*(*fac)))); | |||||
// return l; | |||||
// } | |||||
// } | |||||
//} | |||||
inline double r(const double* x, | |||||
const double* a, | |||||
const double* w, | |||||
const double* fac, | |||||
const int* refineRight){ | |||||
if(*refineRight==0){ | |||||
return(tanh(*a*(*x-(1.0e0+*w*100.0e0)))); | |||||
}else{ | |||||
return(tanh(*a*(*x-(1.0e0-*w*(*fac))))); | |||||
} | |||||
} | |||||
inline double f(const double* x, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w){ | |||||
return(tanh(-*a*(*x-(*c+*w))) | |||||
+tanh(-*a*((*x-1.0e0)-(*c+*w))) | |||||
+tanh(-*a*((*x+1.0e0)-(*c+*w)))); | |||||
} | |||||
inline double g(const double* x, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w){ | |||||
return(tanh(*a*(*x-(*c-*w))) | |||||
+tanh(*a*((*x-1.0e0)-(*c-*w))) | |||||
+tanh(*a*((*x+1.0e0)-(*c-*w)))); | |||||
} | |||||
inline double rho(const double* x, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w, | |||||
const double* mag, | |||||
const double* leftFac, | |||||
const double* rightFac, | |||||
const int* refineLeft, | |||||
const int* refineRight){ | |||||
return(((2.0e0+f(x,a,c,w) | |||||
+g(x,a,c,w) | |||||
+l(x,a,w,leftFac,refineLeft) | |||||
// +l(x,a,c,w,leftFac,refineLeft) | |||||
+r(x,a,w,rightFac,refineRight))*0.5e0) | |||||
*(*mag-1.0e0)+1.0e0); | |||||
} | |||||
size_t maxPoints(const size_t basePts, | |||||
const double* a, | |||||
const double* w, | |||||
const double* mag, | |||||
const double* leftFac, | |||||
const double* rightFac, | |||||
const int* refineLeft, | |||||
const int* refineRight){ | |||||
double dx=1.0e0/((double)(basePts)-1.0e0); | |||||
double y=0.0e0; | |||||
size_t i=0; | |||||
double r=0.0e0; | |||||
double t=0.5e0; | |||||
while(y<=1.0e0){ | |||||
r=rho(&y,a,&t,w,mag,leftFac,rightFac,refineLeft,refineRight); | |||||
y=y+(dx/r); | |||||
i++; | |||||
} | |||||
return(i); | |||||
} | |||||
void fillGrid(const size_t* basePts, | |||||
const size_t* nPts, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w, | |||||
const double* mag, | |||||
const double* leftFac, | |||||
const double* rightFac, | |||||
const int* refineLeft, | |||||
const int* refineRight, | |||||
double x[]){ | |||||
FILE* out;out=fopen("tmp.dat","w"); | |||||
double y=0.0e0; | |||||
double r=0.0e0; | |||||
double dx=1.0e0/((double)(*basePts)-1.0e0); | |||||
for(size_t j=0;j<*nPts;j++){ | |||||
r=rho(&y,a,c,w,mag,leftFac,rightFac,refineLeft,refineRight); // Point density? | |||||
fprintf(out, "%15.15e\n",dx/r); // writing number of points per section to tmp.dat | |||||
y=y+(dx/r); // y is the total number of points? | |||||
} | |||||
fclose(out); | |||||
double dxp[*nPts-1]; | |||||
for (size_t j = 0; j < *nPts; j++) { | |||||
dxp[j]=0.0e0; | |||||
} | |||||
FILE* tmp;tmp=fopen("tmp.dat","r"); | |||||
char buf[MAXBUFLEN]; | |||||
size_t i=0; | |||||
while (fgets(buf,MAXBUFLEN, tmp)!=NULL){ | |||||
sscanf(buf, "%lf", &y); | |||||
dxp[i]=y; | |||||
i++; | |||||
} | |||||
fclose(tmp); | |||||
double sum=0.0e0; | |||||
double err=0.0e0; | |||||
double fix=0.0e0; | |||||
double arr[*nPts-1] ; | |||||
size_t halfboundII = 0; | |||||
for(size_t j=0;j<*nPts-1;j++){ | |||||
sum+=dxp[j]; | |||||
arr[j]=sum; | |||||
} | |||||
for(size_t j=0;j<*nPts;j++){ | |||||
if(arr[j] > 0.5e0){ | |||||
halfboundII = j; | |||||
break; | |||||
} | |||||
} | |||||
err=1.0e0-sum; | |||||
printf("sum before correction: %15.6e\n",sum); | |||||
printf("err before correction: %15.6e\n",err); | |||||
//fix=err/((double)(*nPts)); | |||||
fix = err/((double)(*nPts-1-(halfboundII+1))); | |||||
sum=0.0e0; | |||||
for(size_t j=0;j<*nPts-1;j++){ | |||||
// dxp[j]+=fix; | |||||
if(j>halfboundII){ | |||||
dxp[j]=dxp[j]+fix ; | |||||
} | |||||
sum+=dxp[j]; | |||||
} | |||||
err=1.0e0-sum; | |||||
printf("sum after correction:%15.6e\n",sum); | |||||
printf("err after correction: %15.6e\n",err); | |||||
x[0]=0.0e0; | |||||
for(size_t j=0;j<*nPts-1;j++){ | |||||
x[j+1]=x[j]+dxp[j]; | |||||
} | |||||
x[*nPts-1]=1.0e0; | |||||
} | |||||
double safePosition(double c, double w){ | |||||
if(c<w){ | |||||
return(w); | |||||
} | |||||
else if(c>1.0e0-w){ | |||||
return(1.0e0-w); | |||||
} | |||||
else{ | |||||
return(c); | |||||
} | |||||
} | |||||
int reGrid(UserGrid grid, double position){ | |||||
printf("before regrid: %ld\n", grid->nPts); | |||||
double xx[grid->nPts]; | |||||
fillGrid(&grid->basePts, | |||||
&grid->nPts, | |||||
&grid->a, | |||||
&position, | |||||
&grid->w, | |||||
&grid->mag, | |||||
&grid->leftFac, | |||||
&grid->rightFac, | |||||
&grid->refineLeft, | |||||
&grid->refineRight, | |||||
xx); | |||||
for (size_t i = 0; i < grid->nPts; i++) { | |||||
grid->x[i]=xx[i]; | |||||
} | |||||
return(0); | |||||
} | |||||
void storeGrid(const double* x, double *y, const size_t nPts){ | |||||
for(size_t i=0;i<nPts;i++){ | |||||
y[i]=x[i]; | |||||
} | |||||
} | |||||
int initializeGrid(UserGrid grid){ | |||||
grid->nPts=maxPoints(grid->basePts, | |||||
&grid->a, | |||||
&grid->w, | |||||
&grid->mag, | |||||
&grid->leftFac, | |||||
&grid->rightFac, | |||||
&grid->refineLeft, | |||||
&grid->refineRight); | |||||
printf("nPts: %ld\n",grid->nPts); | |||||
grid->leastMove=grid->w; | |||||
grid->x = new double [grid->nPts]; | |||||
grid->xOld = new double [grid->nPts]; | |||||
for (size_t i = 0; i < grid->nPts; i++) { | |||||
grid->x[i]=0.0e0; | |||||
grid->xOld[i]=0.0e0; | |||||
} | |||||
return(0); | |||||
} | |||||
int getGridSettings(FILE *input, UserGrid grid){ | |||||
int ier=0; | |||||
ier=parseNumber<size_t>(input, "basePts" , MAXBUFLEN, &grid->basePts); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<double>(input, "gridDensitySlope", MAXBUFLEN, &grid->a); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<double>(input, "fineGridHalfWidth", MAXBUFLEN, &grid->w); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<double>(input, "gridRefinement", MAXBUFLEN, &grid->mag); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<double>(input, "leftRefineFactor", MAXBUFLEN, &grid->leftFac); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<double>(input, "rightRefineFactor", MAXBUFLEN, &grid->rightFac); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<int>(input, "refineLeft" , MAXBUFLEN, &grid->refineLeft); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<int>(input, "refineRight" , MAXBUFLEN, &grid->refineRight); | |||||
if(ier==-1)return(-1); | |||||
ier=parseNumber<double>(input, "position" , MAXBUFLEN, &grid->position); | |||||
if(ier==-1)return(-1); | |||||
return(0); | |||||
} | |||||
@@ -1 +0,0 @@ | |||||
gridRoutines.o: gridRoutines.cpp gridRoutines.h parse.h parse.hpp |
@@ -1,89 +0,0 @@ | |||||
#include "parse.h" | |||||
#ifndef GSL_DEF | |||||
#define GSL_DEF | |||||
#include <gsl/gsl_math.h> | |||||
#include <gsl/gsl_spline.h> | |||||
#endif | |||||
#ifndef GRID_DEF | |||||
#define GRID_DEF | |||||
typedef struct gridTag{ | |||||
size_t basePts; | |||||
size_t nPts; | |||||
double position; | |||||
double leastMove; | |||||
double a; | |||||
double w; | |||||
double mag; | |||||
double leftFac; | |||||
double rightFac; | |||||
int refineLeft; | |||||
int refineRight; | |||||
double* x; | |||||
double* xOld; | |||||
} *UserGrid; | |||||
inline double l(const double* x, | |||||
const double* a, | |||||
const double* w, | |||||
const double* fac, | |||||
const int* refineLeft); | |||||
//inline double l(const double* x, | |||||
// const double* a, | |||||
// const double* c, | |||||
// const double* w, | |||||
// const double* fac, | |||||
// const int* refineLeft); | |||||
inline double r(const double* x, | |||||
const double* a, | |||||
const double* w, | |||||
const double* fac, | |||||
const int* refineRight); | |||||
inline double f(const double* x, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w); | |||||
inline double g(const double* x, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w); | |||||
inline double rho(const double* x, | |||||
const double* a, | |||||
const double* c, | |||||
const double* w, | |||||
const double* mag, | |||||
const double* leftFac, | |||||
const double* rightFac, | |||||
const int* refineLeft, | |||||
const int* refineRight); | |||||
size_t maxPoints(const size_t basePts, | |||||
const double* a, | |||||
const double* w, | |||||
const double* mag, | |||||
const double* leftFac, | |||||
const double* rightFac, | |||||
const int* refineLeft, | |||||
const int* refineRight); | |||||
double safePosition(double c, double w); | |||||
int reGrid(UserGrid grid, double position); | |||||
void storeGrid(const double* x, double *y, const size_t nPts); | |||||
int initializeGrid(UserGrid grid); | |||||
int getGridSettings(FILE *input, UserGrid grid); | |||||
#endif |
@@ -34,11 +34,13 @@ typedef struct UserDataTag{ | |||||
/* Current version only support single and binary component(s) droplet */ | /* Current version only support single and binary component(s) droplet */ | ||||
int dropType; | int dropType; | ||||
/* Droplet species gamma using UNIFAC method */ | /* Droplet species gamma using UNIFAC method */ | ||||
double gamma[2]; | |||||
/* Droplet species composition */ | |||||
std::vector<double> gamma; | |||||
/* Droplet species composition, C3H8,n-C7H16,etc.*/ | |||||
std::vector<std::string> dropSpec; | std::vector<std::string> dropSpec; | ||||
/*droplet initial species mole fractions*/ | |||||
std::vector<double> dropMole; | std::vector<double> dropMole; | ||||
//char dropSpec[2][10] = {"propane","n-heptane"}; | |||||
/*droplet species molecular weight*/ | |||||
std::vector<double> MW; | |||||
/* Droplet species mole fractions */ | /* Droplet species mole fractions */ | ||||
//double dropMoleFrac[2]; | //double dropMoleFrac[2]; | ||||
@@ -55,8 +57,10 @@ typedef struct UserDataTag{ | |||||
/*metric=0:Planar*/ | /*metric=0:Planar*/ | ||||
/*metric=1:Cylindrical*/ | /*metric=1:Cylindrical*/ | ||||
/*metric=2:Spherical*/ | /*metric=2:Spherical*/ | ||||
int metric; | |||||
/*No: of species:*/ | |||||
int metric; | |||||
/* Gas phase relevent #s and Pointer index */ | |||||
/* Variables to be solved in the gas phase: T,Yi,r,P,mdot */ | |||||
/*No: of species in the gas phase:*/ | |||||
size_t nsp; | size_t nsp; | ||||
/*No: of equations:*/ | /*No: of equations:*/ | ||||
size_t neq; | size_t neq; | ||||
@@ -73,6 +77,25 @@ typedef struct UserDataTag{ | |||||
size_t np; | size_t np; | ||||
/*Pointer index for mass flow rate:*/ | /*Pointer index for mass flow rate:*/ | ||||
size_t nm; | size_t nm; | ||||
/*No: of species in the liquid phase:*/ | |||||
// size_t l_nsp; | |||||
// /*No: of equations:*/ | |||||
// size_t l_neq; | |||||
// /*No: of variables:*/ | |||||
// size_t l_nvar; | |||||
// /*Pointer indices (see "macros.h" for aliases that use these):*/ | |||||
// /*Pointer index for temperature:*/ | |||||
// size_t l_nt; | |||||
// /*Pointer index for species:*/ | |||||
// size_t l_ny; | |||||
// /*Pointer index for spatial coordinate:*/ | |||||
// size_t l_nr; | |||||
// /*Pointer index for pressure:*/ | |||||
// size_t l_np; | |||||
// /*Pointer index for mass flow rate:*/ | |||||
// size_t l_nm; | |||||
/*Species index of bath gas:*/ | /*Species index of bath gas:*/ | ||||
size_t k_bath; | size_t k_bath; | ||||
/*Species index of oxidizer:*/ | /*Species index of oxidizer:*/ | ||||
@@ -81,7 +104,8 @@ typedef struct UserDataTag{ | |||||
size_t k_HO2; | size_t k_HO2; | ||||
/*Species index of droplet composition*/ | /*Species index of droplet composition*/ | ||||
/*Index starts with 1 instead of 0*/ | /*Index starts with 1 instead of 0*/ | ||||
size_t k_drop[2]; | |||||
/*Similar to dropMole and dropSpec,size of k_drop should be based on droplet type*/ | |||||
std::vector<size_t> k_drop; | |||||
/*User-defined mass flux (kg/m^2/s):*/ | /*User-defined mass flux (kg/m^2/s):*/ | ||||
double mdot; | double mdot; | ||||
/*Flag to solve isobaric/isochoric problem;*/ | /*Flag to solve isobaric/isochoric problem;*/ | ||||
@@ -195,6 +219,10 @@ typedef struct UserDataTag{ | |||||
double Rg; | double Rg; | ||||
/*Total number of points for grid:*/ | /*Total number of points for grid:*/ | ||||
size_t npts; | size_t npts; | ||||
/*Number of points for liquid phase:*/ | |||||
size_t l_npts; | |||||
/*Number of points for gas phase:*/ | |||||
size_t g_npts; | |||||
double gridOffset; | double gridOffset; | ||||
@@ -236,5 +264,5 @@ void setSaneDefaults(UserData data); | |||||
void freeUserData(UserData data); | void freeUserData(UserData data); | ||||
#endif | #endif | ||||
void getGamma(const double mole[],double gamma[]) ; | |||||
void getGamma(const std::vector<double>& mole,std::vector<double>& gamma) ; | |||||
@@ -1,3 +1,5 @@ | |||||
#pragma once | |||||
#ifndef PRINT_DEF | #ifndef PRINT_DEF | ||||
#define PRINT_DEF | #define PRINT_DEF | ||||
#include <string.h> //for strings | #include <string.h> //for strings | ||||
@@ -12,7 +14,7 @@ | |||||
#include <vector> | #include <vector> | ||||
#include <sstream> | #include <sstream> | ||||
#ifndef PARSE_DEF ``` | |||||
#ifndef PARSE_DEF | |||||
#define PARSE_DEF | #define PARSE_DEF | ||||
#define MAXBUFLEN 200 | #define MAXBUFLEN 200 | ||||
@@ -30,12 +32,101 @@ template<typename T> | |||||
int parseArray(FILE* input, const char* keyword, const size_t bufLen, | int parseArray(FILE* input, const char* keyword, const size_t bufLen, | ||||
const size_t arrLen, T y[]); | const size_t arrLen, T y[]); | ||||
// | |||||
///*template function for parsing initial mole fraction in the droplet*/ | |||||
//template<typename T> | |||||
//int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<T>& dropPara){ | |||||
// char buf[bufLen]; | |||||
// char buf1[bufLen]; | |||||
// char comment[1]; | |||||
// char *ret; | |||||
// | |||||
// while (fgets(buf,bufLen, input)!=NULL){ | |||||
// comment[0]=buf[0]; | |||||
// if(strncmp(comment,"#",1)==0){ | |||||
// //printf("Comment!:%s\n",buf); | |||||
// } | |||||
// else{ | |||||
// ret=strtok(buf,"="); | |||||
// if(strcmp(ret,keyword)==0){ | |||||
// /*offset buf by keyword size + 1 for the "="*/ | |||||
// /* Second argument in the strncpy function is the address !!! */ | |||||
// /* Note: current version of code can only take dropType =0 or 1 */ | |||||
// strncpy(buf1, buf+strlen(keyword)+1, bufLen); | |||||
// printf("%10s: ",keyword); | |||||
// if(*dropType ==0){ | |||||
// /* Convert from char* to double */ | |||||
//// std::string str(buf1); | |||||
//// dropPara.push_back(str); | |||||
// T temp_num = std::stod(buf1) ; | |||||
// dropPara.push_back(temp_num) ; | |||||
// printf("%.3f\n",dropPara[0]); | |||||
// }else{ | |||||
// std::istringstream iss(buf1) ; | |||||
// std::string token; | |||||
// while(std::getline(iss,token,',')){ | |||||
// T temp_num = std::stod(token); | |||||
// dropPara.push_back(temp_num); | |||||
// } | |||||
// printf("%.3f,%.3f\n",dropPara[0],dropPara[1]); | |||||
// } | |||||
// rewind(input); | |||||
// return(0); | |||||
// } | |||||
// } | |||||
// } | |||||
// rewind(input); | |||||
// return(-1); | |||||
//} | |||||
template<typename T> | |||||
int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,int* dropType, std::vector<T>& dropPara); | |||||
/* Extract the droplet species and molefractions from input file using template */ | |||||
/* Generic template function */ | |||||
//template<typename T> | |||||
//int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<T>& dropPara){ | |||||
// char buf[bufLen]; | |||||
// char buf1[bufLen]; | |||||
// char comment[1]; | |||||
// char *ret; | |||||
// T* n; | |||||
// | |||||
// while (fgets(buf,bufLen, input)!=NULL){ | |||||
// comment[0]=buf[0]; | |||||
// if(strncmp(comment,"#",1)==0){ | |||||
// //printf("Comment!:%s\n",buf); | |||||
// } | |||||
// else{ | |||||
// ret=strtok(buf,"="); | |||||
// if(strcmp(ret,keyword)==0){ | |||||
// /*offset buf by keyword size + 1 for the "="*/ | |||||
// /* Second argument in the strncpy function is the address !!! */ | |||||
// /* Note: current version of code can only take dropType =0 or 1 */ | |||||
// strncpy(buf1, buf+strlen(keyword)+1, bufLen); | |||||
// printf("%10s: ",keyword); | |||||
// if(*dropType ==0){ | |||||
// getFromString(buf1,n); | |||||
// dropPara.push_back(*n); | |||||
// }else{ | |||||
// std::istringstream iss(buf1) ; | |||||
// std::string token; | |||||
// while(std::getline(iss,token,',')){ | |||||
// T arg = std::stod(token); | |||||
// dropPara.push_back(arg); | |||||
// } | |||||
// printf("%15.6e,%15.6e\n",dropPara[0],dropPara[1]); | |||||
// } | |||||
// rewind(input); | |||||
// return(0); | |||||
// } | |||||
// } | |||||
// } | |||||
// rewind(input); | |||||
// return(-1); | |||||
//} | |||||
template<> | |||||
int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,int* dropType, std::vector<std::string>& dropPara); | |||||
// | |||||
///* Specialization for string */ | |||||
//template<> | |||||
//int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<std::string>& dropPara); | |||||
int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMole[],const size_t bufLen); | int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMole[],const size_t bufLen); | ||||
@@ -1,3 +1,5 @@ | |||||
#pragma once | |||||
template<typename T> | template<typename T> | ||||
int parseNumber(FILE* input, const char* keyword, const size_t bufLen, T* n){ | int parseNumber(FILE* input, const char* keyword, const size_t bufLen, T* n){ | ||||
@@ -83,7 +85,7 @@ int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const in | |||||
char buf1[bufLen]; | char buf1[bufLen]; | ||||
char comment[1]; | char comment[1]; | ||||
char *ret; | char *ret; | ||||
T* n; | |||||
T n; | |||||
while (fgets(buf,bufLen, input)!=NULL){ | while (fgets(buf,bufLen, input)!=NULL){ | ||||
comment[0]=buf[0]; | comment[0]=buf[0]; | ||||
@@ -99,8 +101,8 @@ int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const in | |||||
strncpy(buf1, buf+strlen(keyword)+1, bufLen); | strncpy(buf1, buf+strlen(keyword)+1, bufLen); | ||||
printf("%10s: ",keyword); | printf("%10s: ",keyword); | ||||
if(*dropType ==0){ | if(*dropType ==0){ | ||||
getFromString(buf1,n); | |||||
dropPara.push_back(*n); | |||||
getFromString(buf1,&n); | |||||
dropPara.push_back(n); | |||||
}else{ | }else{ | ||||
std::istringstream iss(buf1) ; | std::istringstream iss(buf1) ; | ||||
std::string token; | std::string token; | ||||
@@ -108,7 +110,7 @@ int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const in | |||||
T arg = std::stod(token); | T arg = std::stod(token); | ||||
dropPara.push_back(arg); | dropPara.push_back(arg); | ||||
} | } | ||||
printf("%15.6e,%15.6e\n",dropPara[0],dropPara[1]); | |||||
printf("%.3f,%.3f\n",dropPara[0],dropPara[1]); | |||||
} | } | ||||
rewind(input); | rewind(input); | ||||
return(0); | return(0); | ||||
@@ -121,5 +123,52 @@ int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const in | |||||
/* Specialization for string */ | /* Specialization for string */ | ||||
template<> | template<> | ||||
int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<std::string>& dropPara); | |||||
inline int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<std::string>& dropPara){ | |||||
char buf[bufLen]; | |||||
char buf1[bufLen]; | |||||
char comment[1]; | |||||
char *ret; | |||||
while (fgets(buf,bufLen, input)!=NULL){ | |||||
buf[strlen(buf)-1] = '\0' ; | |||||
comment[0]=buf[0]; | |||||
if(strncmp(comment,"#",1)==0){ | |||||
//printf("Comment!:%s\n",buf); | |||||
} | |||||
else{ | |||||
ret=strtok(buf,"="); | |||||
if(strcmp(ret,keyword)==0){ | |||||
/*offset buf by keyword size + 1 for the "="*/ | |||||
/* Second argument in the strncpy function is the address !!! */ | |||||
/* Note: current version of code can only take dropType =0 or 1 */ | |||||
strncpy(buf1, buf+strlen(keyword)+1, bufLen); | |||||
printf("%10s: ",keyword); | |||||
if(*dropType ==0){ | |||||
/* Convert from char* to string */ | |||||
//printf("buf1 is %s!\n",buf1) ; | |||||
std::string str; | |||||
for(int i=0;i< strlen(buf1);i++){ | |||||
if(buf1[i] != ' '){ | |||||
str += buf1[i] ; | |||||
} | |||||
} | |||||
// printf("str is :%s!\n",str.c_str()) ; | |||||
dropPara.push_back(str); | |||||
printf("%s.\n",dropPara[0].c_str()); | |||||
}else{ | |||||
std::istringstream iss(buf1) ; | |||||
std::string token; | |||||
while(std::getline(iss,token,',')){ | |||||
//std::stod(token); | |||||
dropPara.push_back(token); | |||||
} | |||||
printf("%s!,%s!\n",dropPara[0].c_str(),dropPara[1].c_str()); | |||||
} | |||||
rewind(input); | |||||
return(0); | |||||
} | |||||
} | |||||
} | |||||
rewind(input); | |||||
return(-1); | |||||
} |
@@ -28,6 +28,7 @@ | |||||
#include "UserData.h" | #include "UserData.h" | ||||
#include <vector> //add the vector module | #include <vector> //add the vector module | ||||
#include <algorithm> | |||||
void REGRID(double* ydata,double* ydotdata,UserData data); | void REGRID(double* ydata,double* ydotdata,UserData data); | ||||
@@ -67,11 +68,14 @@ inline double calc_area(double x,int* i); | |||||
void updateSolution(double* y, double* ydot, const size_t nvar, | void updateSolution(double* y, double* ydot, const size_t nvar, | ||||
const double xOld[],const double xNew[],const size_t npts); | const double xOld[],const double xNew[],const size_t npts); | ||||
void readInitialCondition(FILE* input, double* ydata, const size_t nvar, const size_t nr, const size_t nPts); | |||||
//void readInitialCondition(FILE* input, double* ydata, const size_t nvar, const size_t nr, const size_t nPts); | |||||
void readInitialCondition(FILE* input, double* ydata, const size_t nvar, const size_t nr, const size_t nPts, const size_t l_nPts, double Rg); | |||||
double systemMass(double* ydata, UserData data); | double systemMass(double* ydata, UserData data); | ||||
int initializePsiGrid(double* ydata, double* psidata, UserData data); | int initializePsiGrid(double* ydata, double* psidata, UserData data); | ||||
int initializePsiEtaGrid(double* ydata, double* psidata, UserData data); | |||||
int setInitialCondition(N_Vector* y, | int setInitialCondition(N_Vector* y, | ||||
N_Vector* ydot, | N_Vector* ydot, | ||||
@@ -86,7 +90,10 @@ void getTransport(UserData data, | |||||
double *rho, | double *rho, | ||||
double *lambda, | double *lambda, | ||||
double *YV); | double *YV); | ||||
void getGasMassFlux(UserData data, | |||||
double *ydata, | |||||
size_t gridPoint, | |||||
double* YV) ; | |||||
int residue(double t, | int residue(double t, | ||||
N_Vector y, | N_Vector y, | ||||
N_Vector ydot, | N_Vector ydot, | ||||
@@ -97,6 +104,7 @@ void trackFlameOH(N_Vector y,UserData data); | |||||
void trackFlame(N_Vector y,UserData data); | void trackFlame(N_Vector y,UserData data); | ||||
size_t BathGasIndex(UserData data); | size_t BathGasIndex(UserData data); | ||||
size_t oxidizerIndex(UserData data); | size_t oxidizerIndex(UserData data); | ||||
size_t specIndex(UserData data,const char *specName); | |||||
inline double Qdot(double* t, | inline double Qdot(double* t, | ||||
double* x, | double* x, | ||||
@@ -123,7 +131,34 @@ void resetTolerance(UserData data, N_Vector* y,N_Vector* atolv); | |||||
void getReactions(UserData data,N_Vector* y,FILE* output); | void getReactions(UserData data,N_Vector* y,FILE* output); | ||||
void getSpecies(UserData data,N_Vector* y,FILE* output); | void getSpecies(UserData data,N_Vector* y,FILE* output); | ||||
double getLiquidRho(double dropMole[],double temp,double pres); | |||||
double getLiquidCp(double dropMole[],double temp,double pres); | |||||
double getLiquidHv(double dropMole[],double temp,double pres); | |||||
double getLiquidMaxT(double dropMole[],double pres); | |||||
//double getLiquidRho(double dropMole[],double temp,double pres); | |||||
//double getLiquidCp(double dropMole[],double temp,double pres); | |||||
//double getLiquidHv(double dropMole[],double temp,double pres); | |||||
//double getLiquidMaxT(double dropMole[],double pres); | |||||
double getLiquidDensity(const double temp,const double pres, const std::vector<std::string>& composition); | |||||
double getLiquidDensity(const double temp,const double pres, std::vector<std::string>& composition,const std::vector<double>& mole); | |||||
double getLiquidCond(const double temp,const double pres, const std::vector<std::string>& composition); | |||||
double getLiquidCond(const double temp,const double pres, std::vector<std::string>& composition,const std::vector<double>& mole); | |||||
double getLiquidCpb(const double temp,const double pres, const std::vector<std::string>& composition); | |||||
double getLiquidCpb(const double temp,const double pres, const std::vector<std::string>& composition,const std::vector<double>& mole); | |||||
std::vector<double> getLiquidCp(const double temp, const double pres, const std::vector<std::string> &composition); | |||||
double getGasCond(UserData data, double *ydata, size_t gridPoint); | |||||
std::vector<double> getLiquidVH(const double pres,const int dropType); | |||||
void mass2mole(const std::vector<double>& mass,std::vector<double>& mole, UserData data); | |||||
double getLiquidmassdiff(UserData data, double* ydata, size_t gridPoint,const double temp); | |||||
std::vector<double> getLiquidmassvec(UserData data,double* ydata,int gridPoint); | |||||
std::vector<double> getLiquidmolevec(UserData data,double* ydata,int gridPoint); | |||||
std::vector<std::string> components(int dropType); | |||||
std::vector<double> getVapPressure(UserData data, double* ydata,int gridPoint,const std::vector<double> mole_); | |||||
double dropletmass(UserData data,double* ydata); | |||||
void printIddata(UserData data, double* iddata); | |||||
void printPsidata(UserData data,double* psidata); |
@@ -39,6 +39,7 @@ double get_wall_time(){ | |||||
} | } | ||||
return (double)time.tv_sec + (double)time.tv_usec * .000001; | return (double)time.tv_sec + (double)time.tv_usec * .000001; | ||||
} | } | ||||
double get_cpu_time(){ | double get_cpu_time(){ | ||||
return (double)clock() / CLOCKS_PER_SEC; | return (double)clock() / CLOCKS_PER_SEC; | ||||
} | } | ||||
@@ -1,80 +0,0 @@ | |||||
#ifndef MACRO_DEF | |||||
#define MACRO_DEF | |||||
//#define SUNDIALS_DOUBLE_PRECISION 1 | |||||
//#define SUNDIALS_SINGLE_PRECISION 1 | |||||
#define ZERO RCONST(0.0) | |||||
#define HALF RCONST(0.5) | |||||
#define ONE RCONST(1.0) | |||||
#define TWO RCONST(2.0) | |||||
#define THREE RCONST(3.0) | |||||
#define FOUR RCONST(4.0) | |||||
#define TEN RCONST(10.0) | |||||
/* In order to keep begin the index numbers from 1 instead of 0, we define | |||||
* macros here. Also, we define macros to ease referencing various variables in | |||||
* the sundials nvector. | |||||
*/ | |||||
#define WORK(i) WORK[i-1] | |||||
#define XNEW(i) XNEW[i-1] | |||||
#define psi(i) psidata[i-1] | |||||
#define T(i) ydata[((i-1)*data->nvar)+data->nt] | |||||
#define Y(i,k) ydata[((i-1)*data->nvar)+data->ny+k-1] | |||||
#define R(i) ydata[((i-1)*data->nvar)+data->nr] | |||||
#define P(i) ydata[((i-1)*data->nvar)+data->np] | |||||
#define Mdot(i) ydata[((i-1)*data->nvar)+data->nm] | |||||
#define Tdot(i) ydotdata[((i-1)*data->nvar)+data->nt] | |||||
#define Ydot(i,k) ydotdata[((i-1)*data->nvar)+data->ny+k-1] | |||||
#define Rdot(i) ydotdata[((i-1)*data->nvar)+data->nr] | |||||
#define Pdot(i) ydotdata[((i-1)*data->nvar)+data->np] | |||||
#define Mdotdot(i) ydotdata[((i-1)*data->nvar)+data->nm] | |||||
#define Tres(i) resdata[((i-1)*data->nvar)+data->nt] | |||||
#define Yres(i,k) resdata[((i-1)*data->nvar)+data->ny+k-1] | |||||
#define Rres(i) resdata[((i-1)*data->nvar)+data->nr] | |||||
#define Pres(i) resdata[((i-1)*data->nvar)+data->np] | |||||
#define Mdotres(i) resdata[((i-1)*data->nvar)+data->nm] | |||||
#define Tid(i) iddata[((i-1)*data->nvar)+data->nt] | |||||
#define Yid(i,k) iddata[((i-1)*data->nvar)+data->ny+k-1] | |||||
#define Rid(i) iddata[((i-1)*data->nvar)+data->nr] | |||||
#define Pid(i) iddata[((i-1)*data->nvar)+data->np] | |||||
#define Mdotid(i) iddata[((i-1)*data->nvar)+data->nm] | |||||
#define Yav(i) Yav[i-1] | |||||
#define YAvg(i) YAvg[i-1] | |||||
#define YVmhalf(i) YVmhalf[i-1] | |||||
#define YVphalf(i) YVphalf[i-1] | |||||
#define X(i) X[i-1] | |||||
#define Xp(i) Xp[i-1] | |||||
#define Xgradhalf(i) Xgradhalf[i-1] | |||||
#define XLeft(i) XLeft[i-1] | |||||
#define XRight(i) XRight[i-1] | |||||
#define gradX(i) gradX[i-1] | |||||
#define wdot(i) wdot[i-1] | |||||
#define enthalpy(i) enthalpy[i-1] | |||||
#define energy(i) energy[i-1] | |||||
#define Cp(i) Cp[i-1] | |||||
#define atolT(i) atolvdata[((i-1)*data->nvar)+data->nt] | |||||
#define atolY(i,k) atolvdata[((i-1)*data->nvar)+data->ny+k-1] | |||||
#define atolR(i) atolvdata[((i-1)*data->nvar)+data->nr] | |||||
#define atolP(i) atolvdata[((i-1)*data->nvar)+data->np] | |||||
#define atolMdot(i) atolvdata[((i-1)*data->nvar)+data->nm] | |||||
#define constraintsY(i,k) constraintsdata[((i-1)*data->nvar)+data->ny+k-1] | |||||
#define constraintsR(i) constraintsdata[((i-1)*data->nvar)+data->nr] | |||||
/*Following marcos are defined to calculate the characteristic time-scale */ | |||||
#define wdot_mole(i) wdot_mole[i-1] | |||||
#define wdot_mass(i) wdot_mass[i-1] | |||||
#define MW(i) MW[i-1] | |||||
#define time_scale(i,k) time_scale[(i-1)*data->nsp+k-1] | |||||
#define concentra(i) concentra[i-1] | |||||
#endif |
@@ -1,491 +0,0 @@ | |||||
/* | |||||
_____ ___ ____ ____ | |||||
|_ _/ _ \| _ \ / ___| | |||||
| || | | | |_) | | | |||||
| || |_| | _ <| |___ | |||||
|_| \___/|_| \_\\____| | |||||
*/ | |||||
#include "UserData.h" | |||||
#include "solution.h" | |||||
#include "residue.h" | |||||
#include "macros.h" | |||||
#include "timing.h" | |||||
#include <ida/ida.h> | |||||
#include <ida/ida_direct.h> | |||||
#include <sunmatrix/sunmatrix_band.h> | |||||
#include <sunlinsol/sunlinsol_lapackband.h> | |||||
//#include <ida/ida_band.h> | |||||
static int check_flag(void *flagvalue, | |||||
const char *funcname, | |||||
int opt); | |||||
void freeAtLast(void* mem, N_Vector *y, | |||||
N_Vector *ydot, | |||||
N_Vector *res, | |||||
N_Vector *id, | |||||
N_Vector *atolv, | |||||
N_Vector *constraints,UserData data); | |||||
int main(){ | |||||
// Read input file specifying the details of the case and store them | |||||
FILE *input;input=fopen("input.dat","r"); | |||||
UserData data;data=NULL;data=allocateUserData(input); | |||||
fclose(input); | |||||
data->clockStart=get_wall_time(); | |||||
// /**************** TEST THE xOld *******************/ | |||||
// double* ptr1 = data->grid->xOld ; | |||||
// printf("After allocateUserData in main.cpp,Start print the first 5 elements of the xOld array : \n"); | |||||
// printf("1st:%.6f, 2nd:%.6f, 3rd:%.6f, 4th:%.6f, 5th:%.6f.\n",ptr1[0],ptr1[1],ptr1[2],ptr1[3],ptr1[4]); | |||||
if(data==NULL){ | |||||
printf("check input file!\n"); | |||||
freeUserData(data); | |||||
return(-1); | |||||
} | |||||
// Allocate solution variables | |||||
long int ier,mu,ml,count,netf,ncfn,njevals,nrevals; | |||||
realtype tNow,*atolvdata,*constraintsdata,finalTime,dtMax,tolsfac; | |||||
N_Vector y,ydot,id,res,atolv,constraints; | |||||
y=ydot=id=res=atolv=constraints=NULL; | |||||
ier=allocateSolution(data->neq,data->nThreads,&y,&ydot,&id,&res,&atolv,&constraints); | |||||
ier=setAlgebraicVariables(&id,data); | |||||
// /**************** TEST THE xOld *******************/ | |||||
// double* ptr2 = data->grid->xOld ; | |||||
// printf("Before setInitialCondition in main.cpp,Start print the first 5 elements of the xOld array : \n"); | |||||
// printf("1st:%.6f, 2nd:%.6f, 3rd:%.6f, 4th:%.6f, 5th:%.6f.\n",ptr2[0],ptr2[1],ptr2[2],ptr2[3],ptr2[4]); | |||||
ier=setInitialCondition(&y,&ydot,data); | |||||
if(ier==-1)return(-1); | |||||
tNow=data->tNow; | |||||
finalTime=data->finalTime; | |||||
//TODO: dtMax should be a user input | |||||
dtMax = 1e-4; | |||||
double* ydata; | |||||
double* ydotdata; | |||||
ydata = N_VGetArrayPointer_OpenMP(y); | |||||
ydotdata = N_VGetArrayPointer_OpenMP(ydot); | |||||
////////// DEBUG /////////////////// | |||||
//double* resdata; | |||||
//double* iddata; | |||||
//resdata = N_VGetArrayPointer_OpenMP(res); | |||||
//iddata = N_VGetArrayPointer_OpenMP(id); | |||||
/////////////////////////////////// | |||||
void *mem;mem=NULL;mem = IDACreate(); | |||||
ier = IDASetUserData(mem, data); | |||||
ier = IDASetId(mem, id); | |||||
ier = IDAInit(mem, residue, tNow, y, ydot); | |||||
// Atol array | |||||
atolvdata = N_VGetArrayPointer_OpenMP(atolv); | |||||
for (size_t i = 1; i <=data->npts; i++) { | |||||
atolT(i) = data->temperatureTolerance; | |||||
for (size_t k = 1; k <=data->nsp; k++) { | |||||
if(k!=data->k_bath){ | |||||
atolY(i,k) = data->massFractionTolerance; | |||||
} | |||||
else{ | |||||
atolY(i,k) = data->bathGasTolerance; | |||||
} | |||||
} | |||||
atolR(i) = data->radiusTolerance; | |||||
atolP(i) = data->pressureTolerance; | |||||
atolMdot(i) = data->MdotTolerance; | |||||
} | |||||
ier = IDASVtolerances(mem, data->relativeTolerance, atolv); | |||||
mu = 2*data->nvar; ml = mu; | |||||
SUNMatrix A; A=NULL; | |||||
A=SUNBandMatrix(data->neq,mu,ml,mu+ml); | |||||
SUNLinearSolver LS; LS=NULL; | |||||
//LS=SUNBandLinearSolver(y,A); | |||||
LS=SUNLapackBand(y,A); | |||||
ier=IDADlsSetLinearSolver(mem,LS,A); | |||||
//ier = IDABand(mem, data->neq, mu, ml); | |||||
constraintsdata = N_VGetArrayPointer_OpenMP(constraints); | |||||
if(data->setConstraints){ | |||||
for (size_t i = 1; i <=data->npts; i++) { | |||||
for (size_t k = 1; k <=data->nsp; k++) { | |||||
constraintsY(i,k) = ONE; | |||||
} | |||||
} | |||||
ier=IDASetConstraints(mem, constraints); | |||||
} | |||||
if(!data->quasiSteady){ | |||||
constraintsR(1) = ONE; | |||||
ier=IDASetConstraints(mem, constraints); | |||||
} | |||||
ier = IDASetSuppressAlg(mem, data->suppressAlg); | |||||
if(check_flag(&ier, "IDASetSuppressAlg", 1)) return(1); | |||||
//ier= IDASetMaxNumStepsIC(mem, 1); | |||||
//ier= IDASetMaxNumJacsIC(mem,8); | |||||
//ier= IDASetMaxNumItersIC(mem,100); | |||||
//ier= IDASetMaxBacksIC(mem,2000); | |||||
//ier = IDASetLineSearchOffIC(mem,SUNTRUE); | |||||
//////// DEBUG /////////// | |||||
//if(data->dryRun){ | |||||
// ier = residue(tNow,y, ydot, res, data); | |||||
// for(size_t k=0; k < data->nvar*data->npts; k++){ | |||||
// printf("%i: %15.6e\n",k,resdata[k]); | |||||
// } | |||||
// for(size_t k=0; k < data->nvar*data->npts; k++){ | |||||
// if(iddata[k] == 1){ | |||||
// ydotdata[k] = -resdata[k]; | |||||
// } | |||||
// } | |||||
// ier = residue(tNow,y, ydot, res, data); | |||||
// for(size_t k=0; k < data->nvar*data->npts; k++){ | |||||
// printf("%i: %15.6e\n",k,resdata[k]); | |||||
// } | |||||
//} | |||||
//for(size_t k=0; k < data->neq; k++){ | |||||
// if(iddata[k] == 1){ | |||||
// ydotdata[k] = -resdata[k]; | |||||
// } | |||||
//} | |||||
////////////////////////// | |||||
if(!data->dryRun){ | |||||
printf("Calculating Initial Conditions:\n"); | |||||
printf("Cross your fingers...\n"); | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, 1e-5*finalTime); | |||||
//If at first IDACalcIC doesn't succeed, try, try, try again: | |||||
for (int i = 0; i < 10; i++) { | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, (1e-01+pow(10,i)*finalTime)); | |||||
/************* Print the #of iterations ************/ | |||||
//printf("This the %dth try of calculating initial conditions. \n",i); | |||||
if(ier==0){ | |||||
break; | |||||
} | |||||
} | |||||
//...or else cry again :( | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
}else{ | |||||
printf("Initial (Consistent) Conditions Calculated!\n"); | |||||
} | |||||
ier = IDASetInitStep(mem,1e-12); | |||||
} | |||||
printSpaceTimeHeader(data); | |||||
printGlobalHeader(data); | |||||
printTimescaleHeader(data); | |||||
printSpaceTimeOutput(tNow, &y, data->output, data); | |||||
printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | |||||
// getTimescale(data,&y) ; | |||||
// printTimescaleOutput(tNow, &y, data->timescaleOutput,data); | |||||
if(!data->dryRun){ | |||||
count=0; | |||||
double dt=1e-08; | |||||
double t1=0.0e0; | |||||
double xOld=0.0e0; | |||||
double x=0.0e0; | |||||
double dx=0.0e0; | |||||
double dxMin=1.0e0; | |||||
double dxRatio=dx/dxMin; | |||||
int move=0; | |||||
int kcur=0; | |||||
int RGCOUNT=0; | |||||
size_t ii=0; | |||||
if(data->adaptiveGrid){ | |||||
dxMin=data->grid->leastMove; | |||||
xOld=maxCurvPosition(ydata, data->nt, data->nvar, | |||||
data->grid->x, data->npts); | |||||
//xOld=isothermPosition(ydata, data->isotherm, data->nt, | |||||
// data->nvar, data->grid->x, data->npts); | |||||
} | |||||
while (tNow<=finalTime && R(1)>100e-9) { | |||||
t1=tNow; | |||||
/*Floor small value to zero*/ | |||||
floorSmallValue(data, &y); | |||||
if(data->quasiSteady){ | |||||
ier = IDASolve(mem, finalTime, &tNow, y, ydot, IDA_ONE_STEP); | |||||
}else{ | |||||
/*This prevents the solver from taking a step so large that | |||||
*the droplet radius becomes negative. | |||||
*TODO:Try adding the constraint that the droplet radius must | |||||
* be a positive number*/ | |||||
ier = IDASolve(mem, tNow+dtMax, &tNow, y, ydot, IDA_ONE_STEP); | |||||
//ier = IDASolve(mem, tNow+dtMax, &tNow, y, ydot, IDA_NORMAL); | |||||
} | |||||
if(check_flag(&ier, "IDASolve", 1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
dt=tNow-t1; | |||||
ier = IDAGetCurrentOrder(mem, &kcur); | |||||
/******** Print the max Temperature *********/ | |||||
double maxT = 0.00; | |||||
maxT = maxTemperature(ydata,data->nt,data->nvar,data->npts); | |||||
printf("Maximum temperature is : %.3f[K] \n",maxT); | |||||
if(data->adaptiveGrid==1 && data->moveGrid==1){ | |||||
x=maxCurvPosition(ydata, data->nt, data->nvar, | |||||
data->grid->x, data->npts); | |||||
//x=isothermPosition(ydata, data->isotherm, data->nt, | |||||
// data->nvar, data->grid->x, data->npts); | |||||
//x=maxGradPosition(ydata, data->nt, data->nvar, | |||||
// data->grid->x, data->npts); | |||||
dx=x-xOld; | |||||
if(dx*dxMin>0.0e0){ | |||||
move=1; | |||||
}else{ | |||||
move=-1; | |||||
} | |||||
//if(fabs(dx)>=dxMin && x+(double)(move)*0.5e0*dxMin<=1.0e0){ | |||||
dxRatio=fabs(dx/dxMin); | |||||
/************ Print xOld, x,dx,dxMin,dxRatio ******************/ | |||||
printf("xOld = %.6f, x = %.6f,",xOld,x); | |||||
printf("dx = %.6f, dxMin = %.6f, dxRatio = %.3f\n",dx,dxMin,dxRatio); | |||||
if(dxRatio>=1.0e0 && dxRatio<=2.0e0){ | |||||
printf("Regridding!\n"); | |||||
data->regrid=1; | |||||
printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | |||||
ier=reGrid(data->grid, x+(double)(move)*0.5e0*dxMin); | |||||
if(ier==-1){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
updateSolution(ydata, ydotdata, data->nvar, | |||||
data->grid->xOld,data->grid->x,data->npts); | |||||
storeGrid(data->grid->x,data->grid->xOld,data->npts); | |||||
xOld=x; | |||||
printf("Regrid Complete! Restarting Problem at %15.6e s\n",tNow); | |||||
ier = IDAReInit(mem, tNow, y, ydot); | |||||
if(check_flag(&ier, "IDAReInit", 1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
ier = IDASetInitStep(mem,1e-01*dt); | |||||
printf("Reinitialized! Calculating Initial Conditions:\n"); | |||||
printf("Cross your fingers...\n"); | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e-01*dt); | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e+01*dt); | |||||
} | |||||
//Every once in a while, for reasons | |||||
//that befuddle this mathematically | |||||
//lesser author, IDACalcIC fails. Here, | |||||
//I desperately try to make it converge | |||||
//again by sampling increasingly larger | |||||
//time-steps: | |||||
for (int i = 0; i < 10; i++) { | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+(1e-01+pow(10,i)*dt)); | |||||
if(ier==0){ | |||||
break; | |||||
} | |||||
} | |||||
//Failure :( Back to the drawing board: | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
printf("Initial (Consistent) Conditions Calculated!\n"); | |||||
printf("------------------------------------------\n\n"); | |||||
if(data->writeEveryRegrid){ | |||||
printSpaceTimeOutput(tNow, &y, data->output, data); | |||||
FILE* fp; | |||||
fp=fopen("restart.bin","w"); | |||||
writeRestart(tNow, &y, &ydot, fp, data); | |||||
fclose(fp); | |||||
} | |||||
} | |||||
} | |||||
/*reset the tolerance after ignition*/ | |||||
//resetTolerance(data,&y,&atolv); | |||||
/*regrid and update the solution based on R,re-initialize the problem*/ | |||||
/*For the time being,we only allow TORC to REGRID once for each run*/ | |||||
if(data->JJRG ==1 && (maxT >= data->initialTemperature+data->deltaT)){ | |||||
if(RGCOUNT<1){ | |||||
RGCOUNT = RGCOUNT +1; | |||||
REGRID(ydata,ydotdata,data); | |||||
initializePsiGrid(ydata,data->uniformGrid,data); | |||||
printf("REGRID Complete!Restarting Problem at %15.6e s\n",tNow); | |||||
ier = IDAReInit(mem,tNow,y,ydot); | |||||
if(check_flag(&ier,"IDAReInit",1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
ier= IDASetInitStep(mem,1e-01*dt); | |||||
//ier= IDASetInitStep(mem,0.0); | |||||
printf("Reinitialized!Calculating Initial Conditions:\n"); | |||||
printf("Cross your fingers...\n"); | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e-01*dt); | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e+01*dt); | |||||
} | |||||
//Every once in a while, for reasons | |||||
//that befuddle this mathematically | |||||
//lesser author, IDACalcIC fails. Here, | |||||
//I desperately try to make it converge | |||||
//again by sampling increasingly larger | |||||
//time-steps: | |||||
for (int i = 0; i < 10; i++) { | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+(1e-01+pow(10,i)*dt)); | |||||
if(ier==0){ | |||||
break; | |||||
} | |||||
} | |||||
//Failure :( Back to the drawing board: | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
printf("Initial (Consistent) Conditions Calculated!\n"); | |||||
printf("------------------------------------------\n\n"); | |||||
} | |||||
} | |||||
/*Floor small value to zero*/ | |||||
floorSmallValue(data, &y); | |||||
if(count%data->nSaves==0 && !data->writeEveryRegrid){ | |||||
printSpaceTimeOutput(tNow, &y, data->output, data); | |||||
//if(data->writeRates){ | |||||
// printSpaceTimeRates(tNow, ydot, data); | |||||
//} | |||||
} | |||||
/*Get and Print Rxns Rate of Progress and Specie Rate of Production data*/ | |||||
/*Following code snippet will be executed only once*/ | |||||
if(ii==0 && maxT >=(data->initialTemperature+data->deltaT)){ | |||||
getReactions(data,&y,data->rxnROPOutput); | |||||
getSpecies(data,&y,data->spROPOutput); | |||||
ii++; | |||||
} | |||||
// getTimescale(data,&y); | |||||
// if(count%data->nSaves==0){ | |||||
// printTimescaleOutput(tNow,&y, data->timescaleOutput,data); | |||||
// //printSpaceTimeOutput(tNow, &y, data->output, data); | |||||
// //if(data->writeRates){ | |||||
// // printSpaceTimeRates(tNow, ydot, data); | |||||
// //} | |||||
// } | |||||
/*Print global variables only if time-step is of high order!*/ | |||||
if(data->nTimeSteps==0){ | |||||
data->flamePosition[0]=0.0e0; | |||||
data->flamePosition[1]=0.0e0; | |||||
data->flameTime[0]=tNow; | |||||
data->flameTime[1]=tNow; | |||||
} | |||||
ier = IDAGetNumErrTestFails(mem, &netf); | |||||
ier = IDAGetNumNonlinSolvConvFails(mem, &ncfn); | |||||
ier = IDADlsGetNumJacEvals(mem, &njevals); | |||||
ier = IDADlsGetNumResEvals(mem, &nrevals); | |||||
printf("etf = %ld ," | |||||
"nlsf= %ld ," | |||||
"J=%ld ," | |||||
"R=%ld ," | |||||
"o=%d ,",netf, ncfn, njevals, nrevals, kcur); | |||||
printf("Time=%15.6e s,",tNow); | |||||
printf("dt=%15.6e s,",dt); | |||||
printf("frac: %15.6e\n",dxRatio); | |||||
count++; | |||||
data->nTimeSteps=count; | |||||
} | |||||
} | |||||
SUNLinSolFree(LS); | |||||
SUNMatDestroy(A); | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(0); | |||||
} | |||||
void freeAtLast(void* mem, | |||||
N_Vector *y, | |||||
N_Vector *ydot, | |||||
N_Vector *res, | |||||
N_Vector *id, | |||||
N_Vector *atolv, | |||||
N_Vector *constraints,UserData data){ | |||||
IDAFree(&mem); | |||||
freeSolution(y,ydot,res,id,atolv,constraints); | |||||
freeUserData(data); | |||||
} | |||||
static int check_flag(void *flagvalue, const char *funcname, int opt) | |||||
{ | |||||
int *errflag; | |||||
/* Check if SUNDIALS function returned NULL pointer - no memory allocated */ | |||||
if (opt == 0 && flagvalue == NULL) { | |||||
fprintf(stderr, | |||||
"\nSUNDIALS_ERROR: %s() failed - returned NULL pointer\n\n", | |||||
funcname); | |||||
return(1); | |||||
} | |||||
/* Check if flag < 0 */ | |||||
else if (opt == 1) { | |||||
errflag = (int *) flagvalue; | |||||
if (*errflag < 0) { | |||||
fprintf(stderr, | |||||
"\nSUNDIALS_ERROR: %s() failed with flag = %d\n\n", | |||||
funcname, *errflag); | |||||
return(1); | |||||
} | |||||
} | |||||
/* Check if function returned NULL pointer - no memory allocated */ | |||||
else if (opt == 2 && flagvalue == NULL) { | |||||
fprintf(stderr, | |||||
"\nMEMORY_ERROR: %s() failed - returned NULL pointer\n\n", | |||||
funcname); | |||||
return(1); | |||||
} | |||||
return(0); | |||||
} |
@@ -1,77 +0,0 @@ | |||||
main.o: main.cpp UserData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/IdealGasMix.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/IdealGasPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/ThermoPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Phase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ctexceptions.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/fmt.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ct_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/config.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/core.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format-inl.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/printf.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/ostream.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/ostream.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Elements.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ct_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Species.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/AnyMap.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/global.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/AnyMap.inl.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ValueCache.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/MultiSpeciesThermo.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/SpeciesThermoInterpType.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/speciesThermoTypes.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/GasKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/BulkKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Kinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/ThermoPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/StoichManager.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/stringUtils.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Reaction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/utilities.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/global.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RxnRates.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/reaction_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Falloff.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RateCoeffMgr.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RxnRates.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/ThirdBodyCalc.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/FalloffMgr.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/reaction_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/FalloffFactory.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/FactoryBase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Reaction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/importKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/stringUtils.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportFactory.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportBase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTransportParams.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportParams.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/numerics/DenseMatrix.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/Array.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/utilities.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTranInteraction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTransportData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LTPspecies.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/xml.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ctexceptions.h \ | |||||
gridRoutines.h parse.h parse.hpp solution.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_types.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_config.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/nvector/nvector_openmp.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_nvector.h \ | |||||
residue.h macros.h timing.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/ida/ida.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/ida/ida_direct.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_direct.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_matrix.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_linearsolver.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_iterative.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sunmatrix/sunmatrix_band.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sunlinsol/sunlinsol_lapackband.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_lapack.h |
@@ -1,79 +0,0 @@ | |||||
#include "parse.h" | |||||
void getFromString (const char* buf, int* n){ | |||||
*n=atoi(buf); | |||||
printf("%d\n",*n); | |||||
} | |||||
void getFromString (const char* buf, size_t* n){ | |||||
*n=(size_t)(atoi(buf)); | |||||
printf("%lu\n",*n); | |||||
} | |||||
void getFromString (const char* buf, double* n){ | |||||
*n=(double)(atof(buf)); | |||||
printf("%15.6e\n",*n); | |||||
} | |||||
void getFromString (const char* buf, char* n){ | |||||
sscanf(buf,"%s",n); | |||||
printf("%s\n",n); | |||||
} | |||||
/*Extract droplet species and mole fractions*/ | |||||
int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMole[],const size_t bufLen){ | |||||
char buf[bufLen]; | |||||
char buf1[bufLen]; | |||||
char comment[1]; | |||||
char *ret; | |||||
while (fgets(buf,bufLen, input)!=NULL){ | |||||
comment[0]=buf[0]; | |||||
if(strncmp(comment,"#",1)==0){ | |||||
} | |||||
else{ | |||||
strcpy(buf1,buf); | |||||
ret=strtok(buf,"="); | |||||
//DEBUG | |||||
//printf("Current KEYWORD in input: %20s \n",ret); | |||||
if(strcmp(ret,keyword)==0){ | |||||
char* modifiedFuel = NULL; | |||||
char* equalSign = strstr(buf1,"="); | |||||
if(equalSign!= NULL){ | |||||
modifiedFuel = new char [strlen(equalSign)+1]; | |||||
strcpy(modifiedFuel,equalSign+1); | |||||
//DEBUG | |||||
//printf("modifiedFuel:%20s \n",modifiedFuel); | |||||
char* token = strtok(modifiedFuel,","); | |||||
int index = 0 ; | |||||
char* list[2]; | |||||
while(token!= NULL){ | |||||
//DEBUG | |||||
//printf("TOKEN :%20s \n",token); | |||||
list[index] = token; | |||||
token = strtok(NULL,","); | |||||
index++; | |||||
} | |||||
//for (int i=0;i<2;i++){ | |||||
// printf("%20s",list[i]); | |||||
//} | |||||
for(int i=0;i<2;i++){ | |||||
char* name= strtok(list[i],":"); | |||||
char* value = strtok(NULL,":"); | |||||
//DEBUG | |||||
// printf("Name:%10s,Value:%10s \n",name,value); | |||||
strcpy(dropSpec[i],name); | |||||
dropMole[i]=std::stod(value); | |||||
// printf("In the dropArray,Name:%10s,Value:%.3f\n",dropSpec[i],dropMole[i]); | |||||
} | |||||
delete[] modifiedFuel; | |||||
} | |||||
printf("%10s:%10s:%.3f,%10s:%.3f\n",keyword,dropSpec[0],dropMole[0],dropSpec[1],dropMole[1]); | |||||
//printf("IF statement is execuated. \n"); | |||||
rewind(input); | |||||
//delete[] modifiedFuel; | |||||
return(0); | |||||
} | |||||
} | |||||
} | |||||
rewind(input); | |||||
return(-1); | |||||
} |
@@ -1 +0,0 @@ | |||||
parse.o: parse.cpp parse.h parse.hpp |
@@ -1,36 +0,0 @@ | |||||
#ifndef PRINT_DEF | |||||
#define PRINT_DEF | |||||
#include <string.h> //for strings | |||||
#include <stdio.h> //for printf,scanf | |||||
#include <stdlib.h> //for atoi, atof | |||||
#include <string> | |||||
#include <cstring> | |||||
#include <iostream> | |||||
#include <stdexcept> | |||||
#endif | |||||
#ifndef PARSE_DEF | |||||
#define PARSE_DEF | |||||
#define MAXBUFLEN 200 | |||||
void getFromString (const char* buf, int* n); | |||||
void getFromString (const char* buf, size_t* n); | |||||
void getFromString (const char* buf, double* n); | |||||
void getFromString (const char* buf, char* n); | |||||
int parseString(FILE* input, const char* keyword, const size_t bufLen, char* n); | |||||
template<typename T> | |||||
int parseNumber(FILE* input, const char* keyword, const size_t bufLen, T* n); | |||||
template<typename T> | |||||
int parseArray(FILE* input, const char* keyword, const size_t bufLen, | |||||
const size_t arrLen, T y[]); | |||||
int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMole[],const size_t bufLen); | |||||
#include "parse.hpp" | |||||
#endif | |||||
@@ -1,75 +0,0 @@ | |||||
template<typename T> | |||||
int parseNumber(FILE* input, const char* keyword, const size_t bufLen, T* n){ | |||||
char buf[bufLen]; | |||||
char buf1[bufLen]; | |||||
char comment[1]; | |||||
char *ret; | |||||
while (fgets(buf,bufLen, input)!=NULL){ | |||||
comment[0]=buf[0]; | |||||
if(strncmp(comment,"#",1)==0){ | |||||
//printf("Comment!:%s\n",buf); | |||||
} | |||||
else{ | |||||
ret=strtok(buf,"="); | |||||
if(strcmp(ret,keyword)==0){ | |||||
/*offset buf by keyword size + 1 for the "="*/ | |||||
strncpy (buf1, buf+strlen(keyword)+1, bufLen); | |||||
printf("%30s: ",keyword); | |||||
getFromString(buf1,n); | |||||
rewind(input); | |||||
return(0); | |||||
} | |||||
} | |||||
} | |||||
rewind(input); | |||||
return(-1); | |||||
} | |||||
template<typename T> | |||||
int parseArray(FILE* input, const char* keyword, const size_t bufLen, | |||||
const size_t arrLen, T y[]){ | |||||
char buf[bufLen]; | |||||
char buf1[bufLen]; | |||||
char comment[1]; | |||||
char *ret; | |||||
while (fgets(buf,bufLen, input)!=NULL){ | |||||
comment[0]=buf[0]; | |||||
if(strncmp(comment,"#",1)==0){ | |||||
//printf("Comment!:%s\n",buf); | |||||
} | |||||
else{ | |||||
ret=strtok(buf,"="); | |||||
if(strcmp(ret,keyword)==0){ | |||||
/*offset buf by keyword size + 1 for the "="*/ | |||||
strncpy (buf1, buf+strlen(keyword)+1, bufLen); | |||||
printf("%30s:\n",keyword); | |||||
ret=strtok(buf1,","); | |||||
size_t j=0; | |||||
while(ret!=NULL){ | |||||
if(j<arrLen){ | |||||
//y[j]=atof(ret); | |||||
getFromString(ret,&y[j]); | |||||
} | |||||
ret=strtok(NULL,","); | |||||
j++; | |||||
} | |||||
rewind(input); | |||||
if(j!=arrLen){ | |||||
printf("Check no: of values entered for %s\n",keyword); | |||||
printf("%lu values required!\n",arrLen); | |||||
return(-1); | |||||
} | |||||
else{ | |||||
return(0); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
rewind(input); | |||||
return(-1); | |||||
} |
@@ -1,67 +0,0 @@ | |||||
residue.o: residue.cpp residue.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_types.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_config.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/nvector/nvector_openmp.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_nvector.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/IdealGasMix.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/IdealGasPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/ThermoPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Phase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ctexceptions.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/fmt.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ct_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/config.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/core.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format-inl.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/format.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/printf.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/ostream.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/ext/fmt/ostream.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Elements.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ct_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/Species.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/AnyMap.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/global.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/AnyMap.inl.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ValueCache.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/MultiSpeciesThermo.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/SpeciesThermoInterpType.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/speciesThermoTypes.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/GasKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/BulkKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Kinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/thermo/ThermoPhase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/StoichManager.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/stringUtils.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Reaction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/utilities.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/global.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RxnRates.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/reaction_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Falloff.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RateCoeffMgr.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/RxnRates.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/ThirdBodyCalc.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/FalloffMgr.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/reaction_defs.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/FalloffFactory.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/FactoryBase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/Reaction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/kinetics/importKinetics.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/stringUtils.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportFactory.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportBase.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTransportParams.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportParams.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/numerics/DenseMatrix.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/Array.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/utilities.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTranInteraction.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LiquidTransportData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/LTPspecies.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/transport/TransportData.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/xml.h \ | |||||
/opt/scientific/cantera-2.4_gnu_blas/include/cantera/base/ctexceptions.h \ | |||||
UserData.h gridRoutines.h parse.h parse.hpp macros.h timing.hpp |
@@ -1,116 +0,0 @@ | |||||
#ifndef SUNDIALS_DEF | |||||
#define SUNDIALS_DEF | |||||
#include <sundials/sundials_types.h> | |||||
#include <nvector/nvector_openmp.h> | |||||
#endif | |||||
#ifndef PRINT_DEF | |||||
#define PRINT_DEF | |||||
#include <string.h> //for strings | |||||
#include <string> | |||||
#include <cstring> | |||||
#include <stdio.h> //for printf,scanf | |||||
#include <stdlib.h> //for atoi, atof | |||||
#endif | |||||
#ifndef CANTERA_DEF | |||||
#define CANTERA_DEF | |||||
#include <cantera/IdealGasMix.h> | |||||
#include <cantera/transport.h> | |||||
#endif | |||||
#include "UserData.h" | |||||
void REGRID(double* ydata,double* ydotdata,UserData data); | |||||
void INTERPO(double* y,double* ydot,const size_t nvar,size_t nPts,const double XNEW[], const double XOLD[]); | |||||
double maxTemperaturePosition(const double* y,const size_t nt,const size_t nvar,const double* x ,size_t nPts); | |||||
double maxTemperature(const double* y,const size_t nt, const size_t nvar, size_t nPts); | |||||
int maxTemperatureIndex(const double* y,const size_t nt,const size_t nvar ,size_t nPts); | |||||
double maxCurvPositionR(const double* y, const size_t nt, | |||||
const size_t nvar, const size_t nr, size_t nPts); | |||||
int maxCurvIndexR(const double* y, const size_t nt, | |||||
const size_t nvar, const size_t nr, size_t nPts); | |||||
double maxGradPosition(const double* y, const size_t nt, | |||||
const size_t nvar, const double* x, size_t nPts); | |||||
int maxGradIndex(const double* y, const size_t nt, | |||||
const size_t nvar, const double* x, size_t nPts); | |||||
double maxCurvPosition(const double* y, const size_t nt, | |||||
const size_t nvar, const double* x, size_t nPts); | |||||
int maxCurvIndex(const double* y, const size_t nt, | |||||
const size_t nvar, const double* x, size_t nPts); | |||||
double isothermPosition(const double* y, const double T, const size_t nt, | |||||
const size_t nvar, const double* x, const size_t nPts); | |||||
int setAlgebraicVariables(N_Vector *id,UserData data); | |||||
inline double calc_area(double x,int* i); | |||||
void updateSolution(double* y, double* ydot, const size_t nvar, | |||||
const double xOld[],const double xNew[],const size_t npts); | |||||
void readInitialCondition(FILE* input, double* ydata, const size_t nvar, const size_t nr, const size_t nPts); | |||||
double systemMass(double* ydata, UserData data); | |||||
int initializePsiGrid(double* ydata, double* psidata, UserData data); | |||||
int setInitialCondition(N_Vector* y, | |||||
N_Vector* ydot, | |||||
UserData data); | |||||
inline void setGas(UserData data, double *ydata, size_t gridPoint); | |||||
void getTransport(UserData data, | |||||
double *ydata, | |||||
size_t gridPoint, | |||||
double *rho, | |||||
double *lambda, | |||||
double *YV); | |||||
int residue(double t, | |||||
N_Vector y, | |||||
N_Vector ydot, | |||||
N_Vector res, | |||||
void *user_data); | |||||
void trackFlameOH(N_Vector y,UserData data); | |||||
void trackFlame(N_Vector y,UserData data); | |||||
size_t BathGasIndex(UserData data); | |||||
size_t oxidizerIndex(UserData data); | |||||
inline double Qdot(double* t, | |||||
double* x, | |||||
double* ignTime, | |||||
double* kernelSize, | |||||
double* maxQdot); | |||||
void printSpaceTimeHeader(UserData data); | |||||
void printSpaceTimeOutput(double t, N_Vector* y, FILE* output, UserData data); | |||||
void printSpaceTimeRates(double t, N_Vector ydot, UserData data); | |||||
void printGlobalHeader(UserData data); | |||||
void printGlobalVariables(double t, N_Vector* y, N_Vector* ydot, UserData data); | |||||
void printSpaceTimeOutputInterpolated(double t, N_Vector y, UserData data); | |||||
void writeRestart(double t, N_Vector* y, N_Vector* ydot, FILE* output, UserData data); | |||||
void readRestart(N_Vector* y, N_Vector* ydot, FILE* input, UserData data); | |||||
void getTimescale(UserData data, N_Vector* y); | |||||
void printTimescaleHeader(UserData data); | |||||
void printTimescaleOutput(double t,N_Vector* y,FILE* output,UserData data); | |||||
void floorSmallValue(UserData data, N_Vector* y); | |||||
void resetTolerance(UserData data, N_Vector* y,N_Vector* atolv); | |||||
void getReactions(UserData data,N_Vector* y,FILE* output); | |||||
void getSpecies(UserData data,N_Vector* y,FILE* output); |
@@ -1,90 +0,0 @@ | |||||
#include "solution.h" | |||||
int allocateSolution(size_t neq, | |||||
int nThreads, | |||||
N_Vector *y, | |||||
N_Vector *ydot, | |||||
N_Vector *res, | |||||
N_Vector *id, | |||||
N_Vector *atolv, | |||||
N_Vector *constraints){ | |||||
*y = N_VNew_OpenMP(neq,nThreads); | |||||
if(*y==NULL){ | |||||
printf("Allocation Failed!\n"); | |||||
return(1); | |||||
} | |||||
N_VConst((realtype)(0.0e0), *y); | |||||
*ydot = N_VNew_OpenMP(neq,nThreads); | |||||
if(*ydot==NULL){ | |||||
printf("Allocation Failed!\n"); | |||||
return(1); | |||||
} | |||||
N_VConst((realtype)(0.0e0), *ydot); | |||||
*res = N_VNew_OpenMP(neq,nThreads); | |||||
if(*res==NULL){ | |||||
printf("Allocation Failed!\n"); | |||||
return(1); | |||||
} | |||||
N_VConst((realtype)(0.0e0), *res); | |||||
*id = N_VNew_OpenMP(neq,nThreads); | |||||
if(*id==NULL){ | |||||
printf("Allocation Failed!\n"); | |||||
return(1); | |||||
} | |||||
N_VConst((realtype)(1.0e0), *id); | |||||
*atolv = N_VNew_OpenMP(neq,nThreads); | |||||
if(*atolv==NULL){ | |||||
printf("Allocation Failed!\n"); | |||||
return(1); | |||||
} | |||||
N_VConst((realtype)(0.0e0), *atolv); | |||||
*constraints = N_VNew_OpenMP(neq,nThreads); | |||||
if(*constraints==NULL){ | |||||
printf("Allocation Failed!\n"); | |||||
return(1); | |||||
} | |||||
N_VConst((realtype)(0.0e0), *constraints); | |||||
return(0); | |||||
} | |||||
void freeSolution(N_Vector *y, | |||||
N_Vector *ydot, | |||||
N_Vector *res, | |||||
N_Vector *id, | |||||
N_Vector *atolv, | |||||
N_Vector *constraints){ | |||||
if(*y!=NULL){ | |||||
N_VDestroy_OpenMP(*y); | |||||
printf("y Destroyed!\n"); | |||||
} | |||||
if(*ydot!=NULL){ | |||||
N_VDestroy_OpenMP(*ydot); | |||||
printf("ydot Destroyed!\n"); | |||||
} | |||||
if(*res!=NULL){ | |||||
N_VDestroy_OpenMP(*res); | |||||
printf("res Destroyed!\n"); | |||||
} | |||||
if(*id!=NULL){ | |||||
N_VDestroy_OpenMP(*id); | |||||
printf("id Destroyed!\n"); | |||||
} | |||||
if(*atolv!=NULL){ | |||||
N_VDestroy_OpenMP(*atolv); | |||||
printf("atolv Destroyed!\n"); | |||||
} | |||||
if(*constraints!=NULL){ | |||||
N_VDestroy_OpenMP(*constraints); | |||||
printf("constraints Destroyed!\n"); | |||||
} | |||||
printf("\n\n"); | |||||
} |
@@ -1,5 +0,0 @@ | |||||
solution.o: solution.cpp solution.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_types.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_config.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/nvector/nvector_openmp.h \ | |||||
/opt/scientific/sundials-3.1.1_intel_mkl/include/sundials/sundials_nvector.h |
@@ -1,15 +0,0 @@ | |||||
#ifndef PRINT_DEF | |||||
#define PRINT_DEF | |||||
#include <string.h> //for strings | |||||
#include <stdio.h> //for printf,scanf | |||||
#include <stdlib.h> //for atoi, atof | |||||
#endif | |||||
#ifndef SUNDIALS_DEF | |||||
#define SUNDIALS_DEF | |||||
#include <sundials/sundials_types.h> | |||||
#include <nvector/nvector_openmp.h> | |||||
#endif | |||||
int allocateSolution(size_t neq, int nThreads, N_Vector *y, N_Vector *ydot, N_Vector *res, N_Vector *id, N_Vector *atolv, N_Vector *constraints); | |||||
void freeSolution(N_Vector *y, N_Vector *ydot, N_Vector *res, N_Vector *id, N_Vector *atolv, N_Vector *constraints); |
@@ -2,7 +2,18 @@ | |||||
#include "parse.h" | #include "parse.h" | ||||
void freeUserData(UserData data){ | void freeUserData(UserData data){ | ||||
if(data!=NULL){ | if(data!=NULL){ | ||||
/*destructor for C++ vector*/ | |||||
using Td = std::vector<double>; | |||||
using Ts = std::vector<std::string>; | |||||
using Tt = std::vector<size_t>; | |||||
data->dropMole.~Td(); | |||||
data->dropSpec.~Ts(); | |||||
data->gamma.~Td(); | |||||
data->MW.~Td(); | |||||
data->k_drop.~Tt(); | |||||
if(data->trmix!=NULL){ | if(data->trmix!=NULL){ | ||||
delete data->trmix; | delete data->trmix; | ||||
printf("Transport Deleted!\n"); | printf("Transport Deleted!\n"); | ||||
@@ -53,10 +64,10 @@ void freeUserData(UserData data){ | |||||
fclose(data->globalOutput); | fclose(data->globalOutput); | ||||
printf("Global Output File Cleared from Memory!\n"); | printf("Global Output File Cleared from Memory!\n"); | ||||
} | } | ||||
if(data->timescaleOutput!=NULL){ | |||||
fclose(data->timescaleOutput); | |||||
printf("Characteristic Timescale Output File Cleared from Memory!\n"); | |||||
} | |||||
// if(data->timescaleOutput!=NULL){ | |||||
// fclose(data->timescaleOutput); | |||||
// printf("Characteristic Timescale Output File Cleared from Memory!\n"); | |||||
// } | |||||
//if(data->rxnROPOutput!=NULL){ | //if(data->rxnROPOutput!=NULL){ | ||||
// fclose(data->rxnROPOutput); | // fclose(data->rxnROPOutput); | ||||
// printf("Reactions Rate of Progress Output File Cleared from Memory!\n"); | // printf("Reactions Rate of Progress Output File Cleared from Memory!\n"); | ||||
@@ -74,6 +85,11 @@ UserData allocateUserData(FILE *input){ | |||||
UserData data; | UserData data; | ||||
data = (UserData) malloc(sizeof *data); | data = (UserData) malloc(sizeof *data); | ||||
new(&(data->dropMole)) std::vector<double>; | |||||
new(&(data->dropSpec)) std::vector<std::string>; | |||||
new(&(data->gamma)) std::vector<double>; | |||||
new(&(data->MW)) std::vector<double>; | |||||
new(&(data->k_drop)) std::vector<size_t>; | |||||
if(!data){ | if(!data){ | ||||
printf("Allocation Failed!\n"); | printf("Allocation Failed!\n"); | ||||
@@ -83,9 +99,14 @@ UserData allocateUserData(FILE *input){ | |||||
int ier; | int ier; | ||||
ier=parseNumber<size_t>(input, "basePts" , MAXBUFLEN, &data->npts); | |||||
if(ier==-1 || data->npts<=0){ | |||||
printf("Enter non-zero basePts!\n"); | |||||
ier=parseNumber<size_t>(input, "liquidBasePts" , MAXBUFLEN, &data->l_npts); | |||||
if(ier==-1 || data->l_npts<=0){ | |||||
printf("Enter non-zero liquidbasePts!\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<size_t>(input, "gasBasePts" , MAXBUFLEN, &data->g_npts); | |||||
if(ier==-1 || data->g_npts<=0){ | |||||
printf("Enter non-zero gasBasePts!\n"); | |||||
return(NULL); | return(NULL); | ||||
} | } | ||||
@@ -120,16 +141,16 @@ UserData allocateUserData(FILE *input){ | |||||
return(NULL); | return(NULL); | ||||
} | } | ||||
ier=parseNumber<int>(input,"dropType",MAXBUFLEN,&data->dropType); | |||||
ier=parseNumber<int>(input,"dropletType",MAXBUFLEN,&data->dropType); | |||||
if(ier==-1 || (data->dropType!=0 | if(ier==-1 || (data->dropType!=0 | ||||
&& data->dropType!=1)){ | && data->dropType!=1)){ | ||||
printf("include valid dropletType!\n"); | printf("include valid dropletType!\n"); | ||||
printf("0: single component droplet\n"); | printf("0: single component droplet\n"); | ||||
printf("1: multi-component droplet\n"); | |||||
printf("1: bi-component droplet\n"); | |||||
return(NULL); | return(NULL); | ||||
} | } | ||||
ier=parseDropSpec<double>(input,"dropletMole",MAXBUFLEN,&data->dropType,dropMole); | |||||
ier=parseDropSpec<double>(input,"dropletMole",MAXBUFLEN,&data->dropType,data->dropMole); | |||||
if(ier== -1){ | if(ier== -1){ | ||||
printf("include correct format for droplet mole fraction!\n"); | printf("include correct format for droplet mole fraction!\n"); | ||||
printf("single composition droplet: dropletMole:1.00\n"); | printf("single composition droplet: dropletMole:1.00\n"); | ||||
@@ -137,7 +158,7 @@ UserData allocateUserData(FILE *input){ | |||||
return(NULL); | return(NULL); | ||||
} | } | ||||
ier=parseDropSpec<std::string>(input,"dropletComposition",MAXBUFLEN,&data->dropType,dropSpec); | |||||
ier=parseDropSpec<std::string>(input,"dropletComposition",MAXBUFLEN,&data->dropType,data->dropSpec); | |||||
if(ier== -1){ | if(ier== -1){ | ||||
printf("include correct format for droplet composition!\n"); | printf("include correct format for droplet composition!\n"); | ||||
printf("single composition droplet: dropletComposition:n-heptane\n"); | printf("single composition droplet: dropletComposition:n-heptane\n"); | ||||
@@ -146,14 +167,14 @@ UserData allocateUserData(FILE *input){ | |||||
} | } | ||||
//ier=parseNumber<int>(input, "quasiSteady" , MAXBUFLEN, &data->quasiSteady); | |||||
//if(ier==-1 || (data->quasiSteady!=0 | |||||
// && data->quasiSteady!=1)){ | |||||
// printf("include valid quasiSteady!\n"); | |||||
// printf("0: The droplet surface recedes and the droplet losses mass\n"); | |||||
// printf("1: The droplet surface does not move and the droplet mass is constant\n"); | |||||
// return(NULL); | |||||
//} | |||||
ier=parseNumber<int>(input, "quasiSteady" , MAXBUFLEN, &data->quasiSteady); | |||||
if(ier==-1 || (data->quasiSteady!=0 | |||||
&& data->quasiSteady!=1)){ | |||||
printf("include valid quasiSteady!\n"); | |||||
printf("0: The droplet surface recedes and the droplet losses mass\n"); | |||||
printf("1: The droplet surface does not move and the droplet mass is constant\n"); | |||||
return(NULL); | |||||
} | |||||
ier=parseNumber<double>(input, "dPdt", MAXBUFLEN, &data->dPdt); | ier=parseNumber<double>(input, "dPdt", MAXBUFLEN, &data->dPdt); | ||||
@@ -340,6 +361,13 @@ UserData allocateUserData(FILE *input){ | |||||
} | } | ||||
} | } | ||||
// /*No. of liquid phase species is determined by droplet type, either 1 or 2*/ | |||||
// if(data->dropType==0){ | |||||
// data->l_nsp=1; | |||||
// }else{ | |||||
// data->l_nsp=2; | |||||
// } | |||||
ier=parseNumber<char>(input, "transportModel", MAXBUFLEN, tran); | ier=parseNumber<char>(input, "transportModel", MAXBUFLEN, tran); | ||||
if(ier==-1){ | if(ier==-1){ | ||||
printf("Enter transportModel!\n"); | printf("Enter transportModel!\n"); | ||||
@@ -371,7 +399,7 @@ UserData allocateUserData(FILE *input){ | |||||
} | } | ||||
} | } | ||||
} | } | ||||
//ier=parseNumber<char>(input, "dropletComposition", MAXBUFLEN, data->dropSpec); | //ier=parseNumber<char>(input, "dropletComposition", MAXBUFLEN, data->dropSpec); | ||||
//if(ier==-1){ | //if(ier==-1){ | ||||
// printf("Enter composition of droplet!\n"); | // printf("Enter composition of droplet!\n"); | ||||
@@ -390,43 +418,62 @@ UserData allocateUserData(FILE *input){ | |||||
ier=parseNumber<double>(input, "PCAD", MAXBUFLEN, &data->PCAD); | ier=parseNumber<double>(input, "PCAD", MAXBUFLEN, &data->PCAD); | ||||
if(ier==-1){ | |||||
printf("Enter PCAD value!\n"); | |||||
return(NULL); | |||||
} | |||||
// if(ier==-1){ | |||||
// printf("Enter PCAD value!\n"); | |||||
// return(NULL); | |||||
// } | |||||
ier=parseNumber<double>(input,"RGTC", MAXBUFLEN, &data->RGTC); | ier=parseNumber<double>(input,"RGTC", MAXBUFLEN, &data->RGTC); | ||||
if(ier==-1){ | |||||
printf("Enter PGTC value!\n"); | |||||
return(NULL); | |||||
} | |||||
// if(ier==-1){ | |||||
// printf("Enter PGTC value!\n"); | |||||
// return(NULL); | |||||
// } | |||||
ier=parseNumber<int>(input,"JJRG", MAXBUFLEN, &data->JJRG); | ier=parseNumber<int>(input,"JJRG", MAXBUFLEN, &data->JJRG); | ||||
if(ier==-1){ | |||||
printf("Enter JJRG value!\n"); | |||||
return(NULL); | |||||
} | |||||
// if(ier==-1){ | |||||
// printf("Enter JJRG value!\n"); | |||||
// return(NULL); | |||||
// } | |||||
ier=parseNumber<double>(input,"deltaT", MAXBUFLEN, &data->deltaT); | ier=parseNumber<double>(input,"deltaT", MAXBUFLEN, &data->deltaT); | ||||
if(ier==-1){ | |||||
printf("Enter deltaT value!\n"); | |||||
return(NULL); | |||||
} | |||||
// if(ier==-1){ | |||||
// printf("Enter deltaT value!\n"); | |||||
// return(NULL); | |||||
// } | |||||
data->nr=0; | data->nr=0; | ||||
//data->np=data->nr+1; | //data->np=data->nr+1; | ||||
data->nt=data->nr+1; | data->nt=data->nr+1; | ||||
data->ny=data->nt+1; | data->ny=data->nt+1; | ||||
data->np=data->ny+data->nsp; | data->np=data->ny+data->nsp; | ||||
data->nm=data->np+1; | |||||
data->nm=data->np+1; | |||||
data->nvar=data->nsp+4; //assign no: of variables (R,T,P,Mdot,nsp species) | data->nvar=data->nsp+4; //assign no: of variables (R,T,P,Mdot,nsp species) | ||||
double MW[2]; | |||||
for(int i=0;i<=1;i++){ | |||||
int speciesIndex = data->gas->speciesIndex(data->dropSpec[i]); | |||||
double weight = data->gas->molecularWeight(speciesIndex); | |||||
MW[i]= weight; | |||||
// data->l_nr=0; | |||||
// data->np=data->nr+1; | |||||
// data->l_nt=data->l_nr+1; | |||||
// data->l_ny=data->l_nt+1; | |||||
// data->l_np=data->l_ny+data->l_nsp; //l_nsp is either 1 or 2 | |||||
// data->l_nm=data->l_np+1; | |||||
// data->l_nvar=data->l_nsp+4; | |||||
data->npts = data->l_npts+data->g_npts; | |||||
//std::vector<double> MW(data->dropMole.size()); | |||||
for(size_t ii=0;ii< data->dropMole.size();ii++){ | |||||
// printf("Print inside the loop.\n" ) ; | |||||
// printf("Print dropSpec component :%s! \n",data->dropSpec[0].c_str()); | |||||
// size_t index = 0; | |||||
for(size_t k = 1; k <= data->nsp; k++) { | |||||
printf("spcies name :%s! \t",data->gas->speciesName(k-1).c_str()); | |||||
if(data->gas->speciesName(k - 1)==data->dropSpec[ii] ) { | |||||
// index = k; | |||||
double weight = data->gas->molecularWeight(k-1); | |||||
printf("Molecular weight is: %.3f. \n",weight) ; | |||||
data->MW.push_back(weight); | |||||
} | |||||
} | |||||
} | |||||
// printf("MW array size: %zu\n",data->MW.size()); | |||||
for(auto & arg :data->MW){ | |||||
printf("Molecular weight : %.3f. \n",arg) ; | |||||
} | } | ||||
// double massSum = 0.0; | // double massSum = 0.0; | ||||
// for(int i=0;i<=1;i++){ | // for(int i=0;i<=1;i++){ | ||||
// massSum = massSum + data->dropMole[i] * MW[i]; | // massSum = massSum + data->dropMole[i] * MW[i]; | ||||
@@ -437,19 +484,29 @@ UserData allocateUserData(FILE *input){ | |||||
// data->dropRho = data->dropRho + data->dropMassFrac[i]*data->dropDens[i]; | // data->dropRho = data->dropRho + data->dropMassFrac[i]*data->dropDens[i]; | ||||
// } | // } | ||||
printf("Density of droplet is: %.3f [kg/m^3]\n",data->dropRho); | |||||
//Mass of droplet | |||||
// printf("Density of droplet is: %.3f [kg/m^3]\n",data->dropRho); | |||||
// Mass of droplet | |||||
//data->massDrop=1.0/3.0*pow(data->Rd,3)*997.0; //TODO: The density of the droplet should be a user input | //data->massDrop=1.0/3.0*pow(data->Rd,3)*997.0; //TODO: The density of the droplet should be a user input | ||||
//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 | //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 | ||||
data->massDrop=1.0/3.0*pow(data->Rd,3)*data->dropRho; | |||||
// data->massDrop=1.0/3.0*pow(data->Rd,3)*data->dropRho; | |||||
/* Update the gamma using UNIFAC method for propane and n-heptane */ | /* Update the gamma using UNIFAC method for propane and n-heptane */ | ||||
getGamma(data->dropMole,data->gamma) ; | |||||
printf("Gamma of Propane and n-heptane are %.3f and %.3f .\n",data->gamma[0],data->gamma[1]) ; | |||||
/*Note: gamma only need to be calculated when droplet type = 1, i.e. bi-component*/ | |||||
getGamma(data->dropMole,data->gamma); | |||||
// printf("Gamma of Propane and n-heptane are %.3f and %.3f .\n",data->gamma[0],data->gamma[1]) ; | |||||
if(data->dropType == 0){ | |||||
printf("Single component droplet problem, activity coeffcient is 1. \n"); | |||||
}else{ | |||||
for(auto & arg : data->gamma) { | |||||
printf("Initial activity coeffcient %.3f .\n",arg); | |||||
} | |||||
} | |||||
if(!data->adaptiveGrid){ | if(!data->adaptiveGrid){ | ||||
data->uniformGrid = new double [data->npts]; | data->uniformGrid = new double [data->npts]; | ||||
data->neq=data->nvar*data->npts; | |||||
// data->g_neq=data->g_nvar*data->g_npts; | |||||
// data->l_neq=data->l_nvar*data->l_npts; | |||||
data->neq=data->npts*data->nvar; | |||||
} | } | ||||
else{ | else{ | ||||
data->grid=(UserGrid) malloc(sizeof *data->grid); | data->grid=(UserGrid) malloc(sizeof *data->grid); | ||||
@@ -469,9 +526,9 @@ UserData allocateUserData(FILE *input){ | |||||
data->output=fopen("output.dat","w"); | data->output=fopen("output.dat","w"); | ||||
data->globalOutput=fopen("globalOutput.dat","w"); | data->globalOutput=fopen("globalOutput.dat","w"); | ||||
data->gridOutput=fopen("grid.dat","w"); | data->gridOutput=fopen("grid.dat","w"); | ||||
data->timescaleOutput=fopen("timeScale.dat","w") ; | |||||
data->rxnROPOutput=fopen("rxnROP.dat","w"); | |||||
data->spROPOutput=fopen("spROP.dat","w"); | |||||
// data->timescaleOutput=fopen("timeScale.dat","w") ; | |||||
// data->rxnROPOutput=fopen("rxnROP.dat","w"); | |||||
// data->spROPOutput=fopen("spROP.dat","w"); | |||||
//data->ratesOutput=fopen("rates.dat","w"); | //data->ratesOutput=fopen("rates.dat","w"); | ||||
data->innerMassFractions = new double [data->nsp]; | data->innerMassFractions = new double [data->nsp]; | ||||
@@ -518,6 +575,7 @@ void setSaneDefaults(UserData data){ | |||||
data->pressureTolerance=1e-06; | data->pressureTolerance=1e-06; | ||||
data->massFractionTolerance=1e-09; | data->massFractionTolerance=1e-09; | ||||
data->bathGasTolerance=1e-06; | data->bathGasTolerance=1e-06; | ||||
data->MdotTolerance=1e-09; | |||||
data->finalTime=1e-02; | data->finalTime=1e-02; | ||||
data->tNow=0.0e0; | data->tNow=0.0e0; | ||||
data->setConstraints=0; | data->setConstraints=0; | ||||
@@ -571,5 +629,46 @@ void getGamma(const double mole[],double gamma[]){ | |||||
for(int i=0; i<v_.size(); i++){ | for(int i=0; i<v_.size(); i++){ | ||||
gamma[i] = gammaC_[i] ; | gamma[i] = gammaC_[i] ; | ||||
} | } | ||||
} | |||||
void getGamma(const std::vector<double>& mole,std::vector<double>& gamma){ | |||||
size_t sz = mole.size(); | |||||
if (sz == 1){ | |||||
gamma.push_back(1); | |||||
}else{ | |||||
gamma.reserve(mole.size()); | |||||
/* define relevant matrix */ | |||||
Eigen::Matrix2d nu_ ; | |||||
nu_ << 2,1,2,5; | |||||
/* define relevant vectors */ | |||||
Eigen::Vector2d R_(0.9011,0.6744),Q_(0.8480,0.5400); | |||||
Eigen::Vector2d r_,q_,x_,l_,ones_(1.0,1.0),v_,ksi_,gammaC_; | |||||
double sum_q, sum_r,sum_l; | |||||
r_ = nu_ * R_ ; | |||||
q_ = nu_ * Q_ ; | |||||
x_ << mole[0], mole[1] ; | |||||
sum_q = x_.dot(q_) ; | |||||
sum_r = x_.dot(r_) ; | |||||
for(size_t i=0; i<v_.size() ; i++){ | |||||
v_[i] = q_[i] * x_[i] / sum_q; | |||||
ksi_[i] = r_[i] * x_[i] / sum_r ; | |||||
} | |||||
l_ = 5 * (r_ - q_) - (r_ - ones_) ; | |||||
sum_l = l_.dot(x_) ; | |||||
/* calculate the gamma_c */ | |||||
for(size_t i=0; i<v_.size() ; i++){ | |||||
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 ); | |||||
} | |||||
/******* gamma_R for both propane and n-heptane are 0 **********/ | |||||
/* return the gamma */ | |||||
for(size_t i=0; i<v_.size(); i++){ | |||||
gamma.push_back(gammaC_[i]); | |||||
} | |||||
} | |||||
} | } |
@@ -33,11 +33,10 @@ void freeAtLast(void* mem, N_Vector *y, | |||||
int main(){ | int main(){ | ||||
// Read input file specifying the details of the case and store them | // Read input file specifying the details of the case and store them | ||||
FILE *input;input=fopen("input.dat","r"); | |||||
UserData data;data=NULL;data=allocateUserData(input); | |||||
FILE *input =fopen("input.dat","r"); | |||||
UserData data=allocateUserData(input); | |||||
fclose(input); | fclose(input); | ||||
data->clockStart=get_wall_time(); | |||||
data->clockStart=get_wall_time(); | |||||
// /**************** TEST THE xOld *******************/ | // /**************** TEST THE xOld *******************/ | ||||
// double* ptr1 = data->grid->xOld ; | // double* ptr1 = data->grid->xOld ; | ||||
@@ -118,7 +117,7 @@ int main(){ | |||||
ier=IDADlsSetLinearSolver(mem,LS,A); | ier=IDADlsSetLinearSolver(mem,LS,A); | ||||
//ier = IDABand(mem, data->neq, mu, ml); | //ier = IDABand(mem, data->neq, mu, ml); | ||||
constraintsdata = N_VGetArrayPointer_OpenMP(constraints); | |||||
constraintsdata = N_VGetArrayPointer_OpenMP(constraints); | |||||
if(data->setConstraints){ | if(data->setConstraints){ | ||||
for (size_t i = 1; i <=data->npts; i++) { | for (size_t i = 1; i <=data->npts; i++) { | ||||
for (size_t k = 1; k <=data->nsp; k++) { | for (size_t k = 1; k <=data->nsp; k++) { | ||||
@@ -137,9 +136,11 @@ int main(){ | |||||
if(check_flag(&ier, "IDASetSuppressAlg", 1)) return(1); | if(check_flag(&ier, "IDASetSuppressAlg", 1)) return(1); | ||||
//ier= IDASetMaxNumStepsIC(mem, 1); | //ier= IDASetMaxNumStepsIC(mem, 1); | ||||
//ier= IDASetMaxNumJacsIC(mem,8); | |||||
//ier= IDASetMaxNumItersIC(mem,100); | |||||
//ier= IDASetMaxBacksIC(mem,2000); | |||||
// ier= IDASetMaxNumStepsIC(mem, 8); | |||||
//ier= IDASetMaxNumJacsIC(mem,8); | |||||
// ier= IDASetMaxNumItersIC(mem,100); | |||||
// ier= IDASetMaxBacksIC(mem,2000); | |||||
// ier= IDASetMaxBacksIC(mem,1000); | |||||
//ier = IDASetLineSearchOffIC(mem,SUNTRUE); | //ier = IDASetLineSearchOffIC(mem,SUNTRUE); | ||||
//////// DEBUG /////////// | //////// DEBUG /////////// | ||||
@@ -169,7 +170,8 @@ int main(){ | |||||
printf("Calculating Initial Conditions:\n"); | printf("Calculating Initial Conditions:\n"); | ||||
printf("Cross your fingers...\n"); | printf("Cross your fingers...\n"); | ||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, 1e-5*finalTime); | |||||
// ier = IDACalcIC(mem, IDA_YA_YDP_INIT, 1e-5*finalTime); | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, 1e-7*finalTime); | |||||
//If at first IDACalcIC doesn't succeed, try, try, try again: | //If at first IDACalcIC doesn't succeed, try, try, try again: | ||||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||||
@@ -195,7 +197,7 @@ int main(){ | |||||
printSpaceTimeHeader(data); | printSpaceTimeHeader(data); | ||||
printGlobalHeader(data); | printGlobalHeader(data); | ||||
printTimescaleHeader(data); | |||||
//printTimescaleHeader(data); | |||||
printSpaceTimeOutput(tNow, &y, data->output, data); | printSpaceTimeOutput(tNow, &y, data->output, data); | ||||
printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | ||||
@@ -223,11 +225,11 @@ int main(){ | |||||
//xOld=isothermPosition(ydata, data->isotherm, data->nt, | //xOld=isothermPosition(ydata, data->isotherm, data->nt, | ||||
// data->nvar, data->grid->x, data->npts); | // data->nvar, data->grid->x, data->npts); | ||||
} | } | ||||
while (tNow<=finalTime && R(1)>100e-9) { | |||||
while (tNow<=finalTime && R(data->l_npts)>100e-9) { | |||||
t1=tNow; | t1=tNow; | ||||
/*Floor small value to zero*/ | /*Floor small value to zero*/ | ||||
floorSmallValue(data, &y); | |||||
// floorSmallValue(data, &y); | |||||
if(data->quasiSteady){ | if(data->quasiSteady){ | ||||
@@ -249,9 +251,9 @@ int main(){ | |||||
ier = IDAGetCurrentOrder(mem, &kcur); | ier = IDAGetCurrentOrder(mem, &kcur); | ||||
/******** Print the max Temperature *********/ | /******** Print the max Temperature *********/ | ||||
double maxT = 0.00; | |||||
maxT = maxTemperature(ydata,data->nt,data->nvar,data->npts); | |||||
printf("Maximum temperature is : %.3f[K] \n",maxT); | |||||
// double maxT = 0.00; | |||||
// maxT = maxTemperature(ydata,data->nt,data->nvar,data->npts); | |||||
// printf("Maximum temperature is : %.3f[K] \n",maxT); | |||||
if(data->adaptiveGrid==1 && data->moveGrid==1){ | if(data->adaptiveGrid==1 && data->moveGrid==1){ | ||||
x=maxCurvPosition(ydata, data->nt, data->nvar, | x=maxCurvPosition(ydata, data->nt, data->nvar, | ||||
@@ -337,65 +339,64 @@ int main(){ | |||||
} | } | ||||
/*Print Liquid Thermodynamic data*/ | /*Print Liquid Thermodynamic data*/ | ||||
double rho = getLiquidRho(data->dropMole,T(1),P(1)); | |||||
double Cp = getLiquidCp(data->dropMole,T(1),P(1)); | |||||
double deltaH = getLiquidHv(data->dropMole,T(1),P(1)); | |||||
double boil_T = getLiquidMaxT(data->dropMole,P(1)); | |||||
printf("The Mean Density of Liquid Phase:%6.3e [kg/m^3]\n",rho); | |||||
printf("The Mean Specific Heat Capacity of Liquid Phase:%6.3e [J/(kg*K)]\n",Cp); | |||||
printf("The Mean Heat of Evaporation of Liquid Phase:%6.3e [J/kg]\n",deltaH); | |||||
printf("The Boiling Point of More Volitile Component (Propane):%6.3e [K]\n",boil_T); | |||||
printf("Temperature at the liquid/gas phase interface:%6.3e [K]\n\n",T(1)); | |||||
// double rho = getLiquidRho(data->dropMole,T(1),P(1)); | |||||
// double Cp = getLiquidCp(data->dropMole,T(1),P(1)); | |||||
// double deltaH = getLiquidHv(data->dropMole,T(1),P(1)); | |||||
// double boil_T = getLiquidMaxT(data->dropMole,P(1)); | |||||
// printf("The Mean Density of Liquid Phase:%6.3e [kg/m^3]\n",rho); | |||||
// printf("The Mean Specific Heat Capacity of Liquid Phase:%6.3e [J/(kg*K)]\n",Cp); | |||||
// printf("The Mean Heat of Evaporation of Liquid Phase:%6.3e [J/kg]\n",deltaH); | |||||
// printf("The Boiling Point of More Volitile Component (Propane):%6.3e [K]\n",boil_T); | |||||
// printf("Temperature at the liquid/gas phase interface:%6.3e [K]\n\n",T(1)); | |||||
/*reset the tolerance after ignition*/ | /*reset the tolerance after ignition*/ | ||||
//resetTolerance(data,&y,&atolv); | //resetTolerance(data,&y,&atolv); | ||||
/*regrid and update the solution based on R,re-initialize the problem*/ | /*regrid and update the solution based on R,re-initialize the problem*/ | ||||
/*For the time being,we only allow TORC to REGRID once for each run*/ | /*For the time being,we only allow TORC to REGRID once for each run*/ | ||||
if(data->JJRG ==1 && (maxT >= data->initialTemperature+data->deltaT)){ | |||||
if(RGCOUNT<1){ | |||||
RGCOUNT = RGCOUNT +1; | |||||
REGRID(ydata,ydotdata,data); | |||||
initializePsiGrid(ydata,data->uniformGrid,data); | |||||
printf("REGRID Complete!Restarting Problem at %15.6e s\n",tNow); | |||||
ier = IDAReInit(mem,tNow,y,ydot); | |||||
if(check_flag(&ier,"IDAReInit",1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
ier= IDASetInitStep(mem,1e-01*dt); | |||||
//ier= IDASetInitStep(mem,0.0); | |||||
printf("Reinitialized!Calculating Initial Conditions:\n"); | |||||
printf("Cross your fingers...\n"); | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e-01*dt); | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e+01*dt); | |||||
} | |||||
//Every once in a while, for reasons | |||||
//that befuddle this mathematically | |||||
//lesser author, IDACalcIC fails. Here, | |||||
//I desperately try to make it converge | |||||
//again by sampling increasingly larger | |||||
//time-steps: | |||||
for (int i = 0; i < 10; i++) { | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+(1e-01+pow(10,i)*dt)); | |||||
if(ier==0){ | |||||
break; | |||||
} | |||||
} | |||||
//Failure :( Back to the drawing board: | |||||
if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
return(-1); | |||||
} | |||||
printf("Initial (Consistent) Conditions Calculated!\n"); | |||||
printf("------------------------------------------\n\n"); | |||||
} | |||||
} | |||||
// if(data->JJRG ==1 && (maxT >= data->initialTemperature+data->deltaT)){ | |||||
// if(RGCOUNT<1){ | |||||
// RGCOUNT = RGCOUNT +1; | |||||
// REGRID(ydata,ydotdata,data); | |||||
// initializePsiGrid(ydata,data->uniformGrid,data); | |||||
// printf("REGRID Complete!Restarting Problem at %15.6e s\n",tNow); | |||||
// ier = IDAReInit(mem,tNow,y,ydot); | |||||
// | |||||
// if(check_flag(&ier,"IDAReInit",1)){ | |||||
// freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
// return(-1); | |||||
// } | |||||
// | |||||
// ier= IDASetInitStep(mem,1e-01*dt); | |||||
// //ier= IDASetInitStep(mem,0.0); | |||||
// printf("Reinitialized!Calculating Initial Conditions:\n"); | |||||
// printf("Cross your fingers...\n"); | |||||
// ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e-01*dt); | |||||
// if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
// ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+1e+01*dt); | |||||
// } | |||||
// //Every once in a while, for reasons | |||||
// //that befuddle this mathematically | |||||
// //lesser author, IDACalcIC fails. Here, | |||||
// //I desperately try to make it converge | |||||
// //again by sampling increasingly larger | |||||
// //time-steps: | |||||
// for (int i = 0; i < 10; i++) { | |||||
// ier = IDACalcIC(mem, IDA_YA_YDP_INIT, tNow+(1e-01+pow(10,i)*dt)); | |||||
// if(ier==0){ | |||||
// break; | |||||
// } | |||||
// } | |||||
// //Failure :( Back to the drawing board: | |||||
// if(check_flag(&ier, "IDACalcIC", 1)){ | |||||
// freeAtLast(mem,&y,&ydot,&res,&id,&atolv,&constraints,data); | |||||
// return(-1); | |||||
// } | |||||
// printf("Initial (Consistent) Conditions Calculated!\n"); | |||||
// printf("------------------------------------------\n\n"); | |||||
// | |||||
// } | |||||
// } | |||||
/*Floor small value to zero*/ | /*Floor small value to zero*/ | ||||
//floorSmallValue(data, &y); | //floorSmallValue(data, &y); | ||||
@@ -409,11 +410,11 @@ int main(){ | |||||
/*Get and Print Rxns Rate of Progress and Specie Rate of Production data*/ | /*Get and Print Rxns Rate of Progress and Specie Rate of Production data*/ | ||||
/*Following code snippet will be executed only once*/ | /*Following code snippet will be executed only once*/ | ||||
if(ii==0 && maxT >=(data->initialTemperature+data->deltaT)){ | |||||
getReactions(data,&y,data->rxnROPOutput); | |||||
getSpecies(data,&y,data->spROPOutput); | |||||
ii++; | |||||
} | |||||
// if(ii==0 && maxT >=(data->initialTemperature+data->deltaT)){ | |||||
// getReactions(data,&y,data->rxnROPOutput); | |||||
// getSpecies(data,&y,data->spROPOutput); | |||||
// ii++; | |||||
// } | |||||
// getTimescale(data,&y); | // getTimescale(data,&y); | ||||
// if(count%data->nSaves==0){ | // if(count%data->nSaves==0){ | ||||
// printTimescaleOutput(tNow,&y, data->timescaleOutput,data); | // printTimescaleOutput(tNow,&y, data->timescaleOutput,data); | ||||
@@ -85,46 +85,48 @@ int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMo | |||||
return(-1); | return(-1); | ||||
} | } | ||||
/* Specialization for string */ | |||||
template<> | |||||
int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<std::string>& dropPara){ | |||||
char buf[bufLen]; | |||||
char buf1[bufLen]; | |||||
char comment[1]; | |||||
char *ret; | |||||
while (fgets(buf,bufLen, input)!=NULL){ | |||||
comment[0]=buf[0]; | |||||
if(strncmp(comment,"#",1)==0){ | |||||
//printf("Comment!:%s\n",buf); | |||||
} | |||||
else{ | |||||
ret=strtok(buf,"="); | |||||
if(strcmp(ret,keyword)==0){ | |||||
/*offset buf by keyword size + 1 for the "="*/ | |||||
/* Second argument in the strncpy function is the address !!! */ | |||||
/* Note: current version of code can only take dropType =0 or 1 */ | |||||
strncpy(buf1, buf+strlen(keyword)+1, bufLen); | |||||
printf("%10s: ",keyword); | |||||
if(*dropType ==0){ | |||||
/* Convert from char* to string */ | |||||
std::string str(buf1); | |||||
dropPara.push_back(str); | |||||
printf("%s\n",dropPara[0].c_str()); | |||||
}else{ | |||||
std::istringstream iss(buf1) ; | |||||
std::string token; | |||||
while(std::getline(iss,token,',')){ | |||||
//std::stod(token); | |||||
dropPara.push_back(token); | |||||
} | |||||
printf("%s,%s\n",dropPara[0].c_str(),dropPara[1].c_str()); | |||||
} | |||||
rewind(input); | |||||
return(0); | |||||
} | |||||
} | |||||
} | |||||
rewind(input); | |||||
return(-1); | |||||
} | |||||
///* Specialization for string */ | |||||
//template<> | |||||
//int parseDropSpec<std::string>(FILE* input, const char* keyword, const size_t bufLen,const int* dropType, std::vector<std::string>& dropPara){ | |||||
// char buf[bufLen]; | |||||
// char buf1[bufLen]; | |||||
// char comment[1]; | |||||
// char *ret; | |||||
// | |||||
// while (fgets(buf,bufLen, input)!=NULL){ | |||||
// comment[0]=buf[0]; | |||||
// if(strncmp(comment,"#",1)==0){ | |||||
// //printf("Comment!:%s\n",buf); | |||||
// } | |||||
// else{ | |||||
// ret=strtok(buf,"="); | |||||
// if(strcmp(ret,keyword)==0){ | |||||
// /*offset buf by keyword size + 1 for the "="*/ | |||||
// /* Second argument in the strncpy function is the address !!! */ | |||||
// /* Note: current version of code can only take dropType =0 or 1 */ | |||||
// strncpy(buf1, buf+strlen(keyword)+1, bufLen); | |||||
// printf("%10s: ",keyword); | |||||
// if(*dropType ==0){ | |||||
// /* Convert from char* to string */ | |||||
// std::string str(buf1); | |||||
// dropPara.push_back(str); | |||||
// printf("%s\n",dropPara[0].c_str()); | |||||
// }else{ | |||||
// std::istringstream iss(buf1) ; | |||||
// std::string token; | |||||
// while(std::getline(iss,token,',')){ | |||||
// //std::stod(token); | |||||
// dropPara.push_back(token); | |||||
// } | |||||
// printf("%s,%s\n",dropPara[0].c_str(),dropPara[1].c_str()); | |||||
// } | |||||
// rewind(input); | |||||
// return(0); | |||||
// } | |||||
// } | |||||
// } | |||||
// rewind(input); | |||||
// return(-1); | |||||
//} |
@@ -1,2 +0,0 @@ | |||||
double get_wall_time(); | |||||
double get_cpu_time(); |
@@ -1,45 +0,0 @@ | |||||
// Windows | |||||
#ifdef _WIN32 | |||||
#include <Windows.h> | |||||
double get_wall_time(){ | |||||
LARGE_INTEGER time,freq; | |||||
if (!QueryPerformanceFrequency(&freq)){ | |||||
// Handle error | |||||
return 0; | |||||
} | |||||
if (!QueryPerformanceCounter(&time)){ | |||||
// Handle error | |||||
return 0; | |||||
} | |||||
return (double)time.QuadPart / freq.QuadPart; | |||||
} | |||||
double get_cpu_time(){ | |||||
FILETIME a,b,c,d; | |||||
if (GetProcessTimes(GetCurrentProcess(),&a,&b,&c,&d) != 0){ | |||||
// Returns total user time. | |||||
// Can be tweaked to include kernel times as well. | |||||
return | |||||
(double)(d.dwLowDateTime | | |||||
((unsigned long long)d.dwHighDateTime << 32)) * 0.0000001; | |||||
}else{ | |||||
// Handle error | |||||
return 0; | |||||
} | |||||
} | |||||
// Posix/Linux | |||||
#else | |||||
#include <time.h> | |||||
#include <sys/time.h> | |||||
double get_wall_time(){ | |||||
struct timeval time; | |||||
if (gettimeofday(&time,NULL)){ | |||||
// Handle error | |||||
return 0; | |||||
} | |||||
return (double)time.tv_sec + (double)time.tv_usec * .000001; | |||||
} | |||||
double get_cpu_time(){ | |||||
return (double)clock() / CLOCKS_PER_SEC; | |||||
} | |||||
#endif |