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
Installation
Installation guide
Copyright
About
People
Contact/Get involved
Publications
Acknowledgements
Picture show
Go
src
generic
geometric_multigrid.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-2023 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
// Include the corresponding header file
27
#include "
geometric_multigrid.h
"
28
29
namespace
oomph
30
{
31
//=========================================================================
32
/// Given the son type of the element and the local coordinate s of
33
/// a given node in the son element, return the local coordinate s in its
34
/// father element. 2D case.
35
//=========================================================================
36
template
<>
37
void
MGSolver<2>::level_up_local_coord_of_node
(
const
int
& son_type,
38
Vector<double>
&
s
)
39
{
40
// If the element is unrefined between the levels the local coordinate
41
// of the node in one element is the same as that in the other element
42
// therefore we only need to perform calculations if the levels are
43
// different (i.e. son_type is not OMEGA)
44
if
(son_type !=
Tree::OMEGA
)
45
{
46
// Scale the local coordinate from the range [-1,1]x[-1,1] to the range
47
// [0,1]x[0,1] to match the width of the local coordinate range of the
48
// fine element from the perspective of the father element. This
49
// then simply requires a shift of the coordinates to match which type
50
// of son element we're dealing with
51
s
[0] = (
s
[0] + 1.0) / 2.0;
52
s
[1] = (
s
[1] + 1.0) / 2.0;
53
54
// Cases: The son_type determines how the local coordinates should be
55
// shifted to give the local coordinates in the coarse mesh element
56
switch
(son_type)
57
{
58
// If we're dealing with the bottom-left element we need to shift
59
// the range [0,1]x[0,1] to [-1,0]x[-1,0]
60
case
QuadTreeNames::SW
:
61
s
[0] -= 1;
62
s
[1] -= 1;
63
break
;
64
65
// If we're dealing with the bottom-right element we need to shift
66
// the range [0,1]x[0,1] to [0,1]x[-1,0]
67
case
QuadTreeNames::SE
:
68
s
[1] -= 1;
69
break
;
70
71
// If we're dealing with the top-right element we need to shift the
72
// range [0,1]x[0,1] to [0,1]x[0,1], i.e. nothing needs to be done
73
case
QuadTreeNames::NE
:
74
break
;
75
76
// If we're dealing with the top-left element we need to shift
77
// the range [0,1]x[0,1] to [-1,0]x[0,1]
78
case
QuadTreeNames::NW
:
79
s
[0] -= 1;
80
break
;
81
}
82
}
// if son_type!=Tree::OMEGA
83
}
// End of level_up_local_coord_of_node
84
85
//=========================================================================
86
/// Given the son type of the element and the local coordinate s of
87
/// a given node in the son element, return the local coordinate s in its
88
/// father element. 3D case.
89
//=========================================================================
90
template
<>
91
void
MGSolver<3>::level_up_local_coord_of_node
(
const
int
& son_type,
92
Vector<double>
&
s
)
93
{
94
// If the element is unrefined between the levels the local coordinate
95
// of the node in one element is the same as that in the other element
96
// therefore we only need to perform calculations if the levels are
97
// different (i.e. son_type is not OMEGA)
98
if
(son_type !=
Tree::OMEGA
)
99
{
100
// Scale the local coordinate from the range [-1,1]x[-1,1]x[-1,1]
101
// to the range [0,1]x[0,1]x[0,1] to match the width of the local
102
// coordinate range of the fine element from the perspective of
103
// the father element. This then simply requires a shift of the
104
// coordinates to match which type of son element we're dealing with
105
s
[0] = (
s
[0] + 1.0) / 2.0;
106
s
[1] = (
s
[1] + 1.0) / 2.0;
107
s
[2] = (
s
[2] + 1.0) / 2.0;
108
109
// Cases: The son_type determines how the local coordinates should be
110
// shifted to give the local coordinates in the coarse mesh element
111
switch
(son_type)
112
{
113
case
OcTreeNames::LDF
:
114
s
[0] -= 1;
115
s
[1] -= 1;
116
break
;
117
118
case
OcTreeNames::LDB
:
119
s
[0] -= 1;
120
s
[1] -= 1;
121
s
[2] -= 1;
122
break
;
123
124
case
OcTreeNames::LUF
:
125
s
[0] -= 1;
126
break
;
127
128
case
OcTreeNames::LUB
:
129
s
[0] -= 1;
130
s
[2] -= 1;
131
break
;
132
133
case
OcTreeNames::RDF
:
134
s
[1] -= 1;
135
break
;
136
137
case
OcTreeNames::RDB
:
138
s
[1] -= 1;
139
s
[2] -= 1;
140
break
;
141
142
case
OcTreeNames::RUF
:
143
break
;
144
145
case
OcTreeNames::RUB
:
146
s
[2] -= 1;
147
break
;
148
}
149
}
// if son_type!=Tree::OMEGA
150
}
// End of level_up_local_coord_of_node
151
}
// End of namespace oomph
s
static char t char * s
Definition:
cfortran.h:568
oomph::MGSolver::level_up_local_coord_of_node
void level_up_local_coord_of_node(const int &son_type, Vector< double > &s)
Given the son_type of an element and a local node number j in that element with nnode_1d nodes per co...
oomph::Tree::OMEGA
static const int OMEGA
Default value for an unassigned neighbour.
Definition:
tree.h:262
oomph::Vector< double >
geometric_multigrid.h
oomph::OcTreeNames::RDF
@ RDF
Definition:
octree.h:54
oomph::OcTreeNames::RUB
@ RUB
Definition:
octree.h:52
oomph::OcTreeNames::LUF
@ LUF
Definition:
octree.h:55
oomph::OcTreeNames::LDF
@ LDF
Definition:
octree.h:53
oomph::OcTreeNames::RDB
@ RDB
Definition:
octree.h:50
oomph::OcTreeNames::LUB
@ LUB
Definition:
octree.h:51
oomph::OcTreeNames::RUF
@ RUF
Definition:
octree.h:56
oomph::OcTreeNames::LDB
@ LDB
Definition:
octree.h:49
oomph::QuadTreeNames::SE
@ SE
Definition:
quadtree.h:57
oomph::QuadTreeNames::NW
@ NW
Definition:
quadtree.h:58
oomph::QuadTreeNames::NE
@ NE
Definition:
quadtree.h:59
oomph::QuadTreeNames::SW
@ SW
Definition:
quadtree.h:56
oomph
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
Definition:
advection_diffusion_elements.cc:30