https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
18registerMooseObject("ThermalHydraulicsApp", THMMesh);
19
20const BoundaryName THMMesh::INVALID_BOUNDARY_ID = "invalid_boundary_id";
21
24{
26 params.addClassDescription("Creates a mesh (nodes and elements) for the Components");
27 MooseEnum dims("1=1 2 3", "3");
28 params.addParam<MooseEnum>("dim", dims, "The dimension of the mesh to be generated");
29 // we do not allow renumbering, because we generate our meshes
30 params.set<bool>("allow_renumbering") = false;
31 return params;
32}
33
35 : MooseMesh(parameters),
36 _dim(getParam<MooseEnum>("dim")),
37 _next_node_id(0),
38 _next_element_id(0),
39 _next_subdomain_id(0),
40 _next_boundary_id(0)
41{
42}
43
44THMMesh::THMMesh(const THMMesh & other_mesh)
45 : MooseMesh(other_mesh),
46 _dim(other_mesh._dim),
47 _next_node_id(other_mesh._next_node_id),
48 _next_element_id(other_mesh._next_element_id),
49 _next_subdomain_id(other_mesh._next_subdomain_id),
50 _next_boundary_id(other_mesh._next_boundary_id)
51{
52}
53
54unsigned int
56{
57 return _dim;
58}
59
60unsigned int
62{
63 return _dim;
64}
65
66std::unique_ptr<MooseMesh>
68{
69 return _app.getFactory().copyConstruct(*this);
70}
71
72void
74{
75 getMesh().set_spatial_dimension(_dim);
76}
77
78dof_id_type
80{
81 dof_id_type id = _next_node_id++;
82 return id;
83}
84
85dof_id_type
87{
88 dof_id_type id = _next_element_id++;
89 return id;
90}
91
92Node *
93THMMesh::addNode(const Point & pt)
94{
95 dof_id_type id = getNextNodeId();
96 Node * node = _mesh->add_point(pt, id);
97 return node;
98}
99
100Elem *
101THMMesh::addElement(libMesh::ElemType elem_type, const std::vector<dof_id_type> & node_ids)
102{
103 dof_id_type elem_id = getNextElementId();
104
105 Elem * elem = libMesh::Elem::build(elem_type).release();
106 elem->set_id(elem_id);
107 _mesh->add_elem(elem);
108 for (std::size_t i = 0; i < node_ids.size(); i++)
109 elem->set_node(i, _mesh->node_ptr(node_ids[i]));
110 return elem;
111}
112
113Elem *
114THMMesh::addNodeElement(dof_id_type node)
115{
116 dof_id_type elem_id = getNextElementId();
117
118 Elem * elem = new libMesh::NodeElem;
119 elem->set_id(elem_id);
120 _mesh->add_elem(elem);
121 elem->set_node(0, _mesh->node_ptr(node));
122 return elem;
123}
124
125Elem *
126THMMesh::addElementEdge2(dof_id_type node0, dof_id_type node1)
127{
128 dof_id_type elem_id = getNextElementId();
129
130 Elem * elem = new Edge2;
131 elem->set_id(elem_id);
132 _mesh->add_elem(elem);
133 elem->set_node(0, _mesh->node_ptr(node0));
134 elem->set_node(1, _mesh->node_ptr(node1));
135 return elem;
136}
137
138Elem *
139THMMesh::addElementEdge3(dof_id_type node0, dof_id_type node1, dof_id_type node2)
140{
141 dof_id_type elem_id = getNextElementId();
142
143 Elem * elem = new Edge3;
144 elem->set_id(elem_id);
145 _mesh->add_elem(elem);
146 elem->set_node(0, _mesh->node_ptr(node0));
147 elem->set_node(1, _mesh->node_ptr(node1));
148 elem->set_node(2, _mesh->node_ptr(node2));
149 return elem;
150}
151
152Elem *
153THMMesh::addElementQuad4(dof_id_type node0, dof_id_type node1, dof_id_type node2, dof_id_type node3)
154{
155 dof_id_type elem_id = getNextElementId();
156
157 Elem * elem = new Quad4;
158 elem->set_id(elem_id);
159 _mesh->add_elem(elem);
160 elem->set_node(0, _mesh->node_ptr(node0));
161 elem->set_node(1, _mesh->node_ptr(node1));
162 elem->set_node(2, _mesh->node_ptr(node2));
163 elem->set_node(3, _mesh->node_ptr(node3));
164 return elem;
165}
166
167Elem *
168THMMesh::addElementQuad9(dof_id_type node0,
169 dof_id_type node1,
170 dof_id_type node2,
171 dof_id_type node3,
172 dof_id_type node4,
173 dof_id_type node5,
174 dof_id_type node6,
175 dof_id_type node7,
176 dof_id_type node8)
177{
178 dof_id_type elem_id = getNextElementId();
179
180 Elem * elem = new Quad9;
181 elem->set_id(elem_id);
182 _mesh->add_elem(elem);
183 // vertices
184 elem->set_node(0, _mesh->node_ptr(node0));
185 elem->set_node(1, _mesh->node_ptr(node1));
186 elem->set_node(2, _mesh->node_ptr(node2));
187 elem->set_node(3, _mesh->node_ptr(node3));
188 // mid-edges
189 elem->set_node(4, _mesh->node_ptr(node4));
190 elem->set_node(5, _mesh->node_ptr(node5));
191 elem->set_node(6, _mesh->node_ptr(node6));
192 elem->set_node(7, _mesh->node_ptr(node7));
193 // center
194 elem->set_node(8, _mesh->node_ptr(node8));
195
196 return elem;
197}
198
201{
203 return id;
204}
205
208{
210 return id;
211}
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
registerMooseObject("ThermalHydraulicsApp", THMMesh)
std::unique_ptr< T > copyConstruct(const T &object)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
Factory & getFactory()
virtual Elem * elem(const dof_id_type i)
MeshBase & getMesh()
virtual const Node & node(const dof_id_type i) const
std::unique_ptr< libMesh::MeshBase > _mesh
static InputParameters validParams()
MooseApp & _app
Mesh for THM.
Definition THMMesh.h:19
virtual std::unique_ptr< MooseMesh > safeClone() const override
Definition THMMesh.C:67
Elem * addElementQuad4(dof_id_type node0, dof_id_type node1, dof_id_type node2, dof_id_type node3)
Definition THMMesh.C:153
Elem * addElement(libMesh::ElemType elem_type, const std::vector< dof_id_type > &node_ids)
Add a new element into the mesh.
Definition THMMesh.C:101
virtual SubdomainID getNextSubdomainId()
Gets the next subdomain ID.
Definition THMMesh.C:200
SubdomainID _next_subdomain_id
The next subdomain ID in the mesh (used for mesh generation)
Definition THMMesh.h:67
Elem * addElementEdge2(dof_id_type node0, dof_id_type node1)
Definition THMMesh.C:126
virtual unsigned int dimension() const override
Definition THMMesh.C:55
static const BoundaryName INVALID_BOUNDARY_ID
Definition THMMesh.h:72
virtual void buildMesh() override
Definition THMMesh.C:73
dof_id_type _next_element_id
The next element ID in the mesh (used for mesh generation)
Definition THMMesh.h:65
BoundaryID _next_boundary_id
The next boundary ID in the mesh (used for mesh generation)
Definition THMMesh.h:69
Elem * addNodeElement(dof_id_type node)
Definition THMMesh.C:114
Elem * addElementEdge3(dof_id_type node0, dof_id_type node1, dof_id_type node2)
Definition THMMesh.C:139
virtual BoundaryID getNextBoundaryId()
Gets the next nodeset or sideset ID.
Definition THMMesh.C:207
THMMesh(const InputParameters &parameters)
Definition THMMesh.C:34
unsigned int _dim
The dimension of the mesh.
Definition THMMesh.h:60
virtual dof_id_type getNextElementId()
Gets the next element ID.
Definition THMMesh.C:86
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:168
dof_id_type _next_node_id
The next node ID in the mesh (used for mesh generation)
Definition THMMesh.h:63
virtual dof_id_type getNextNodeId()
Gets the next node ID.
Definition THMMesh.C:79
virtual unsigned int effectiveSpatialDimension() const override
Definition THMMesh.C:61
static InputParameters validParams()
Definition THMMesh.C:23
Node * addNode(const Point &pt)
Add a new node into the mesh.
Definition THMMesh.C:93
dof_id_type & set_id()