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

Reply via email to