@@ -53,6 +53,10 @@ void freeUserData(UserData data){ | |||||
fclose(data->globalOutput); | fclose(data->globalOutput); | ||||
printf("Global Output File Cleared from Memory!\n"); | printf("Global Output File Cleared from Memory!\n"); | ||||
} | } | ||||
if(data->timescaleOutput!=NULL){ | |||||
fclose(data->timescaleOutput); | |||||
printf("Characteristic Timescale Output File Cleared from Memory!\n"); | |||||
} | |||||
} | } | ||||
free(data); /* Free the user data */ | free(data); /* Free the user data */ | ||||
@@ -383,9 +387,14 @@ UserData allocateUserData(FILE *input){ | |||||
data->output=fopen("output.dat","w"); | data->output=fopen("output.dat","w"); | ||||
data->globalOutput=fopen("globalOutput.dat","w"); | data->globalOutput=fopen("globalOutput.dat","w"); | ||||
data->gridOutput=fopen("grid.dat","w"); | data->gridOutput=fopen("grid.dat","w"); | ||||
data->timescaleOutput=fopen("timeScale.dat","w") ; | |||||
//data->ratesOutput=fopen("rates.dat","w"); | //data->ratesOutput=fopen("rates.dat","w"); | ||||
data->innerMassFractions = new double [data->nsp]; | 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); | return(data); | ||||
} | } | ||||
@@ -184,6 +184,16 @@ typedef struct UserDataTag{ | |||||
double flamePosition[2]; | double flamePosition[2]; | ||||
double flameTime[2]; | double flameTime[2]; | ||||
size_t nTimeSteps; | 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; | |||||
} *UserData; | } *UserData; | ||||
UserData allocateUserData(FILE *input); | UserData allocateUserData(FILE *input); | ||||
void setSaneDefaults(UserData data); | void setSaneDefaults(UserData data); | ||||
@@ -66,4 +66,12 @@ | |||||
#define constraintsY(i,k) constraintsdata[((i-1)*data->nvar)+data->ny+k-1] | #define constraintsY(i,k) constraintsdata[((i-1)*data->nvar)+data->ny+k-1] | ||||
#define constraintsR(i) constraintsdata[((i-1)*data->nvar)+data->nr] | #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 | #endif |
@@ -175,8 +175,11 @@ int main(){ | |||||
printSpaceTimeHeader(data); | printSpaceTimeHeader(data); | ||||
printGlobalHeader(data); | printGlobalHeader(data); | ||||
printTimescaleHeader(data); | |||||
printSpaceTimeOutput(tNow, &y, data->output, data); | printSpaceTimeOutput(tNow, &y, data->output, data); | ||||
printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | ||||
printTimescaleOutput(tNow, &y, data->timescaleOutput,data); | |||||
if(!data->dryRun){ | if(!data->dryRun){ | ||||
count=0; | count=0; | ||||
@@ -304,6 +307,14 @@ int main(){ | |||||
//} | //} | ||||
} | } | ||||
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!*/ | /*Print global variables only if time-step is of high order!*/ | ||||
if(data->nTimeSteps==0){ | if(data->nTimeSteps==0){ | ||||
data->flamePosition[0]=0.0e0; | data->flamePosition[0]=0.0e0; | ||||
@@ -1444,3 +1444,80 @@ void printGlobalVariables(double t, N_Vector* y, N_Vector* ydot, UserData data) | |||||
//// Ydot(npts-1,k)=Ydot(npts,k); | //// Ydot(npts-1,k)=Ydot(npts,k); | ||||
//// } | //// } | ||||
////} | ////} | ||||
/*Following functions are added to derive the characteristic time scale of species*/ | |||||
void getTimescale(UserData data, N_Vector* y){ | |||||
size_t i, k, nsp,npts ; | |||||
nsp = data->nsp ; | |||||
npts = data->npts ; | |||||
double rho, wdot_mole[nsp], wdot_mass[nsp],MW[nsp],concentra[nsp]; | |||||
//double time_scale[npts*nsp] ; | |||||
double* ydata ; | |||||
ydata = N_VGetArrayPointer_OpenMP(*y); //access the data stored in N_Vector* y | |||||
for(i=1; i<= npts;i++){ | |||||
setGas(data,ydata,i); //set the gas state at each grid point | |||||
rho = data->gas->density(); //get the averaged density at each grid point, Unit:kg/m^3 | |||||
data->gas->getNetProductionRates(wdot_mole) ; //Unit:kmol/(m^3 * s) | |||||
for(k=1; k<= nsp; k++){ | |||||
MW(k) = data->gas->molecularWeight(k-1) ; //Unit:kg/kmol | |||||
} | |||||
for(k=1; k<= nsp; k++){ | |||||
wdot_mass(k) = wdot_mole(k) * MW(k) ; //Unit:kg/(m^3 * s) | |||||
} | |||||
for(k=1; k<= nsp; k++){ | |||||
concentra(k) = Y(i,k) * rho ; //Unit:kg/m^3 | |||||
} | |||||
for(k=1;k<= nsp;k++){ | |||||
data->time_scale(i,k) = concentra(k)/(wdot_mass(k)+ 1.00e-16) ; | |||||
} | |||||
} | |||||
} | |||||
void printTimescaleHeader(UserData data) | |||||
{ | |||||
fprintf((data->timescaleOutput), "%15s\t","#1"); | |||||
for (size_t k = 1; k <=data->nsp+1; k++) { | |||||
fprintf((data->timescaleOutput), "%15lu\t",k+1); | |||||
} | |||||
fprintf((data->timescaleOutput), "%15lu\n",data->nsp+3); | |||||
fprintf((data->timescaleOutput), "%15s\t%15s\t%15s\t","#time","radius","Temp(K)"); | |||||
//fprintf((data->output), "%15s\t%15s\t","radius(m)","Temp(K)"); | |||||
for (size_t k = 1; k <=(data->nsp); k++) { | |||||
fprintf((data->timescaleOutput), "%15s\t",data->gas->speciesName(k-1).c_str()); | |||||
} | |||||
//fprintf((data->output), "%15s\t","Pressure(Pa)"); | |||||
//fprintf((data->timescaleOutput), "%15s\n",data->gas->speciesName(data->nsp-1).c_str()); | |||||
//fprintf((data->output), "%15s\n","Mdot (kg/s)"); | |||||
fprintf((data->timescaleOutput), "\n"); | |||||
} | |||||
void printTimescaleOutput(double t,N_Vector* y,FILE* output,UserData data) | |||||
{ | |||||
double* ydata; | |||||
ydata = N_VGetArrayPointer_OpenMP(*y); | |||||
for(size_t i=1 ; i<= data->npts; i++){ | |||||
fprintf(output, "%15.9e\t%15.9e\t",t,R(i)); | |||||
for(size_t k=1; k<=data->nsp;k++){ | |||||
fprintf(output, "%15.9e\t",data->time_scale(i,k)); | |||||
} | |||||
fprintf(output, "\n"); | |||||
} | |||||
fprintf(output, "\n"); | |||||
} |
@@ -88,3 +88,7 @@ void printSpaceTimeOutputInterpolated(double t, N_Vector y, UserData data); | |||||
void writeRestart(double t, N_Vector* y, N_Vector* ydot, FILE* output, 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 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); |