Browse Source

Implementation of liquid/gas phase droplet ignition, single component

binary_fuel
Weiye Wang 1 month ago
parent
commit
00e0f73495
49 changed files with 3410 additions and 6215 deletions
  1. +14
    -11
      CMakeLists.txt
  2. BIN
      DropletCombustion11
  3. BIN
      DropletCombustion3
  4. BIN
      DropletCombustion4
  5. BIN
      DropletCombustion8
  6. BIN
      DropletCombustion9
  7. BIN
      DropletCombustionTest1
  8. BIN
      DropletCombustionTest3
  9. BIN
      DropletCombustionTest4
  10. BIN
      DropletCombustionTest5
  11. BIN
      DropletCombustionTest7
  12. BIN
      DropletCombustionTest7-Binary
  13. +0
    -499
      UserData.cpp
  14. +0
    -63
      UserData.d
  15. +0
    -221
      UserData.h
  16. BIN
      UserData.o
  17. +0
    -293
      gridRoutines.cpp
  18. +0
    -1
      gridRoutines.d
  19. +0
    -89
      gridRoutines.h
  20. BIN
      gridRoutines.o
  21. +35
    -7
      include/UserData.h
  22. +96
    -5
      include/parse.h
  23. +54
    -5
      include/parse.hpp
  24. +41
    -6
      include/residue.h
  25. +1
    -0
      include/timing.hpp
  26. BIN
      lagrangianCombustion2
  27. +0
    -80
      macros.h
  28. +0
    -491
      main.cpp
  29. +0
    -77
      main.d
  30. BIN
      main.o
  31. +0
    -79
      parse.cpp
  32. +0
    -1
      parse.d
  33. +0
    -36
      parse.h
  34. +0
    -75
      parse.hpp
  35. BIN
      parse.o
  36. +0
    -1983
      residue.cpp
  37. +0
    -67
      residue.d
  38. +0
    -116
      residue.h
  39. BIN
      residue.o
  40. +0
    -90
      solution.cpp
  41. +0
    -5
      solution.d
  42. +0
    -15
      solution.h
  43. BIN
      solution.o
  44. +153
    -54
      src/UserData.cpp
  45. +74
    -73
      src/main.cpp
  46. +44
    -42
      src/parse.cpp
  47. +2898
    -1684
      src/residue.cpp
  48. +0
    -2
      timing.h
  49. +0
    -45
      timing.hpp

+ 14
- 11
CMakeLists.txt View File

@@ -5,35 +5,38 @@ set(CMAKE_CXX_STANDARD 11)


# 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(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(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
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
add_executable(DropletCombustion ${SRC_LIST})

# 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
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
PRIVATE cantera_shared sundials_nvecopenmp sundials_ida sundials_sunlinsollapackband gsl gslcblas CoolProp fmt)

# Include directories
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(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)




BIN
DropletCombustion11 View File


BIN
DropletCombustion3 View File


BIN
DropletCombustion4 View File


BIN
DropletCombustion8 View File


BIN
DropletCombustion9 View File


BIN
DropletCombustionTest1 View File


BIN
DropletCombustionTest3 View File


BIN
DropletCombustionTest4 View File


BIN
DropletCombustionTest5 View File


BIN
DropletCombustionTest7 View File


BIN
DropletCombustionTest7-Binary View File


+ 0
- 499
UserData.cpp View File

@@ -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;
}


+ 0
- 63
UserData.d View File

@@ -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

+ 0
- 221
UserData.h View File

@@ -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


BIN
UserData.o View File


+ 0
- 293
gridRoutines.cpp View File

@@ -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);
}


+ 0
- 1
gridRoutines.d View File

@@ -1 +0,0 @@
gridRoutines.o: gridRoutines.cpp gridRoutines.h parse.h parse.hpp

+ 0
- 89
gridRoutines.h View File

@@ -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

BIN
gridRoutines.o View File


+ 35
- 7
include/UserData.h View File

