#ifndef NETGEN_BOUNDARYLAYER_HPP #define NETGEN_BOUNDARYLAYER_HPP #include #include #include namespace netgen { /// DLL_HEADER extern void InsertVirtualBoundaryLayer (Mesh& mesh); /// Create a typical prismatic boundary layer on the given /// surfaces struct SpecialBoundaryPoint { struct GrowthGroup { Array faces; Vec<3> growth_vector; Array new_points; GrowthGroup(FlatArray faces_, FlatArray> normals); GrowthGroup(const GrowthGroup&) = default; GrowthGroup() = default; }; // std::map> normals; Array growth_groups; Vec<3> separating_direction; SpecialBoundaryPoint(const std::map>& normals); SpecialBoundaryPoint() = default; }; DLL_HEADER void GenerateBoundaryLayer (Mesh& mesh, const BoundaryLayerParameters& blp); DLL_HEADER int /* new_domain_number */ GenerateBoundaryLayer2 (Mesh& mesh, int domain, const Array& thicknesses, bool should_make_new_domain = true, const Array& boundaries = Array{}); class BoundaryLayerTool { public: BoundaryLayerTool(Mesh& mesh_, const BoundaryLayerParameters& params_); void ProcessParameters (); void Perform (); Mesh& mesh; MeshTopology& topo; BoundaryLayerParameters params; Array, PointIndex> growthvectors; std::map> non_bl_growth_vectors; Table p2sel; BitArray domains, is_edge_moved, is_boundary_projected, is_boundary_moved; Array moved_segs; int max_edge_nr, nfd_old, ndom_old; Array new_mat_nrs; BitArray moved_surfaces; int np, nseg, nse, ne; double total_height; // These parameters are derived from given BoundaryLayerParameters and the Mesh Array par_heights; Array par_surfid; bool insert_only_volume_elements; map par_new_mat; Array par_project_boundaries; bool have_single_segments; Array old_segments, segments, new_segments, new_segments_on_moved_bnd; Array new_sels, new_sels_on_moved_bnd; Array, PointIndex> mapto; Array mapfrom; Array surfacefacs; Array si_map; std::map special_boundary_points; std::map*, double>> growth_vector_map; // major steps called in Perform() void CreateNewFaceDescriptors (); void CreateFaceDescriptorsSides (); void CalculateGrowthVectors (); Array>, SegmentIndex> BuildSegMap (); BitArray ProjectGrowthVectorsOnSurface (); void InterpolateSurfaceGrowthVectors (); void InterpolateGrowthVectors (); void LimitGrowthVectorLengths (); void FixSurfaceElements (); void InsertNewElements (FlatArray>, SegmentIndex> segmap, const BitArray& in_surface_direction); void SetDomInOut (); void SetDomInOutSides (); void AddSegments (); void AddSurfaceElements (); Vec<3> getNormal (const Element2d& el) { auto v0 = mesh[el[0]]; return Cross(mesh[el[1]] - v0, mesh[el[2]] - v0).Normalize(); } Vec<3> getEdgeTangent (PointIndex pi, int edgenr, FlatArray segs); }; } // namespace netgen #endif // NETGEN_BOUNDARYLAYER_HPP