preCICE
Loading...
Searching...
No Matches
CoarseGrainingMappingTest.cpp
Go to the documentation of this file.
1#include <Eigen/Core>
2#include <algorithm>
3#include <memory>
4#include <string_view>
7#include "mapping/Mapping.hpp"
9#include "math/constants.hpp"
10#include "mesh/Data.hpp"
11#include "mesh/Mesh.hpp"
13#include "mesh/Utils.hpp"
14#include "mesh/Vertex.hpp"
17#include "testing/Testing.hpp"
18#include "time/Sample.hpp"
19
20using namespace precice;
21using namespace precice::mesh;
22
23BOOST_AUTO_TEST_SUITE(MappingTests)
24BOOST_AUTO_TEST_SUITE(CoarseGrainingMapping)
25
26namespace {
27
28// Checks: outside radius -> 0, inside (<= radius) -> > 0
29// Assumes 5x5x5 grid with unit spacing starting at (0,0,0)
30// and linear indexing: idx = k*(Nx*Ny) + j*Nx + i
31void check_support_5x5x5(const Eigen::MatrixXd &values,
32 double radius,
33 const Eigen::Vector3d &center)
34{
35 const int Nx = 5, Ny = 5, Nz = 5;
36 const int N = Nx * Ny * Nz;
37
38 BOOST_TEST(static_cast<int>(values.cols()) == N);
39
40 for (int k = 0; k < Nz; ++k) {
41 for (int j = 0; j < Ny; ++j) {
42 for (int i = 0; i < Nx; ++i) {
43 const int idx = k * (Nx * Ny) + j * Nx + i;
44
45 // grid point coordinate (unit spacing, origin at 0,0,0)
46 Eigen::Vector3d p{static_cast<double>(i), static_cast<double>(j), static_cast<double>(k)};
47 const double d = (p - center).norm();
48
49 const Eigen::VectorXd v = values.col(idx);
50 Eigen::VectorXd zero(v.size());
51 zero.setZero();
52
53 if (d <= radius) {
54 BOOST_TEST(v > zero, boost::test_tools::per_element());
55 } else {
56 BOOST_TEST(v == zero, boost::test_tools::per_element());
57 }
58 }
59 }
60 }
61}
62} // namespace
63
65BOOST_AUTO_TEST_CASE(Conservative3D)
66{
68 const int dimensions = 3;
69 const int scalar = 1;
70 const int vector = 3;
71
72 // Create mesh to map from
73 PtrMesh outMesh(new Mesh("OutMesh", dimensions, testing::nextMeshID()));
74
75 const int Nx = 5, Ny = 5, Nz = 5;
76 const double spacing = 1.0;
77 const double x0 = 0.0, y0 = 0.0, z0 = 0.0;
78 for (int k = 0; k < Nz; ++k) {
79 for (int j = 0; j < Ny; ++j) {
80 for (int i = 0; i < Nx; ++i) {
81 Eigen::Vector3d p{x0 + spacing * i,
82 y0 + spacing * j,
83 z0 + spacing * k};
84 outMesh->createVertex(p);
85 }
86 }
87 }
88
89 // Setup mapping with mapping coordinates and geometry used
91 const double radius = 2.5;
93 mapping.setMeshes(inMesh, outMesh);
94 BOOST_TEST(mapping.hasComputedMapping() == false);
95 BOOST_TEST(mapping.isJustInTimeMapping() == true);
96
98
99 // Constructs the index tree for the defined output mesh
100 mapping.computeMapping();
101 BOOST_TEST(mapping.hasComputedMapping() == true);
102
103 Eigen::MatrixXd inCoords(dimensions, 1);
104 inCoords.setConstant(0.0);
105 Eigen::MatrixXd inData(scalar, 1);
106 inData.setConstant(1.0);
107 Eigen::MatrixXd outData(scalar, Nx * Ny * Nz);
108 outData.setZero();
109 mapping.mapConservativeAt(inCoords, inData, dummyCache, outData);
110
111 // Test that we only have support within the function radius
112 check_support_5x5x5(outData, radius, Eigen::Vector3d(0.0, 0.0, 0.0));
113 const double zeroEvaluation = 0.133690152197192;
114 BOOST_TEST(outData(0, 0) == zeroEvaluation);
115 const double sqrtOneEvaluation = 0.06352956032410564;
116 // evaluation with std::sqrt(1.0)
117 BOOST_TEST(outData(0, 1) == sqrtOneEvaluation);
118
119 // We mirror the contribution of the 0,0,0 point to the 1,0,0 point using the 2,0,0 point
120 inCoords(0, 0) = 2.0;
121 mapping.mapConservativeAt(inCoords, inData, dummyCache, outData);
122 BOOST_TEST(outData(0, 1) == 2 * sqrtOneEvaluation);
123 outData.setZero();
124
125 // Testing in the middle of the domain
126 inCoords.setConstant(2.5);
127 mapping.mapConservativeAt(inCoords, inData, dummyCache, outData);
128 BOOST_TEST(outData(0, 0) == 0.0);
129 check_support_5x5x5(outData, radius, Eigen::Vector3d(2.5, 2.5, 2.5));
130
131 // Testing vector data
132 inData.resize(vector, 2);
133 inData.row(0).setConstant(1);
134 inData.row(1).setConstant(2);
135 inData.row(2).setConstant(3);
136 inCoords.resize(dimensions, 2);
137 inCoords.setZero();
138 outData.resize(vector, Nx * Ny * Nz);
139 outData.setZero();
140
141 mapping.mapConservativeAt(inCoords, inData, dummyCache, outData);
142 check_support_5x5x5(outData, radius, Eigen::Vector3d(0.0, 0.0, 0.0));
143
144 BOOST_TEST(outData(0, 0) == 2 * zeroEvaluation);
145 BOOST_TEST(outData(1, 0) == 2 * 2 * zeroEvaluation);
146 BOOST_TEST(outData(2, 0) == 2 * 3 * zeroEvaluation);
147
148 BOOST_TEST(outData(1, 2) == 2 * outData(0, 2));
149 BOOST_TEST(outData(2, 2) == 3 * outData(0, 2));
150}
BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithSubsteps)
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
#define PRECICE_TEST()
Definition Testing.hpp:39
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Definition Testing.hpp:29
static mesh::PtrMesh getJustInTimeMappingMesh(int dimension)
Container and creator for meshes.
Definition Mesh.hpp:38
Vertex & createVertex(const Eigen::Ref< const Eigen::VectorXd > &coords)
Creates and initializes a Vertex object.
Definition Mesh.cpp:104
STL class.
contains data mapping from points to meshes.
provides Mesh, Data and primitives.
std::shared_ptr< Mesh > PtrMesh
Main namespace of the precice library.