16 std::string& topography_string,
17 int coarsestMeshLevel,
18 double coarsestMeshSize,
19 double maxAdaptiveDepth,
20 tarch::la::Vector<DIMENSIONS,double> _domainOffset,
21 tarch::la::Vector<DIMENSIONS,double> _domainSize,
26 std::copy_n(_nodes, basisSize ,
nodes);
27 for(
int i=0; i<basisSize; i++){
28 for(
int j=0; j<basisSize; j++){
29 dudx[i][j] = _dudx[j*basisSize+i];
33 max_dx = coarsestMeshSize * std::pow(1 / 3.0, maxAdaptiveDepth);
40 elements_l[toolbox::curvi::Coordinate::X] = std::round(_domainSize[0] / coarsestMeshSize);
41 elements_l[toolbox::curvi::Coordinate::Y] = std::round(_domainSize[1] / coarsestMeshSize);
42 elements_l[toolbox::curvi::Coordinate::Z] = std::round(_domainSize[2] / coarsestMeshSize);
45 size[toolbox::curvi::Coordinate::X] = _domainSize[0];
46 size[toolbox::curvi::Coordinate::Y] = _domainSize[1];
47 size[toolbox::curvi::Coordinate::Z] = _domainSize[2];
54 interface = new toolbox::curvi::Interface(topography_string, offset, size, elements_l, basisSize - 1);
68 const tarch::la::Vector<DIMENSIONS, double>& center,
69 const tarch::la::Vector<DIMENSIONS, double>& dx,
74 const tarch::la::Vector<DIMENSIONS,double>& center,
78 )> initUnknownsPointwise
81 if (tarch::la::equals(t, 0.0)) {
83 kernels::idx4 id_xyzf(basisSize, basisSize, basisSize, numberOfData);
86 int ex = std::round((center[0] -
domainOffset[0] - dx[0] / 2.0) / dx[0]);
87 int ey = std::round((center[1] -
domainOffset[1] - dx[1] / 2.0) / dx[1]);
88 int ez = std::round((center[2] -
domainOffset[2] - dx[2] / 2.0) / dx[2]);
91 toolbox::curvi::Block element =
interface->getElement(
nodes, ex, ey, ez);
93 element.getIndexOffset(index_offset);
95 for (
int k = 0; k < basisSize; k++) {
96 int e_k = index_offset[toolbox::curvi::Coordinate::Z] + k;
97 for (
int j = 0; j < basisSize; j++) {
98 int e_j = index_offset[toolbox::curvi::Coordinate::Y] + j;
99 for (
int i = 0; i < basisSize; i++) {
100 int e_i = index_offset[toolbox::curvi::Coordinate::X] + i;
103 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 0)] = element(
104 toolbox::curvi::Coordinate::X,
105 toolbox::curvi::Coordinate::Z, e_k,
106 toolbox::curvi::Coordinate::Y, e_j,
107 toolbox::curvi::Coordinate::X, e_i
109 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 1)] = element(
110 toolbox::curvi::Coordinate::Y,
111 toolbox::curvi::Coordinate::Z, e_k,
112 toolbox::curvi::Coordinate::Y, e_j,
113 toolbox::curvi::Coordinate::X, e_i
115 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 2)] = element(
116 toolbox::curvi::Coordinate::Z,
117 toolbox::curvi::Coordinate::Z, e_k,
118 toolbox::curvi::Coordinate::Y, e_j,
119 toolbox::curvi::Coordinate::X, e_i
127 for (
int k = 0; k < basisSize; k++) {
128 for (
int j = 0; j < basisSize; j++) {
129 for (
int i = 0; i < basisSize; i++) {
130 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 0)] =
nodes[i] * dx[0] + center[0] - dx[0] / 2;
131 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 1)] =
nodes[j] * dx[1] + center[1] - dx[1] / 2;
132 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 2)] =
nodes[k] * dx[2] + center[2] - dx[2] / 2;
138 T derivatives[basisSize * basisSize * basisSize * 10];
139 std::fill_n(derivatives, basisSize * basisSize * basisSize * 10, 0.0);
145 for (
int k = 0; k < basisSize; k++) {
146 for (
int j = 0; j < basisSize; j++) {
147 for (
int i = 0; i < basisSize; i++) {
148 derivatives[id_der(k, j, i, 0)] = 1.0;
149 derivatives[id_der(k, j, i, 1)] = 1.0;
150 derivatives[id_der(k, j, i, 5)] = 1.0;
151 derivatives[id_der(k, j, i, 9)] = 1.0;
159 for (
int k = 0; k < basisSize; k++) {
160 for (
int j = 0; j < basisSize; j++) {
161 for (
int i = 0; i < basisSize; i++) {
162 std::copy_n(derivatives + id_der(k, j, i, 0), 10, luh + id_xyzf(k, j, i, Shortcuts::jacobian));
167 tarch::la::Vector<DIMENSIONS, double> curv_center;
169 for (
int k = 0; k < basisSize; k++) {
170 for (
int j = 0; j < basisSize; j++) {
171 for (
int i = 0; i < basisSize; i++) {
173 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 0)],
174 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 1)],
175 luh[id_xyzf(k, j, i, Shortcuts::curve_grid + 2)]};
177 initUnknownsPointwise(
178 coords, curv_center, t, dt, luh + id_xyzf(k, j, i, 0)
185 for (
int k = 0; k < basisSize; k++) {
186 for (
int j = 0; j < basisSize; j++) {
187 for (
int i = 0; i < basisSize; i++) {
188 for (
int m = 0; m < numberOfData; m++) {
189 assertion5(std::isfinite(luh[id_xyzf(k, j, i, m)]), k, j, i, m,
meshLevel);
237 int center_i1 = int(std::ceil(basisSize / 2.0));
238 int center_i2 = int(std::floor(basisSize / 2.0));
241 kernels::idx4 id_xyzf(basisSize, basisSize, basisSize, numberOfData);
243 center[0] = (luh[id_xyzf(center_i1, center_i1, center_i1, Shortcuts::curve_grid + 0)]
244 + luh[id_xyzf(center_i2, center_i2, center_i2, Shortcuts::curve_grid + 0)])
246 center[1] = (luh[id_xyzf(center_i1, center_i1, center_i1, Shortcuts::curve_grid + 1)]
247 + luh[id_xyzf(center_i2, center_i2, center_i2, Shortcuts::curve_grid + 1)])
249 center[2] = (luh[id_xyzf(center_i1, center_i1, center_i1, Shortcuts::curve_grid + 2)]
250 + luh[id_xyzf(center_i2, center_i2, center_i2, Shortcuts::curve_grid + 2)])