11#include "../primes/prime.h"
12#include "../indices/index.h"
13#include "../iterator/RectangularIterator.h"
19#include "multiDepthHashGrid.h"
23class MultiLevelVector;
31 friend MultiLevelVector;
39 Process(
int *my_rank,
int rank_) {
45 Process() { all =
true; };
47 Process(
int *my_rank) { myrank = *my_rank, all =
true; };
49 void runProcess(
int rank_) {
54 void runALL() { all =
true; };
56 void setMyRank(
int *my_rank) { myrank = *my_rank; }
58 int getMyRank() {
return myrank; }
60 int getRank() {
return rank; }
68template <
class A>
struct ExprSparseG;
70enum type_sparseGrid { sparseGrid_withBoundary, sparseGrid_zeroBoundary };
92 friend MultiLevelVector;
99 template<
class A,
class B>
100 friend double product(
const ExprSparseG<A> &a,
const ExprSparseG<B> &b);
103 friend double L_infty(
const ExprSparseG<A> &a);
112 void PrintSlice_gnu(
string name);
114 void PrintSlice2_gnu(
string name);
116 void PrintSlice3_gnu(
string name);
118 void Print_vtk(std::ostream &Datei);
124 void PrintGridIndices(
int level, IndexDimension* Indices,
int numberofindices);
127 int getMaxDepth(
int d);
129 int getMaxDepth(
int d, IndexDimension Index);
131 inline bool checkMultiDimFiveStencil(IndexDimension Index);
133 virtual inline bool AddPoint(IndexDimension I);
141 inline bool occupied(
unsigned long &indexOfData, IndexDimension I);
143 inline bool occupied2(
unsigned long &indexOfData, IndexDimension I);
146 inline bool occupied(
unsigned long &indexOfData, IndexDimension I,
bool active);
148 dataInteger *getSecondTable() {
return secondTable; };
150 dataInteger *getPrimeTable() {
return primeTable; };
158 unsigned long getMaximalOccupiedSecondTable() {
return maximalOccupiedSecondTable; };
161 unsigned long getLengthSecondTable() {
return secondTableLength; }
170 inline IndexDimension getSupportIMin(
unsigned long i);
172 inline IndexDimension getSupportIMax(
unsigned long i);
179 inline unsigned long hash(IndexDimension index);
181 inline unsigned long hashWithDepth(IndexDimension index, Depth T);
186 bool WorkOnHangingNodes;
189 inline bool workonindex(
unsigned long i) {
195 unsigned long getPrimeTableLength()
const {
return primeTableLength; };;;
198 MultiDepthHashGrid* getMultiDepthHashGrid() {
return multiDepthHashGrid;}
205 return max_LOne-DimensionSparseGrid+1;
218 friend MultiDepthHashGrid;
219 MultiDepthHashGrid *multiDepthHashGrid;
224 unsigned long primeTableLength;
225 unsigned long secondTableLength;
226 unsigned long minimalEmptySecondTable;
227 unsigned long maximalOccupiedSecondTable;
231 dataInteger *primeTable;
238 indexInteger *indicesSupportMax;
247 void setIndexInTable(
const IndexDimension I,
unsigned long iSetz);
339 bool AddPoint(
const IndexDimension I);
341 bool AddPoint(
const IndexDimension I,
bool hangingNode);
343 void AddRecursiveSonsOfPoint(IndexDimension I,
int level);
353 int getHangingNodes();
355 virtual void completeNeumannGrid();
357 virtual void completeDirichletGrid();
359 virtual void completeDirichletGrid_NEU();
365 if(grid_key == second_grid.getKey())
369 void AddPointsOfDepth(Depth T);
370 void completeGridWithoutBoundary();
371 std::vector<IndexDimension> pointsToAdd;
382 void addHangingNodes();
397 unsigned long value = index.getIndex(0);
398 for (
int d = 1; d < DimensionSparseGrid; ++d) {
399 value = value + index.getIndex(d) * PrimeNumbers::getPrimeForHash(d);
402 value = value + T.at(0) * PrimeNumbers::getPrimeForHash(DimensionSparseGrid);
403 for (
int d = 1; d < DimensionSparseGrid; d++)
404 value = value + T.at(d) * PrimeNumbers::getPrimeForHash(DimensionSparseGrid + d);
407 return value % primeTableLength;
410unsigned long AdaptiveSparseGrid_Base::hashWithDepth(IndexDimension index, Depth T) {
412 unsigned long value = index.getIndex(0);
413 for (
int d = 1; d < DimensionSparseGrid; ++d) {
414 value = value + index.getIndex(d) * PrimeNumbers::getPrimeForHash(d);
417 value = value + T.at(0) * PrimeNumbers::getPrimeForHash(DimensionSparseGrid);
418 for (
int d = 1; d < DimensionSparseGrid; d++)
419 value = value + T.at(d) * PrimeNumbers::getPrimeForHash(DimensionSparseGrid + d);
422 return value % primeTableLength;
427bool AdaptiveSparseGrid_Base::AddPoint(IndexDimension I) {
428 unsigned long indArray =
hash(I);
429 unsigned long i = primeTable[indArray];
432 primeTable[indArray] = freeSpace + 1;
434 setIndexInTable(I,freeSpace);
458 setIndexInTable(I,freeSpace);
484 unsigned long indArray =
hash(I);
485 unsigned long i = primeTable[indArray];
514 unsigned long indArray =
hash(I);
515 unsigned long i = primeTable[indArray];
545bool AdaptiveSparseGrid_Base::checkMultiDimFiveStencil(IndexDimension Index) {
568 for (
int d = 0; d < DimensionSparseGrid; ++d) {
574inline IndexDimension AdaptiveSparseGrid_Base::getSupportIMin(
unsigned long i) {
576 for (
int d = 0; d < DimensionSparseGrid; ++d) {
582inline IndexDimension AdaptiveSparseGrid_Base::getSupportIMax(
unsigned long i) {
584 for (
int d = 0; d < DimensionSparseGrid; ++d) {
585 back.replace(d, indicesSupportMax[d + i * DimensionSparseGrid]);
590bool AdaptiveSparseGrid_Base::occupied2(
unsigned long &indexOfData, IndexDimension I) {
592 SingleDepthHashGrid &depthGrid = this->getMultiDepthHashGrid()->getGridForDepth(T);
593 const auto &mapping = depthGrid._mapPosToGridPos;
595 if(depthGrid.occupied(j,I)){
596 indexOfData=mapping[j];
Definition sparseGrid.h:86
AdaptiveSparseGrid_Base()
Definition sparseGrid.cc:30
bool * isActiveNodeTable
0 means empty; 1 means occupied, but no next; v>1 means v-2 is next array index
Definition sparseGrid.h:233
unsigned long getFreeSpaceNumberInSecondTable()
Definition sparseGrid.cc:402
IndexDimension getIndexOfTable(unsigned long i)
Definition sparseGrid.h:566
void Print_gnu(string name)
Prints coordinates of adaptive sparse grid in gnu-file.
Definition sparseGrid.cc:258
int * indicesSupportMin
Contains coded indices. Length: secondTableLength*DimensionSparseGrid
Definition sparseGrid.h:237
unsigned long hash(IndexDimension index)
Definition sparseGrid.h:395
unsigned long * secondTable
0 means empty; v>0 means v-1 is array index
Definition sparseGrid.h:232
void printCoordinates()
Prints coordinates of adaptive sparse grid.
Definition sparseGrid.cc:125
void PrintGridIndices(int level, IndexDimension *Indices, int numberofindices)
prints all nodes and highlights given Indices
Definition sparseGrid.cc:189
int * indicesSecondTable
true means AdaptiveSparseGrid_Base::getIndexOfTable (i) is active node.
Definition sparseGrid.h:236
bool occupied(unsigned long &indexOfData, IndexDimension I)
Definition sparseGrid.h:465
void PrintActiveHanging(int level)
prints active nodes (o) and hanging nodes (x)
Definition sparseGrid.cc:139
Definition sparseGrid.h:277
void CompleteToLocalTensorProductGrid()
adds all father points including boundary points
Definition localTensorProduct.cc:189
bool AddPoint(const IndexDimension I)
Definition sparseGrid.cc:482
AdaptiveSparseGrid()
Definition sparseGrid.h:282
Definition ListOfDepthOrderedGrids.h:115