5 #ifndef DUNE_GRID_YASPGRID_HH 6 #define DUNE_GRID_YASPGRID_HH 14 #include <type_traits> 19 #include <dune/common/hybridutilities.hh> 20 #include <dune/common/bigunsignedint.hh> 21 #include <dune/common/math.hh> 22 #include <dune/common/typetraits.hh> 23 #include <dune/common/reservedvector.hh> 24 #include <dune/common/parallel/communication.hh> 25 #include <dune/common/parallel/mpihelper.hh> 26 #include <dune/geometry/axisalignedcubegeometry.hh> 27 #include <dune/geometry/type.hh> 33 #include <dune/common/parallel/mpicommunication.hh> 54 template<
int dim,
class Coordinates>
class YaspGrid;
56 template<
int codim,
int dim,
class Gr
idImp>
class YaspEntity;
90 template<
int dim,
class Coordinates>
109 bigunsignedint<dim*yaspgrid_dim_bits+yaspgrid_level_bits+dim>,
111 bigunsignedint<dim*yaspgrid_dim_bits+yaspgrid_level_bits+dim>,
117 std::array<GeometryType,1>>
122 template<
int dim,
int codim>
123 struct YaspCommunicateMeta {
124 template<
class G,
class DataHandle>
127 if (data.contains(dim,codim))
129 g.template communicateCodim<DataHandle,codim>(data,iftype,dir,level);
131 YaspCommunicateMeta<dim,codim-1>::comm(g,data,iftype,dir,level);
136 struct YaspCommunicateMeta<dim,0> {
137 template<
class G,
class DataHandle>
140 if (data.contains(dim,0))
141 g.template communicateCodim<DataHandle,0>(data,iftype,dir,level);
163 template<
int dim,
class Coordinates = Equ
idistantCoordinates<
double, dim> >
165 :
public GridDefaultImplementation<dim,dim,typename Coordinates::ctype,YaspGridFamily<dim, Coordinates> >
168 template<
int, PartitionIteratorType,
typename>
179 typedef typename Coordinates::ctype
ctype;
199 std::array<YGrid, dim+1> overlapfront;
200 std::array<YGridComponent<Coordinates>, Dune::power(2,dim)> overlapfront_data;
201 std::array<YGrid, dim+1>
overlap;
202 std::array<YGridComponent<Coordinates>, Dune::power(2,dim)> overlap_data;
203 std::array<YGrid, dim+1> interiorborder;
204 std::array<YGridComponent<Coordinates>, Dune::power(2,dim)> interiorborder_data;
206 std::array<YGridComponent<Coordinates>, Dune::power(2,dim)> interior_data;
208 std::array<YGridList<Coordinates>,dim+1> send_overlapfront_overlapfront;
209 std::array<std::deque<Intersection>, Dune::power(2,dim)> send_overlapfront_overlapfront_data;
210 std::array<YGridList<Coordinates>,dim+1> recv_overlapfront_overlapfront;
211 std::array<std::deque<Intersection>, Dune::power(2,dim)> recv_overlapfront_overlapfront_data;
213 std::array<YGridList<Coordinates>,dim+1> send_overlap_overlapfront;
214 std::array<std::deque<Intersection>, Dune::power(2,dim)> send_overlap_overlapfront_data;
215 std::array<YGridList<Coordinates>,dim+1> recv_overlapfront_overlap;
216 std::array<std::deque<Intersection>, Dune::power(2,dim)> recv_overlapfront_overlap_data;
218 std::array<YGridList<Coordinates>,dim+1> send_interiorborder_interiorborder;
219 std::array<std::deque<Intersection>, Dune::power(2,dim)> send_interiorborder_interiorborder_data;
220 std::array<YGridList<Coordinates>,dim+1> recv_interiorborder_interiorborder;
221 std::array<std::deque<Intersection>, Dune::power(2,dim)> recv_interiorborder_interiorborder_data;
223 std::array<YGridList<Coordinates>,dim+1> send_interiorborder_overlapfront;
224 std::array<std::deque<Intersection>, Dune::power(2,dim)> send_interiorborder_overlapfront_data;
225 std::array<YGridList<Coordinates>,dim+1> recv_overlapfront_interiorborder;
226 std::array<std::deque<Intersection>, Dune::power(2,dim)> recv_overlapfront_interiorborder_data;
238 typedef std::array<int, dim> iTupel;
239 typedef FieldVector<ctype, dim> fTupel;
266 return _coarseSize[i] * (1 << l);
273 for (
int i=0; i<dim; ++i)
295 return _levels.begin();
302 DUNE_THROW(
GridError,
"level not existing");
303 return std::next(_levels.begin(), i);
309 return _levels.end();
327 void makelevel (
const Coordinates& coords, std::bitset<dim> periodic, iTupel o_interior,
int overlap)
329 YGridLevel& g = _levels.back();
334 g.keepOverlap = keep_ovlp;
339 typename std::array<YGridComponent<Coordinates>, power(2,dim)>::iterator overlapfront_it = g.overlapfront_data.begin();
340 typename std::array<YGridComponent<Coordinates>, power(2,dim)>::iterator overlap_it = g.overlap_data.begin();
341 typename std::array<YGridComponent<Coordinates>, power(2,dim)>::iterator interiorborder_it = g.interiorborder_data.begin();
342 typename std::array<YGridComponent<Coordinates>, power(2,dim)>::iterator interior_it = g.interior_data.begin();
344 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
345 send_overlapfront_overlapfront_it = g.send_overlapfront_overlapfront_data.begin();
346 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
347 recv_overlapfront_overlapfront_it = g.recv_overlapfront_overlapfront_data.begin();
349 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
350 send_overlap_overlapfront_it = g.send_overlap_overlapfront_data.begin();
351 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
352 recv_overlapfront_overlap_it = g.recv_overlapfront_overlap_data.begin();
354 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
355 send_interiorborder_interiorborder_it = g.send_interiorborder_interiorborder_data.begin();
356 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
357 recv_interiorborder_interiorborder_it = g.recv_interiorborder_interiorborder_data.begin();
359 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
360 send_interiorborder_overlapfront_it = g.send_interiorborder_overlapfront_data.begin();
361 typename std::array<std::deque<Intersection>, power(2,dim)>::iterator
362 recv_overlapfront_interiorborder_it = g.recv_overlapfront_interiorborder_data.begin();
365 std::array<int,dim> n;
366 std::fill(n.begin(), n.end(), 0);
369 std::bitset<dim> ovlp_low(0ULL);
370 std::bitset<dim> ovlp_up(0ULL);
376 for (
int i=0; i<dim; i++)
380 s_overlap[i] = g.coords.size(i);
385 o_overlap[i] = o_interior[i]-
overlap;
392 if (o_interior[i] -
overlap < 0)
396 o_overlap[i] = o_interior[i] -
overlap;
401 if (o_overlap[i] + g.coords.size(i) <
globalSize(i))
406 for (
unsigned int codim = 0; codim < dim + 1; codim++)
409 g.overlapfront[codim].setBegin(&*overlapfront_it);
410 g.overlap[codim].setBegin(&*overlap_it);
411 g.interiorborder[codim].setBegin(&*interiorborder_it);
412 g.interior[codim].setBegin(&*interior_it);
413 g.send_overlapfront_overlapfront[codim].setBegin(send_overlapfront_overlapfront_it);
414 g.recv_overlapfront_overlapfront[codim].setBegin(recv_overlapfront_overlapfront_it);
415 g.send_overlap_overlapfront[codim].setBegin(send_overlap_overlapfront_it);
416 g.recv_overlapfront_overlap[codim].setBegin(recv_overlapfront_overlap_it);
417 g.send_interiorborder_interiorborder[codim].setBegin(send_interiorborder_interiorborder_it);
418 g.recv_interiorborder_interiorborder[codim].setBegin(recv_interiorborder_interiorborder_it);
419 g.send_interiorborder_overlapfront[codim].setBegin(send_interiorborder_overlapfront_it);
420 g.recv_overlapfront_interiorborder[codim].setBegin(recv_overlapfront_interiorborder_it);
423 for (
unsigned int index = 0; index < (1<<dim); index++)
426 std::bitset<dim> r(index);
427 if (r.count() != dim-codim)
431 std::array<int,dim> origin(o_overlap);
432 std::array<int,dim>
size(s_overlap);
436 for (
int i=0; i<dim; i++)
442 for (
int i=0; i<dim; i++)
458 for (
int i=0; i<dim; i++)
480 for (
int i=0; i<dim; i++)
495 intersections(*overlapfront_it,*overlapfront_it,*send_overlapfront_overlapfront_it, *recv_overlapfront_overlapfront_it);
496 intersections(*overlap_it,*overlapfront_it,*send_overlap_overlapfront_it, *recv_overlapfront_overlap_it);
497 intersections(*interiorborder_it,*interiorborder_it,*send_interiorborder_interiorborder_it,*recv_interiorborder_interiorborder_it);
498 intersections(*interiorborder_it,*overlapfront_it,*send_interiorborder_overlapfront_it,*recv_overlapfront_interiorborder_it);
505 ++send_overlapfront_overlapfront_it;
506 ++recv_overlapfront_overlapfront_it;
507 ++send_overlap_overlapfront_it;
508 ++recv_overlapfront_overlap_it;
509 ++send_interiorborder_interiorborder_it;
510 ++recv_interiorborder_interiorborder_it;
511 ++send_interiorborder_overlapfront_it;
512 ++recv_overlapfront_interiorborder_it;
516 g.overlapfront[codim].finalize(&*overlapfront_it);
517 g.overlap[codim].finalize(&*overlap_it);
518 g.interiorborder[codim].finalize(&*interiorborder_it);
519 g.interior[codim].finalize(&*interior_it);
520 g.send_overlapfront_overlapfront[codim].finalize(send_overlapfront_overlapfront_it,g.overlapfront[codim]);
521 g.recv_overlapfront_overlapfront[codim].finalize(recv_overlapfront_overlapfront_it,g.overlapfront[codim]);
522 g.send_overlap_overlapfront[codim].finalize(send_overlap_overlapfront_it,g.overlapfront[codim]);
523 g.recv_overlapfront_overlap[codim].finalize(recv_overlapfront_overlap_it,g.overlapfront[codim]);
524 g.send_interiorborder_interiorborder[codim].finalize(send_interiorborder_interiorborder_it,g.overlapfront[codim]);
525 g.recv_interiorborder_interiorborder[codim].finalize(recv_interiorborder_interiorborder_it,g.overlapfront[codim]);
526 g.send_interiorborder_overlapfront[codim].finalize(send_interiorborder_overlapfront_it,g.overlapfront[codim]);
527 g.recv_overlapfront_interiorborder[codim].finalize(recv_overlapfront_interiorborder_it,g.overlapfront[codim]);
540 struct mpifriendly_ygrid {
543 std::fill(origin.begin(), origin.end(), 0);
544 std::fill(
size.begin(),
size.end(), 0);
546 mpifriendly_ygrid (
const YGridComponent<Coordinates>& grid)
547 : origin(grid.origin()),
size(grid.
size())
562 std::deque<Intersection>& sendlist, std::deque<Intersection>& recvlist)
567 std::vector<YGridComponent<Coordinates> > send_recvgrid(_torus.
neighbors());
568 std::vector<YGridComponent<Coordinates> > recv_recvgrid(_torus.
neighbors());
569 std::vector<YGridComponent<Coordinates> > send_sendgrid(_torus.
neighbors());
570 std::vector<YGridComponent<Coordinates> > recv_sendgrid(_torus.
neighbors());
573 std::vector<mpifriendly_ygrid> mpifriendly_send_recvgrid(_torus.
neighbors());
574 std::vector<mpifriendly_ygrid> mpifriendly_recv_recvgrid(_torus.
neighbors());
575 std::vector<mpifriendly_ygrid> mpifriendly_send_sendgrid(_torus.
neighbors());
576 std::vector<mpifriendly_ygrid> mpifriendly_recv_sendgrid(_torus.
neighbors());
584 iTupel coord = _torus.
coord();
585 iTupel delta = i.delta();
587 for (
int k=0; k<dim; k++) nb[k] += delta[k];
589 std::fill(v.begin(), v.end(), 0);
591 for (
int k=0; k<dim; k++)
600 if (nb[k]>=_torus.
dims(k))
613 send_sendgrid[i.index()] = sendgrid.
move(v);
614 send_recvgrid[i.index()] = recvgrid.
move(v);
626 mpifriendly_send_sendgrid[i.index()] = mpifriendly_ygrid(send_sendgrid[i.index()]);
627 _torus.
send(i.rank(), &mpifriendly_send_sendgrid[i.index()],
sizeof(mpifriendly_ygrid));
632 _torus.
recv(i.rank(), &mpifriendly_recv_sendgrid[i.index()],
sizeof(mpifriendly_ygrid));
640 mpifriendly_send_recvgrid[i.index()] = mpifriendly_ygrid(send_recvgrid[i.index()]);
641 _torus.
send(i.rank(), &mpifriendly_send_recvgrid[i.index()],
sizeof(mpifriendly_ygrid));
646 _torus.
recv(i.rank(), &mpifriendly_recv_recvgrid[i.index()],
sizeof(mpifriendly_ygrid));
656 mpifriendly_ygrid yg = mpifriendly_recv_recvgrid[i.index()];
658 send_intersection.grid = sendgrid.
intersection(recv_recvgrid[i.index()]);
659 send_intersection.rank = i.rank();
660 send_intersection.distance = i.distance();
661 if (!send_intersection.grid.empty()) sendlist.push_front(send_intersection);
664 yg = mpifriendly_recv_sendgrid[i.index()];
666 recv_intersection.grid = recvgrid.
intersection(recv_sendgrid[i.index()]);
667 recv_intersection.rank = i.rank();
668 recv_intersection.distance = i.distance();
669 if(!recv_intersection.grid.empty()) recvlist.push_back(recv_intersection);
686 std::array<int, dim> sides;
688 for (
int i=0; i<dim; i++)
691 ((
begin()->overlap[0].dataBegin()->origin(i) == 0)+
692 (
begin()->overlap[0].dataBegin()->origin(i) +
begin()->overlap[0].dataBegin()->size(i)
697 for (
int k=0; k<dim; k++)
700 for (
int l=0; l<dim; l++)
703 offset *=
begin()->overlap[0].dataBegin()->size(l);
705 nBSegments += sides[k]*offset;
732 std::bitset<dim> periodic = std::bitset<dim>(0ULL),
737 , leafIndexSet_(*this)
738 , _periodic(periodic)
747 for (std::size_t i=0; i<dim; i++)
748 _coarseSize[i] = coordinates.size(i);
751 _torus = decltype(_torus)(
comm,tag,_coarseSize,
overlap,partitioner);
754 std::fill(o.begin(), o.end(), 0);
755 iTupel o_interior(o);
756 iTupel s_interior(_coarseSize);
758 _torus.
partition(_torus.
rank(),o,_coarseSize,o_interior,s_interior);
764 for (std::size_t i=0; i<dim; i++)
765 _L[i] = coordinates.size(i) * coordinates.meshsize(i,0);
770 for (
int i=0; i<dim; i++)
771 _L[i] = coordinates.coordinate(i,_coarseSize[i]) - coordinates.coordinate(i,0);
776 int mysteryFactor = (std::is_same<Coordinates,EquidistantCoordinates<ctype,dim> >::value) ? 1 : 2;
779 for (
int i=0; i<dim; i++)
782 int toosmall = (s_interior[i] <= mysteryFactor *
overlap) &&
783 (periodic[i] || (s_interior[i] != _coarseSize[i]));
786 MPI_Allreduce(&toosmall, &global, 1, MPI_INT, MPI_LOR,
comm);
788 DUNE_THROW(
Dune::GridError,
"YaspGrid does not support degrees of freedom shared by more than immediately neighboring subdomains." 789 " Note that this also holds for DOFs on subdomain boundaries." 790 " Increase grid elements or decrease overlap accordingly.");
792 #endif // #if HAVE_MPI 797 iTupel s_overlap(s_interior);
798 for (
int i=0; i<dim; i++)
800 if ((o_interior[i] -
overlap > 0) || (periodic[i]))
802 if ((o_interior[i] + s_interior[i] +
overlap <= _coarseSize[i]) || (periodic[i]))
806 FieldVector<ctype,dim> upperRightWithOverlap;
807 for (
int i=0; i<dim; i++)
808 upperRightWithOverlap[i] = coordinates.coordinate(i,0) + coordinates.meshsize(i,0) * s_overlap[i];
821 Dune::FieldVector<ctype,dim> lowerleft;
822 for (
int i=0; i<dim; i++)
823 lowerleft[i] = coordinates.origin(i);
835 std::array<std::vector<ctype>,dim> newCoords;
836 std::array<int, dim> offset(o_interior);
839 for (
int i=0; i<dim; ++i)
842 std::size_t
begin = o_interior[i];
843 std::size_t
end =
begin + s_interior[i] + 1;
847 if (o_interior[i] -
overlap > 0)
852 if (o_interior[i] + s_interior[i] +
overlap < _coarseSize[i])
857 auto newCoordsIt = newCoords[i].begin();
858 for (std::size_t j=
begin; j<
end; j++)
860 *newCoordsIt = coordinates.coordinate(i, j);
866 if ((periodic[i]) && (o_interior[i] + s_interior[i] +
overlap >= _coarseSize[i]))
870 newCoords[i].push_back(newCoords[i].back() - coordinates.coordinate(i,j) + coordinates.coordinate(i,j+1));
873 if ((periodic[i]) && (o_interior[i] -
overlap <= 0))
878 std::size_t reverseCounter = coordinates.size(i);
879 for (
int j=0; j<
overlap; ++j, --reverseCounter)
880 newCoords[i].insert(newCoords[i].
begin(), newCoords[i].
front()
881 - coordinates.coordinate(i,reverseCounter) + coordinates.coordinate(i,reverseCounter-1));
902 template<
class C = Coordinates,
903 typename std::enable_if_t< std::is_same_v<C, EquidistantCoordinates<ctype,dim> >,
int> = 0>
905 std::array<
int, std::size_t{dim}> s,
906 std::bitset<std::size_t{dim}> periodic = std::bitset<std::size_t{dim}>{0ULL},
910 : ccobj(
comm), _torus(
comm,tag,s,
overlap,partitioner), leafIndexSet_(*
this),
911 _L(L), _periodic(periodic), _coarseSize(s), _overlap(
overlap),
912 keep_ovlp(
true), adaptRefCount(0), adaptActive(
false)
917 std::fill(o.begin(), o.end(), 0);
918 iTupel o_interior(o);
919 iTupel s_interior(s);
925 for (
int i=0; i<dim; i++)
928 int toosmall = (s_interior[i] < 2*
overlap) &&
929 (periodic[i] || (s_interior[i] != s[i]));
932 MPI_Allreduce(&toosmall, &global, 1, MPI_INT, MPI_LOR,
comm);
934 DUNE_THROW(
Dune::GridError,
"YaspGrid does not support degrees of freedom shared by more than immediately neighboring subdomains." 935 " Note that this also holds for DOFs on subdomain boundaries." 936 " Increase grid elements or decrease overlap accordingly.");
938 #endif // #if HAVE_MPI 940 iTupel s_overlap(s_interior);
941 for (
int i=0; i<dim; i++)
943 if ((o_interior[i] -
overlap > 0) || (periodic[i]))
945 if ((o_interior[i] + s_interior[i] +
overlap <= _coarseSize[i]) || (periodic[i]))
949 FieldVector<ctype,dim> upperRightWithOverlap;
951 for (
int i=0; i<dim; i++)
952 upperRightWithOverlap[i] = (L[i] / s[i]) * s_overlap[i];
955 EquidistantCoordinates<ctype,dim> cc(upperRightWithOverlap,s_overlap);
972 template<
class C = Coordinates,
973 typename std::enable_if_t< std::is_same_v<C, EquidistantOffsetCoordinates<ctype,dim> >,
int> = 0>
975 Dune::FieldVector<ctype, dim> upperright,
976 std::array<
int, std::size_t{dim}> s,
977 std::bitset<std::size_t{dim}> periodic = std::bitset<std::size_t{dim}>(0ULL),
981 : ccobj(
comm), _torus(
comm,tag,s,
overlap,partitioner), leafIndexSet_(*
this),
982 _L(upperright - lowerleft),
983 _periodic(periodic), _coarseSize(s), _overlap(
overlap),
984 keep_ovlp(
true), adaptRefCount(0), adaptActive(
false)
989 std::fill(o.begin(), o.end(), 0);
990 iTupel o_interior(o);
991 iTupel s_interior(s);
997 for (
int i=0; i<dim; i++)
1000 int toosmall = (s_interior[i] < 2*
overlap) &&
1001 (periodic[i] || (s_interior[i] != s[i]));
1004 MPI_Allreduce(&toosmall, &global, 1, MPI_INT, MPI_LOR,
comm);
1006 DUNE_THROW(
Dune::GridError,
"YaspGrid does not support degrees of freedom shared by more than immediately neighboring subdomains." 1007 " Note that this also holds for DOFs on subdomain boundaries." 1008 " Increase grid elements or decrease overlap accordingly.");
1010 #endif // #if HAVE_MPI 1012 iTupel s_overlap(s_interior);
1013 for (
int i=0; i<dim; i++)
1015 if ((o_interior[i] -
overlap > 0) || (periodic[i]))
1017 if ((o_interior[i] + s_interior[i] +
overlap <= _coarseSize[i]) || (periodic[i]))
1021 FieldVector<ctype,dim> upperRightWithOverlap;
1022 for (
int i=0; i<dim; i++)
1023 upperRightWithOverlap[i] = lowerleft[i]
1024 + s_overlap[i] * (upperright[i]-lowerleft[i]) / s[i];
1026 EquidistantOffsetCoordinates<ctype,dim> cc(lowerleft,upperRightWithOverlap,s_overlap);
1041 template<
class C = Coordinates,
1042 typename std::enable_if_t< std::is_same_v<C, TensorProductCoordinates<ctype,dim> >,
int> = 0>
1043 YaspGrid (std::array<std::vector<ctype>, std::size_t{dim}> coords,
1044 std::bitset<std::size_t{dim}> periodic = std::bitset<std::size_t{dim}>(0ULL),
1048 : ccobj(
comm), _torus(
comm,tag,Dune::Yasp::sizeArray<dim>(coords),
overlap,partitioner),
1049 leafIndexSet_(*
this), _periodic(periodic), _overlap(
overlap),
1050 keep_ovlp(
true), adaptRefCount(0), adaptActive(
false)
1053 DUNE_THROW(
Dune::GridError,
"Setup of a tensorproduct grid requires monotonous sequences of coordinates.");
1058 for (
int i=0; i<dim; i++) {
1059 _coarseSize[i] = coords[i].size() - 1;
1060 _L[i] = coords[i][_coarseSize[i]] - coords[i][0];
1064 std::fill(o.begin(), o.end(), 0);
1065 iTupel o_interior(o);
1066 iTupel s_interior(_coarseSize);
1068 _torus.
partition(_torus.
rank(),o,_coarseSize,o_interior,s_interior);
1072 for (
int i=0; i<dim; i++)
1075 int toosmall = (s_interior[i] < 2*
overlap) &&
1076 (periodic[i] || (s_interior[i] != _coarseSize[i]));
1079 MPI_Allreduce(&toosmall, &global, 1, MPI_INT, MPI_LOR,
comm);
1081 DUNE_THROW(
Dune::GridError,
"YaspGrid does not support degrees of freedom shared by more than immediately neighboring subdomains." 1082 " Note that this also holds for DOFs on subdomain boundaries." 1083 " Increase grid elements or decrease overlap accordingly.");
1085 #endif // #if HAVE_MPI 1088 std::array<std::vector<ctype>,dim> newcoords;
1089 std::array<int, dim> offset(o_interior);
1092 for (
int i=0; i<dim; ++i)
1095 typename std::vector<ctype>::iterator
begin = coords[i].begin() + o_interior[i];
1096 typename std::vector<ctype>::iterator
end =
begin + s_interior[i] + 1;
1100 if (o_interior[i] -
overlap > 0)
1105 if (o_interior[i] + s_interior[i] +
overlap < _coarseSize[i])
1114 if ((periodic[i]) && (o_interior[i] + s_interior[i] +
overlap >= _coarseSize[i]))
1117 typename std::vector<ctype>::iterator it = coords[i].begin();
1119 newcoords[i].push_back(newcoords[i].back() - *it + *(++it));
1122 if ((periodic[i]) && (o_interior[i] -
overlap <= 0))
1127 typename std::vector<ctype>::iterator it = coords[i].end() - 1;
1129 newcoords[i].insert(newcoords[i].
begin(), newcoords[i].
front() - *it + *(--it));
1133 TensorProductCoordinates<ctype,dim> cc(newcoords, offset);
1156 YaspGrid (std::array<std::vector<ctype>, std::size_t{dim}> coords,
1157 std::bitset<std::size_t{dim}> periodic,
1160 std::array<int,dim> coarseSize,
1162 : ccobj(
comm), _torus(
comm,tag,coarseSize,
overlap,partitioner), leafIndexSet_(*
this),
1163 _periodic(periodic), _coarseSize(coarseSize), _overlap(
overlap),
1164 keep_ovlp(
true), adaptRefCount(0), adaptActive(
false)
1167 static_assert(std::is_same<Coordinates,TensorProductCoordinates<ctype,dim> >::value,
1168 "YaspGrid coordinate container template parameter and given constructor values do not match!");
1171 DUNE_THROW(
Dune::GridError,
"Setup of a tensorproduct grid requires monotonous sequences of coordinates.");
1173 for (
int i=0; i<dim; i++)
1174 _L[i] = coords[i][coords[i].
size() - 1] - coords[i][0];
1178 std::array<int,dim> o;
1179 std::fill(o.begin(), o.end(), 0);
1180 std::array<int,dim> o_interior(o);
1181 std::array<int,dim> s_interior(coarseSize);
1183 _torus.
partition(_torus.
rank(),o,coarseSize,o_interior,s_interior);
1186 std::array<int,dim> offset(o_interior);
1187 for (
int i=0; i<dim; i++)
1188 if ((periodic[i]) || (o_interior[i] > 0))
1191 TensorProductCoordinates<ctype,dim> cc(coords, offset);
1212 return _levels.size()-1;
1220 "Coarsening " << -refCount <<
" levels requested!");
1223 for (
int k=refCount; k<0; k++)
1227 _levels.back() = empty;
1231 indexsets.pop_back();
1235 for (
int k=0; k<refCount; k++)
1238 YGridLevel& cg = _levels[
maxLevel()];
1240 std::bitset<dim> ovlp_low(0ULL), ovlp_up(0ULL);
1241 for (
int i=0; i<dim; i++)
1243 if (cg.overlap[0].dataBegin()->origin(i) > 0 || _periodic[i])
1245 if (cg.overlap[0].dataBegin()->max(i) + 1 <
globalSize(i) || _periodic[i])
1249 Coordinates newcont(cg.coords.refine(ovlp_low, ovlp_up, cg.overlapSize, keep_ovlp));
1251 int overlap = (keep_ovlp) ? 2*cg.overlapSize : cg.overlapSize;
1255 for (
int i=0; i<dim; i++)
1256 o_interior[i] = 2*cg.interior[0].dataBegin()->origin(i);
1259 _levels.resize(_levels.size() + 1);
1272 keep_ovlp = keepPhysicalOverlap;
1288 assert(adaptActive ==
false);
1289 if (e.level() !=
maxLevel())
return false;
1290 adaptRefCount =
std::max(adaptRefCount, refCount);
1302 return ( e.level() ==
maxLevel() ) ? adaptRefCount : 0;
1309 return (adaptRefCount > 0);
1316 adaptRefCount =
comm().max(adaptRefCount);
1317 return (adaptRefCount < 0);
1323 adaptActive =
false;
1328 template<
int cd, PartitionIteratorType pitype>
1331 return levelbegin<cd,pitype>(level);
1335 template<
int cd, PartitionIteratorType pitype>
1338 return levelend<cd,pitype>(level);
1345 return levelbegin<cd,All_Partition>(level);
1352 return levelend<cd,All_Partition>(level);
1356 template<
int cd, PartitionIteratorType pitype>
1359 return levelbegin<cd,pitype>(
maxLevel());
1363 template<
int cd, PartitionIteratorType pitype>
1366 return levelend<cd,pitype>(
maxLevel());
1373 return levelbegin<cd,All_Partition>(
maxLevel());
1380 return levelend<cd,All_Partition>(
maxLevel());
1384 template <
typename Seed>
1388 const int codim = Seed::codimension;
1395 return Entity(EntityImp(g,YIterator(g->overlapfront[codim],seed.impl().coord(),seed.impl().offset())));
1402 return g->overlapSize;
1409 return g->overlapSize;
1413 int ghostSize ([[maybe_unused]]
int level, [[maybe_unused]]
int codim)
const 1425 int size (
int level,
int codim)
const 1431 for (
auto it = g->overlapfront[codim].dataBegin(); it != g->overlapfront[codim].dataEnd(); ++it)
1432 count += it->totalsize();
1446 return (type.isCube()) ?
size(level,dim-type.dim()) : 0;
1470 template<
class DataHandleImp,
class DataType>
1473 YaspCommunicateMeta<dim,dim>::comm(*
this,data,iftype,dir,level);
1480 template<
class DataHandleImp,
class DataType>
1483 YaspCommunicateMeta<dim,dim>::comm(*
this,data,iftype,dir,this->
maxLevel());
1490 template<
class DataHandle,
int codim>
1494 if (!data.contains(dim,codim))
return;
1497 typedef typename DataHandle::DataType DataType;
1508 sendlist = &g->send_interiorborder_interiorborder[codim];
1509 recvlist = &g->recv_interiorborder_interiorborder[codim];
1513 sendlist = &g->send_interiorborder_overlapfront[codim];
1514 recvlist = &g->recv_overlapfront_interiorborder[codim];
1518 sendlist = &g->send_overlap_overlapfront[codim];
1519 recvlist = &g->recv_overlapfront_overlap[codim];
1523 sendlist = &g->send_overlapfront_overlapfront[codim];
1524 recvlist = &g->recv_overlapfront_overlapfront[codim];
1529 std::swap(sendlist,recvlist);
1534 std::vector<int> send_size(sendlist->
size(),-1);
1535 std::vector<int> recv_size(recvlist->
size(),-1);
1536 std::vector<size_t*> send_sizes(sendlist->
size(),
static_cast<size_t*
>(0));
1537 std::vector<size_t*> recv_sizes(recvlist->
size(),
static_cast<size_t*
>(0));
1542 if (data.fixedSize(dim,codim))
1546 for (ListIt is=sendlist->
begin(); is!=sendlist->
end(); ++is)
1550 send_size[cnt] = is->grid.totalsize() * data.size(*it);
1554 for (ListIt is=recvlist->
begin(); is!=recvlist->
end(); ++is)
1558 recv_size[cnt] = is->grid.totalsize() * data.size(*it);
1566 for (ListIt is=sendlist->
begin(); is!=sendlist->
end(); ++is)
1569 size_t *buf =
new size_t[is->grid.totalsize()];
1570 send_sizes[cnt] = buf;
1573 int i=0;
size_t n=0;
1578 for ( ; it!=itend; ++it)
1580 buf[i] = data.size(*it);
1589 torus().
send(is->rank,buf,is->grid.totalsize()*
sizeof(size_t));
1595 for (ListIt is=recvlist->
begin(); is!=recvlist->
end(); ++is)
1598 size_t *buf =
new size_t[is->grid.totalsize()];
1599 recv_sizes[cnt] = buf;
1602 torus().
recv(is->rank,buf,is->grid.totalsize()*
sizeof(size_t));
1611 for (ListIt is=sendlist->
begin(); is!=sendlist->
end(); ++is)
1613 delete[] send_sizes[cnt];
1614 send_sizes[cnt] = 0;
1620 for (ListIt is=recvlist->
begin(); is!=recvlist->
end(); ++is)
1623 size_t *buf = recv_sizes[cnt];
1627 for (
int i=0; i<is->grid.totalsize(); ++i)
1638 std::vector<DataType*> sends(sendlist->
size(),
static_cast<DataType*
>(0));
1640 for (ListIt is=sendlist->
begin(); is!=sendlist->
end(); ++is)
1643 DataType *buf =
new DataType[send_size[cnt]];
1649 MessageBuffer<DataType> mb(buf);
1656 for ( ; it!=itend; ++it)
1657 data.gather(mb,*it);
1660 torus().
send(is->rank,buf,send_size[cnt]*
sizeof(DataType));
1665 std::vector<DataType*> recvs(recvlist->
size(),
static_cast<DataType*
>(0));
1667 for (ListIt is=recvlist->
begin(); is!=recvlist->
end(); ++is)
1670 DataType *buf =
new DataType[recv_size[cnt]];
1676 torus().
recv(is->rank,buf,recv_size[cnt]*
sizeof(DataType));
1685 for (ListIt is=sendlist->
begin(); is!=sendlist->
end(); ++is)
1687 delete[] sends[cnt];
1694 for (ListIt is=recvlist->
begin(); is!=recvlist->
end(); ++is)
1697 DataType *buf = recvs[cnt];
1700 MessageBuffer<DataType> mb(buf);
1703 if (data.fixedSize(dim,codim))
1707 size_t n=data.size(*it);
1710 for ( ; it!=itend; ++it)
1711 data.scatter(mb,*it,n);
1716 size_t *sbuf = recv_sizes[cnt];
1721 for ( ; it!=itend; ++it)
1722 data.scatter(mb,*it,sbuf[i++]);
1735 return theglobalidset;
1740 return theglobalidset;
1745 if (level<0 || level>
maxLevel()) DUNE_THROW(RangeError,
"level out of range");
1746 return *(indexsets[level]);
1751 return leafIndexSet_;
1776 template<int codim_, int dim_, class GridImp_, template<int,int,class> class EntityImp_>
1792 void write (
const Y& data)
1794 static_assert(( std::is_same<DT,Y>::value ),
"DataType mismatch");
1800 void read (Y& data)
const 1802 static_assert(( std::is_same<DT,Y>::value ),
"DataType mismatch");
1813 template<
int cd, PartitionIteratorType pitype>
1817 if (level<0 || level>
maxLevel()) DUNE_THROW(RangeError,
"level out of range");
1828 return levelend <cd, pitype> (level);
1830 DUNE_THROW(
GridError,
"YaspLevelIterator with this codim or partition type not implemented");
1834 template<
int cd, PartitionIteratorType pitype>
1835 YaspLevelIterator<cd,pitype,GridImp> levelend (
int level)
const 1838 if (level<0 || level>
maxLevel()) DUNE_THROW(RangeError,
"level out of range");
1841 return YaspLevelIterator<cd,pitype,GridImp>(g,g->interior[cd].end());
1843 return YaspLevelIterator<cd,pitype,GridImp>(g,g->interiorborder[cd].end());
1845 return YaspLevelIterator<cd,pitype,GridImp>(g,g->overlap[cd].end());
1847 return YaspLevelIterator<cd,pitype,GridImp>(g,g->overlapfront[cd].end());
1849 DUNE_THROW(GridError,
"YaspLevelIterator with this codim or partition type not implemented");
1854 Torus<Communication,dim> _torus;
1856 std::vector< std::shared_ptr< YaspIndexSet<const YaspGrid<dim,Coordinates>,
false > > > indexsets;
1857 YaspIndexSet<const YaspGrid<dim,Coordinates>,
true> leafIndexSet_;
1858 YaspGlobalIdSet<const YaspGrid<dim,Coordinates> > theglobalidset;
1860 Dune::FieldVector<ctype, dim> _L;
1862 std::bitset<dim> _periodic;
1864 ReservedVector<YGridLevel,32> _levels;
1872 template<
typename ctype,
int dim>
1874 std::array<
int, std::size_t{dim}>,
1875 std::bitset<std::size_t{dim}> = std::bitset<std::size_t{dim}>{0ULL},
1878 const Yasp::Partitioning<dim>* = YaspGrid<dim, EquidistantCoordinates<ctype, dim>>::defaultPartitioner())
1879 ->
YaspGrid< dim, EquidistantCoordinates<ctype, dim> >;
1881 template<
typename ctype,
int dim>
1883 FieldVector<ctype, dim>,
1884 std::array<
int, std::size_t{dim}>,
1885 std::bitset<std::size_t{dim}> = std::bitset<std::size_t{dim}>{0ULL},
1888 const Yasp::Partitioning<dim>* = YaspGrid<dim, EquidistantOffsetCoordinates<ctype, dim>>::defaultPartitioner())
1889 ->
YaspGrid< dim, EquidistantOffsetCoordinates<ctype, dim> >;
1891 template<
typename ctype, std::
size_t dim>
1893 std::bitset<dim> = std::bitset<dim>{0ULL},
1896 const Yasp::Partitioning<dim>* =
YaspGrid<
int{dim}, TensorProductCoordinates<ctype,
int{dim}>>::defaultPartitioner())
1897 ->
YaspGrid<
int{dim}, TensorProductCoordinates<ctype,
int{dim}> >;
1900 template <
int d,
class CC>
1901 std::ostream& operator<< (std::ostream& s, const YaspGrid<d,CC>& grid)
1905 s <<
"[" << rank <<
"]:" <<
" YaspGrid maxlevel=" << grid.maxLevel() << std::endl;
1907 s <<
"Printing the torus: " <<std::endl;
1908 s << grid.torus() << std::endl;
1912 s <<
"[" << rank <<
"]: " << std::endl;
1913 s <<
"[" << rank <<
"]: " <<
"==========================================" << std::endl;
1914 s <<
"[" << rank <<
"]: " <<
"level=" << g->level() << std::endl;
1916 for (
int codim = 0; codim < d + 1; ++codim)
1918 s <<
"[" << rank <<
"]: " <<
"overlapfront[" << codim <<
"]: " << g->overlapfront[codim] << std::endl;
1919 s <<
"[" << rank <<
"]: " <<
"overlap[" << codim <<
"]: " << g->overlap[codim] << std::endl;
1920 s <<
"[" << rank <<
"]: " <<
"interiorborder[" << codim <<
"]: " << g->interiorborder[codim] << std::endl;
1921 s <<
"[" << rank <<
"]: " <<
"interior[" << codim <<
"]: " << g->interior[codim] << std::endl;
1924 for (I i=g->send_overlapfront_overlapfront[codim].begin();
1925 i!=g->send_overlapfront_overlapfront[codim].end(); ++i)
1926 s <<
"[" << rank <<
"]: " <<
" s_of_of[" << codim <<
"] to rank " 1927 << i->rank <<
" " << i->grid << std::endl;
1929 for (I i=g->recv_overlapfront_overlapfront[codim].begin();
1930 i!=g->recv_overlapfront_overlapfront[codim].end(); ++i)
1931 s <<
"[" << rank <<
"]: " <<
" r_of_of[" << codim <<
"] to rank " 1932 << i->rank <<
" " << i->grid << std::endl;
1934 for (I i=g->send_overlap_overlapfront[codim].begin();
1935 i!=g->send_overlap_overlapfront[codim].end(); ++i)
1936 s <<
"[" << rank <<
"]: " <<
" s_o_of[" << codim <<
"] to rank " 1937 << i->rank <<
" " << i->grid << std::endl;
1939 for (I i=g->recv_overlapfront_overlap[codim].begin();
1940 i!=g->recv_overlapfront_overlap[codim].end(); ++i)
1941 s <<
"[" << rank <<
"]: " <<
" r_of_o[" << codim <<
"] to rank " 1942 << i->rank <<
" " << i->grid << std::endl;
1944 for (I i=g->send_interiorborder_interiorborder[codim].begin();
1945 i!=g->send_interiorborder_interiorborder[codim].end(); ++i)
1946 s <<
"[" << rank <<
"]: " <<
" s_ib_ib[" << codim <<
"] to rank " 1947 << i->rank <<
" " << i->grid << std::endl;
1949 for (I i=g->recv_interiorborder_interiorborder[codim].begin();
1950 i!=g->recv_interiorborder_interiorborder[codim].end(); ++i)
1951 s <<
"[" << rank <<
"]: " <<
" r_ib_ib[" << codim <<
"] to rank " 1952 << i->rank <<
" " << i->grid << std::endl;
1954 for (I i=g->send_interiorborder_overlapfront[codim].begin();
1955 i!=g->send_interiorborder_overlapfront[codim].end(); ++i)
1956 s <<
"[" << rank <<
"]: " <<
" s_ib_of[" << codim <<
"] to rank " 1957 << i->rank <<
" " << i->grid << std::endl;
1959 for (I i=g->recv_overlapfront_interiorborder[codim].begin();
1960 i!=g->recv_overlapfront_interiorborder[codim].end(); ++i)
1961 s <<
"[" << rank <<
"]: " <<
" r_of_ib[" << codim <<
"] to rank " 1962 << i->rank <<
" " << i->grid << std::endl;
1971 namespace Capabilities
1981 template<
int dim,
class Coordinates>
1984 static const bool v =
true;
1990 template<
int dim,
class Coordinates>
1993 static const bool v =
true;
1994 static const unsigned int topologyId = GeometryTypes::cube(dim).id();
2000 template<
int dim,
class Coordinates>
2003 static const bool v =
true;
2009 template<
int dim,
class Coordinates,
int codim>
2012 static const bool v =
true;
2019 template<
int dim,
class Coordinates,
int codim>
2022 static const bool v =
true;
2028 template<
int dim,
int codim,
class Coordinates>
2031 static const bool v =
true;
2037 template<
int dim,
class Coordinates>
2040 static const bool v =
true;
2046 template<
int dim,
class Coordinates>
2049 static const bool v =
true;
2055 template<
int dim,
class Coordinates>
2058 static const bool v =
true;
bool getRefineOption() const
Definition: yaspgrid.hh:284
bigunsignedint< dim *yaspgrid_dim_bits+yaspgrid_level_bits+dim > PersistentIndexType
Definition: yaspgrid.hh:712
The YaspIntersectionIterator class.
double partition(int rank, iTupel origin_in, iTupel size_in, iTupel &origin_out, iTupel &size_out) const
partition the given grid onto the torus and return the piece of the process with given rank; returns ...
Definition: torus.hh:239
iTupel levelSize(int l) const
return size vector of the grid (in cells) on level l
Definition: yaspgrid.hh:270
Iterator over a collection o YGrids A YGrid::Iterator is the heart of an entity in YaspGrid...
Definition: ygrid.hh:593
void boundarysegmentssize()
Definition: yaspgrid.hh:683
void makelevel(const Coordinates &coords, std::bitset< dim > periodic, iTupel o_interior, int overlap)
Make a new YGridLevel structure.
Definition: yaspgrid.hh:327
const YaspGrid< dim, Coordinates > GridImp
Definition: yaspgrid.hh:675
const Dune::FieldVector< ctype, dim > & domainSize() const
returns the size of the physical domain
Definition: yaspgrid.hh:1462
iTupel coord() const
return own coordinates
Definition: torus.hh:100
YGridLevelIterator end() const
return iterator pointing to one past the finest level
Definition: yaspgrid.hh:307
Specialize with 'true' if the grid is a Cartesian grid. Cartesian grids satisfy the following propert...
Definition: common/capabilities.hh:47
send/receive interior and border entities
Definition: gridenums.hh:87
const Torus< Communication, dim > & torus() const
return reference to torus
Definition: yaspgrid.hh:246
int max(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:337
int size(int codim) const
number of leaf entities per codim in this process
Definition: yaspgrid.hh:1438
A Traits struct that collects all associated types of one implementation.
Definition: common/grid.hh:410
The YaspLevelIterator class.
void intersections(const YGridComponent< Coordinates > &sendgrid, const YGridComponent< Coordinates > &recvgrid, std::deque< Intersection > &sendlist, std::deque< Intersection > &recvlist)
Construct list of intersections with neighboring processors.
Definition: yaspgrid.hh:561
typename GridFamily::Traits::Communication Communication
A type that is a model of Dune::Communication. It provides a portable way for communication on the se...
Definition: common/grid.hh:515
concept MessageBuffer
Model of a message buffer.
Definition: messagebuffer.hh:17
int size() const
return the size of the container, this is the sum of the sizes of all deques
Definition: ygrid.hh:953
Traits::template Codim< cd >::template Partition< All_Partition >::LevelIterator lbegin(int level) const
version without second template parameter for convenience
Definition: yaspgrid.hh:1343
the YaspEntity class and its specializations
static const bool v
Definition: common/capabilities.hh:50
typename Base::Communication Communication
Definition: yaspgrid.hh:181
Specialization of the PersistentContainer for YaspGrid.
static const bool v
Definition: common/capabilities.hh:98
implements a collection of YGridComponents which form a codimension Entities of given codimension c n...
Definition: ygrid.hh:550
Traits::template Codim< cd >::template Partition< All_Partition >::LeafIterator leafbegin() const
return LeafIterator which points to the first entity in maxLevel
Definition: yaspgrid.hh:1371
only interior entities
Definition: gridenums.hh:137
int ghostSize([[maybe_unused]] int level, [[maybe_unused]] int codim) const
return size (= distance in graph) of ghost region
Definition: yaspgrid.hh:1413
Definition: defaultgridview.hh:25
Specialize with 'true' for if the codimension 0 entity of the grid has only one possible geometry typ...
Definition: common/capabilities.hh:26
constexpr Front front
PartitionSet for the front partition.
Definition: partitionset.hh:280
void init()
Definition: yaspgrid.hh:677
send overlap, receive all entities
Definition: gridenums.hh:90
YaspGrid(const Coordinates &coordinates, std::bitset< dim > periodic=std::bitset< dim >(0ULL), int overlap=1, Communication comm=Communication(), const Yasp::Partitioning< dim > *partitioner=defaultPartitioner())
Definition: yaspgrid.hh:731
static const bool v
Definition: common/capabilities.hh:116
const int yaspgrid_level_bits
Definition: yaspgrid.hh:48
void send(int rank, void *buffer, int size) const
store a send request; buffers are sent in order; handles also local requests with memcpy ...
Definition: torus.hh:361
IndexSet< const GridImp, LeafIndexSetImp, LeafIndexType, LeafGeometryTypes > LeafIndexSet
The type of the leaf index set.
Definition: common/grid.hh:1082
The YaspIntersection class.
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lbegin(int level) const
one past the end on this level
Definition: yaspgrid.hh:1329
IndexSet< const GridImp, LevelIndexSetImp, LevelIndexType, LevelGeometryTypes > LevelIndexSet
The type of the level index set.
Definition: common/grid.hh:1080
implements a collection of multiple std::deque<Intersection> Intersections with neighboring processor...
Definition: ygrid.hh:822
[ provides Dune::Grid ]
Definition: yaspgrid.hh:54
const int yaspgrid_dim_bits
Definition: yaspgrid.hh:47
Specialization of the StructuredGridFactory class for YaspGrid.
Traits::template Codim< cd >::template Partition< All_Partition >::LevelIterator lend(int level) const
version without second template parameter for convenience
Definition: yaspgrid.hh:1350
void recv(int rank, void *buffer, int size) const
store a receive request; buffers are received in order; handles also local requests with memcpy ...
Definition: torus.hh:374
static const bool v
Definition: common/capabilities.hh:125
int overlapSize([[maybe_unused]] int odim) const
return size (= distance in graph) of overlap region
Definition: yaspgrid.hh:1406
Specialize with 'true' for all codims that a grid implements entities for. (default=false) ...
Definition: common/capabilities.hh:57
This provides container classes for the coordinates to be used in YaspGrid Upon implementation of the...
concept Intersection
Model of an intersection.
Definition: concepts/intersection.hh:23
void communicate(CommDataHandleIF< DataHandleImp, DataType > &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition: yaspgrid.hh:1471
bool checkIfMonotonous(const std::array< std::vector< ctype >, dim > &coords)
Definition: coordinates.hh:372
all entities
Definition: gridenums.hh:141
level-wise, non-persistent, consecutive indices for YaspGrid
void postAdapt()
clean up some markers
Definition: yaspgrid.hh:1321
The YaspEntitySeed class.
Definition: partitioning.hh:46
YaspIntersectionIterator enables iteration over intersections with neighboring codim 0 entities...
Definition: yaspgrid.hh:59
Iterator begin() const
return iterator pointing to the begin of the container
Definition: ygrid.hh:923
Communication< MPI_Comm > YaspCommunication
Definition: yaspgrid.hh:85
friend class Entity
Model of a grid entity.
Definition: yaspgrid.hh:1777
YaspGrid(Dune::FieldVector< ctype, dim > lowerleft, Dune::FieldVector< ctype, dim > upperright, std::array< int, std::size_t{dim}> s, std::bitset< std::size_t{dim}> periodic=std::bitset< std::size_t{dim}>(0ULL), int overlap=1, Communication comm=Communication(), const Yasp::Partitioning< dim > *partitioner=defaultPartitioner())
Definition: yaspgrid.hh:974
IdSet< const GridImp, LocalIdSetImp, LIDType > LocalIdSet
The type of the local id set.
Definition: common/grid.hh:1086
Different resources needed by all grid implementations.
ProcListIterator recvbegin() const
first process in receive list
Definition: torus.hh:349
send interior and border, receive all entities
Definition: gridenums.hh:88
Specialize with 'true' if implementation guarantees a conforming leaf grid. (default=false) ...
Definition: common/capabilities.hh:114
int overlapSize(int level, [[maybe_unused]] int codim) const
return size (= distance in graph) of overlap region
Definition: yaspgrid.hh:1399
int maxLevel() const
Definition: yaspgrid.hh:1210
reverse communication direction
Definition: gridenums.hh:172
YGridLevelIterator begin(int i) const
return iterator pointing to given level
Definition: yaspgrid.hh:299
only ghost entities
Definition: gridenums.hh:142
The YaspGeometry class and its specializations.
int size(int level, int codim) const
number of entities per level and codim in this process
Definition: yaspgrid.hh:1425
Traits::template Codim< cd >::template Partition< pitype >::LeafIterator leafbegin() const
return LeafIterator which points to the first entity in maxLevel
Definition: yaspgrid.hh:1357
Definition: yaspgrid.hh:64
YaspGridFamily< dim, Coordinates > GridFamily
the GridFamily of this grid
Definition: yaspgrid.hh:715
IdSet< const GridImp, GlobalIdSetImp, GIDType > GlobalIdSet
The type of the global id set.
Definition: common/grid.hh:1084
const Traits::LevelIndexSet & levelIndexSet(int level) const
Definition: yaspgrid.hh:1743
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:170
This file provides the infrastructure for toroidal communication in YaspGrid.
send all and receive all entities
Definition: gridenums.hh:91
YaspGrid(FieldVector< ctype, dim >, std::array< int, std::size_t{dim}>, std::bitset< std::size_t{dim}>=std::bitset< std::size_t{dim}>{0ULL}, int=1, YaspCommunication=YaspCommunication(), const Yasp::Partitioning< dim > *=YaspGrid< dim, EquidistantCoordinates< ctype, dim >>::defaultPartitioner()) -> YaspGrid< dim, EquidistantCoordinates< ctype, dim > >
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition: coordinates.hh:130
Definition: yaspgrid.hh:56
ReservedVector< YGridLevel, 32 >::const_iterator YGridLevelIterator
Iterator over the grid levels.
Definition: yaspgrid.hh:290
Coordinates::ctype ctype
Type used for coordinates.
Definition: yaspgrid.hh:179
GridTraits< dim, dim, Dune::YaspGrid< dim, Coordinates >, YaspGeometry, YaspEntity, YaspLevelIterator, YaspIntersection, YaspIntersection, YaspIntersectionIterator, YaspIntersectionIterator, YaspHierarchicIterator, YaspLevelIterator, YaspIndexSet< const YaspGrid< dim, Coordinates >, false >, YaspIndexSet< const YaspGrid< dim, Coordinates >, true >, YaspGlobalIdSet< const YaspGrid< dim, Coordinates > >, bigunsignedint< dim *yaspgrid_dim_bits+yaspgrid_level_bits+dim >, YaspGlobalIdSet< const YaspGrid< dim, Coordinates > >, bigunsignedint< dim *yaspgrid_dim_bits+yaspgrid_level_bits+dim >, CCType, DefaultLevelGridViewTraits, DefaultLeafGridViewTraits, YaspEntitySeed, YaspGeometry, unsigned int, std::array< GeometryType, 1 > > Traits
Definition: yaspgrid.hh:118
bool preAdapt()
returns true, if the grid will be coarsened
Definition: yaspgrid.hh:1313
const Traits::LeafIndexSet & leafIndexSet() const
Definition: yaspgrid.hh:1749
const Traits::LocalIdSet & localIdSet() const
Definition: yaspgrid.hh:1738
Traits::template Codim< cd >::template Partition< All_Partition >::LeafIterator leafend() const
return LeafIterator which points behind the last entity in maxLevel
Definition: yaspgrid.hh:1378
Iterator end() const
return iterator pointing to the end of the container
Definition: ygrid.hh:929
int size(GeometryType type) const
number of leaf entities per geometry type in this process
Definition: yaspgrid.hh:1450
Definition: defaultgridview.hh:211
facility for writing and reading grids
Definition: common/backuprestore.hh:42
Definition: common/geometry.hh:28
void communicate(CommDataHandleIF< DataHandleImp, DataType > &data, InterfaceType iftype, CommunicationDirection dir) const
Definition: yaspgrid.hh:1481
ProcListIterator sendend() const
end of send list
Definition: torus.hh:343
bool adapt()
map adapt to global refine
Definition: yaspgrid.hh:1306
Traits::template Codim< Seed::codimension >::Entity entity(const Seed &seed) const
Definition: yaspgrid.hh:1386
YaspHierarchicIterator enables iteration over son entities of codim 0.
Definition: yaspgrid.hh:61
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lend(int level) const
Iterator to one past the last entity of given codim on level for partition type.
Definition: yaspgrid.hh:1336
Include standard header files.
Definition: agrid.hh:59
void exchange() const
exchange messages stored in request buffers; clear request buffers afterwards
Definition: torus.hh:387
int getMark(const typename Traits::template Codim< 0 >::Entity &e) const
returns adaptation mark for given entity
Definition: yaspgrid.hh:1300
a base class for the yaspgrid partitioning strategy
Definition: partitioning.hh:37
Iterates over entities of one grid level.
Definition: yaspgrid.hh:58
type describing an intersection with a neighboring processor
Definition: ygrid.hh:828
Container for equidistant coordinates in a YaspGrid.
Definition: coordinates.hh:28
The general version that handles all codimensions but 0 and dim.
Definition: yaspgrid.hh:55
static const bool v
Definition: common/capabilities.hh:75
interior and border entities
Definition: gridenums.hh:138
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition: datahandleif.hh:77
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:86
Specialize with 'true' if implementation guarantees conforming level grids. (default=false) ...
Definition: common/capabilities.hh:105
static const bool v
Definition: common/capabilities.hh:107
static const Yasp::Partitioning< dim > * defaultPartitioner()
Definition: yaspgrid.hh:313
YaspGrid(Dune::FieldVector< ctype, dim > L, std::array< int, std::size_t{dim}> s, std::bitset< std::size_t{dim}> periodic=std::bitset< std::size_t{dim}>{0ULL}, int overlap=1, Communication comm=Communication(), const Yasp::Partitioning< dim > *partitioner=defaultPartitioner())
Definition: yaspgrid.hh:904
static const bool v
Definition: common/capabilities.hh:28
YGridComponent< Coordinates > intersection(const YGridComponent< Coordinates > &r) const
Return YGridComponent of supergrid of self which is the intersection of self and another YGridCompone...
Definition: ygrid.hh:271
specialize with 'true' for all codims that a grid provides an iterator for (default=hasEntity<codim>:...
Definition: common/capabilities.hh:73
YaspCommunication CCType
Definition: yaspgrid.hh:93
ProcListIterator sendbegin() const
first process in send list
Definition: torus.hh:337
A traits struct that collects all associated types of one grid model.
Definition: common/grid.hh:1012
constexpr Overlap overlap
PartitionSet for the overlap partition.
Definition: partitionset.hh:277
void globalRefine(int refCount)
refine the grid refCount times.
Definition: yaspgrid.hh:1216
YaspGlobalIdSet< YaspGrid< dim, Coordinates > > GlobalIdSetType
Definition: yaspgrid.hh:722
persistent, globally unique Ids
Definition: yaspgrid.hh:63
static const bool v
Definition: common/capabilities.hh:59
const Communication & comm() const
return a communication object
Definition: yaspgrid.hh:1756
static const unsigned int topologyId
Definition: common/capabilities.hh:31
YaspIntersection provides data about intersection with neighboring codim 0 entities.
Definition: yaspgrid.hh:60
interior, border, and overlap entities
Definition: gridenums.hh:139
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition: albertagrid/dgfparser.hh:28
static const bool v
Definition: common/capabilities.hh:170
This provides a YGrid, the elemental component of the yaspgrid implementation.
Coordinate container for a tensor product YaspGrid.
Definition: coordinates.hh:244
Describes the minimal information necessary to create a fully functional YaspEntity.
Definition: yaspgrid.hh:57
Provides base classes for index and id sets.
Describes the parallel communication interface class for MessageBuffers and DataHandles.
YGridComponent< Coordinates > move(iTupel v) const
return grid moved by the vector v
Definition: ygrid.hh:263
Traits::template Codim< cd >::template Partition< pitype >::LeafIterator leafend() const
return LeafIterator which points behind the last entity in maxLevel
Definition: yaspgrid.hh:1364
const Traits::GlobalIdSet & globalIdSet() const
Definition: yaspgrid.hh:1733
YaspIndexSet< YaspGrid< dim, Coordinates >, true > LeafIndexSetType
Definition: yaspgrid.hh:721
Specialize with 'true' if implementation provides backup and restore facilities. (default=false) ...
Definition: common/capabilities.hh:123
YGridLevelIterator begin() const
return iterator pointing to coarsest level
Definition: yaspgrid.hh:293
Wrapper class for entities.
Definition: common/entity.hh:65
int rank() const
return own rank
Definition: torus.hh:94
iTupel globalSize() const
return number of cells on finest level on all processors
Definition: yaspgrid.hh:258
specialize with 'true' for all codims that a grid can communicate data on (default=false) ...
Definition: common/capabilities.hh:96
Definition: yaspgrid.hh:91
size_t numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition: yaspgrid.hh:1456
int globalSize(int i) const
return number of cells on finest level in given direction on all processors
Definition: yaspgrid.hh:252
int size(int level, GeometryType type) const
number of entities per level and geometry type in this process
Definition: yaspgrid.hh:1444
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:132
Implementation of Level- and LeafIndexSets for YaspGrid.
Definition: yaspgrid.hh:62
int ghostSize([[maybe_unused]] int codim) const
return size (= distance in graph) of ghost region
Definition: yaspgrid.hh:1419
void refineOptions(bool keepPhysicalOverlap)
set options for refinement
Definition: yaspgrid.hh:1270
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:18
A set of traits classes to store static information about grid implementation.
YaspGrid(std::array< std::vector< ctype >, std::size_t{dim}> coords, std::bitset< std::size_t{dim}> periodic=std::bitset< std::size_t{dim}>(0ULL), int overlap=1, Communication comm=Communication(), const Yasp::Partitioning< dim > *partitioner=defaultPartitioner())
Standard constructor for a tensorproduct YaspGrid.
Definition: yaspgrid.hh:1043
bool isPeriodic(int i) const
return whether the grid is periodic in direction i
Definition: yaspgrid.hh:279
GridFamily::Traits::template Codim< cd >::Entity Entity
A type that is a model of a Dune::Entity<cd,dim,...>.
Definition: common/grid.hh:419
Specialize with 'true' if the grid implementation is thread safe, while it is not modified...
Definition: common/capabilities.hh:169
bool mark(int refCount, const typename Traits::template Codim< 0 >::Entity &e)
Marks an entity to be refined/coarsened in a subsequent adapt.
Definition: yaspgrid.hh:1286
int neighbors() const
return the number of neighbors, which is
Definition: torus.hh:203
void communicateCodim(DataHandle &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition: yaspgrid.hh:1491
send overlap, receive overlap and front entities
Definition: gridenums.hh:89
YaspIndexSet< YaspGrid< dim, Coordinates >, false > LevelIndexSetType
Definition: yaspgrid.hh:720
constexpr Interior interior
PartitionSet for the interior partition.
Definition: partitionset.hh:271
int levelSize(int l, int i) const
return size of the grid (in cells) on level l in direction i
Definition: yaspgrid.hh:264
ProcListIterator recvend() const
last process in receive list
Definition: torus.hh:355
YaspGridFamily< dim, Coordinates >::Traits Traits
Definition: yaspgrid.hh:717
const iTupel & dims() const
return dimensions of torus
Definition: torus.hh:112