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
demo_drivers
poisson
fish_poisson
fish_poisson_no_adapt.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
// Driver for solution of 2D Poisson equation in fish-shaped domain
27
28
// Generic oomph-lib headers
29
#include "generic.h"
30
31
// The Poisson equations
32
#include "poisson.h"
33
34
// The fish mesh
35
#include "meshes/fish_mesh.h"
36
37
using namespace
std;
38
39
using namespace
oomph;
40
41
42
//============ start_of_namespace=====================================
43
/// Namespace for const source term in Poisson equation
44
//====================================================================
45
namespace
ConstSourceForPoisson
46
{
47
48
/// Strength of source function: default value -1.0
49
double
Strength
=-1.0;
50
51
/// Const source function
52
void
source_function
(
const
Vector<double>& x,
double
& source)
53
{
54
source =
Strength
;
55
}
56
57
}
// end of namespace
58
59
60
61
62
//======start_of_problem_class========================================
63
/// Poisson problem in fish-shaped domain.
64
/// Template parameter identifies the element type.
65
//====================================================================
66
template
<
class
ELEMENT>
67
class
FishPoissonProblem
:
public
Problem
68
{
69
70
public
:
71
72
/// Constructor
73
FishPoissonProblem
();
74
75
/// Destructor: Empty
76
virtual
~FishPoissonProblem
(){}
77
78
/// Update the problem specs after solve (empty)
79
void
actions_after_newton_solve
() {}
80
81
/// Update the problem specs before solve (empty)
82
void
actions_before_newton_solve
() {}
83
84
/// Overloaded version of the problem's access function to
85
/// the mesh. Recasts the pointer to the base Mesh object to
86
/// the actual mesh type.
87
FishMesh<ELEMENT>*
mesh_pt
()
88
{
89
return
dynamic_cast<
FishMesh<ELEMENT>*
>
(Problem::mesh_pt());
90
}
91
92
/// Doc the solution. Output directory and labels are specified
93
/// by DocInfo object
94
void
doc_solution
(DocInfo& doc_info);
95
96
};
// end of problem class
97
98
99
100
101
102
//===========start_of_constructor=========================================
103
/// Constructor for Poisson problem in fish-shaped
104
/// domain.
105
//========================================================================
106
template
<
class
ELEMENT>
107
FishPoissonProblem<ELEMENT>::FishPoissonProblem
()
108
{
109
110
// Build fish mesh -- this is a coarse base mesh consisting
111
// of four elements.
112
Problem::mesh_pt()=
new
FishMesh<ELEMENT>;
113
114
// Set the boundary conditions for this problem: All nodes are
115
// free by default -- just pin the ones that have Dirichlet conditions
116
// here. Since the boundary values are never changed, we set
117
// them here rather than in actions_before_newton_solve().
118
unsigned
n_bound = mesh_pt()->nboundary();
119
for
(
unsigned
i=0;i<n_bound;i++)
120
{
121
unsigned
n_node = mesh_pt()->nboundary_node(i);
122
for
(
unsigned
n=0;n<n_node;n++)
123
{
124
// Pin the single scalar value at this node
125
mesh_pt()->boundary_node_pt(i,n)->pin(0);
126
127
// Assign the homogenous boundary condition for the one and only
128
// nodal value
129
mesh_pt()->boundary_node_pt(i,n)->set_value(0,0.0);
130
}
131
}
132
133
// Loop over elements and set pointers to source function
134
unsigned
n_element = mesh_pt()->nelement();
135
for
(
unsigned
e=0;e<n_element;e++)
136
{
137
// Upcast from FiniteElement to the present element
138
ELEMENT *el_pt =
dynamic_cast<
ELEMENT*
>
(mesh_pt()->element_pt(e));
139
140
//Set the source function pointer
141
el_pt->source_fct_pt() = &
ConstSourceForPoisson::source_function
;
142
}
143
144
// Setup the equation numbering scheme
145
cout <<
"Number of equations: "
<< assign_eqn_numbers() << std::endl;
146
147
}
// end of constructor
148
149
150
151
152
//=======start_of_doc=====================================================
153
/// Doc the solution in tecplot format.
154
//========================================================================
155
template
<
class
ELEMENT>
156
void
FishPoissonProblem<ELEMENT>::doc_solution
(DocInfo& doc_info)
157
{
158
159
ofstream some_file;
160
char
filename[100];
161
162
// Number of plot points in each coordinate direction.
163
unsigned
npts;
164
npts=5;
165
166
167
// Output solution
168
snprintf(filename,
sizeof
(filename),
"%s/soln%i.dat"
,doc_info.directory().c_str(),
169
doc_info.number());
170
some_file.open(filename);
171
mesh_pt()->output(some_file,npts);
172
some_file.close();
173
174
// Output solution
175
snprintf(filename,
sizeof
(filename),
"%s/soln_nodes%i.dat"
,doc_info.directory().c_str(),
176
doc_info.number());
177
some_file.open(filename);
178
mesh_pt()->output(some_file,4);
179
some_file.close();
180
181
// Output solution
182
snprintf(filename,
sizeof
(filename),
"%s/soln_fine%i.dat"
,doc_info.directory().c_str(),
183
doc_info.number());
184
some_file.open(filename);
185
mesh_pt()->output(some_file,20*npts);
186
some_file.close();
187
188
189
// Output boundaries
190
snprintf(filename,
sizeof
(filename),
"%s/boundaries%i.dat"
,doc_info.directory().c_str(),
191
doc_info.number());
192
some_file.open(filename);
193
mesh_pt()->output_boundaries(some_file);
194
some_file.close();
195
196
}
// end of doc
197
198
199
200
201
202
203
204
205
//=================start_of_main==========================================
206
/// Demonstrate how to solve 2D Poisson problem in
207
/// fish-shaped domain.
208
//========================================================================
209
int
main
()
210
{
211
212
213
//Set up the problem with nine-node Poisson elements
214
FishPoissonProblem<QPoissonElement<2,3>
> problem;
215
216
// Setup labels for output
217
//------------------------
218
DocInfo doc_info;
219
220
// Set output directory
221
doc_info.set_directory(
"RESLT"
);
222
223
// Step number
224
doc_info.number()=0;
225
226
227
228
// Solve/doc the problem
229
//----------------------
230
231
// Solve the problem
232
problem.newton_solve();
233
234
//Output solution
235
problem.
doc_solution
(doc_info);
236
237
}
// end of main
238
239
FishPoissonProblem
Poisson problem in fish-shaped domain. Template parameter identifies the element type.
Definition
fish_poisson_no_adapt.cc:68
FishPoissonProblem::actions_before_newton_solve
void actions_before_newton_solve()
Update the problem specs before solve (empty)
Definition
fish_poisson_no_adapt.cc:82
FishPoissonProblem::mesh_pt
FishMesh< ELEMENT > * mesh_pt()
Overloaded version of the problem's access function to the mesh. Recasts the pointer to the base Mesh...
Definition
fish_poisson_no_adapt.cc:87
FishPoissonProblem::doc_solution
void doc_solution(DocInfo &doc_info)
Doc the solution. Output directory and labels are specified by DocInfo object.
Definition
fish_poisson_no_adapt.cc:156
FishPoissonProblem::actions_after_newton_solve
void actions_after_newton_solve()
Update the problem specs after solve (empty)
Definition
fish_poisson_no_adapt.cc:79
FishPoissonProblem::FishPoissonProblem
FishPoissonProblem()
Constructor.
Definition
fish_poisson_no_adapt.cc:107
FishPoissonProblem::~FishPoissonProblem
virtual ~FishPoissonProblem()
Destructor: Empty.
Definition
fish_poisson_no_adapt.cc:76
main
int main()
Demonstrate how to solve 2D Poisson problem in fish-shaped domain.
Definition
fish_poisson_no_adapt.cc:209
ConstSourceForPoisson
Namespace for const source term in Poisson equation.
Definition
fish_poisson.cc:48
ConstSourceForPoisson::Strength
double Strength
Strength of source function: default value -1.0.
Definition
fish_poisson.cc:51
ConstSourceForPoisson::source_function
void source_function(const Vector< double > &x, double &source)
Const source function.
Definition
fish_poisson.cc:54