Line data Source code
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 :
24 : InputParameters
25 7518 : THMMesh::validParams()
26 : {
27 7518 : InputParameters params = MooseMesh::validParams();
28 7518 : params.addClassDescription("Creates a mesh (nodes and elements) for the Components");
29 15036 : MooseEnum dims("1=1 2 3", "3");
30 15036 : 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 7518 : params.set<bool>("allow_renumbering") = false;
33 7518 : return params;
34 7518 : }
35 :
36 3759 : THMMesh::THMMesh(const InputParameters & parameters)
37 : : MooseMesh(parameters),
38 3759 : _dim(getParam<MooseEnum>("dim")),
39 3759 : _next_node_id(0),
40 3759 : _next_element_id(0),
41 3759 : _next_subdomain_id(0),
42 3759 : _next_boundary_id(0)
43 : {
44 3759 : }
45 :
46 0 : THMMesh::THMMesh(const THMMesh & other_mesh)
47 : : MooseMesh(other_mesh),
48 0 : _dim(other_mesh._dim),
49 0 : _next_node_id(other_mesh._next_node_id),
50 0 : _next_element_id(other_mesh._next_element_id),
51 0 : _next_subdomain_id(other_mesh._next_subdomain_id),
52 0 : _next_boundary_id(other_mesh._next_boundary_id)
53 : {
54 0 : }
55 :
56 : unsigned int
57 201626 : THMMesh::dimension() const
58 : {
59 201626 : return _dim;
60 : }
61 :
62 : unsigned int
63 650 : THMMesh::effectiveSpatialDimension() const
64 : {
65 650 : return _dim;
66 : }
67 :
68 : std::unique_ptr<MooseMesh>
69 0 : THMMesh::safeClone() const
70 : {
71 0 : return _app.getFactory().copyConstruct(*this);
72 : }
73 :
74 : void
75 0 : THMMesh::buildMesh()
76 : {
77 0 : getMesh().set_spatial_dimension(_dim);
78 0 : }
79 :
80 : dof_id_type
81 445053 : THMMesh::getNextNodeId()
82 : {
83 445053 : dof_id_type id = _next_node_id++;
84 445053 : return id;
85 : }
86 :
87 : dof_id_type
88 380132 : THMMesh::getNextElementId()
89 : {
90 380132 : dof_id_type id = _next_element_id++;
91 380132 : return id;
92 : }
93 :
94 : Node *
95 445053 : THMMesh::addNode(const Point & pt)
96 : {
97 445053 : dof_id_type id = getNextNodeId();
98 445053 : Node * node = _mesh->add_point(pt, id);
99 445053 : return node;
100 : }
101 :
102 : Elem *
103 50340 : THMMesh::addElement(libMesh::ElemType elem_type, const std::vector<dof_id_type> & node_ids)
104 : {
105 50340 : dof_id_type elem_id = getNextElementId();
106 :
107 50340 : Elem * elem = libMesh::Elem::build(elem_type).release();
108 : elem->set_id(elem_id);
109 50340 : _mesh->add_elem(elem);
110 441588 : for (std::size_t i = 0; i < node_ids.size(); i++)
111 391248 : elem->set_node(i, _mesh->node_ptr(node_ids[i]));
112 50340 : return elem;
113 : }
114 :
115 : Elem *
116 1099 : THMMesh::addNodeElement(dof_id_type node)
117 : {
118 1099 : dof_id_type elem_id = getNextElementId();
119 :
120 1099 : Elem * elem = new NodeElem;
121 : elem->set_id(elem_id);
122 1099 : _mesh->add_elem(elem);
123 1099 : elem->set_node(0, _mesh->node_ptr(node));
124 1099 : return elem;
125 : }
126 :
127 : Elem *
128 113073 : THMMesh::addElementEdge2(dof_id_type node0, dof_id_type node1)
129 : {
130 113073 : dof_id_type elem_id = getNextElementId();
131 :
132 113073 : Elem * elem = new Edge2;
133 : elem->set_id(elem_id);
134 113073 : _mesh->add_elem(elem);
135 113073 : elem->set_node(0, _mesh->node_ptr(node0));
136 113073 : elem->set_node(1, _mesh->node_ptr(node1));
137 113073 : return elem;
138 : }
139 :
140 : Elem *
141 0 : THMMesh::addElementEdge3(dof_id_type node0, dof_id_type node1, dof_id_type node2)
142 : {
143 0 : dof_id_type elem_id = getNextElementId();
144 :
145 0 : Elem * elem = new Edge3;
146 : elem->set_id(elem_id);
147 0 : _mesh->add_elem(elem);
148 0 : elem->set_node(0, _mesh->node_ptr(node0));
149 0 : elem->set_node(1, _mesh->node_ptr(node1));
150 0 : elem->set_node(2, _mesh->node_ptr(node2));
151 0 : return elem;
152 : }
153 :
154 : Elem *
155 215582 : THMMesh::addElementQuad4(dof_id_type node0, dof_id_type node1, dof_id_type node2, dof_id_type node3)
156 : {
157 215582 : dof_id_type elem_id = getNextElementId();
158 :
159 215582 : Elem * elem = new Quad4;
160 : elem->set_id(elem_id);
161 215582 : _mesh->add_elem(elem);
162 215582 : elem->set_node(0, _mesh->node_ptr(node0));
163 215582 : elem->set_node(1, _mesh->node_ptr(node1));
164 215582 : elem->set_node(2, _mesh->node_ptr(node2));
165 215582 : elem->set_node(3, _mesh->node_ptr(node3));
166 215582 : return elem;
167 : }
168 :
169 : Elem *
170 38 : THMMesh::addElementQuad9(dof_id_type node0,
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 38 : dof_id_type elem_id = getNextElementId();
181 :
182 38 : Elem * elem = new Quad9;
183 : elem->set_id(elem_id);
184 38 : _mesh->add_elem(elem);
185 : // vertices
186 38 : elem->set_node(0, _mesh->node_ptr(node0));
187 38 : elem->set_node(1, _mesh->node_ptr(node1));
188 38 : elem->set_node(2, _mesh->node_ptr(node2));
189 38 : elem->set_node(3, _mesh->node_ptr(node3));
190 : // mid-edges
191 76 : elem->set_node(4, _mesh->node_ptr(node4));
192 38 : elem->set_node(5, _mesh->node_ptr(node5));
193 38 : elem->set_node(6, _mesh->node_ptr(node6));
194 38 : elem->set_node(7, _mesh->node_ptr(node7));
195 : // center
196 38 : elem->set_node(8, _mesh->node_ptr(node8));
197 :
198 38 : return elem;
199 : }
200 :
201 : SubdomainID
202 7927 : THMMesh::getNextSubdomainId()
203 : {
204 7927 : SubdomainID id = _next_subdomain_id++;
205 7927 : return id;
206 : }
207 :
208 : BoundaryID
209 31840 : THMMesh::getNextBoundaryId()
210 : {
211 31840 : BoundaryID id = _next_boundary_id++;
212 31840 : return id;
213 : }
|