5#ifndef GRUN_MULTILEVELSPARSEGRID_H
6#define GRUN_MULTILEVELSPARSEGRID_H
13class MultiLevelAdaptiveSparseGrid{
20 primeTableLength = PrimeNumbers::getNextPrime(10000000);
21 secondTableLength = 10000000;
25 primeTable =
new dataInteger[primeTableLength];
26 for(
unsigned long i=0;i<primeTableLength;++i) primeTable[i] = 0;
28 secondTable =
new dataInteger[secondTableLength];
29 for(
unsigned long i=0;i<secondTableLength;++i) secondTable[i] = 0;
31 isActiveNodeTable=
new bool[secondTableLength];
32 for (
unsigned long i = 0; i < secondTableLength; ++i) isActiveNodeTable[i] =
false;
35 indicesSecondTable =
new indexInteger[secondTableLength *
37 for (
unsigned long i = 0; i < secondTableLength * DimensionSparseGrid; ++i) indicesSecondTable[i] = 0;
39 minimalEmptySecondTable = 0;
40 maximalOccupiedSecondTable = 0;
43 depthTable =
new int[secondTableLength * DimensionSparseGrid];
44 for (
unsigned long i = 0; i < secondTableLength * DimensionSparseGrid; ++i) depthTable[i] = -1;
45 createbysparsegrid(grid);
48 ~MultiLevelAdaptiveSparseGrid() {
51 delete[] isActiveNodeTable;
53 delete[] indicesSecondTable;
61 void PrintActiveHangingDepth(
int level, Depth T);
63 void setDepthInTable(
unsigned long k, Depth T) {
65 for (
int d = 0; d < DimensionSparseGrid; d++)
66 depthTable[d + k * DimensionSparseGrid] = T.at(d);
70 inline bool occupied(
unsigned long &indexOfData, IndexDimension &Index, Depth &T) {
73 unsigned long indArray = hash(Index, T);
75 unsigned long i = primeTable[indArray];
83 if (Index == getIndexOfTable(i) && T == getDepthOfTable(i)) {
87 unsigned long iNext = secondTable[i];
90 if (Index == getIndexOfTable(i) && T == getDepthOfTable(i)) {
94 iNext = secondTable[i];
103 inline unsigned long hash(IndexDimension &Index, Depth &Tfine) {
104 unsigned long value = Index.getIndex(0);
105 for (
int d = 1; d < DimensionSparseGrid; ++d) {
106 value = value + Index.getIndex(d) * PrimeNumbers::getPrimeForHash(d);
109 for (
int d = 0; d < DimensionSparseGrid; d++) {
110 value = value + Tfine.at(d) * PrimeNumbers::getPrimeForHash(d + DimensionSparseGrid);
112 return value % primeTableLength;
115 inline Depth getDepthOfTable(
unsigned long i);
117 unsigned long getMaximalOccupiedSecondTable() {
return maximalOccupiedSecondTable;};
118 unsigned long getLengthSecondTable() {
return secondTableLength; }
122 unsigned long primeTableLength;
123 unsigned long secondTableLength;
124 unsigned long minimalEmptySecondTable;
125 unsigned long maximalOccupiedSecondTable;
126 dataInteger *primeTable;
127 dataInteger *secondTable;
128 bool *isActiveNodeTable;
130 indexInteger *indicesSecondTable;
132 std::list<Depth> liste;
134 bool AddPointDepth(IndexDimension &Index, Depth &Tfine);
136 void setIndexAndDepthInTable(
const IndexDimension Index, Depth Tfine,
unsigned long iSetz);
138 inline IndexDimension getIndexOfTable(
unsigned long i);
141 unsigned long getFreeSpaceNumberInSecondTable();
146Depth MultiLevelAdaptiveSparseGrid::getDepthOfTable(
unsigned long i) {
148 for (
int d = 0; d < DimensionSparseGrid; d++) {
149 T.set(depthTable[d + i * DimensionSparseGrid], d);
155inline IndexDimension MultiLevelAdaptiveSparseGrid::getIndexOfTable(
unsigned long i) {
157 for (
int d = 0; d < DimensionSparseGrid; ++d) {
158 back.replace(d, indicesSecondTable[d + i * DimensionSparseGrid]);
Definition sparseGrid.h:86
Definition sparseGrid.h:277