3 #include "../Numerics/idx.h"
6 #include "toolbox/curvi/Coordinate.h"
7 #include "toolbox/curvi/geometry/Block.h"
8 #include "toolbox/curvi/interface/Interface.h"
9 #include "toolbox/curvi/kdTree/Root.h"
11 template <
class Shortcuts,
int basisSize,
int numberOfData,
typename T>
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);
42 elements_l[toolbox::curvi::Coordinate::Z] = std::round(_domainSize[2] / coarsestMeshSize);
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 ez = std::round((center[2] -
domainOffset[2] - dx[2] / 2.0) / dx[2]);
87 int ey = std::round((center[1] -
domainOffset[1] - dx[1] / 2.0) / dx[1]);
88 int ex = std::round((center[0] -
domainOffset[0] - dx[0] / 2.0) / dx[0]);
90 #ifndef QUICK_IDENTITY
91 toolbox::curvi::Block element =
interface->getElement(
nodes, ez, ey, ex);
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++) {
99 for (
int i = 0; i < basisSize; i++) {
103 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 0)] = element(
105 toolbox::curvi::Coordinate::Z, e_k,
109 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 1)] = element(
111 toolbox::curvi::Coordinate::Z, e_k,
115 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 2)] = element(
117 toolbox::curvi::Coordinate::Z, e_k,
126 for (
int k = 0; k < basisSize; k++) {
127 for (
int j = 0;
j < basisSize;
j++) {
128 for (
int i = 0; i < basisSize; i++) {
129 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 0)] =
nodes[i] * dx[0] + center[0] - dx[0] / 2;
130 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 1)] =
nodes[
j] * dx[1] + center[1] - dx[1] / 2;
131 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 2)] =
nodes[k] * dx[2] + center[2] - dx[2] / 2;
137 T derivatives[basisSize * basisSize * basisSize * 10];
138 std::fill_n(derivatives, basisSize * basisSize * basisSize * 10, 0.0);
142 #ifdef QUICK_IDENTITY
144 for (
int k = 0; k < basisSize; k++) {
145 for (
int j = 0;
j < basisSize;
j++) {
146 for (
int i = 0; i < basisSize; i++) {
147 derivatives[id_der(k,
j, i, 0)] = 1.0;
148 derivatives[id_der(k,
j, i, 1)] = 1.0;
149 derivatives[id_der(k,
j, i, 5)] = 1.0;
150 derivatives[id_der(k,
j, i, 9)] = 1.0;
158 for (
int k = 0; k < basisSize; k++) {
159 for (
int j = 0;
j < basisSize;
j++) {
160 for (
int i = 0; i < basisSize; i++) {
161 std::copy_n(derivatives + id_der(k,
j, i, 0), 10, luh + id_xyzf(k,
j, i, Shortcuts::jacobian));
166 tarch::la::Vector<DIMENSIONS, double> curv_center;
168 for (
int k = 0; k < basisSize; k++) {
169 for (
int j = 0;
j < basisSize;
j++) {
170 for (
int i = 0; i < basisSize; i++) {
172 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 0)],
173 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 1)],
174 luh[id_xyzf(k,
j, i, Shortcuts::curve_grid + 2)]};
176 initUnknownsPointwise(
177 coords, curv_center,
t,
dt, luh + id_xyzf(k,
j, i, 0)
184 for (
int k = 0; k < basisSize; k++) {
185 for (
int j = 0;
j < basisSize;
j++) {
186 for (
int i = 0; i < basisSize; i++) {
187 for (
int m = 0; m < numberOfData; m++) {
188 assertion5(std::isfinite(luh[id_xyzf(k,
j, i, m)]), k,
j, i, m,
meshLevel);
198 for (
int p = 0;
p < 1;
p++) {
199 toolbox::curvi::Coordinate dir_top =
static_cast<toolbox::curvi::Coordinate
>(_TOP);
204 coords[toolbox::curvi::Coordinate::Z] = pointSourceLocation[
p][2];
206 pointSourceLocation[
p][_TOP] = this->
interface->invertProjection(dir_top, coords);
210 void getElementSize(
const T*
const luh, tarch::la::Vector<DIMENSIONS, double>& dx) {
213 kernels::idx4 id_xyzf(basisSize, basisSize, basisSize, numberOfData);
219 for (
int i = 0; i < basisSize; i++) {
220 for (
int j = 0;
j < basisSize;
j++) {
222 dx[0], luh[id_xyzf(i,
j, basisSize - 1, Shortcuts::curve_grid + 0)] - luh[id_xyzf(i,
j, 0, Shortcuts::curve_grid + 0)]
225 dx[1], luh[id_xyzf(i, basisSize - 1,
j, Shortcuts::curve_grid + 1)] - luh[id_xyzf(i, 0,
j, Shortcuts::curve_grid + 1)]
228 dx[2], luh[id_xyzf(basisSize - 1, i,
j, Shortcuts::curve_grid + 2)] - luh[id_xyzf(0, i,
j, Shortcuts::curve_grid + 2)]
235 int center_i1 =
int(std::ceil(basisSize / 2.0));
236 int center_i2 =
int(std::floor(basisSize / 2.0));
239 kernels::idx4 id_xyzf(basisSize, basisSize, basisSize, numberOfData);
241 center[0] = (luh[id_xyzf(center_i1, center_i1, center_i1, Shortcuts::curve_grid + 0)]
242 + luh[id_xyzf(center_i2, center_i2, center_i2, Shortcuts::curve_grid + 0)])
244 center[1] = (luh[id_xyzf(center_i1, center_i1, center_i1, Shortcuts::curve_grid + 1)]
245 + luh[id_xyzf(center_i2, center_i2, center_i2, Shortcuts::curve_grid + 1)])
247 center[2] = (luh[id_xyzf(center_i1, center_i1, center_i1, Shortcuts::curve_grid + 2)]
248 + luh[id_xyzf(center_i2, center_i2, center_i2, Shortcuts::curve_grid + 2)])
259 double dudx[basisSize][basisSize];
toolbox::curvi::Root * getRoot()
ContextCurvilinear(std::string &topography_string, int coarsestMeshLevel, double coarsestMeshSize, double maxAdaptiveDepth, tarch::la::Vector< DIMENSIONS, double > _domainOffset, tarch::la::Vector< DIMENSIONS, double > _domainSize, T *_nodes, T *_dudx)
void getElementSize(const T *const luh, tarch::la::Vector< DIMENSIONS, double > &dx)
void initUnknownsPatch(T *luh, const tarch::la::Vector< DIMENSIONS, double > ¢er, const tarch::la::Vector< DIMENSIONS, double > &dx, double t, double dt, std::function< void(const T *const x, const tarch::la::Vector< DIMENSIONS, double > ¢er, const double t, const double dt, T *Q)> initUnknownsPointwise)
void getElementCenter(const T *const luh, tarch::la::Vector< DIMENSIONS, double > ¢er)
void correctPointSourceLocation(double pointSourceLocation[][3])
double dudx[basisSize][basisSize]
toolbox::curvi::Interface * interface
static void metricDerivatives(double dudx[][num_nodes], const T *const coordinates, const double *const dx, T *derivatives)