#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; 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; map par_new_mat; Array par_project_boundaries; bool have_single_segments; Array segments, new_segments; Array, PointIndex> mapto; Array mapfrom; Array surfacefacs; Array si_map; Array limits; 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 InsertNewElements(FlatArray>, SegmentIndex> segmap, const BitArray & in_surface_direction); void SetDomInOut(); void SetDomInOutSides(); void AddSegments(); void FixVolumeElements(); 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); }; } // namespace netgen #endif // NETGEN_BOUNDARYLAYER_HPP