https://mooseframework.inl.gov
THMMesh.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "THMMesh.h"
11 #include "libmesh/node.h"
12 #include "libmesh/node_elem.h"
13 #include "libmesh/edge_edge2.h"
14 #include "libmesh/edge_edge3.h"
15 #include "libmesh/face_quad4.h"
16 #include "libmesh/face_quad9.h"
17 
18 using namespace libMesh;
19 
20 registerMooseObject("ThermalHydraulicsApp", THMMesh);
21 
22 const BoundaryName THMMesh::INVALID_BOUNDARY_ID = "invalid_boundary_id";
23 
26 {
28  params.addClassDescription("Creates a mesh (nodes and elements) for the Components");
29  MooseEnum dims("1=1 2 3", "3");
30  params.addParam<MooseEnum>("dim", dims, "The dimension of the mesh to be generated");
31  // we do not allow renumbering, because we generate our meshes
32  params.set<bool>("allow_renumbering") = false;
33  return params;
34 }
35 
36 THMMesh::THMMesh(const InputParameters & parameters)
37  : MooseMesh(parameters),
38  _dim(getParam<MooseEnum>("dim")),
39  _next_node_id(0),
40  _next_element_id(0),
41  _next_subdomain_id(0),
42  _next_boundary_id(0)
43 {
44 }
45 
46 THMMesh::THMMesh(const THMMesh & other_mesh)
47  : MooseMesh(other_mesh),
48  _dim(other_mesh._dim),
49  _next_node_id(other_mesh._next_node_id),
50  _next_element_id(other_mesh._next_element_id),
51  _next_subdomain_id(other_mesh._next_subdomain_id),
52  _next_boundary_id(other_mesh._next_boundary_id)
53 {
54 }
55 
56 unsigned int
58 {
59  return _dim;
60 }
61 
62 unsigned int
64 {
65  return _dim;
66 }
67 
68 std::unique_ptr<MooseMesh>
70 {
71  return _app.getFactory().copyConstruct(*this);
72 }
73 
74 void
76 {
78 }
79 
82 {
84  return id;
85 }
86 
89 {
91  return id;
92 }
93 
94 Node *
96 {
98  Node * node = _mesh->add_point(pt, id);
99  return node;
100 }
101 
102 Elem *
103 THMMesh::addElement(libMesh::ElemType elem_type, const std::vector<dof_id_type> & node_ids)
104 {
105  dof_id_type elem_id = getNextElementId();
106 
107  Elem * elem = libMesh::Elem::build(elem_type).release();
108  elem->set_id(elem_id);
109  _mesh->add_elem(elem);
110  for (std::size_t i = 0; i < node_ids.size(); i++)
111  elem->set_node(i, _mesh->node_ptr(node_ids[i]));
112  return elem;
113 }
114 
115 Elem *
117 {
118  dof_id_type elem_id = getNextElementId();
119 
120  Elem * elem = new NodeElem;
121  elem->set_id(elem_id);
122  _mesh->add_elem(elem);
123  elem->set_node(0, _mesh->node_ptr(node));
124  return elem;
125 }
126 
127 Elem *
129 {
130  dof_id_type elem_id = getNextElementId();
131 
132  Elem * elem = new Edge2;
133  elem->set_id(elem_id);
134  _mesh->add_elem(elem);
135  elem->set_node(0, _mesh->node_ptr(node0));
136  elem->set_node(1, _mesh->node_ptr(node1));
137  return elem;
138 }
139 
140 Elem *
142 {
143  dof_id_type elem_id = getNextElementId();
144 
145  Elem * elem = new Edge3;
146  elem->set_id(elem_id);
147  _mesh->add_elem(elem);
148  elem->set_node(0, _mesh->node_ptr(node0));
149  elem->set_node(1, _mesh->node_ptr(node1));
150  elem->set_node(2, _mesh->node_ptr(node2));
151  return elem;
152 }
153 
154 Elem *
156 {
157  dof_id_type elem_id = getNextElementId();
158 
159  Elem * elem = new Quad4;
160  elem->set_id(elem_id);
161  _mesh->add_elem(elem);
162  elem->set_node(0, _mesh->node_ptr(node0));
163  elem->set_node(1, _mesh->node_ptr(node1));
164  elem->set_node(2, _mesh->node_ptr(node2));
165  elem->set_node(3, _mesh->node_ptr(node3));
166  return elem;
167 }
168 
169 Elem *
171  dof_id_type node1,
172  dof_id_type node2,
173  dof_id_type node3,
174  dof_id_type node4,
175  dof_id_type node5,
176  dof_id_type node6,
177  dof_id_type node7,
178  dof_id_type node8)
179 {
180  dof_id_type elem_id = getNextElementId();
181 
182  Elem * elem = new Quad9;
183  elem->set_id(elem_id);
184  _mesh->add_elem(elem);
185  // vertices
186  elem->set_node(0, _mesh->node_ptr(node0));
187  elem->set_node(1, _mesh->node_ptr(node1));
188  elem->set_node(2, _mesh->node_ptr(node2));
189  elem->set_node(3, _mesh->node_ptr(node3));
190  // mid-edges
191  elem->set_node(4, _mesh->node_ptr(node4));
192  elem->set_node(5, _mesh->node_ptr(node5));
193  elem->set_node(6, _mesh->node_ptr(node6));
194  elem->set_node(7, _mesh->node_ptr(node7));
195  // center
196  elem->set_node(8, _mesh->node_ptr(node8));
197 
198  return elem;
199 }
200 
203 {
205  return id;
206 }
207 
210 {
212  return id;
213 }
static InputParameters validParams()
static InputParameters validParams()
Definition: THMMesh.C:25
virtual Node *& set_node(const unsigned int i)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
virtual dof_id_type getNextNodeId()
Gets the next node ID.
Definition: THMMesh.C:81
void set_spatial_dimension(unsigned char d)
Elem * addElementEdge2(dof_id_type node0, dof_id_type node1)
Definition: THMMesh.C:128
T & set(const std::string &name, bool quiet_mode=false)
THMMesh(const InputParameters &parameters)
Definition: THMMesh.C:36
virtual unsigned int effectiveSpatialDimension() const override
Definition: THMMesh.C:63
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
dof_id_type _next_element_id
The next element ID in the mesh (used for mesh generation)
Definition: THMMesh.h:65
static const BoundaryName INVALID_BOUNDARY_ID
Definition: THMMesh.h:72
Elem * addElementEdge3(dof_id_type node0, dof_id_type node1, dof_id_type node2)
Definition: THMMesh.C:141
Mesh for THM.
Definition: THMMesh.h:18
Elem * addNodeElement(dof_id_type node)
Definition: THMMesh.C:116
Factory & getFactory()
dof_id_type & set_id()
BoundaryID _next_boundary_id
The next boundary ID in the mesh (used for mesh generation)
Definition: THMMesh.h:69
unsigned int _dim
The dimension of the mesh.
Definition: THMMesh.h:60
MeshBase & getMesh()
Elem * addElementQuad4(dof_id_type node0, dof_id_type node1, dof_id_type node2, dof_id_type node3)
Definition: THMMesh.C:155
Elem * addElement(libMesh::ElemType elem_type, const std::vector< dof_id_type > &node_ids)
Add a new element into the mesh.
Definition: THMMesh.C:103
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
boundary_id_type BoundaryID
Elem * addElementQuad9(dof_id_type node0, dof_id_type node1, dof_id_type node2, dof_id_type node3, dof_id_type node4, dof_id_type node5, dof_id_type node6, dof_id_type node7, dof_id_type node8)
Definition: THMMesh.C:170
virtual SubdomainID getNextSubdomainId()
Gets the next subdomain ID.
Definition: THMMesh.C:202
virtual std::unique_ptr< MooseMesh > safeClone() const override
Definition: THMMesh.C:69
MooseApp & _app
virtual dof_id_type getNextElementId()
Gets the next element ID.
Definition: THMMesh.C:88
std::unique_ptr< libMesh::MeshBase > _mesh
virtual BoundaryID getNextBoundaryId()
Gets the next nodeset or sideset ID.
Definition: THMMesh.C:209
virtual void buildMesh() override
Definition: THMMesh.C:75
virtual const Node & node(const dof_id_type i) const
dof_id_type _next_node_id
The next node ID in the mesh (used for mesh generation)
Definition: THMMesh.h:63
void addClassDescription(const std::string &doc_string)
virtual unsigned int dimension() const override
Definition: THMMesh.C:57
virtual Elem * elem(const dof_id_type i)
SubdomainID _next_subdomain_id
The next subdomain ID in the mesh (used for mesh generation)
Definition: THMMesh.h:67
uint8_t dof_id_type
Node * addNode(const Point &pt)
Add a new node into the mesh.
Definition: THMMesh.C:95
registerMooseObject("ThermalHydraulicsApp", THMMesh)