@@ -34,11 +34,13 @@ typedef struct UserDataTag{
/* Current version only support single and binary component(s) droplet */
int dropType;
/* 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;
/*droplet initial species mole fractions*/
std::vector<double> dropMole;
//char dropSpec[2][10] = {"propane","n-heptane"};
/*droplet species molecular weight*/
std::vector<double> MW;

/* Droplet species mole fractions */
//double dropMoleFrac[2];
@@ -55,8 +57,10 @@ typedef struct UserDataTag{
/*metric=0:Planar*/
/*metric=1:Cylindrical*/
/*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;
/*No: of equations:*/
size_t neq;
@@ -73,6 +77,25 @@ typedef struct UserDataTag{
size_t np;
/*Pointer index for mass flow rate:*/
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:*/
size_t k_bath;
/*Species index of oxidizer:*/
@@ -81,7 +104,8 @@ typedef struct UserDataTag{
size_t k_HO2;
/*Species index of droplet composition*/
/*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):*/
double mdot;
/*Flag to solve isobaric/isochoric problem;*/
@@ -195,6 +219,10 @@ typedef struct UserDataTag{
double Rg;
/*Total number of points for grid:*/
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;

@@ -236,5 +264,5 @@ void setSaneDefaults(UserData data);
void freeUserData(UserData data);
#endif

void getGamma(const double mole[],double gamma[]) ;
void getGamma(const std::vector<double>& mole,std::vector<double>& gamma) ;


+ 96
- 5
include/parse.h View File

@@ -1,3 +1,5 @@
#pragma once

#ifndef PRINT_DEF
#define PRINT_DEF
#include <string.h> //for strings
@@ -12,7 +14,7 @@
#include <vector>
#include <sstream>

#ifndef PARSE_DEF ```
#ifndef PARSE_DEF
#define PARSE_DEF
#define MAXBUFLEN 200

@@ -30,12 +32,101 @@ template<typename T>
int parseArray(FILE* input, const char* keyword, const size_t bufLen,
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);



+ 54
- 5
include/parse.hpp View File

@@ -1,3 +1,5 @@
#pragma once

template<typename T>
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 comment[1];
char *ret;
T* n;
T n;

while (fgets(buf,bufLen, input)!=NULL){
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);
printf("%10s: ",keyword);
if(*dropType ==0){
getFromString(buf1,n);
dropPara.push_back(*n);
getFromString(buf1,&n);
dropPara.push_back(n);
}else{
std::istringstream iss(buf1) ;
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);
dropPara.push_back(arg);
}
printf("%15.6e,%15.6e\n",dropPara[0],dropPara[1]);
printf("%.3f,%.3f\n",dropPara[0],dropPara[1]);
}
rewind(input);
return(0);
@@ -121,5 +123,52 @@ int parseDropSpec(FILE* input, const char* keyword, const size_t bufLen,const in

/* 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);
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);
}

+ 41
- 6
include/residue.h View File

@@ -28,6 +28,7 @@

#include "UserData.h"
#include <vector> //add the vector module
#include <algorithm>

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,
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);

int initializePsiGrid(double* ydata, double* psidata, UserData data);
int initializePsiEtaGrid(double* ydata, double* psidata, UserData data);

int setInitialCondition(N_Vector* y,
N_Vector* ydot,
@@ -86,7 +90,10 @@ void getTransport(UserData data,
double *rho,
double *lambda,
double *YV);

void getGasMassFlux(UserData data,
double *ydata,
size_t gridPoint,
double* YV) ;
int residue(double t,
N_Vector y,
N_Vector ydot,
@@ -97,6 +104,7 @@ void trackFlameOH(N_Vector y,UserData data);
void trackFlame(N_Vector y,UserData data);
size_t BathGasIndex(UserData data);
size_t oxidizerIndex(UserData data);
size_t specIndex(UserData data,const char *specName);

inline double Qdot(double* t,
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 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);

+ 1
- 0
include/timing.hpp View File

@@ -39,6 +39,7 @@ double get_wall_time(){
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}

double get_cpu_time(){
return (double)clock() / CLOCKS_PER_SEC;
}


BIN
lagrangianCombustion2 View File


+ 0
- 80
macros.h View File

@@ -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

+ 0
- 491
main.cpp View File

@@ -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);
}

+ 0
- 77
main.d View File

@@ -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

BIN
main.o View File


+ 0
- 79
parse.cpp View File

@@ -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);
}

+ 0
- 1
parse.d View File

@@ -1 +0,0 @@
parse.o: parse.cpp parse.h parse.hpp

+ 0
- 36
parse.h View File

@@ -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



+ 0
- 75
parse.hpp View File

@@ -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);
}

BIN
parse.o View File


+ 0
- 1983
residue.cpp
File diff suppressed because it is too large
View File


+ 0
- 67
residue.d View File

@@ -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

+ 0
- 116
residue.h View File

@@ -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);

BIN
residue.o View File


+ 0
- 90
solution.cpp View File

@@ -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");
}

+ 0
- 5
solution.d View File

@@ -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

+ 0
- 15
solution.h View File

@@ -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);

BIN
solution.o View File


+ 153
- 54
src/UserData.cpp View File

@@ -2,7 +2,18 @@
#include "parse.h"

void freeUserData(UserData data){

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){
delete data->trmix;
printf("Transport Deleted!\n");
@@ -53,10 +64,10 @@ void freeUserData(UserData data){
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->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");
@@ -74,6 +85,11 @@ UserData allocateUserData(FILE *input){

UserData 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){
printf("Allocation Failed!\n");
@@ -83,9 +99,14 @@ UserData allocateUserData(FILE *input){

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);
}

@@ -120,16 +141,16 @@ UserData allocateUserData(FILE *input){
return(NULL);
}

ier=parseNumber<int>(input,"dropType",MAXBUFLEN,&data->dropType);
ier=parseNumber<int>(input,"dropletType",MAXBUFLEN,&data->dropType);
if(ier==-1 || (data->dropType!=0
&& data->dropType!=1)){
printf("include valid dropletType!\n");
printf("0: single component droplet\n");
printf("1: multi-component droplet\n");
printf("1: bi-component droplet\n");
return(NULL);
}

ier=parseDropSpec<double>(input,"dropletMole",MAXBUFLEN,&data->dropType,dropMole);
ier=parseDropSpec<double>(input,"dropletMole",MAXBUFLEN,&data->dropType,data->dropMole);
if(ier== -1){
printf("include correct format for droplet mole fraction!\n");
printf("single composition droplet: dropletMole:1.00\n");
@@ -137,7 +158,7 @@ UserData allocateUserData(FILE *input){
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){
printf("include correct format for droplet composition!\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);

@@ -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);
if(ier==-1){
printf("Enter transportModel!\n");
@@ -371,7 +399,7 @@ UserData allocateUserData(FILE *input){
}
}
}
//ier=parseNumber<char>(input, "dropletComposition", MAXBUFLEN, data->dropSpec);
//if(ier==-1){
// printf("Enter composition of droplet!\n");
@@ -390,43 +418,62 @@ UserData allocateUserData(FILE *input){

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);
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);
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);
if(ier==-1){
printf("Enter deltaT value!\n");
return(NULL);
}
// if(ier==-1){
// printf("Enter deltaT value!\n");
// return(NULL);
// }
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->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;
// 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;
// for(int i=0;i<=1;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];
// }
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)*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 */
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){
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{
data->grid=(UserGrid) malloc(sizeof *data->grid);
@@ -469,9 +526,9 @@ UserData allocateUserData(FILE *input){
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->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];
@@ -518,6 +575,7 @@ void setSaneDefaults(UserData data){
data->pressureTolerance=1e-06;
data->massFractionTolerance=1e-09;
data->bathGasTolerance=1e-06;
data->MdotTolerance=1e-09;
data->finalTime=1e-02;
data->tNow=0.0e0;
data->setConstraints=0;
@@ -571,5 +629,46 @@ void getGamma(const double mole[],double gamma[]){
for(int i=0; i<v_.size(); 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]);
}
}
}

+ 74
- 73
src/main.cpp View File

@@ -33,11 +33,10 @@ void freeAtLast(void* mem, N_Vector *y,
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);
FILE *input =fopen("input.dat","r");
UserData data=allocateUserData(input);
fclose(input);
data->clockStart=get_wall_time();

data->clockStart=get_wall_time();

// /**************** TEST THE xOld *******************/
// double* ptr1 = data->grid->xOld ;
@@ -118,7 +117,7 @@ int main(){
ier=IDADlsSetLinearSolver(mem,LS,A);
//ier = IDABand(mem, data->neq, mu, ml);

constraintsdata = N_VGetArrayPointer_OpenMP(constraints);
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++) {
@@ -137,9 +136,11 @@ int main(){
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= IDASetMaxNumStepsIC(mem, 8);
//ier= IDASetMaxNumJacsIC(mem,8);
// ier= IDASetMaxNumItersIC(mem,100);
// ier= IDASetMaxBacksIC(mem,2000);
// ier= IDASetMaxBacksIC(mem,1000);
//ier = IDASetLineSearchOffIC(mem,SUNTRUE);

//////// DEBUG ///////////
@@ -169,7 +170,8 @@ int main(){
printf("Calculating Initial Conditions:\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:
for (int i = 0; i < 10; i++) {
@@ -195,7 +197,7 @@ int main(){

printSpaceTimeHeader(data);
printGlobalHeader(data);
printTimescaleHeader(data);
//printTimescaleHeader(data);
printSpaceTimeOutput(tNow, &y, data->output, data);
printSpaceTimeOutput(tNow, &y, data->gridOutput, data);

@@ -223,11 +225,11 @@ int main(){
//xOld=isothermPosition(ydata, data->isotherm, data->nt,
// 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;
/*Floor small value to zero*/
floorSmallValue(data, &y);
// floorSmallValue(data, &y);

if(data->quasiSteady){
@@ -249,9 +251,9 @@ int main(){
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);
// 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,
@@ -337,65 +339,64 @@ int main(){
}
/*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*/
//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");

}
}
// 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);
@@ -409,11 +410,11 @@ int main(){
/*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++;
}
// 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);


+ 44
- 42
src/parse.cpp View File

@@ -85,46 +85,48 @@ int parseDrop(FILE* input, const char* keyword,char dropSpec[][10],double dropMo
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);
//}

+ 2898
- 1684
src/residue.cpp
File diff suppressed because it is too large
View File


+ 0
- 2
timing.h View File

@@ -1,2 +0,0 @@
double get_wall_time();
double get_cpu_time();

+ 0
- 45
timing.hpp View File

@@ -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

Loading…
Cancel
Save