42 for(
int i=0; i<
phi.size(); i++)
47 *
domn->
io->
ostrm << endl <<
"ERROR: Non-increasing domain!" << endl;
55 if(iLowerDummy == iUpperDummy)
58 if(iLowerDummy < iUpperDummy) {
77 if(iLowerDummy == iUpperDummy)
79 if(iLowerDummy < iUpperDummy){
81 double posUpperDummy =
domn->
posf->
d.at(iUpperDummy+1);
85 for (
int iDummy = iLowerDummy+1; iDummy <= iUpperDummy; iDummy++){
100 iDummy = iLowerDummy;
151 yf = vector<vector<double> >(
phi.size(), vector<double>(
xf.size(), 0.0));
153 for(
int iProf = 0; iProf<(int)
phi.size(); iProf++) {
156 yf.at(iProf).at(0) =
phi.at(iProf)->d.at(0);
167 for(
int i=1,j=
iLower+i; i<(int)
xf.size()-1; i++, j++) {
170 (
phi.at(iProf)->d.at(j)-
phi.at(iProf)->d.at(j-1));
179 for(
int i=0; i<(int)
xf.size(); i++)
180 xf.at(i) = (
xf.at(i)-xfMin)/(xfMax-xfMin);
182 for(
int iProf = 0; iProf<(int)
phi.size(); iProf++) {
185 double yfMax = *max_element(
phi.at(iProf)->d.begin(),
phi.at(iProf)->d.end());
186 double yfMin = *min_element(
phi.at(iProf)->d.begin(),
phi.at(iProf)->d.end());
187 for(
int i=0; i<(int)
xf.size(); i++)
188 yf.at(iProf).at(i) = (
yf.at(iProf).at(i)-yfMin)/(yfMax-yfMin);
193 vector<double> s_dist(
xf.size(),0.0);
194 vector<double> sn_dist;
200 sn_dist.resize(nNewGrd+1, 0.0);
201 xnf.resize(nNewGrd+1, 0.0);
203 double dS = s_distCum / nNewGrd;
205 for(
int i=1, im=0; i<nNewGrd+1; i++, im++)
206 sn_dist.at(i) = sn_dist.at(im) + dS;
212 for(
int i=0; i<(int)
xnf.size(); i++)
213 xnf.at(i) = xfMin +
xnf.at(i)*(xfMax-xfMin);
217 for(
int i=0; i<(int)
xnf.size(); i++)
219 *
domn->
io->
ostrm << endl <<
"Error in mesher: X is out of bounds, i= " << i << endl;
220 *
domn->
io->
ostrm <<
" posLower, posUpper, xnf.at(i) ,xnf.at(0), xnf.at(end) = " <<
225 for(
int i=1; i<(int)
xnf.size(); i++)
226 if(
xnf.at(i) <=
xnf.at(i-1)) {
229 *
domn->
io->
ostrm <<
"i = " << i <<
" xnf.size = " <<
xnf.size() <<
" xnf = "
230 <<
xnf.at(i-1) <<
" "<<
xnf.at(i) << endl;
231 *
domn->
io->
ostrm << endl <<
"Error in mesher: xnf is nonincreasing " << endl;
239 if(iUpper < domn->
ngrd-1)
253 for (
int i=0; i<
ngrd; i++) {
256 dx.insert(
dx.begin()+i,
dx.at(i));
264 for(
int i=1; i<
ngrdf; i++)
276 for(
int i=1; i<
ngrdf; i++)
287 for(
int i=1; i<
ngrdf; i++)
297 vector<double> whereSplit;
302 for(
int j=1; j<(int)
xnf.size()-1; j++) {
312 whereSplit.push_back(
xnf.at(j) );
314 for( ; j<(int)
xnf.size()-1; j++) {
319 whereSplit.push_back(
xnf.at(j) );
328 whereSplit.insert(whereSplit.begin(),
domn->
posf->
d.at(iCell));
329 whereSplit.push_back(
domn->
posf->
d.at(iCell+1));
330 splitCell(iCell, whereSplit.size()-2, whereSplit);
346 for(
int i=1, j=1; i<
domn->
ngrdf-1; i++) {
353 for(
int i=
mark.size()-1; i>=0; i--)
381 *
domn->
io->
ostrm << endl <<
"ERROR in adapMesh posLower/Upper on wrong boundary" << endl;
384 for(
int i=0; i<
ngrd; i++) {
390 for(
int i=
ngrd-1; i>=0; i--) {
425 for(i=0; i<=
ngrd-1; i++)
431 vector<int> ind(
mark.size());
432 for(i=0; i<(int)ind.size(); i++)
434 sort(ind.begin(), ind.end(), *
this);
435 vector<int> scMark(
mark.size());
436 for(i=0; i<(int)ind.size(); i++)
437 scMark.at(i) =
mark.at(ind.at(i));
444 int iend = scMark.size();
449 for(i=0; i<iend; i++) {
461 else if(isc ==
ngrd-1)
464 iSmallerNB = (
dx.at(isc-1) <=
dx.at(isc+1)) ? isc-1 : isc+1;
471 if(iSmallerNB > isc) {
477 dx.at(isc) =
dx.at(isc) +
dx.at(isc+1);
478 dx.erase(
dx.begin() + isc+1 );
483 for(j=i+1; j<iend; j++)
484 if(scMark.at(j) > isc)
486 for(j=i+1; j<iend; j++)
487 if(scMark.at(j)==isc){
488 scMark.erase(scMark.begin()+j);
503 dx.at(isc-1) =
dx.at(isc-1) +
dx.at(isc);
504 dx.erase(
dx.begin() + isc );
513 for(j=i+1; j<iend; j++)
514 if(scMark.at(j) > isc)
516 for(j=i+1; j<iend; j++)
517 if(scMark.at(j)==isc){
518 scMark.erase(scMark.begin()+j);
554 for (
int i=0; i<
ngrd; i++){
563 xn = x +
dx.at(i)+
dx.at(i+1)/2;
567 if (phase_c == phase_n){
570 dx.at(i) =
dx.at(i) +
dx.at(i+1);
571 dx.erase(
dx.begin() + i+1 );
581 xp = x -
dx.at(i-1)/2;
586 if (phase_p == phase_c){
590 dx.at(i-1) =
dx.at(i-1) +
dx.at(i);
591 dx.erase(
dx.begin() + i );
600 xp = x -
dx.at(i-1)/2;
602 xn = x +
dx.at(i) +
dx.at(i+1)/2;
608 if (phase_p != phase_c && phase_c == phase_n){
612 dx.at(i) =
dx.at(i) +
dx.at(i+1);
613 dx.erase(
dx.begin() + i+1 );
619 if (phase_p == phase_c && phase_c != phase_n){
624 dx.at(i-1) =
dx.at(i-1) +
dx.at(i);
625 dx.erase(
dx.begin() + i );
631 if (phase_p != phase_c && phase_c != phase_n){
637 if (phase_p == phase_c && phase_c == phase_n){
639 if (
dx.at(i-1) <
dx.at(i+1)){
644 dx.at(i-1) =
dx.at(i-1) +
dx.at(i);
645 dx.erase(
dx.begin() + i );
651 dx.at(i) =
dx.at(i) +
dx.at(i+1);
652 dx.erase(
dx.begin() + i+1 );
661 *
domn->
io->
ostrm <<
"\n(phase_p != phase_c && phase_c == phase_n) = " << (phase_p != phase_c && phase_c == phase_n);
662 *
domn->
io->
ostrm <<
"\n(phase_p != phase_c && phase_c == phase_n) = " << (phase_p == phase_c && phase_c != phase_n);
663 *
domn->
io->
ostrm <<
"\n(phase_p != phase_c && phase_c == phase_n) = " << (phase_p != phase_c && phase_c != phase_n);
664 *
domn->
io->
ostrm <<
"\n(phase_p != phase_c && phase_c == phase_n) = " << (phase_p == phase_c && phase_c == phase_n);
665 *
domn->
io->
ostrm <<
"\nERROR: In the function meshManager::mergeSmallCells_MP()"
666 << endl <<
"This error might not be there caused by logic one of the"
667 << endl <<
"previous cases have to occur."
668 << endl <<
"There must be a NaN problem.";
693 for(i=iLo; i<=iHi; i++) {
694 d1 =
dx.at(i)/
dx.at(i+1);
695 if(d1 > 2.5 || d1 < 0.4)
700 d1 =
dx.at(i)/
dx.at(0);
701 if(d1 > 2.5 || d1 < 0.4)
707 for(i=0; i<(int)
mark.size(); i++)
775 int ip = (mPos ==
ngrd-1) ? 0 : mPos+1;
776 double ratio = (
dx.at(mPos) <
dx.at(ip)) ?
dx.at(ip)/
dx.at(mPos) :
dx.at(mPos)/
dx.at(ip);
783 int isplt = (
dx.at(mPos) <
dx.at(ip)) ? ip : mPos;
784 int nsplt =
static_cast<int>(log2(ratio / 2.5)) + 1 ;
786 vector<double> icp(nsplt);
788 bool splitCellOnRight = (isplt > mPos);
789 if(mPos ==
ngrd-1 && isplt == 0)
790 splitCellOnRight =
true;
792 if(splitCellOnRight) {
793 icp.at(nsplt-1) =
dx.at(isplt)*0.5;
794 for(i=nsplt-2; i>=0; i--)
795 icp.at(i) = icp.at(i+1)*0.5;
797 for(i=nsplt-1; i>=1; i--)
798 icp.at(i) -= icp.at(i-1);
800 dx.insert(
dx.begin()+isplt, icp.begin(), icp.end());
803 icp.at(0) =
dx.at(isplt)*0.5;
804 for(i=1; i<nsplt; i++)
805 icp.at(i) = icp.at(i-1)*0.5;
806 for(i=1; i<nsplt; i++)
807 icp.at(i) += icp.at(i-1);
809 for(i=0; i<nsplt-1; i++)
810 icp.at(i) = icp.at(i+1) - icp.at(i);
812 icp.at(nsplt-1) = icp.at(nsplt-2);
814 dx.insert(
dx.begin()+isplt+1, icp.begin(), icp.end());
822 for(i=iglobal+1; i<(int)
mark.size(); i++)
823 if(
mark.at(i) > isplt)
829 if(splitCellOnRight) {
830 inext = isplt + nsplt;
855 for(
int i=0, ip=1; i<
ngrd; i++, ip++)
873 if(val >= x.at(x.size()-1))
875 for(
int i=istart; i<(int)x.size(); i++)
893 const double &xval,
double &yval,
int &istart) {
902 yval = y.at(i) + (xval-x.at(i))*(y.at(ip)-y.at(i))/(x.at(ip)-x.at(i));
916 const vector<double> &xn, vector<double> &yn) {
918 if(x.size() != y.size() || xn.size() != yn.size()) {
919 cerr <<
"\nERROR IN INTERPVEC" << endl;
923 for(
int i=0; i<(int)xn.size(); i++)
924 interp1pt(x,y,xn.at(i),yn.at(i), istart);
938 vector<double> &sDist) {
944 for (
int i=1; i<(int)x.size(); i++) {
946 dx2 = x.at(i)-x.at(i-1);
950 for(
int iProf=0; iProf<(int)y.size(); iProf++) {
951 dmb = y.at(iProf).at(i) - y.at(iProf).at(i-1);
953 if(dmb > dy2) dy2 = dmb;
956 sDist.at(i)= sDist.at(i-1)+sqrt(dx2 +dy2);
959 return sDist.at(sDist.size()-1);
973 for(
int i=0; i<
domn->
v.size(); i++)
974 domn->
v.at(i)->splitCell(isplt, nsplt, cellFaces);
1090 double m1 = dxc1 *
domn->
rho->
d.at(imrg);
1091 double m2 = dxc2 *
domn->
rho->
d.at(imrg+1);
1100 for(
int k=0; k<
domn->
v.size(); k++) {
1101 if(
domn->
v.at(k)->var_name==
"rho" ||
domn->
v.at(k)->var_name==
"pos" ||
domn->
v.at(k)->var_name==
"posf")
1103 domn->
v.at(k)->merge2cells(imrg, m1, m2, LconstVolume);
1137 if(time - tLastDA < domn->pram->DAtimeFac * dtCUmax)
1144 while(time - tLastDA >= youngsters) {
1148 int leftSide = cLastDA;
1149 int rightSide = (cLastDA ==
domn->
pram->
sLastDA-1) ? cLastDA : cLastDA+1;
1153 while(time -
lastDA.at(leftSide) >= 0.5 * youngsters){
1161 if(time -
lastDA.at(leftSide) < 0.5 * youngsters)
1166 while(time -
lastDA.at(rightSide) >= 0.5 * youngsters){
1174 if(time -
lastDA.at(rightSide) < 0.5 * youngsters)
1182 updateDA(time, tLastDA, cLastDA, iStart, iEnd);
1206 int iStart,
int iEnd) {
1220 if(leftCell > rightCell) {
1223 for(
int i=0; i<=rightCell; i++)
1225 if( !(cLastDA >= leftCell) && !(cLastDA <= rightCell) )
1229 for(
int i=leftCell; i<=rightCell; i++)
1231 if(!( (cLastDA >= leftCell) && (cLastDA <= rightCell) ))
1241 tLastDA =
lastDA.at(cLastDA);
1260 if(iStart > 0) iStart--;
1261 if(iEnd < domn->
ngrd-1) iEnd++;
1263 updateDA(time, tLastDA, cLastDA, iStart, iEnd);
1294 delta_lo = delta_hi;
1315 vector<double> cellFaces;
1328 if(
domn->
posf->
d.at(iSplitHi+1) != xSplitHi) {
1329 cellFaces.push_back(
domn->
posf->
d.at(iSplitHi));
1330 cellFaces.push_back(xSplitHi);
1331 cellFaces.push_back(
domn->
posf->
d.at(iSplitHi+1));
1334 for(
int k=0; k<
domn->
v.size(); k++)
1335 domn->
v.at(k)->d.erase(
domn->
v.at(k)->d.begin()+iSplitHi+1,
domn->
v.at(k)->d.end());
1351 double xSplitLo =
domn->
posf->
d.at(0) + delta_lo;
1353 if(
domn->
posf->
d.at(iSplitLo) != xSplitLo) {
1354 cellFaces.resize(0);
1355 cellFaces.push_back(
domn->
posf->
d.at(iSplitLo));
1356 cellFaces.push_back(xSplitLo);
1357 cellFaces.push_back(
domn->
posf->
d.at(iSplitLo+1));
1362 for(
int k=0; k<
domn->
v.size(); k++)
1363 domn->
v.at(k)->d.erase(
domn->
v.at(k)->d.begin(),
domn->
v.at(k)->d.begin()+iSplitLo+1);
1383 if(Ld < domn->pram->domainLength) {
1390 vector<double> cellFaces;
1400 if(
domn->
posf->
d.at(iSplitHi+1) != xSplitHi) {
1401 vector<double> cellFaces {
domn->
posf->
d.at(iSplitHi), xSplitHi,
domn->
posf->
d.at(iSplitHi+1)};
1404 for(
int k=0; k<
domn->
v.size(); k++)
1405 domn->
v.at(k)->d.erase(
domn->
v.at(k)->d.begin()+iSplitHi+1,
domn->
v.at(k)->d.end());
1420 cout << endl <<
"ERROR: meshManager::enforceDomainSize: not setup for given bcType" << endl;
1434 dxc.resize(line->
posf->
d.size()-1);
1436 for(
int i=0, ip=1; i<line->
posf->
d.size()-1; i++, ip++) {
1437 pm1 = line->
posf->
d.at(ip)*line->
posf->
d.at(i) < 0 ? -1.0 : 1.0;
1438 dxc.at(i) = abs(pow(abs(line->
posf->
d.at(ip)), C) -
1439 pm1*pow(abs(line->
posf->
d.at(i) ), C));
1452 for(
int i=0, ip=1; i<
dx.size(); i++, ip++)
1466 if(dxmid <= 3.0*domn->pram->dxmin) {
1467 if(imid < domn->
ngrd-1)
1488 vector<double> splitFaces(3);
1502 splitFaces[0] =
domn->
posf->
d.at(iSplt);
1504 splitFaces[2] =
domn->
posf->
d.at(iSplt+1);
1507 nTimesToMerge = iSplt - iZero;
1508 for(
int i=1; i<=nTimesToMerge; i++)
1521 splitFaces[0] =
domn->
posf->
d.at(iSplt);
1523 splitFaces[2] =
domn->
posf->
d.at(iSplt+1);
1528 nTimesToMerge = iZero - iSplt;
1529 for(
int i=1; i<=nTimesToMerge; i++)
1550 if(abs(
domn->
pos->
d.at(iSplitZero)) > 1.0E-10) {
1552 vector<double> cellFacesLo;
1553 vector<double> cellFacesHi;
1555 if(
domn->
posf->
d.at(iSplitHi+1) != h/2.0 ) {
1556 cellFacesHi.push_back(
domn->
posf->
d.at(iSplitHi));
1557 cellFacesHi.push_back(h/2.0);
1558 cellFacesHi.push_back(
domn->
posf->
d.at(iSplitHi+1));
1562 if(
domn->
posf->
d.at(iSplitLo) != (-1.0)*h/2.0 ) {
1563 cellFacesLo.push_back(
domn->
posf->
d.at(iSplitLo));
1564 cellFacesLo.push_back((-1.0)*h/2.0);
1565 cellFacesLo.push_back(
domn->
posf->
d.at(iSplitLo+1));
1604 double V2tot = accumulate(dxc2.begin(), dxc2.end(), 0.0);
1606 domn->
posf->
d[0] = -pow(0.5*V2tot, invC);
1607 for(
int ie=1, iw=0, i=0; ie<
domn->
ngrdf; ie++, iw++, i++) {
1609 dmb = pow(abs(
domn->
posf->
d[iw]),C) - dxc2[i];
1610 if(dmb >=0)
domn->
posf->
d[ie] = -pow( dmb, invC);
1611 else domn->
posf->
d[ie] = pow(-dmb, invC);
1623 double dxc0 = abs( pow(abs(
domn->
posf->
d.at(i0+1)), C) - pm1*pow(abs(
domn->
posf->
d.at(i0) ), C) );
1624 double fracVolR = pow(
domn->
posf->
d[i0+1],C) / dxc0;
1625 double fracVolL = 1.0 - fracVolR;
1629 domn->
posf->
d[i0+1] = pow(fracVolR*dxc2[i0], invC);
1630 for(
int i=i0+2, im=i0+1; i<
domn->
ngrdf; i++, im++)
1635 domn->
posf->
d[i0] = -pow(fracVolL*dxc2[i0], invC);
1636 for(
int i=i0-1, im=i0; i>=0; i--, im--)
1646 for(
int ie=1, iw=0, i=0; ie<
domn->
ngrdf; ie++, iw++, i++)
1653 cout << endl <<
"ERROR: meshManager::setGridFromDxc: not setup for given bcType" << endl;
int ngrd
number of grid cells
int domainPositionToIndex(double position, const bool LowSide, int dbg)
dv * posf
access as: posf->d[i], or posf->var_name, etc.
dv * pos
pointers to gas properties
int ngrdf
number of grid cell faces = ngrd+1
inputoutput * io
pointer to input/output object
eddy * ed
pointer to object for eddy operations
vector< dv * > v
All domain variables are stored in here.
param * pram
pointer to the parameters object
vector< double > d
the data
virtual void merge2cells(const int imrg, const double m2, const double m1, const bool LconstVolume=false)
virtual void setVar(const int ipt=-1)
double rightEdge
right edge location of eddy
double leftEdge
left edge location of eddy
double calcDistance(const vector< double > &x, const vector< vector< double > > &y, vector< double > &sDist)
void updateDA(const double &time, double &tLastDA, int &cLastDA, int iStart, int iEnd)
vector< double > dx
vector of cell sizes
void removeFaceNearZero()
vector< double > xnf
vector of new cell face positions
void interp1pt(const vector< double > &x, const vector< double > &y, const double &xval, double &yval, int &istart)
void makeCellWithZeroSymmetric()
void adaptEddyRegionOfMesh(const double &time, double &tLastDA, int &cLastDA)
vector< int > mark
dummy small cell index array for sorting
void setGridDx(const domain *line, vector< double > &dx)
void setGridFromDxc(const vector< double > &dxc2)
void init(domain *p_domn, const vector< dv * > p_phi)
int iUpper
region of grid to adapt (the cell w/ right eddy edge)
int iLower
region of grid to adapt (the cell w/ left eddy edge)
domain * domn
pointer to odt domain to adapt
void merge2cells(const int imrg, const bool LconstVolume=false)
vector< vector< double > > yf
vector of cell values
void splitCell(const int isplt, const int nsplt, const vector< double > &cellFaces)
int ngrdf
local number of grid faces
double posUpper
physical region of eddy (upper bound)
double posLower
physical region of eddy (lower bound)
int findPos(const vector< double > &x, const double val, const int &istart)
void setGridDxc(const domain *line, vector< double > &dxc, double C)
void splitCellWithZero()
** Create cell with r=0 at its center
int ngrd
local number of grid points
void adaptGrid(int iLower, int iUpper)
void adaptGrid_details(const int iLower, const int iUpper)
vector< double > lastDA
constant (unif) mesh to list time of last adapt
vector< double > xf
vector of cell face positions
vector< dv * > phi
vector of pointers to domainvariable objects
void adaptAfterSufficientDiffTime(const double &time, double &tLastDA, int &cLastDA, double &dtCUmax)
void interpVec(const vector< double > &x, const vector< double > &y, const vector< double > &xn, vector< double > &yn)
void fix2point5offender(const int mPos, const int &iglobal)
double DAtimeFac
time until catch-up adaption is DAtimeFac * dtCUmax
int cCoord
1 = planar, 2 = cylindrical, 3 = spherical
bool LmultiPhase
true if domain has more than one phase (particles don't count)
double dxmin
min grid spacing: = dxmin / domain length
double vBChi
Dirichlet velocity boundary condition.
bool LplanarExpCent0
flag: for planar cases (C=1) set the expansion center at 0 for outflow cases (normally expand about t...
double domainLength
length of domain (m)
bool Lspatial
spatial formulation if true
bool Lperiodic
periodic if true
double vBClo
Dirichlet velocity boundary condition.
double gDens
grid density for mesher
double xDomainCenter
position of the center of the domain
double dxmax
max grid spacing = dxmax / domain length
string bcType
OUTFLOW, PERIODIC, WALL, WALL_OUT.
int sLastDA
size of the lastDA vector for timing adaptmesh after diff
Header file for class domain.
Header file for class meshManager.
Header file for class param.