| @@ -53,6 +53,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"); | |||
| } | |||
| } | |||
| free(data); /* Free the user data */ | |||
| @@ -383,9 +387,14 @@ 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->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); | |||
| } | |||
| @@ -184,6 +184,16 @@ typedef struct UserDataTag{ | |||
| 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; | |||
| } *UserData; | |||
| UserData allocateUserData(FILE *input); | |||
| void setSaneDefaults(UserData data); | |||
| @@ -66,4 +66,12 @@ | |||
| #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 | |||
| @@ -175,8 +175,11 @@ int main(){ | |||
| printSpaceTimeHeader(data); | |||
| printGlobalHeader(data); | |||
| printTimescaleHeader(data); | |||
| printSpaceTimeOutput(tNow, &y, data->output, data); | |||
| printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | |||
| printTimescaleOutput(tNow, &y, data->timescaleOutput,data); | |||
| if(!data->dryRun){ | |||
| 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!*/ | |||
| if(data->nTimeSteps==0){ | |||
| 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); | |||
| //// } | |||
| ////} | |||
| /*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 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); | |||