48#include "hydrodynamics/BoundaryElementModel.hpp"
50#include "hydrodynamics/Mesh.hpp"
54#include "math/integration/StrangFixCowperTriangleQuadrature.hpp"
55#include "math/integration/TriangleQuadrature.hpp"
56#include "utils/Constants.hpp"
57#include "utils/simError.h"
63 std::size_t BoundaryElementModel::assignElements() {
65 if (shape_->isMesh()) {
66 createTriangles(
dynamic_cast<Mesh*
>(shape_));
68 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
69 "BoundaryElementModel::assignElements Error: No mesh was "
70 "given as the shape\n");
71 painCave.severity = OPENMD_ERROR;
75 return elements_.size();
80 void BoundaryElementModel::createTriangles(Mesh* m) {
82 std::string name = m->getName();
83 std::vector<Triangle> facets = m->getFacets();
84 for (std::vector<Triangle>::iterator i = facets.begin();
85 i != facets.end(); ++i) {
86 HydrodynamicsElement currTri;
88 currTri.pos = (*i).getCentroid();
90 elements_.push_back(currTri);
95 void BoundaryElementModel::checkElement(std::size_t i) {}
97 void BoundaryElementModel::writeElements(std::ostream& os) {
98 std::vector<HydrodynamicsElement>::iterator iter;
99 std::string name = shape_->getName();
101 <<
" " << name << std::endl;
102 for (iter = elements_.begin(); iter != elements_.end(); ++iter) {
103 Triangle t = iter->t;
104 Vector3d n = t.getUnitNormal();
105 Vector3d v1 = t.vertex1();
106 Vector3d v2 = t.vertex2();
107 Vector3d v3 = t.vertex3();
110 <<
" " << n[0] <<
" " << n[1] <<
" " << n[2] << std::endl;
112 <<
"outer loop" << std::endl;
116 <<
" " << v1[0] <<
" " << v1[1] <<
" " << v1[2] << std::endl;
120 <<
" " << v2[0] <<
" " << v2[1] <<
" " << v2[2] << std::endl;
124 <<
" " << v3[0] <<
" " << v3[1] <<
" " << v3[2] << std::endl;
126 <<
"endloop" << std::endl;
128 <<
"endfacet" << std::endl;
131 <<
" " << name << std::endl;
134 Mat3x3d BoundaryElementModel::interactionTensor(
const std::size_t i,
136 const RealType viscosity) {
138 Mat3x3d I = SquareMatrix3<RealType>::identity();
140 StrangFixCowperTriangleQuadratureRule rule(6);
142 Vector3d centroid = elements_[i].pos;
143 Triangle t = elements_[j].t;
145 auto Tij = [&t, ¢roid, &I, &viscosity](
const Vector3d& p) {
147 Vector3d r = t.barycentricToCartesian(p);
148 Vector3d ab = centroid - r;
149 RealType abl = ab.
length();
151 T = (I + outProduct(ab, ab) / (abl * abl));
152 T /= (8.0 * Constants::PI * viscosity * abl);
156 B = TriangleQuadrature<RectMatrix<RealType, 3, 3>, RealType>::Integrate(
159 centroid = elements_[j].pos;
162 auto Tji = [&t, ¢roid, &I, &viscosity](
const Vector3d& p) {
164 Vector3d r = t.barycentricToCartesian(p);
165 Vector3d ab = centroid - r;
166 RealType abl = ab.
length();
168 T = (I + outProduct(ab, ab) / (abl * abl));
169 T /= (8.0 * Constants::PI * viscosity * abl);
173 B += TriangleQuadrature<RectMatrix<RealType, 3, 3>, RealType>::Integrate(
Real length() const
Returns the length of this vector.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.