netgen/libsrc/meshing/boundarylayer.hpp

116 lines
3.4 KiB
C++
Raw Normal View History

#ifndef NETGEN_BOUNDARYLAYER_HPP
#define NETGEN_BOUNDARYLAYER_HPP
2009-01-13 04:40:13 +05:00
2023-11-29 13:19:27 +05:00
#include <core/array.hpp>
#include "../include/myadt.hpp"
#include "../include/gprim.hpp"
namespace netgen
{
2009-01-13 04:40:13 +05:00
///
2015-10-19 13:08:30 +05:00
DLL_HEADER extern void InsertVirtualBoundaryLayer (Mesh & mesh);
2009-01-13 04:40:13 +05:00
/// Create a typical prismatic boundary layer on the given
/// surfaces
2014-12-18 19:00:58 +05:00
class BoundaryLayerParameters
{
public:
// parameters by Philippose ..
Array<int> surfid;
Array<double> heights;
map<string, string> new_mat;
2020-04-23 18:44:32 +05:00
BitArray domains;
bool outside = false; // set the boundary layer on the outside
bool grow_edges = false;
bool limit_growth_vectors = true;
double limit_safety = 0.3; // alloow only 30% of the growth vector length
bool sides_keep_surfaceindex = false;
bool keep_surfaceindex = false;
Array<size_t> project_boundaries;
2014-12-18 19:00:58 +05:00
};
2023-11-29 13:19:27 +05:00
struct SpecialBoundaryPoint {
struct GrowthGroup {
Array<int> faces;
Vec<3> growth_vector;
Array<PointIndex> new_points;
GrowthGroup(FlatArray<int> faces_, FlatArray<Vec<3>> normals);
GrowthGroup(const GrowthGroup &) = default;
GrowthGroup() = default;
};
// std::map<int, Vec<3>> normals;
Array<GrowthGroup> growth_groups;
SpecialBoundaryPoint( const std::map<int, Vec<3>> & normals );
SpecialBoundaryPoint() = default;
};
DLL_HEADER void GenerateBoundaryLayer (Mesh & mesh,
const BoundaryLayerParameters & blp);
2021-03-30 19:54:39 +05:00
DLL_HEADER int /* new_domain_number */ GenerateBoundaryLayer2 (Mesh & mesh, int domain, const Array<double> & thicknesses, bool should_make_new_domain=true, const Array<int> & boundaries=Array<int>{});
2009-01-13 04:40:13 +05:00
2022-03-07 19:58:09 +05:00
class BoundaryLayerTool
{
public:
BoundaryLayerTool(Mesh & mesh_, const BoundaryLayerParameters & params_);
void Perform();
Mesh & mesh;
MeshTopology & topo;
BoundaryLayerParameters params;
Array<Vec<3>, PointIndex> growthvectors;
Table<SurfaceElementIndex, PointIndex> p2sel;
BitArray domains, is_edge_moved, is_boundary_projected, is_boundary_moved;
Array<SegmentIndex> moved_segs;
int max_edge_nr, nfd_old, ndom_old;
Array<int> new_mat_nrs;
BitArray moved_surfaces;
2022-03-07 19:58:09 +05:00
int np, nseg, nse, ne;
2024-02-26 13:09:42 +05:00
double total_height;
2022-03-07 19:58:09 +05:00
bool have_single_segments;
Array<Segment> segments, new_segments;
2023-11-29 13:19:27 +05:00
Array<Array<PointIndex>, PointIndex> mapto;
2022-03-07 19:58:09 +05:00
Array<double> surfacefacs;
Array<int> si_map;
2022-03-07 19:58:09 +05:00
Array<double, PointIndex> limits;
2022-03-07 19:58:09 +05:00
2023-11-29 13:19:27 +05:00
std::map<PointIndex, SpecialBoundaryPoint> special_boundary_points;
std::map<PointIndex, std::tuple<Vec<3>*, double>> growth_vector_map;
2022-03-07 19:58:09 +05:00
// major steps called in Perform()
void CreateNewFaceDescriptors();
void CreateFaceDescriptorsSides();
2022-03-07 19:58:09 +05:00
void CalculateGrowthVectors();
Array<Array<pair<SegmentIndex, int>>, SegmentIndex> BuildSegMap();
BitArray ProjectGrowthVectorsOnSurface();
2022-03-07 19:58:09 +05:00
void InterpolateSurfaceGrowthVectors();
2022-03-07 19:58:09 +05:00
void InterpolateGrowthVectors();
2022-03-07 19:58:09 +05:00
void LimitGrowthVectorLengths();
2022-03-07 19:58:09 +05:00
void InsertNewElements(FlatArray<Array<pair<SegmentIndex, int>>, SegmentIndex> segmap, const BitArray & in_surface_direction);
void SetDomInOut();
void SetDomInOutSides();
2022-03-07 19:58:09 +05:00
void AddSegments();
2022-03-07 19:58:09 +05:00
void FixVolumeElements();
2022-03-07 19:58:09 +05:00
Vec<3> getNormal(const Element2d & el)
{
auto v0 = mesh[el[0]];
return Cross(mesh[el[1]]-v0, mesh[el[2]]-v0).Normalize();
}
2022-03-07 19:58:09 +05:00
Vec<3> getEdgeTangent(PointIndex pi, int edgenr);
2022-03-07 19:58:09 +05:00
};
} // namespace netgen
#endif // NETGEN_BOUNDARYLAYER_HPP