Toggle navigation
Documentation
Big picture
The finite element method
The data structure
Not-so-quick guide
Optimisation
Order of action functions
Example codes and tutorials
List of example codes and tutorials
Meshing
Solvers
MPI parallel processing
Post-processing/visualisation
Other
Change log
Creating documentation
Coding conventions
Index
FAQ
About
People
Contact/Get involved
Publications
Acknowledgements
Copyright
Picture show
Go
src
generalised_newtonian_navier_stokes
generalised_newtonian_Tnavier_stokes_elements.cc
Go to the documentation of this file.
1
// LIC// ====================================================================
2
// LIC// This file forms part of oomph-lib, the object-oriented,
3
// LIC// multi-physics finite-element library, available
4
// LIC// at http://www.oomph-lib.org.
5
// LIC//
6
// LIC// Copyright (C) 2006-2025 Matthias Heil and Andrew Hazel
7
// LIC//
8
// LIC// This library is free software; you can redistribute it and/or
9
// LIC// modify it under the terms of the GNU Lesser General Public
10
// LIC// License as published by the Free Software Foundation; either
11
// LIC// version 2.1 of the License, or (at your option) any later version.
12
// LIC//
13
// LIC// This library is distributed in the hope that it will be useful,
14
// LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15
// LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
// LIC// Lesser General Public License for more details.
17
// LIC//
18
// LIC// You should have received a copy of the GNU Lesser General Public
19
// LIC// License along with this library; if not, write to the Free Software
20
// LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21
// LIC// 02110-1301 USA.
22
// LIC//
23
// LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24
// LIC//
25
// LIC//====================================================================
26
// Non-inline functions for triangle/tet NS elements
27
28
#include "
generalised_newtonian_Tnavier_stokes_elements.h
"
29
30
31
namespace
oomph
32
{
33
//////////////////////////////////////////////////////////////////////
34
//////////////////////////////////////////////////////////////////////
35
//////////////////////////////////////////////////////////////////////
36
37
38
//========================================================================
39
/// Unpin all internal pressure dofs.
40
//========================================================================
41
template
<
unsigned
DIM>
42
void
GeneralisedNewtonianTCrouzeixRaviartElement<
43
DIM
>::unpin_all_internal_pressure_dofs()
44
{
45
unsigned
n_pres
= this->npres_nst();
46
// loop over pressure dofs
47
for
(
unsigned
l
= 0;
l
<
n_pres
;
l
++)
48
{
49
// unpin internal pressure
50
this->internal_data_pt(P_nst_internal_index)->unpin(
l
);
51
}
52
}
53
54
55
//=========================================================================
56
/// Add to the set \c paired_load_data pairs containing
57
/// - the pointer to a Data object
58
/// and
59
/// - the index of the value in that Data object
60
/// .
61
/// for all values (pressures, velocities) that affect the
62
/// load computed in the \c get_load(...) function.
63
//=========================================================================
64
template
<
unsigned
DIM>
65
void
GeneralisedNewtonianTCrouzeixRaviartElement<DIM>::identify_load_data
(
66
std::set<std::pair<Data*, unsigned>>&
paired_load_data
)
67
{
68
// Find the index at which the velocity is stored
69
unsigned
u_index[
DIM
];
70
for
(
unsigned
i
= 0;
i
<
DIM
;
i
++)
71
{
72
u_index[
i
] = this->u_index_nst(
i
);
73
}
74
75
// Loop over the nodes
76
unsigned
n_node
= this->
nnode
();
77
for
(
unsigned
n
= 0;
n
<
n_node
;
n
++)
78
{
79
// Loop over the velocity components and add pointer to their data
80
// and indices to the vectors
81
for
(
unsigned
i
= 0;
i
<
DIM
;
i
++)
82
{
83
paired_load_data
.insert(std::make_pair(this->
node_pt
(
n
), u_index[
i
]));
84
}
85
}
86
87
// Identify the pressure data
88
identify_pressure_data(
paired_load_data
);
89
}
90
91
92
//=========================================================================
93
/// Add to the set \c paired_pressue_data pairs containing
94
/// - the pointer to a Data object
95
/// and
96
/// - the index of the value in that Data object
97
/// .
98
/// for all pressures values that affect the
99
/// load computed in the \c get_load(...) function.
100
//=========================================================================
101
template
<
unsigned
DIM>
102
void
GeneralisedNewtonianTCrouzeixRaviartElement<DIM>::identify_pressure_data
(
103
std::set<std::pair<Data*, unsigned>>&
paired_pressure_data
)
104
{
105
// Loop over the internal data
106
unsigned
n_internal
= this->
ninternal_data
();
107
for
(
unsigned
l
= 0;
l
<
n_internal
;
l
++)
108
{
109
unsigned
nval
= this->
internal_data_pt
(
l
)->
nvalue
();
110
// Add internal data
111
for
(
unsigned
j
= 0;
j
<
nval
;
j
++)
112
{
113
paired_pressure_data
.insert(
114
std::make_pair(this->
internal_data_pt
(
l
),
j
));
115
}
116
}
117
}
118
119
120
///////////////////////////////////////////////////////////////////////////
121
///////////////////////////////////////////////////////////////////////////
122
///////////////////////////////////////////////////////////////////////////
123
124
// 2D Taylor--Hood
125
126
// Set the data for the number of Variables at each node
127
template
<>
128
const
unsigned
GeneralisedNewtonianTTaylorHoodElement<2>::Initial_Nvalue
[6] =
129
{3, 3, 3, 2, 2, 2};
130
131
// Set the data for the pressure conversion array
132
template
<>
133
const
unsigned
GeneralisedNewtonianTTaylorHoodElement<2>::Pconv
[3] = {
134
0, 1, 2};
135
136
// 3D Taylor--Hood
137
// Set the data for the number of Variables at each node
138
template
<>
139
const
unsigned
GeneralisedNewtonianTTaylorHoodElement<3>::Initial_Nvalue
[10] =
140
{4, 4, 4, 4, 3, 3, 3, 3, 3, 3};
141
142
// Set the data for the pressure conversion array
143
template
<>
144
const
unsigned
GeneralisedNewtonianTTaylorHoodElement<3>::Pconv
[4] = {
145
0, 1, 2, 3};
146
147
148
//========================================================================
149
/// Unpin all pressure dofs, incl the mid-face/side ones where
150
/// they have been allocated (e.g. in the refineable version of this
151
/// element).
152
//========================================================================
153
template
<
unsigned
DIM>
154
void
GeneralisedNewtonianTTaylorHoodElement
<
155
DIM
>::unpin_all_nodal_pressure_dofs()
156
{
157
unsigned
n_node
= this->nnode();
158
// loop over nodes
159
for
(
unsigned
l
= 0;
l
<
n_node
;
l
++)
160
{
161
if
(this->node_pt(
l
)->nvalue() ==
DIM
+ 1)
162
{
163
// unpin pressure dof
164
this->node_pt(
l
)->unpin(
DIM
);
165
}
166
}
167
}
168
169
//========================================================================
170
/// Pin all nodal pressure dofs, incl the mid-face/side ones where
171
/// they have been allocated (e.g. in the refineable version of this
172
/// element).
173
//========================================================================
174
template
<
unsigned
DIM>
175
void
GeneralisedNewtonianTTaylorHoodElement
<
176
DIM
>::pin_all_nodal_pressure_dofs()
177
{
178
// Loop over all nodes and pin pressure
179
unsigned
n_node
= this->nnode();
180
for
(
unsigned
n
= 0;
n
<
n_node
;
n
++)
181
{
182
if
(this->node_pt(
n
)->nvalue() ==
DIM
+ 1)
183
{
184
this->node_pt(
n
)->pin(
DIM
);
185
}
186
}
187
}
188
189
//========================================================================
190
/// Unpin the proper nodal pressure dofs which are not hanging.
191
//========================================================================
192
template
<
unsigned
DIM>
193
void
GeneralisedNewtonianTTaylorHoodElement
<
194
DIM
>::unpin_proper_nodal_pressure_dofs()
195
{
196
// Loop over all pressure nodes and unpin if they're not hanging
197
unsigned
n_pres
= npres_nst();
198
for
(
unsigned
l
= 0;
l
<
n_pres
;
l
++)
199
{
200
Node
*
nod_pt
= this->node_pt(Pconv[
l
]);
201
if
(!
nod_pt
->is_hanging(
DIM
))
202
{
203
nod_pt
->unpin(
DIM
);
204
}
205
}
206
}
207
208
209
//=========================================================================
210
/// Add to the set \c paired_load_data pairs containing
211
/// - the pointer to a Data object
212
/// and
213
/// - the index of the value in that Data object
214
/// .
215
/// for all values (pressures, velocities) that affect the
216
/// load computed in the \c get_load(...) function.
217
//=========================================================================
218
template
<
unsigned
DIM>
219
void
GeneralisedNewtonianTTaylorHoodElement<DIM>::identify_load_data
(
220
std::set<std::pair<Data*, unsigned>>&
paired_load_data
)
221
{
222
// Loop over the nodes
223
unsigned
n_node
= this->
nnode
();
224
for
(
unsigned
n
= 0;
n
<
n_node
;
n
++)
225
{
226
// Loop over the velocity components and add pointer to their data
227
// and indices to the vectors
228
for
(
unsigned
i
= 0;
i
<
DIM
;
i
++)
229
{
230
paired_load_data
.insert(std::make_pair(this->
node_pt
(
n
),
i
));
231
}
232
}
233
234
// Add the pressure data
235
identify_pressure_data(
paired_load_data
);
236
}
237
238
//=========================================================================
239
/// Add to the set \c paired_load_data pairs containing
240
/// - the pointer to a Data object
241
/// and
242
/// - the index of the value in that Data object
243
/// .
244
/// for all values (pressures, velocities) that affect the
245
/// load computed in the \c get_load(...) function.
246
//=========================================================================
247
template
<
unsigned
DIM>
248
void
GeneralisedNewtonianTTaylorHoodElement<DIM>::identify_pressure_data
(
249
std::set<std::pair<Data*, unsigned>>&
paired_load_data
)
250
{
251
// Loop over the pressure data
252
unsigned
n_pres
= npres_nst();
253
for
(
unsigned
l
= 0;
l
<
n_pres
;
l
++)
254
{
255
// The DIMth entry in each nodal data is the pressure, which
256
// affects the traction
257
paired_load_data
.insert(std::make_pair(this->
node_pt
(Pconv[
l
]),
DIM
));
258
}
259
}
260
261
//====================================================================
262
/// / Force build of templates
263
//====================================================================
264
template
class
GeneralisedNewtonianTCrouzeixRaviartElement<2>
;
265
template
class
GeneralisedNewtonianTTaylorHoodElement<2>
;
266
267
template
class
GeneralisedNewtonianTCrouzeixRaviartElement<3>
;
268
template
class
GeneralisedNewtonianTTaylorHoodElement<3>
;
269
270
}
// namespace oomph
i
cstr elem_len * i
Definition
cfortran.h:603
oomph::Data::nvalue
unsigned nvalue() const
Return number of values stored in data object (incl pinned ones).
Definition
nodes.h:483
oomph::FiniteElement::nnode
unsigned nnode() const
Return the number of nodes.
Definition
elements.h:2214
oomph::FiniteElement::node_pt
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition
elements.h:2179
oomph::GeneralisedElement::internal_data_pt
Data *& internal_data_pt(const unsigned &i)
Return a pointer to i-th internal data object.
Definition
elements.h:605
oomph::GeneralisedElement::ninternal_data
unsigned ninternal_data() const
Return the number of internal data objects.
Definition
elements.h:810
oomph::GeneralisedNewtonianTCrouzeixRaviartElement::identify_load_data
void identify_load_data(std::set< std::pair< Data *, unsigned > > &paired_load_data)
Add to the set paired_load_data pairs of pointers to data objects and unsignedegers that index the va...
Definition
generalised_newtonian_Tnavier_stokes_elements.cc:65
oomph::GeneralisedNewtonianTCrouzeixRaviartElement::identify_pressure_data
void identify_pressure_data(std::set< std::pair< Data *, unsigned > > &paired_pressure_data)
Add to the set paired_pressure_data pairs containing.
Definition
generalised_newtonian_Tnavier_stokes_elements.cc:102
oomph::GeneralisedNewtonianTTaylorHoodElement
Taylor–Hood elements are Navier–Stokes elements with quadratic interpolation for velocities and posit...
Definition
generalised_newtonian_Tnavier_stokes_elements.h:740
oomph::GeneralisedNewtonianTTaylorHoodElement::identify_pressure_data
void identify_pressure_data(std::set< std::pair< Data *, unsigned > > &paired_pressure_data)
Add to the set paired_pressure_data pairs containing.
Definition
generalised_newtonian_Tnavier_stokes_elements.cc:248
oomph::GeneralisedNewtonianTTaylorHoodElement::identify_load_data
void identify_load_data(std::set< std::pair< Data *, unsigned > > &paired_load_data)
Add to the set paired_load_data pairs containing.
Definition
generalised_newtonian_Tnavier_stokes_elements.cc:219
oomph::Node
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
Definition
nodes.h:906
oomph::TAdvectionDiffusionReactionElement
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
Definition
Tadvection_diffusion_reaction_elements.h:66
oomph::TAdvectionDiffusionReactionElement::TAdvectionDiffusionReactionElement
TAdvectionDiffusionReactionElement()
Constructor: Call constructors for TElement and AdvectionDiffusionReaction equations.
Definition
Tadvection_diffusion_reaction_elements.h:70
generalised_newtonian_Tnavier_stokes_elements.h
oomph
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition
advection_diffusion_elements.cc:30