std::enable_if< I< sizeof...(LArgs), void >::typecall_level_forall(Func &a_func, LevelIndex &a_index, std::tuple< LArgs... > a_args, FArgs &&... a_fargs){ auto &arg=parse_level_arg(a_index, std::get< I >a_args));call_level_forall< I+1 >a_func, a_index, a_args, a_fargs..., arg);}template< typename T, unsigned int C, MemType MEM, Centering CTR >template< typename Func, typename... Srcs >void LevelBoxData< T, C, MEM, CTR >::initialize(Func &a_func, Srcs &... a_srcs){ PROTO_ASSERT(m_isDefined, "LevelBoxData::initialize | Error: Object not defined");auto srcs=std::tuple< Srcs &... >a_srcs...);for(auto iter :m_layout) { auto &patch=(*this)[iter];call_level_forall(a_func, iter, srcs, patch);}}template< typename T, unsigned int C, MemType MEM, Centering CTR >BoxLevelBoxData< T, C, MEM, CTR >::patchBox(const DataIndex< BoxPartition > &a_index) const { PROTO_ASSERT(m_isDefined, "LevelBoxData::patchBox | Error: Object not defined");PROTO_ASSERT(DIM<=6, "LevelBoxData::patchBox | Error: This function will fail for DIM > 6");Box B;if(CTR==PR_CELL) { B=layout()[a_index];} else if(CTR==PR_NODE) { B=layout()[a_index].extrude(Point::Ones());} else { int ctr=(int) CTR;B=layout()[a_index].extrude(Point::Basis(ctr, 1));} return B;}template< typename T, unsigned int C, MemType MEM, Centering CTR >unsigned intLevelBoxData< T, C, MEM, CTR >::patchSize() const { PROTO_ASSERT(m_isDefined, "LevelBoxData::patchSize | Error: Object not defined");int size=1;Point boxSize=layout().boxSize()+2 *ghost();switch(CTR) { case PR_NODE:boxSize+=Point::Ones();break;case PR_CELL:break;default:MayDay< void >::Abort("LevelBoxData::patchSize | Specified centering not implemented");} for(int ii=0;ii< DIM;ii++) { size *=boxSize[ii];} return C *size;}template< typename T, unsigned int C, MemType MEM, Centering CTR >unsigned intLevelBoxData< T, C, MEM, CTR >::offset(int a_proc) const { return layout().offset(a_proc) *patchSize();}template< typename T, unsigned int C, MemType MEM, Centering CTR >unsigned int LevelBoxData< T, C, MEM, CTR >::numBoxes() const { return m_layout.size();}template< typename T, unsigned int C, MemType MEM, Centering CTR >void LevelBoxData< T, C, MEM, CTR >::setToZero(int a_comp){ setVal(0, a_comp);}template< typename T, unsigned int C, MemType MEM, Centering CTR >void LevelBoxData< T, C, MEM, CTR >::setVal(T a_value, int a_comp){ PROTO_ASSERT(m_isDefined, "LevelBoxData::setVal | Error: Object not defined");PROTO_ASSERT((a_comp >=-1) &&(a_comp< DIM), "LevelBoxData::setVal | Error: %i is not a valid component specification.", a_comp);for(auto iter :m_layout) { auto &patch=(*this)[iter];if(a_comp==-1) { patch.setVal(a_value);} else { auto patch_i=slice(patch, a_comp);patch_i.setVal(a_value);} }}template< typename T, unsigned int C, MemType MEM, Centering CTR >void LevelBoxData< T, C, MEM, CTR >::setDomainBoundary(T a_value, int a_comp){ PROTO_ASSERT(m_isDefined, "LevelBoxData::setBoundary | Error: Object not defined");PROTO_ASSERT((a_comp >=-1) &&(a_comp< DIM), "LevelBoxData::setBoundary | Error: \%i is not a valid component specification.", a_comp);if(ghost()==Point::Zeros()){ return;} for(auto iter :m_layout) { if(!layout().onLevelBoundary(m_layout.point(iter))) { continue;} auto &patch=(*this)[iter];if(a_comp==-1) { BoxData< T, C, MEM > tmp(layout()[iter]);patch.copyTo(tmp);patch.setVal(a_value);tmp.copyTo(patch);} else { auto patch_i=slice(patch, a_comp);BoxData< T, 1, MEM > tmp(layout()[iter]);patch_i.copyTo(tmp);patch_i.setVal(a_value);tmp.copyTo(patch_i);} } exchange();}template< typename T, unsigned int C, MemType MEM, Centering CTR >void LevelBoxData< T, C, MEM, CTR >::setRandom(T a_low, T a_high){ for(auto iter :m_layout) { auto &patch=(*this)[iter];patch.setRandom(a_low, a_high);} exchange();}template< typename T, unsigned int C, MemType MEM, Centering CTR >void LevelBoxData< T, C, MEM, CTR >::exchange(){ PROTO_ASSERT(m_isDefined, "LevelBoxData::exchange | Error: Object not defined");if(m_ghost==Point::Zeros()) { return;} PR_TIME("LevelBoxData::exchange");PROTO_ASSERT(m_exchangeCopier !=nullptr, "LevelBoxData::exchange | Error: exchange copier is not defined");m_exchangeCopier-> | Proto::execute () |