LoAdSG
multilevelSparseGrid.h
1//
2// Created by scherner on 20.05.21.
3//
4
5#ifndef GRUN_MULTILEVELSPARSEGRID_H
6#define GRUN_MULTILEVELSPARSEGRID_H
7
8#include "sparseGrid.h"
9#include <algorithm>
10#include <list>
11
12
13class MultiLevelAdaptiveSparseGrid{
14public:
15
16
17 MultiLevelAdaptiveSparseGrid(AdaptiveSparseGrid *grid){
18
19
20 primeTableLength = PrimeNumbers::getNextPrime(10000000);
21 secondTableLength = 10000000;
22
23
24
25 primeTable = new dataInteger[primeTableLength];
26 for(unsigned long i=0;i<primeTableLength;++i) primeTable[i] = 0;
27
28 secondTable = new dataInteger[secondTableLength];
29 for(unsigned long i=0;i<secondTableLength;++i) secondTable[i] = 0;
30
31 isActiveNodeTable= new bool[secondTableLength];
32 for (unsigned long i = 0; i < secondTableLength; ++i) isActiveNodeTable[i] = false;
33
34
35 indicesSecondTable = new indexInteger[secondTableLength *
36 DimensionSparseGrid];
37 for (unsigned long i = 0; i < secondTableLength * DimensionSparseGrid; ++i) indicesSecondTable[i] = 0;
38
39 minimalEmptySecondTable = 0;
40 maximalOccupiedSecondTable = 0;
41
42
43 depthTable = new int[secondTableLength * DimensionSparseGrid];
44 for (unsigned long i = 0; i < secondTableLength * DimensionSparseGrid; ++i) depthTable[i] = -1;
45 createbysparsegrid(grid);
46 }
47
48 ~MultiLevelAdaptiveSparseGrid() {
49 delete[] primeTable;
50 delete[] secondTable;
51 delete[] isActiveNodeTable;
52
53 delete[] indicesSecondTable;
54
55 delete[] depthTable;
56 };
57
58 void createbysparsegrid(AdaptiveSparseGrid_Base *grid);
59
60
61 void PrintActiveHangingDepth(int level, Depth T);
62
63 void setDepthInTable(unsigned long k, Depth T) {
64
65 for (int d = 0; d < DimensionSparseGrid; d++)
66 depthTable[d + k * DimensionSparseGrid] = T.at(d);
67
68 };
69
70 inline bool occupied(unsigned long &indexOfData, IndexDimension &Index, Depth &T) {
71
72
73 unsigned long indArray = hash(Index, T);
74
75 unsigned long i = primeTable[indArray];
76
77 if (i == 0) { // in prime table is something free;
78 return false;
79 } else { // anaylse what is going on
80 i = i - 1; // shift since data are stored with shift
81
82
83 if (Index == getIndexOfTable(i) && T == getDepthOfTable(i)) {
84 indexOfData = i;
85 return true;
86 } else { // search in second table;
87 unsigned long iNext = secondTable[i];
88 while (iNext > 1) {
89 i = iNext - 2;
90 if (Index == getIndexOfTable(i) && T == getDepthOfTable(i)) {
91 indexOfData = i;
92 return true;
93 }
94 iNext = secondTable[i];
95 }
96 return false;
97 }
98 }
99
100 };
101
102
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);
107 }
108
109 for (int d = 0; d < DimensionSparseGrid; d++) {
110 value = value + Tfine.at(d) * PrimeNumbers::getPrimeForHash(d + DimensionSparseGrid);
111 }
112 return value % primeTableLength;
113 };
114
115 inline Depth getDepthOfTable(unsigned long i);
116
117 unsigned long getMaximalOccupiedSecondTable() { return maximalOccupiedSecondTable;};
118 unsigned long getLengthSecondTable() { return secondTableLength; }
119
120 int getDOFS();
121private:
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;
129
130 indexInteger *indicesSecondTable;
131 int *depthTable;
132 std::list<Depth> liste;
133
134 bool AddPointDepth(IndexDimension &Index, Depth &Tfine);
135
136 void setIndexAndDepthInTable(const IndexDimension Index, Depth Tfine, unsigned long iSetz);
137
138 inline IndexDimension getIndexOfTable(unsigned long i);
139
140
141 unsigned long getFreeSpaceNumberInSecondTable();
142
143};
144
145
146Depth MultiLevelAdaptiveSparseGrid::getDepthOfTable(unsigned long i) {
147 Depth T(0);
148 for (int d = 0; d < DimensionSparseGrid; d++) {
149 T.set(depthTable[d + i * DimensionSparseGrid], d);
150 }
151 return T;
152}
153
154
155inline IndexDimension MultiLevelAdaptiveSparseGrid::getIndexOfTable(unsigned long i) {
156 IndexDimension back;
157 for (int d = 0; d < DimensionSparseGrid; ++d) {
158 back.replace(d, indicesSecondTable[d + i * DimensionSparseGrid]);
159 }
160 return back;
161}
162#endif //GRUN_MULTILEVELSPARSEGRID_H
Definition sparseGrid.h:86
Definition sparseGrid.h:277