5#ifndef DUNE_GRID_YASPGRID_HH
6#define DUNE_GRID_YASPGRID_HH
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;
55 template<
int mydim,
int cdim,
class Gr
idImp>
class YaspGeometry;
56 template<
int codim,
int dim,
class Gr
idImp>
class YaspEntity;
58 template<
int codim, PartitionIteratorType pitype,
class Gr
idImp>
class YaspLevelIterator;
62 template<
class Gr
idImp,
bool isLeafIndexSet>
class YaspIndexSet;
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>
138 static void comm (
const G& g, DataHandle& data, InterfaceType iftype, CommunicationDirection dir,
int level)
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> >
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;
205 std::array<YGrid, dim+1> interior;
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();
330 g.overlapSize = overlap;
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++)
462 origin[i] += overlap;
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.");
797 iTupel s_overlap(s_interior);
798 for (
int i=0; i<dim; i++)
800 if ((o_interior[i] - overlap > 0) || (periodic[i]))
801 s_overlap[i] += overlap;
802 if ((o_interior[i] + s_interior[i] + overlap <= _coarseSize[i]) || (periodic[i]))
803 s_overlap[i] += overlap;
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];
810 if constexpr (std::is_same_v<Coordinates,EquidistantCoordinates<ctype,dim>>)
816 this->
makelevel(coordinatesWithOverlap,periodic,o_interior,overlap);
819 if constexpr (std::is_same_v<Coordinates,EquidistantOffsetCoordinates<ctype,dim>>)
821 Dune::FieldVector<ctype,dim> lowerleft;
822 for (
int i=0; i<dim; i++)
823 lowerleft[i] = coordinates.origin(i);
829 this->
makelevel(coordinatesWithOverlap,periodic,o_interior,overlap);
833 if constexpr (std::is_same_v<Coordinates,TensorProductCoordinates<ctype,dim>>)
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)
850 offset[i] -= overlap;
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]))
869 for (
int j=0; j<overlap; ++j)
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))
875 offset[i] -= overlap;
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));
888 this->
makelevel(coordinatesWithOverlap,periodic,o_interior,overlap);
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);
921 _torus.partition(_torus.rank(),o,s,o_interior,s_interior);
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.");
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);
958 makelevel(cc,periodic,o_interior,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);
993 _torus.partition(_torus.rank(),o,s,o_interior,s_interior);
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.");
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);
1029 makelevel(cc,periodic,o_interior,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),
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.");
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);
1136 makelevel(cc,periodic,o_interior,overlap);
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))
1189 offset[i] -= overlap;
1191 TensorProductCoordinates<ctype,dim> cc(coords, offset);
1194 makelevel(cc,periodic,o_interior,overlap);
1200 friend struct BackupRestoreFacility<
YaspGrid<dim,Coordinates> >;
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);
1260 makelevel(newcont,_periodic,o_interior,overlap);
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>
1385 typename Traits::template Codim<Seed::codimension>::Entity
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();
1444 int size (
int level, GeometryType type)
const
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];
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_;
1774 friend class
Dune::YaspEntity<0, dim, const Dune::YaspGrid<dim, Coordinates> >;
1776 template<int codim_, int dim_, class GridImp_, template<int,int,class> class EntityImp_>
1780 class MessageBuffer {
1783 MessageBuffer (DT *p)
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>
1838 if (level<0 || level>
maxLevel()) DUNE_THROW(RangeError,
"level out of range");
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},
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},
1891 template<
typename ctype, std::
size_t dim>
1893 std::bitset<dim> = std::bitset<dim>{0ULL},
1900 template <
int d,
class CC>
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;
the YaspEntity class and its specializations
The YaspIntersectionIterator class.
This provides a YGrid, the elemental component of the yaspgrid implementation.
Specialization of the StructuredGridFactory class for YaspGrid.
level-wise, non-persistent, consecutive indices for YaspGrid
The YaspIntersection class.
Specialization of the PersistentContainer for YaspGrid.
The YaspGeometry class and its specializations.
This provides container classes for the coordinates to be used in YaspGrid Upon implementation of the...
The YaspLevelIterator class.
This file provides the infrastructure for toroidal communication in YaspGrid.
The YaspEntitySeed class.
Describes the parallel communication interface class for MessageBuffers and DataHandles.
std::ostream & operator<<(std::ostream &out, const PartitionType &type)
write a PartitionType to a stream
Definition gridenums.hh:72
CommunicationDirection
Define a type for communication direction parameter.
Definition gridenums.hh:170
InterfaceType
Parameter to be used for the communication functions.
Definition gridenums.hh:86
@ All_Partition
all entities
Definition gridenums.hh:141
@ Interior_Partition
only interior entities
Definition gridenums.hh:137
@ InteriorBorder_Partition
interior and border entities
Definition gridenums.hh:138
@ Overlap_Partition
interior, border, and overlap entities
Definition gridenums.hh:139
@ Ghost_Partition
only ghost entities
Definition gridenums.hh:142
@ BackwardCommunication
reverse communication direction
Definition gridenums.hh:172
@ InteriorBorder_All_Interface
send interior and border, receive all entities
Definition gridenums.hh:88
@ All_All_Interface
send all and receive all entities
Definition gridenums.hh:91
@ Overlap_All_Interface
send overlap, receive all entities
Definition gridenums.hh:90
@ Overlap_OverlapFront_Interface
send overlap, receive overlap and front entities
Definition gridenums.hh:89
@ InteriorBorder_InteriorBorder_Interface
send/receive interior and border entities
Definition gridenums.hh:87
void swap(Dune::PersistentContainer< G, T > &a, Dune::PersistentContainer< G, T > &b)
Definition utility/persistentcontainer.hh:83
Include standard header files.
Definition agrid.hh:60
const int yaspgrid_level_bits
Definition yaspgrid.hh:48
Communication< MPI_Comm > YaspCommunication
Definition yaspgrid.hh:85
const int yaspgrid_dim_bits
Definition yaspgrid.hh:47
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 > >
constexpr Overlap overlap
PartitionSet for the overlap partition.
Definition partitionset.hh:277
constexpr Front front
PartitionSet for the front partition.
Definition partitionset.hh:280
bool checkIfMonotonous(const std::array< std::vector< ctype >, dim > &coords)
Definition coordinates.hh:372
std::array< int, d > sizeArray(const std::array< std::vector< ct >, d > &v)
Definition ygrid.hh:29
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition common/intersection.hh:164
Specialize with 'true' for if the codimension 0 entity of the grid has only one possible geometry typ...
Definition common/capabilities.hh:27
Specialize with 'true' if the grid is a Cartesian grid. Cartesian grids satisfy the following propert...
Definition common/capabilities.hh:48
Specialize with 'true' for all codims that a grid implements entities for. (default=false).
Definition common/capabilities.hh:58
specialize with 'true' for all codims that a grid provides an iterator for (default=hasEntity<codim>:...
Definition common/capabilities.hh:74
specialize with 'true' for all codims that a grid can communicate data on (default=false)
Definition common/capabilities.hh:97
Specialize with 'true' if implementation guarantees conforming level grids. (default=false).
Definition common/capabilities.hh:106
Specialize with 'true' if implementation guarantees a conforming leaf grid. (default=false).
Definition common/capabilities.hh:115
Specialize with 'true' if implementation provides backup and restore facilities. (default=false).
Definition common/capabilities.hh:124
Specialize with 'true' if the grid implementation is thread safe, while it is not modified....
Definition common/capabilities.hh:169
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition datahandleif.hh:78
Definition defaultgridview.hh:26
Definition defaultgridview.hh:211
Base class for exceptions in Dune grid modules.
Definition exceptions.hh:20
Definition common/grid.hh:848
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
A Traits struct that collects all associated types of one implementation.
Definition common/grid.hh:411
A traits struct that collects all associated types of one grid model.
Definition common/grid.hh:1013
Dune::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 > >::LeafIndexSet IndexSet< const Dune::YaspGrid< dim, Coordinates >, YaspIndexSet< const YaspGrid< dim, Coordinates >, true >, unsigned int, std::array< GeometryType, 1 > > LeafIndexSet
Definition common/grid.hh:1082
Dune::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 > >::LevelIndexSet IndexSet< const Dune::YaspGrid< dim, Coordinates >, YaspIndexSet< const YaspGrid< dim, Coordinates >, false >, unsigned int, std::array< GeometryType, 1 > > LevelIndexSet
Definition common/grid.hh:1080
Dune::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 > >::LocalIdSet IdSet< const Dune::YaspGrid< dim, Coordinates >, YaspGlobalIdSet< const YaspGrid< dim, Coordinates > >, bigunsignedint< dim *yaspgrid_dim_bits+yaspgrid_level_bits+dim > > LocalIdSet
Definition common/grid.hh:1086
Dune::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 > >::GlobalIdSet IdSet< const Dune::YaspGrid< dim, Coordinates >, YaspGlobalIdSet< const YaspGrid< dim, Coordinates > >, bigunsignedint< dim *yaspgrid_dim_bits+yaspgrid_level_bits+dim > > GlobalIdSet
Definition common/grid.hh:1084
[ provides Dune::Grid ]
Definition yaspgrid.hh:166
YaspGridFamily< dim, EquidistantCoordinates< ctype, dim > > GridFamily
Definition yaspgrid.hh:715
YaspIndexSet< YaspGrid< dim, EquidistantCoordinates< ctype, dim > >, false > LevelIndexSetType
Definition yaspgrid.hh:720
int ghostSize(int level, int codim) const
return size (= distance in graph) of ghost region
Definition yaspgrid.hh:1413
const Torus< Communication, dim > & torus() const
return reference to torus
Definition yaspgrid.hh:246
typename Base::Communication Communication
Definition yaspgrid.hh:181
const Traits::LeafIndexSet & leafIndexSet() const
Definition yaspgrid.hh:1749
void init()
Definition yaspgrid.hh:677
Traits::template Codim< cd >::template Partition< All_Partition >::LevelIterator lbegin(int level) const
version without second template parameter for convenience
Definition yaspgrid.hh:1343
int size(int level, GeometryType type) const
number of entities per level and geometry type in this process
Definition yaspgrid.hh:1444
Traits::template Codim< Seed::codimension >::Entity entity(const Seed &seed) const
Definition yaspgrid.hh:1386
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
const Traits::GlobalIdSet & globalIdSet() const
Definition yaspgrid.hh:1733
const Traits::LocalIdSet & localIdSet() const
Definition yaspgrid.hh:1738
YaspGridFamily< dim, EquidistantCoordinates< ctype, dim > >::Traits Traits
Definition yaspgrid.hh:717
bool getRefineOption() const
Definition yaspgrid.hh:284
void globalRefine(int refCount)
refine the grid refCount times.
Definition yaspgrid.hh:1216
int getMark(const typename Traits::template Codim< 0 >::Entity &e) const
returns adaptation mark for given entity
Definition yaspgrid.hh:1300
void boundarysegmentssize()
Definition yaspgrid.hh:683
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
YaspIndexSet< YaspGrid< dim, EquidistantCoordinates< ctype, dim > >, true > LeafIndexSetType
Definition yaspgrid.hh:721
int ghostSize(int codim) const
return size (= distance in graph) of ghost region
Definition yaspgrid.hh:1419
int globalSize(int i) const
return number of cells on finest level in given direction on all processors
Definition yaspgrid.hh:252
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
Traits::template Codim< cd >::template Partition< pitype >::LeafIterator leafend() const
return LeafIterator which points behind the last entity in maxLevel
Definition yaspgrid.hh:1364
void postAdapt()
clean up some markers
Definition yaspgrid.hh:1321
const Dune::FieldVector< ctype, dim > & domainSize() const
returns the size of the physical domain
Definition yaspgrid.hh:1462
YGridLevelIterator end() const
return iterator pointing to one past the finest level
Definition yaspgrid.hh:307
friend class YaspHierarchicIterator
Definition yaspgrid.hh:172
friend class Entity
Definition yaspgrid.hh:1777
int size(GeometryType type) const
number of leaf entities per geometry type in this process
Definition yaspgrid.hh:1450
int maxLevel() const
Definition yaspgrid.hh:1210
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
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
void communicate(CommDataHandleIF< DataHandleImp, DataType > &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition yaspgrid.hh:1471
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
Traits::template Codim< cd >::template Partition< pitype >::LeafIterator leafbegin() const
return LeafIterator which points to the first entity in maxLevel
Definition yaspgrid.hh:1357
bool preAdapt()
returns true, if the grid will be coarsened
Definition yaspgrid.hh:1313
iTupel levelSize(int l) const
return size vector of the grid (in cells) on level l
Definition yaspgrid.hh:270
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 overlapSize(int level, int codim) const
Definition yaspgrid.hh:1399
friend class YaspLevelIterator
Definition yaspgrid.hh:169
void communicate(CommDataHandleIF< DataHandleImp, DataType > &data, InterfaceType iftype, CommunicationDirection dir) const
Definition yaspgrid.hh:1481
int size(int codim) const
number of leaf entities per codim in this process
Definition yaspgrid.hh:1438
bool isPeriodic(int i) const
return whether the grid is periodic in direction i
Definition yaspgrid.hh:279
const Traits::LevelIndexSet & levelIndexSet(int level) const
Definition yaspgrid.hh:1743
void refineOptions(bool keepPhysicalOverlap)
set options for refinement
Definition yaspgrid.hh:1270
int size(int level, int codim) const
number of entities per level and codim in this process
Definition yaspgrid.hh:1425
YaspGlobalIdSet< YaspGrid< dim, EquidistantCoordinates< ctype, dim > > > GlobalIdSetType
Definition yaspgrid.hh:722
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
bool adapt()
map adapt to global refine
Definition yaspgrid.hh:1306
Traits::template Codim< cd >::template Partition< All_Partition >::LevelIterator lend(int level) const
version without second template parameter for convenience
Definition yaspgrid.hh:1350
ReservedVector< YGridLevel, 32 >::const_iterator YGridLevelIterator
Definition yaspgrid.hh:290
size_t numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition yaspgrid.hh:1456
void communicateCodim(DataHandle &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition yaspgrid.hh:1491
void makelevel(const Coordinates &coords, std::bitset< dim > periodic, iTupel o_interior, int overlap)
Make a new YGridLevel structure.
Definition yaspgrid.hh:327
bigunsignedint< dim *yaspgrid_dim_bits+yaspgrid_level_bits+dim > PersistentIndexType
Definition yaspgrid.hh:712
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
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lbegin(int level) const
one past the end on this level
Definition yaspgrid.hh:1329
static const Yasp::Partitioning< dim > * defaultPartitioner()
Definition yaspgrid.hh:313
iTupel globalSize() const
return number of cells on finest level on all processors
Definition yaspgrid.hh:258
const Communication & comm() const
Definition yaspgrid.hh:1756
int overlapSize(int odim) const
return size (= distance in graph) of overlap region
Definition yaspgrid.hh:1406
const YaspGrid< dim, EquidistantCoordinates< ctype, dim > > GridImp
Definition yaspgrid.hh:675
YGridLevelIterator begin(int i) const
return iterator pointing to given level
Definition yaspgrid.hh:299
EquidistantCoordinates< ctype, dim >::ctype ctype
Definition yaspgrid.hh:179
int levelSize(int l, int i) const
return size of the grid (in cells) on level l in direction i
Definition yaspgrid.hh:264
YGridLevelIterator begin() const
return iterator pointing to coarsest level
Definition yaspgrid.hh:293
The general version that handles all codimensions but 0 and dim.
Definition yaspgridgeometry.hh:31
Definition yaspgridentity.hh:242
Describes the minimal information necessary to create a fully functional YaspEntity.
Definition yaspgridentityseed.hh:18
Iterates over entities of one grid level.
Definition yaspgridleveliterator.hh:19
YaspIntersectionIterator enables iteration over intersections with neighboring codim 0 entities.
Definition yaspgridintersectioniterator.hh:22
YaspIntersection provides data about intersection with neighboring codim 0 entities.
Definition yaspgridintersection.hh:22
YaspHierarchicIterator enables iteration over son entities of codim 0.
Definition yaspgridhierarchiciterator.hh:20
Implementation of Level- and LeafIndexSets for YaspGrid.
Definition yaspgridindexsets.hh:25
persistent, globally unique Ids
Definition yaspgrididset.hh:25
Definition yaspgridpersistentcontainer.hh:35
Definition yaspgrid.hh:92
YaspCommunication CCType
Definition yaspgrid.hh:93
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
static const bool v
Definition yaspgrid.hh:1984
static const bool v
Definition yaspgrid.hh:1993
static const unsigned int topologyId
Definition yaspgrid.hh:1994
static const bool v
Definition yaspgrid.hh:2003
static const bool v
Definition yaspgrid.hh:2012
static const bool v
Definition yaspgrid.hh:2022
static const bool v
Definition yaspgrid.hh:2031
static const bool v
Definition yaspgrid.hh:2040
static const bool v
Definition yaspgrid.hh:2049
static const bool v
Definition yaspgrid.hh:2058
Container for equidistant coordinates in a YaspGrid.
Definition coordinates.hh:29
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition coordinates.hh:131
Coordinate container for a tensor product YaspGrid.
Definition coordinates.hh:245
a base class for the yaspgrid partitioning strategy
Definition partitioning.hh:38
Definition partitioning.hh:47
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
int rank() const
return own rank
Definition torus.hh:94
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
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
void exchange() const
exchange messages stored in request buffers; clear request buffers afterwards
Definition torus.hh:387
YGridComponent< Coordinates > move(iTupel v) const
return grid moved by the vector v
Definition ygrid.hh:263
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
implements a collection of YGridComponents which form a codimension Entities of given codimension c n...
Definition ygrid.hh:551
Iterator over a collection o YGrids A YGrid::Iterator is the heart of an entity in YaspGrid.
Definition ygrid.hh:594
implements a collection of multiple std::deque<Intersection> Intersections with neighboring processor...
Definition ygrid.hh:823
int size() const
return the size of the container, this is the sum of the sizes of all deques
Definition ygrid.hh:953
Iterator end() const
return iterator pointing to the end of the container
Definition ygrid.hh:929
Iterator begin() const
return iterator pointing to the begin of the container
Definition ygrid.hh:923
type describing an intersection with a neighboring processor
Definition ygrid.hh:829
A set of traits classes to store static information about grid implementation.
Different resources needed by all grid implementations.
Provides base classes for index and id sets.