#ifndef NETGEN_BOUNDARYLAYER_HPP #define NETGEN_BOUNDARYLAYER_HPP namespace netgen { /// DLL_HEADER extern void InsertVirtualBoundaryLayer (Mesh & mesh); /// Create a typical prismatic boundary layer on the given /// surfaces class BoundaryLayerParameters { public: // parameters by Philippose .. Array surfid; Array heights; map new_mat; 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; Array project_boundaries; }; 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 Perform(); protected: 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 height; bool have_single_segments; Array segments, new_segments; Array surfacefacs; Array si_map; Array limits; // 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(); // utility functions array, 2> GetMappedSeg( PointIndex pi ); ArrayMem, 4> GetFace( SurfaceElementIndex sei ); ArrayMem, 4> GetMappedFace( SurfaceElementIndex sei ); ArrayMem, 4> GetMappedFace( SurfaceElementIndex sei, int face ); 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