@@ -7,7 +7,7 @@ | |||||
compiler =g++ | compiler =g++ | ||||
CANTERA_DIR =/opt/scientific/cantera-2.4_gnu_blas | CANTERA_DIR =/opt/scientific/cantera-2.4_gnu_blas | ||||
IDA_DIR =/opt/scientific/sundials-3.1.1_intel_mkl | IDA_DIR =/opt/scientific/sundials-3.1.1_intel_mkl | ||||
EXE =DropletCombustion9 | |||||
EXE =DropletCombustionTest6 | |||||
#DESTDIR =~/bin | #DESTDIR =~/bin | ||||
DESTDIR = ../example | DESTDIR = ../example | ||||
@@ -380,6 +380,12 @@ UserData allocateUserData(FILE *input){ | |||||
ier=reGrid(data->grid, data->grid->position); | ier=reGrid(data->grid, data->grid->position); | ||||
if(ier==-1)return(NULL); | 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->npts=data->grid->nPts; | ||||
data->neq=data->nvar*data->npts; | data->neq=data->nvar*data->npts; | ||||
} | } | ||||
@@ -1,5 +1,6 @@ | |||||
#include "gridRoutines.h" | #include "gridRoutines.h" | ||||
#include <stdio.h> | #include <stdio.h> | ||||
inline double l(const double* x, | inline double l(const double* x, | ||||
const double* a, | const double* a, | ||||
const double* w, | const double* w, | ||||
@@ -8,10 +9,40 @@ inline double l(const double* x, | |||||
if(*refineLeft==0){ | if(*refineLeft==0){ | ||||
return(tanh(-*a*(*x+*w*100.0e0))); | return(tanh(-*a*(*x+*w*100.0e0))); | ||||
}else{ | }else{ | ||||
return(tanh(-*a*(*x-*w*(*fac)))); | |||||
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, | inline double r(const double* x, | ||||
const double* a, | const double* a, | ||||
const double* w, | const double* w, | ||||
@@ -55,6 +86,7 @@ inline double rho(const double* x, | |||||
return(((2.0e0+f(x,a,c,w) | return(((2.0e0+f(x,a,c,w) | ||||
+g(x,a,c,w) | +g(x,a,c,w) | ||||
+l(x,a,w,leftFac,refineLeft) | +l(x,a,w,leftFac,refineLeft) | ||||
// +l(x,a,c,w,leftFac,refineLeft) | |||||
+r(x,a,w,rightFac,refineRight))*0.5e0) | +r(x,a,w,rightFac,refineRight))*0.5e0) | ||||
*(*mag-1.0e0)+1.0e0); | *(*mag-1.0e0)+1.0e0); | ||||
} | } | ||||
@@ -122,16 +154,33 @@ void fillGrid(const size_t* basePts, | |||||
double sum=0.0e0; | double sum=0.0e0; | ||||
double err=0.0e0; | double err=0.0e0; | ||||
double fix=0.0e0; | double fix=0.0e0; | ||||
double arr[*nPts-1] ; | |||||
size_t halfboundII = 0; | |||||
for(size_t j=0;j<*nPts-1;j++){ | for(size_t j=0;j<*nPts-1;j++){ | ||||
sum+=dxp[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; | err=1.0e0-sum; | ||||
printf("sum before correction: %15.6e\n",sum); | printf("sum before correction: %15.6e\n",sum); | ||||
printf("err before correction: %15.6e\n",err); | printf("err before correction: %15.6e\n",err); | ||||
fix=err/((double)(*nPts)); | |||||
//fix=err/((double)(*nPts)); | |||||
fix = err/((double)(*nPts-1-(halfboundII+1))); | |||||
sum=0.0e0; | sum=0.0e0; | ||||
for(size_t j=0;j<*nPts-1;j++){ | for(size_t j=0;j<*nPts-1;j++){ | ||||
dxp[j]+=fix; | |||||
// dxp[j]+=fix; | |||||
if(j>halfboundII){ | |||||
dxp[j]=dxp[j]+fix ; | |||||
} | |||||
sum+=dxp[j]; | sum+=dxp[j]; | ||||
} | } | ||||
err=1.0e0-sum; | err=1.0e0-sum; | ||||
@@ -33,6 +33,13 @@ inline double l(const double* x, | |||||
const double* fac, | const double* fac, | ||||
const int* refineLeft); | 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, | inline double r(const double* x, | ||||
const double* a, | const double* a, | ||||
const double* w, | const double* w, | ||||
@@ -38,6 +38,12 @@ int main(){ | |||||
fclose(input); | fclose(input); | ||||
data->clockStart=get_wall_time(); | 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){ | if(data==NULL){ | ||||
printf("check input file!\n"); | printf("check input file!\n"); | ||||
freeUserData(data); | freeUserData(data); | ||||
@@ -53,6 +59,13 @@ int main(){ | |||||
y=ydot=id=res=atolv=constraints=NULL; | y=ydot=id=res=atolv=constraints=NULL; | ||||
ier=allocateSolution(data->neq,data->nThreads,&y,&ydot,&id,&res,&atolv,&constraints); | ier=allocateSolution(data->neq,data->nThreads,&y,&ydot,&id,&res,&atolv,&constraints); | ||||
ier=setAlgebraicVariables(&id,data); | 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); | ier=setInitialCondition(&y,&ydot,data); | ||||
if(ier==-1)return(-1); | if(ier==-1)return(-1); | ||||
tNow=data->tNow; | tNow=data->tNow; | ||||
@@ -154,10 +167,16 @@ int main(){ | |||||
if(!data->dryRun){ | if(!data->dryRun){ | ||||
printf("Calculating Initial Conditions:\n"); | printf("Calculating Initial Conditions:\n"); | ||||
printf("Cross your fingers...\n"); | printf("Cross your fingers...\n"); | ||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, 1e-05*finalTime); | |||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, 1e-5*finalTime); | |||||
//If at first IDACalcIC doesn't succeed, try, try, try again: | //If at first IDACalcIC doesn't succeed, try, try, try again: | ||||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||||
ier = IDACalcIC(mem, IDA_YA_YDP_INIT, (1e-01+pow(10,i)*finalTime)); | 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){ | if(ier==0){ | ||||
break; | break; | ||||
} | } | ||||
@@ -179,8 +198,8 @@ int main(){ | |||||
printSpaceTimeOutput(tNow, &y, data->output, data); | printSpaceTimeOutput(tNow, &y, data->output, data); | ||||
printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | printSpaceTimeOutput(tNow, &y, data->gridOutput, data); | ||||
getTimescale(data,&y) ; | |||||
printTimescaleOutput(tNow, &y, data->timescaleOutput,data); | |||||
// getTimescale(data,&y) ; | |||||
// printTimescaleOutput(tNow, &y, data->timescaleOutput,data); | |||||
if(!data->dryRun){ | if(!data->dryRun){ | ||||
@@ -196,13 +215,15 @@ int main(){ | |||||
int kcur=0; | int kcur=0; | ||||
if(data->adaptiveGrid){ | if(data->adaptiveGrid){ | ||||
dxMin=data->grid->leastMove; | 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); | |||||
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) { | while (tNow<=finalTime && R(1)>100e-9) { | ||||
t1=tNow; | t1=tNow; | ||||
/*Floor small value to zero*/ | /*Floor small value to zero*/ | ||||
@@ -229,15 +250,20 @@ int main(){ | |||||
dt=tNow-t1; | dt=tNow-t1; | ||||
ier = IDAGetCurrentOrder(mem, &kcur); | 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){ | if(data->adaptiveGrid==1 && data->moveGrid==1){ | ||||
//x=maxCurvPosition(ydata, data->nt, data->nvar, | |||||
// data->grid->x, data->npts); | |||||
x=maxCurvPosition(ydata, data->nt, data->nvar, | |||||
data->grid->x, data->npts); | |||||
//x=isothermPosition(ydata, data->isotherm, data->nt, | //x=isothermPosition(ydata, data->isotherm, data->nt, | ||||
// data->nvar, data->grid->x, data->npts); | |||||
// data->nvar, data->grid->x, data->npts); | |||||
x=maxGradPosition(ydata, data->nt, data->nvar, | |||||
data->grid->x, data->npts); | |||||
//x=maxGradPosition(ydata, data->nt, data->nvar, | |||||
// data->grid->x, data->npts); | |||||
dx=x-xOld; | dx=x-xOld; | ||||
if(dx*dxMin>0.0e0){ | if(dx*dxMin>0.0e0){ | ||||
@@ -248,6 +274,11 @@ int main(){ | |||||
//if(fabs(dx)>=dxMin && x+(double)(move)*0.5e0*dxMin<=1.0e0){ | //if(fabs(dx)>=dxMin && x+(double)(move)*0.5e0*dxMin<=1.0e0){ | ||||
dxRatio=fabs(dx/dxMin); | 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){ | if(dxRatio>=1.0e0 && dxRatio<=2.0e0){ | ||||
printf("Regridding!\n"); | printf("Regridding!\n"); | ||||
@@ -319,14 +350,14 @@ int main(){ | |||||
} | } | ||||
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); | |||||
//} | |||||
} | |||||
// 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!*/ | /*Print global variables only if time-step is of high order!*/ | ||||
if(data->nTimeSteps==0){ | if(data->nTimeSteps==0){ | ||||
@@ -3,3 +3,12 @@ Dropletcombustion6 is the version where the Antoine parameters are those of wate | |||||
Version 7 change the hardcode some tolerance after ignition:Max T> 1800K | Version 7 change the hardcode some tolerance after ignition:Max T> 1800K | ||||
version 8: the x in the main.cpp is changed to the maxGradPosition | version 8: the x in the main.cpp is changed to the maxGradPosition | ||||
version 9: isothermPosition function in residue.cpp is revised for droplet combustion | version 9: isothermPosition function in residue.cpp is revised for droplet combustion | ||||
version 10: both xOld and x is the position of isoTherm ; | |||||
version 11: both xOld and x is the position of maximum curvature; | |||||
DropletCombustionTest: test the variables in the program | |||||
DropletCombustionTest1: Multiple the l function by 10.0 | |||||
DropletCombustionTest2: Multiple the l function by 100.0 and remove print timeScale; | |||||
DropletCombustionTest3: Multiple the l function by 10.0 and print the maxTemp and add criteria for regrid | |||||
DropletCombustionTest4: dxRatio to be 1.0e-2 and delta_T to be 150 [K] | |||||
DropletCombustionTest5: dxRatio to be 1.0 and print x and xOld temperature, modified the fillGrid function; | |||||
@@ -9,6 +9,115 @@ | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include "timing.hpp" | #include "timing.hpp" | ||||
double maxTemperaturePosition(const double* y,const size_t nt,const size_t nvar,const double *x ,size_t nPts){ | |||||
double maxT = 0.0e0; | |||||
double TempT = 0.0e0; | |||||
double pos = 0.0e0; | |||||
for (size_t i=1;i<=nPts;i++){ | |||||
TempT = y[(i-1)*nvar+nt] ; | |||||
if(TempT > maxT){ | |||||
maxT = TempT ; | |||||
pos = x[i-1]; | |||||
} | |||||
} | |||||
return(pos); | |||||
} | |||||
double maxTemperature(const double* y,const size_t nt,const size_t nvar ,size_t nPts){ | |||||
double maxT = 0.0e0; | |||||
double TempT = 0.0e0; | |||||
//int index = 0 ; | |||||
for (size_t i=1;i<=nPts;i++){ | |||||
TempT = y[(i-1)*nvar+nt] ; | |||||
if(TempT > maxT){ | |||||
maxT = TempT ; | |||||
} | |||||
} | |||||
return(maxT); | |||||
} | |||||
int maxTemperatureIndex(const double* y,const size_t nt,const size_t nvar ,size_t nPts){ | |||||
double maxT = 0.0e0; | |||||
double TempT = 0.0e0; | |||||
int index = 0 ; | |||||
for (size_t i=1;i<=nPts;i++){ | |||||
TempT = y[(i-1)*nvar+nt] ; | |||||
if(TempT > maxT){ | |||||
maxT = TempT ; | |||||
index = i; | |||||
} | |||||
} | |||||
return(index); | |||||
} | |||||
double maxCurvPositionR(const double* y, const size_t nt, | |||||
const size_t nvar, const size_t nr, size_t nPts){ | |||||
double maxCurvT=0.0e0; | |||||
double gradTp=0.0e0; | |||||
double gradTm=0.0e0; | |||||
double curvT=0.0e0; | |||||
double dx=0.0e0; | |||||
double dr=0.0e0; | |||||
double pos=0.0e0; | |||||
size_t j,jm,jp; | |||||
size_t r,rp,rm; | |||||
for (size_t i = 1; i <nPts-1; i++) { | |||||
j=i*nvar+nt; | |||||
jm=(i-1)*nvar+nt; | |||||
jp=(i+1)*nvar+nt; | |||||
r = i*nvar+nr; | |||||
rm = (i-1)*nvar+nr; | |||||
rp = (i+1)*nvar+nr; | |||||
//gradTp=fabs((y[jp]-y[j])/(x[i+1]-x[i])); | |||||
//gradTm=fabs((y[j]-y[jm])/(x[i]-x[i-1])); | |||||
//dx=0.5e0*((x[i]+x[i+1])-(x[i-1]+x[i])); | |||||
//curvT=(gradTp-gradTm)/dx; | |||||
gradTp = fabs((y[jp]-y[j])/(y[rp]-y[r])); | |||||
gradTp = fabs((y[j]-y[jm])/(y[r]-y[rm])); | |||||
dr = 0.5e0*(y[rp]-y[rm]); | |||||
curvT=(gradTp-gradTm)/dr; | |||||
if (curvT>=maxCurvT) { | |||||
maxCurvT=curvT; | |||||
pos=y[r]; | |||||
} | |||||
} | |||||
return(pos); | |||||
} | |||||
int maxCurvIndexR(const double* y, const size_t nt, | |||||
const size_t nvar, const size_t nr, size_t nPts){ | |||||
double maxCurvT=0.0e0; | |||||
double gradTp=0.0e0; | |||||
double gradTm=0.0e0; | |||||
double curvT=0.0e0; | |||||
double dx=0.0e0; | |||||
double dr=0.0e0; | |||||
int pos=0; | |||||
size_t j,jm,jp; | |||||
size_t r,rm,rp; | |||||
for (size_t i = 1; i <nPts-1; i++) { | |||||
j=i*nvar+nt; | |||||
jm=(i-1)*nvar+nt; | |||||
jp=(i+1)*nvar+nt; | |||||
r = i*nvar+nr; | |||||
rm = (i-1)*nvar+nr; | |||||
rp = (i+1)*nvar+nr; | |||||
//gradTp=fabs((y[jp]-y[j])/(x[i+1]-x[i])); | |||||
//gradTm=fabs((y[j]-y[jm])/(x[i]-x[i-1])); | |||||
//dx=0.5e0*((x[i]+x[i+1])-(x[i-1]+x[i])); | |||||
//curvT=(gradTp-gradTm)/dx; | |||||
gradTp = fabs((y[jp]-y[j])/(y[rp]-y[r])); | |||||
gradTp = fabs((y[j]-y[jm])/(y[r]-y[rm])); | |||||
dr = 0.5e0*(y[rp]-y[rm]); | |||||
curvT=(gradTp-gradTm)/dr; | |||||
if (curvT>=maxCurvT) { | |||||
maxCurvT=curvT; | |||||
pos=i; | |||||
} | |||||
} | |||||
return(pos); | |||||
} | |||||
double maxGradPosition(const double* y, const size_t nt, | double maxGradPosition(const double* y, const size_t nt, | ||||
const size_t nvar, const double* x, size_t nPts){ | const size_t nvar, const double* x, size_t nPts){ | ||||
double maxGradT=0.0e0; | double maxGradT=0.0e0; | ||||
@@ -31,7 +140,7 @@ int maxGradIndex(const double* y, const size_t nt, | |||||
const size_t nvar, const double* x, size_t nPts){ | const size_t nvar, const double* x, size_t nPts){ | ||||
double maxGradT=0.0e0; | double maxGradT=0.0e0; | ||||
double gradT=0.0e0; | double gradT=0.0e0; | ||||
int pos=0.0e0; | |||||
int pos=0; | |||||
size_t j,jm; | size_t j,jm; | ||||
for (size_t i = 1; i <nPts; i++) { | for (size_t i = 1; i <nPts; i++) { | ||||
j=i*nvar+nt; | j=i*nvar+nt; | ||||
@@ -478,7 +587,9 @@ int setInitialCondition(N_Vector* y, | |||||
//Define Grid: | //Define Grid: | ||||
double dR=(data->domainLength)/((double)(data->npts)-1.0e0); | double dR=(data->domainLength)/((double)(data->npts)-1.0e0); | ||||
double dv=(pow(data->domainLength,1+data->metric)-pow(data->firstRadius*data->domainLength,1+data->metric))/((double)(data->npts)-1.0e0); | double dv=(pow(data->domainLength,1+data->metric)-pow(data->firstRadius*data->domainLength,1+data->metric))/((double)(data->npts)-1.0e0); | ||||
for (size_t i = 1; i <=data->npts; i++) { | |||||
//Initialize the R(i),T(i)(data->initialTemperature),Y(i,k),P(i) | |||||
for (size_t i = 1; i <=data->npts; i++) { | |||||
if(data->metric==0){ | if(data->metric==0){ | ||||
R(i)=Rd+(double)((i-1)*dR); | R(i)=Rd+(double)((i-1)*dR); | ||||
}else{ | }else{ | ||||
@@ -497,6 +608,18 @@ int setInitialCondition(N_Vector* y, | |||||
P(i)=data->initialPressure*Cantera::OneAtm; | P(i)=data->initialPressure*Cantera::OneAtm; | ||||
} | } | ||||
R(data->npts)=data->domainLength+data->Rd; | R(data->npts)=data->domainLength+data->Rd; | ||||
// /********** test R(i) and the volumn between grids *****************/ | |||||
// printf("Print the first 4 R(i)s and volumn between them: \n") ; | |||||
// printf("Grids: 1st:%2.6e,2nd:%2.6e,3rd:%2.6e,4th:%2.6e \n",R(1),R(2),R(3),R(4)); | |||||
// double v1,v2,v3,v4,v5; | |||||
// v1 =pow(R(2),1+data->metric) - pow(R(1),1+data->metric); | |||||
// v2 =pow(R(3),1+data->metric) - pow(R(2),1+data->metric); | |||||
// v3 =pow(R(4),1+data->metric) - pow(R(3),1+data->metric); | |||||
// v4 =pow(R(5),1+data->metric) - pow(R(4),1+data->metric); | |||||
// v5 =pow(R(6),1+data->metric) - pow(R(5),1+data->metric); | |||||
// printf("Volumn: 1st:%2.6e,2nd:%2.6e,3rd:%2.6e,4th:%2.6e,5th:%2.6e\n",v1,v2,v3,v4,v5) ; | |||||
double Tmax; | double Tmax; | ||||
double Tmin=data->initialTemperature; | double Tmin=data->initialTemperature; | ||||
@@ -554,8 +677,21 @@ int setInitialCondition(N_Vector* y, | |||||
data->grid->position=0.0e0; | data->grid->position=0.0e0; | ||||
double x=data->grid->position+data->gridOffset*data->grid->leastMove; | double x=data->grid->position+data->gridOffset*data->grid->leastMove; | ||||
printf("New grid center:%15.6e\n",x); | printf("New grid center:%15.6e\n",x); | ||||
ier=reGrid(data->grid, x); | |||||
// /**************** TEST THE data->grid->xOld *******************/ | |||||
// double* ptr3 = data->grid->xOld ; | |||||
// printf("SetInitialCondition function is called,before reGrid,Start print the first 5 elements of the xOld array : \n"); | |||||
// printf("1st:%.6f, 2nd:%.6f, 3rd:%.6f, 4th:%.6f, 5th:%.6f.\n",ptr3[0],ptr3[1],ptr3[2],ptr3[3],ptr3[4]); | |||||
ier=reGrid(data->grid, x); | |||||
if(ier==-1)return(-1); | if(ier==-1)return(-1); | ||||
// /**************** TEST THE data->grid->xOld *******************/ | |||||
// double* ptr = data->grid->xOld ; | |||||
// printf("SetInitialCondition function is called,after reGrid,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]); | |||||
updateSolution(ydata, ydotdata, data->nvar, | updateSolution(ydata, ydotdata, data->nvar, | ||||
data->grid->xOld,data->grid->x,data->npts); | data->grid->xOld,data->grid->x,data->npts); | ||||
storeGrid(data->grid->x,data->grid->xOld,data->npts); | storeGrid(data->grid->x,data->grid->xOld,data->npts); | ||||
@@ -662,16 +798,24 @@ int setInitialCondition(N_Vector* y, | |||||
} | } | ||||
} | } | ||||
//Set grid to location of maximum curvature: | |||||
//Set grid to location of maximum curvature calculated by r instead of x: | |||||
if(data->adaptiveGrid){ | if(data->adaptiveGrid){ | ||||
data->grid->position=maxCurvPosition(ydata, data->nt, data->nvar, | |||||
data->grid->x, data->npts); | |||||
//data->grid->position=maxCurvPosition(ydata, data->nt, data->nvar, | |||||
// data->grid->x, data->npts); | |||||
int maxCurvII = 0; | |||||
maxCurvII = maxCurvIndexR(ydata,data->nt,data->nvar,data->nr,data->npts); | |||||
data->grid->position = data->grid->x[maxCurvII]; | |||||
ier=reGrid(data->grid, data->grid->position); | ier=reGrid(data->grid, data->grid->position); | ||||
updateSolution(ydata, ydotdata, data->nvar, | updateSolution(ydata, ydotdata, data->nvar, | ||||
data->grid->xOld,data->grid->x,data->npts); | data->grid->xOld,data->grid->x,data->npts); | ||||
storeGrid(data->grid->x,data->grid->xOld,data->npts); | storeGrid(data->grid->x,data->grid->xOld,data->npts); | ||||
/******** Test the maxCurvPosition and related variables *******/ | |||||
printf("The maxCurvPositition(based on r) is : %.6f,Temperature is : %.3f \n",data->grid->position,T(maxCurvII+1)); | |||||
} | } | ||||
/*Ensure consistent boundary conditions*/ | /*Ensure consistent boundary conditions*/ | ||||
//T(1)=T(2); | //T(1)=T(2); | ||||
//for (size_t k = 1; k <=data->nsp; k++) { | //for (size_t k = 1; k <=data->nsp; k++) { | ||||
@@ -19,6 +19,17 @@ | |||||
#include "UserData.h" | #include "UserData.h" | ||||
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, | double maxGradPosition(const double* y, const size_t nt, | ||||
const size_t nvar, const double* x, size_t nPts); | const size_t nvar, const double* x, size_t nPts); | ||||