Hi. I am currently making a code which can treat moving mesh problem.I used
GmshIO to construct mesh object, andI made a function to move boundary nodes in
one boundary, as given amount (of growth). The thing what I want to do now is
redistribute internal mesh to prevent negative jacobian from twisted nodes
after the intended movement. In here, I want to fix the position of bounday
nodes, so I just want to redistribute internal nodes only. I have used the
MeshTools::Modification::smooth() function to redistribute the nodes, but it
seems that this use "averaged position between nodes".So this lead the
unintended movement of boundary nodes after their intended movement (when I
used smooth function) Is there any possible way to solve this kind of problem?
More information for my case; Assume that there is a 2D rectanguler mesh file
from Gmsh. It will contain; 4 point for edge ((0,0), (1,0), (1,1), and (0,1))
4 bounadry id (left = 1, bottom = 2, right = 3, top = 4) 1 domain id (surface
= 1) My object is to move the boundary nodes in "right boundary" , and
redistribute internal nodes without boundary nodes From the mesh file, I make
mesh object by using "GmshIO(mesh).read("meshfile_name.msh");" and by using
followed function, I write the a function, which includes followed
contents;void Function(Mesh & mesh){ MeshBase::element_iterator el =
mesh.level_elements_begin(0); MeshBase::element_iterator end =
mesh.level_elements_end(0); for (; el != end; ++el) { const Elem* elem =
*el; std::vector<boundary_id_type> bc_ids; for (unsigned int s = 0; s <
elem->n_neighbors(); s++) { if (elem->neighbor(s) == NULL) {
mesh.get_boundary_info().boundary_ids (elem, s, bc_ids); for
(std::vector<boundary_id_type>::const_iterator b = bc_ids.begin(0; b !=
bc_ids.end(); ++b) { const boundary id_type bc_id = *b;
if (bc_id == 3) // Right boundary {
std::unique_ptr<Elem> side (elem->build_side(0)); Node*
node0 = side->get_node(0); const unsigned int id0 =
node0->id(); Point point0 = *static_cast<const Point
*>(node0); thickness_at_height =
Function_to_calculate_thickness_at_height(point0(1)); // This function will
return the amount of movement at each height mesh.node(id0) =
Point(thickness_at_height, point0(1), point0(2)); } }
} } } MeshTools::Modification::smooth(mesh, 1000, 0); }
Thanks for reading my question.Best regards;Seungjin Seo.
_______________________________________________
Libmesh-users mailing list
Libmesh-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmesh-users