本文整理汇总了C++中ProblemDomain::shiftIterator方法的典型用法代码示例。如果您正苦于以下问题:C++ ProblemDomain::shiftIterator方法的具体用法?C++ ProblemDomain::shiftIterator怎么用?C++ ProblemDomain::shiftIterator使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ProblemDomain
的用法示例。
在下文中一共展示了ProblemDomain::shiftIterator方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: buildPeriodicVector
void CFStencil::buildPeriodicVector(Vector<Box>& a_periodicVector,
const ProblemDomain& a_fineDomain,
const DisjointBoxLayout& a_fineBoxes)
{
Box periodicTestBox(a_fineDomain.domainBox());
if (a_fineDomain.isPeriodic())
{
for (int idir=0; idir<SpaceDim; idir++)
{
if (a_fineDomain.isPeriodic(idir))
{
periodicTestBox.grow(idir,-1);
}
}
}
a_periodicVector.clear();
a_periodicVector.reserve(a_fineBoxes.size());
LayoutIterator lit = a_fineBoxes.layoutIterator();
for (lit.reset(); lit.ok(); ++lit)
{
const Box& box = a_fineBoxes[lit()];
a_periodicVector.push_back(box);
// if periodic, also need to add periodic images
// only do this IF we're periodic and box
// adjacent to the domain box boundary somewhere
if (a_fineDomain.isPeriodic()
&& !periodicTestBox.contains(box))
{
ShiftIterator shiftIt = a_fineDomain.shiftIterator();
IntVect shiftMult(a_fineDomain.domainBox().size());
Box shiftedBox(box);
for (shiftIt.begin(); shiftIt.ok(); ++shiftIt)
{
IntVect shiftVect = shiftMult*shiftIt();
shiftedBox.shift(shiftVect);
a_periodicVector.push_back(shiftedBox);
shiftedBox.shift(-shiftVect);
} // end loop over periodic shift directions
} // end if periodic
}
a_periodicVector.sort();
}
示例2: periodicTestBox
void
CFStencil::define(
const ProblemDomain& a_fineDomain,
const Box& a_grid,
const DisjointBoxLayout& a_fineBoxes,
const DisjointBoxLayout& a_coarBoxes,
int a_refRatio,
int a_direction,
Side::LoHiSide a_hiorlo)
{
m_isDefined = true;
CH_assert(a_refRatio >= 1);
CH_assert(a_direction >= 0);
CH_assert(a_direction < SpaceDim);
CH_assert((a_hiorlo == Side::Lo) ||
(a_hiorlo == Side::Hi));
CH_assert(!a_fineDomain.isEmpty());
//set internal vars. most of these are kept around
//just to keep the class from having an identity crisis.
m_direction = a_direction;
m_hiorlo = a_hiorlo;
Box finebox = a_grid;
//compute intvectset of all points on fine grid that
//need to be interpolated
//shift direction
int hilo = sign(a_hiorlo);
//create fine stencil
Box edgebox;
CH_assert((hilo ==1) || (hilo == -1));
if (hilo == -1)
{
edgebox = adjCellLo(finebox,m_direction,1);
}
else
{
edgebox = adjCellHi(finebox,m_direction,1);
}
edgebox = a_fineDomain & edgebox;
if (!edgebox.isEmpty())
{
Box periodicTestBox(a_fineDomain.domainBox());
if (a_fineDomain.isPeriodic())
{
for (int idir=0; idir<SpaceDim; idir++)
{
if (a_fineDomain.isPeriodic(idir))
{
periodicTestBox.grow(idir,-1);
}
}
}
m_fineIVS.define(edgebox);
LayoutIterator lit = a_fineBoxes.layoutIterator();
for (lit.reset(); lit.ok(); ++lit)
{
m_fineIVS -= a_fineBoxes[lit()];
// if periodic, also need to subtract periodic images
// only do this IF we're periodic _and_ both boxes
// adjoin the domain box boundary somewhere
if (a_fineDomain.isPeriodic() && !periodicTestBox.contains(edgebox)
&& !periodicTestBox.contains(a_fineBoxes[lit()]))
{
ShiftIterator shiftIt = a_fineDomain.shiftIterator();
IntVect shiftMult(a_fineDomain.domainBox().size());
Box shiftedBox(a_fineBoxes[lit()]);
for (shiftIt.begin(); shiftIt.ok(); ++shiftIt)
{
IntVect shiftVect = shiftMult*shiftIt();
shiftedBox.shift(shiftVect);
m_fineIVS -= shiftedBox;
shiftedBox.shift(-shiftVect);
} // end loop over periodic shift directions
} // end if periodic
}
}
//ivs where all coarse slopes are defined
//== coarsened fine ivs
m_coarIVS.define(m_fineIVS);
m_coarIVS.coarsen(a_refRatio);
// this is a trick to get around the lack of a IntVectSet intersection
// operator which works with a ProblemDomain
ProblemDomain coardom= coarsen(a_fineDomain, a_refRatio);
Box domainIntersectBox = m_coarIVS.minBox();
domainIntersectBox = coardom & domainIntersectBox;
m_coarIVS &= domainIntersectBox;
m_packedBox = m_fineIVS.minBox();
if (m_fineIVS.numPts() == m_packedBox.numPts())
{
m_isPacked = true;
}
else
//.........这里部分代码省略.........
示例3: define
//.........这里部分代码省略.........
{
// add the dataIndex for this box to the list
// of boxes which we need to come back to
periodicallyFilledToVect.push_back(DataIndex(to()));
// now check to see if we need to grow the
// periodic check radius
if (!grownDomainCheckBox.contains(ghost))
{
// grow the domainCheckBox until it contains ghost
while (!grownDomainCheckBox.contains(ghost))
{
grownDomainCheckBox.grow(1);
periodicCheckRadius++;
}
} // end if we need to grow radius around domain
} //end if ghost box is not contained in domain
} // end if original ghost box didn't intersect domain
}// end if periodic
}
// Here ends the so-called N-squared optimizations. the rest is unchanged. (ndk)
// now do periodic checking, if necessary
if (isPeriodic)
{
// the only "from" boxes we will need to check
// will be those within periodicCheckRadius of the
// domain boundary. so, create a box to screen out
// those which we will need to check.
Box shrunkDomainBox = a_domain.domainBox();
shrunkDomainBox.grow(-periodicCheckRadius);
ShiftIterator shiftIt = a_domain.shiftIterator();
IntVect shiftMult(domainBox.size());
// now loop over "from" boxes
for (LayoutIterator from(a_level.layoutIterator()); from.ok(); ++from)
{
// first check to see whether we need to look at this box
const Box& fromBox = level[from()];
if (!shrunkDomainBox.contains(fromBox))
{
unsigned int fromProcID = level.procID(from());
// check to see if fromBox is contained in domain,
// if not, add it to the list of fromBoxes we need to
// go back and check separately to see if it will
// fill one of the "to" boxes
if (!domainBox.contains(fromBox))
{
periodicFromVect.push_back(DataIndex(from()));
if (!grownFromDomainCheckBox.contains(fromBox))
{
while (!grownFromDomainCheckBox.contains(fromBox))
{
grownFromDomainCheckBox.grow(1);
periodicFromCheckRadius++;
}
} // end if we need to grow domain check box
} // end if fromBox is outside domain
// now loop over those "to" boxes which were not contained
// in the domain