How to refine an existing triangular or tetrahedral mesh
Refining a mesh of simplicial elements
The kratos provides the possibility of "easily" adapting an existing FE mesh (of simplex elements)
This possibility is provided by the two functions
which are implemented in the KratosMeshingApplication.
The elements to be refined can be specified by setting the value of SPLIT_ELEMENT on the element.
A small example
the following Python code performs the refinement of a 3D mesh. The code selects all of the elements whose barycenter has a Z between -5 and 5, and refines them
###mark the elements to be splitted (if they have barycenter with z between -5 and 5) for elem in fluid_model_part.Elements: xc = 0.0 yc = 0.0 zc = 0.0 for node in elem.GetNodes(): xc += node.X yc += node.Y zc += node.Z size = float(len(elem.GetNodes())) xc /= size yc /= size zc /= size if( zc > -5 and zc < 5 ): elem.SetValue(SPLIT_ELEMENT,True) ###compute the nodal neighbours on the initial mesh number_of_avg_elems = 20 number_of_avg_nodes = 20 nodal_neighbour_search = FindNodalNeighboursProcess(fluid_model_part,number_of_avg_elems,number_of_avg_nodes) nodal_neighbour_search.Execute() ###perform the refinement Refine = LocalRefineTetrahedraMesh(fluid_model_part) refine_on_reference = False; interpolate_internal_variables = False; Refine.LocalRefineMesh(refine_on_reference,interpolate_internal_variables) ###recompute the neighbours since they changed due to the creation of new nodes nodal_neighbour_search.ClearNeighbours() nodal_neighbour_search.Execute()