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