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
demo_drivers
interaction
free_boundary_poisson
old_for_doc.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-2024 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
//###########################################################
27
// OLD VERSION OF CODE -- KEEP ALIVE BECAUSE IT ALLOWS
28
// PLOT OF COUPLED AND UNCOUPLED SOLUTIONS!
29
//###########################################################
30
31
// Driver for solution of "free boundary" 2D Poisson equation in
32
// fish-shaped domain with adaptivity
33
34
35
// Generic oomph-lib headers
36
#include "generic.h"
37
38
// The Poisson equations
39
#include "poisson.h"
40
41
// The fish mesh
42
#include "meshes/fish_mesh.h"
43
44
// Circle as generalised element:
45
#include "
circle_as_generalised_element.h
"
46
47
using namespace
std;
48
49
using namespace
oomph
;
50
51
/// ////////////////////////////////////////////////////////////////////
52
/// ////////////////////////////////////////////////////////////////////
53
/// ////////////////////////////////////////////////////////////////////
54
55
56
57
//====================================================================
58
/// Namespace for const source term in Poisson equation
59
//====================================================================
60
namespace
ConstSourceForPoisson
61
{
62
/// Strength of source function: default value 1.0
63
double
Strength
=1.0;
64
65
/// Const source function
66
void
get_source
(
const
Vector<double>
&
x
,
double
&
source
)
67
{
68
source
= -
Strength
;
69
}
70
71
}
72
73
74
/// /////////////////////////////////////////////////////////////////////
75
/// /////////////////////////////////////////////////////////////////////
76
/// /////////////////////////////////////////////////////////////////////
77
78
79
80
//====================================================================
81
/// Refineable Poisson problem in deformable fish-shaped domain.
82
/// Template parameter identifies the element.
83
//====================================================================
84
template
<
class
ELEMENT>
85
class
RefineableFishPoissonProblem
:
public
Problem
86
{
87
88
public
:
89
90
/// Constructor: Bool flag specifies if position of fish back is
91
/// prescribed or computed from the coupled problem. String specifies
92
/// output directory
93
RefineableFishPoissonProblem
(
bool
fix_position
,
string
directory_name
);
94
95
/// Destructor
96
virtual
~RefineableFishPoissonProblem
();
97
98
/// Update after Newton step: Update in response to possible changes
99
/// in the wall shape
100
void
actions_before_newton_convergence_check
()
101
{
102
fish_mesh_pt
()->node_update();
103
}
104
105
106
/// Update the problem specs before solve: Update nodal positions
107
void
actions_before_newton_solve
()
108
{
109
fish_mesh_pt
()->node_update();
110
}
111
112
/// Update the problem specs after solve (empty)
113
void
actions_after_newton_solve
(){}
114
115
//Access function for the fish mesh
116
MacroElementNodeUpdateRefineableFishMesh<ELEMENT>
*
fish_mesh_pt
()
117
{
118
return
Fish_mesh_pt
;
119
}
120
121
/// Return value of the "load" on the elastically supported ring
122
/// that represents the fish's back
123
double
&
load
()
124
{
125
return
*
Load_pt
->value_pt(0);
126
}
127
128
/// Return value of the vertical displacement of the ring that
129
/// represents the fish's back
130
double
&
y_c
()
131
{
132
return
static_cast<
ElasticallySupportedRingElement
*
>
(
fish_mesh_pt
()->
133
fish_back_pt
())->
y_c
();
134
}
135
136
/// Doc the solution
137
void
doc_solution
();
138
139
/// Access to DocInfo object
140
DocInfo
&
doc_info
() {
return
Doc_info
;}
141
142
private
:
143
144
/// Node at which the solution of the Poisson equation is documented
145
/// This solution at this node is also used as the "load" on the ring
146
/// that represents the fish's back
147
Node
*
Doc_node_pt
;
148
149
/// Trace file
150
ofstream
Trace_file
;
151
152
/// Pointer to fish mesh
153
MacroElementNodeUpdateRefineableFishMesh<ELEMENT>
*
Fish_mesh_pt
;
154
155
/// Pointer to single-element mesh that stores the GeneralisedElement
156
/// that represents the fish's back
157
Mesh
*
Fish_back_mesh_pt
;
158
159
/// Pointer to data item that stores the "load" on the fish back
160
Data
*
Load_pt
;
161
162
/// Is the position of the fish's back prescribed?
163
bool
Fix_position
;
164
165
/// Doc info object
166
DocInfo
Doc_info
;
167
168
};
169
170
171
172
173
174
//========================================================================
175
/// Constructor for adaptive Poisson problem in deformable fish-shaped
176
/// domain. Pass flag if position of fish back is fixed, and the output
177
/// directory.
178
//========================================================================
179
template
<
class
ELEMENT>
180
RefineableFishPoissonProblem<ELEMENT>::RefineableFishPoissonProblem
(
181
bool
fix_position
,
string
directory_name
) : Fix_position(
fix_position
)
182
{
183
184
// Set output directory
185
Doc_info
.set_directory(
directory_name
);
186
187
// Initialise step number
188
Doc_info
.number()=0;
189
190
// Open trace file
191
char
filename
[100];
192
sprintf
(
filename
,
"%s/trace.dat"
,
directory_name
.c_str());
193
Trace_file
.open(
filename
);
194
Trace_file
195
<<
"VARIABLES=\"load\",\"y<sub>circle</sub>\",\"u<sub>control</sub>\""
196
<< std::endl;
197
198
// Set coordinates and radius for the circle that will become the fish back
199
double
x_c=0.5;
200
double
y_c
=0.0;
201
double
r_back
=1.0;
202
203
// Build geometric object that will become the fish back
204
GeomObject*
fish_back_pt
=
new
ElasticallySupportedRingElement
(x_c,
y_c
,
r_back
);
205
206
// Build fish mesh with geometric object that specifies the fish back
207
Fish_mesh_pt
=
new
MacroElementNodeUpdateRefineableFishMesh<ELEMENT>
(
fish_back_pt
);
208
209
// Add the fish mesh to the problem's collection of submeshes:
210
add_sub_mesh
(
Fish_mesh_pt
);
211
212
// Build mesh that will store only the geometric wall element
213
Fish_back_mesh_pt
=
new
Mesh
;
214
215
// So far, the mesh is completely empty. Let's add the
216
// one (and only!) GeneralisedElement which represents the shape
217
// of the fish's back to it:
218
Fish_back_mesh_pt
->add_element_pt(
dynamic_cast<
GeneralisedElement
*
>
(
219
Fish_mesh_pt
->fish_back_pt()));
220
221
// Add the fish back mesh to the problem's collection of submeshes:
222
add_sub_mesh
(
Fish_back_mesh_pt
);
223
224
// Now build global mesh from the submeshes
225
build_global_mesh
();
226
227
// Create/set error estimator
228
fish_mesh_pt
()->spatial_error_estimator_pt()=
new
Z2ErrorEstimator
;
229
230
231
// Choose a node at which the solution is documented: Choose
232
// the central node that is shared by all four elements in
233
// the base mesh because it exists at all refinement levels.
234
235
// How many nodes does element 0 have?
236
unsigned
nnod
=
fish_mesh_pt
()->finite_element_pt(0)->nnode();
237
238
// The central node is the last node in element 0:
239
Doc_node_pt
=
fish_mesh_pt
()->finite_element_pt(0)->node_pt(
nnod
-1);
240
241
// Doc
242
cout
<< std::endl <<
"Control node is located at: "
243
<<
Doc_node_pt
->x(0) <<
" "
<<
Doc_node_pt
->x(1) << std::endl << std::endl;
244
245
// Position of fish back is prescribed
246
if
(
Fix_position
)
247
{
248
// Create the load data object
249
Load_pt
=
new
Data
(1);
250
251
// Pin the prescribed load
252
Load_pt
->pin(0);
253
254
// Pin the vertical displacement
255
dynamic_cast<
ElasticallySupportedRingElement
*
>
(
256
Fish_mesh_pt
->fish_back_pt())->
pin_yc
();
257
258
}
259
// Coupled problem: The position of the fish back is determined
260
// via the solution of the Poisson equation: The solution at
261
// the control node acts as the load for the displacement of the
262
// fish back
263
else
264
{
265
// Use the solution (value 0) at the control node as the load
266
// that acts on the ring. [Note: Node == Data by inheritance]
267
Load_pt
=
Doc_node_pt
;
268
}
269
270
271
// Set the pointer to the Data object that specifies the
272
// load on the fish's back
273
dynamic_cast<
ElasticallySupportedRingElement
*
>
(
Fish_mesh_pt
->fish_back_pt())->
274
set_load_pt
(
Load_pt
);
275
276
277
// Set the boundary conditions for this problem: All nodes are
278
// free by default -- just pin the ones that have Dirichlet conditions
279
// here.
280
unsigned
num_bound
=
fish_mesh_pt
()->nboundary();
281
for
(
unsigned
ibound
=0;
ibound
<
num_bound
;
ibound
++)
282
{
283
unsigned
num_nod
=
fish_mesh_pt
()->nboundary_node(
ibound
);
284
for
(
unsigned
inod
=0;
inod
<
num_nod
;
inod
++)
285
{
286
fish_mesh_pt
()->boundary_node_pt(
ibound
,
inod
)->pin(0);
287
}
288
}
289
290
291
// Set homogeneous boundary conditions on all boundaries
292
for
(
unsigned
ibound
=0;
ibound
<
num_bound
;
ibound
++)
293
{
294
// Loop over the nodes on boundary
295
unsigned
num_nod
=
fish_mesh_pt
()->nboundary_node(
ibound
);
296
for
(
unsigned
inod
=0;
inod
<
num_nod
;
inod
++)
297
{
298
fish_mesh_pt
()->boundary_node_pt(
ibound
,
inod
)->set_value(0,0.0);
299
}
300
}
301
302
/// Loop over elements and set pointers to source function
303
unsigned
n_element
=
fish_mesh_pt
()->nelement();
304
for
(
unsigned
i
=0;
i
<
n_element
;
i
++)
305
{
306
// Upcast from FiniteElement to the present element
307
ELEMENT
*
el_pt
=
dynamic_cast<
ELEMENT
*
>
(
fish_mesh_pt
()->element_pt(
i
));
308
309
//Set the source function pointer
310
el_pt
->source_fct_pt() = &
ConstSourceForPoisson::get_source
;
311
}
312
313
// Do equation numbering
314
cout
<<
"Number of equations: "
<<
assign_eqn_numbers
() << std::endl;
315
316
}
317
318
319
320
//========================================================================
321
/// Destructor for Poisson problem in deformable fish-shaped domain.
322
//========================================================================
323
template
<
class
ELEMENT>
324
RefineableFishPoissonProblem<ELEMENT>::~RefineableFishPoissonProblem
()
325
{
326
// Close trace file
327
Trace_file.close();
328
329
}
330
331
332
333
334
//========================================================================
335
/// Doc the solution in tecplot format.
336
//========================================================================
337
template
<
class
ELEMENT>
338
void
RefineableFishPoissonProblem<ELEMENT>::doc_solution
()
339
{
340
341
ofstream
some_file
;
342
char
filename
[100];
343
344
// Number of plot points in each coordinate direction.
345
unsigned
npts
;
346
npts
=5;
347
348
349
// Output solution
350
sprintf
(
filename
,
"%s/soln%i.dat"
,Doc_info.directory().c_str(),
351
Doc_info.number());
352
some_file
.open(
filename
);
353
fish_mesh_pt()->output(
some_file
,
npts
);
354
some_file
.close();
355
356
// Write "load" on the fish's back, vertical position of the
357
// fish back, and solution at control node to trace file
358
Trace_file
359
<<
static_cast<
ElasticallySupportedRingElement
*
>
(fish_mesh_pt()->
360
fish_back_pt
())->load()
361
<<
" "
362
<<
static_cast<
ElasticallySupportedRingElement
*
>
(fish_mesh_pt()->
363
fish_back_pt
())->y_c()
364
<<
" "
<< Doc_node_pt->value(0) << std::endl;
365
}
366
367
368
369
370
371
372
373
/// /////////////////////////////////////////////////////////////////////
374
/// /////////////////////////////////////////////////////////////////////
375
/// /////////////////////////////////////////////////////////////////////
376
377
378
//========================================================================
379
/// Demonstrate how to solve 2D Poisson problem in deformable
380
/// fish-shaped domain with mesh adaptation.
381
//========================================================================
382
template
<
class
ELEMENT>
383
void
demo_fish_poisson
(
const
string
&
directory_name
)
384
{
385
386
// Set up the problem with prescribed displacement of fish back
387
bool
fix_position
=
true
;
388
RefineableFishPoissonProblem<ELEMENT>
problem
(
fix_position
,
directory_name
);
389
390
391
// Change/doc targets for mesh adaptation
392
if
(CommandLineArgs::Argc>1)
393
{
394
problem
.fish_mesh_pt()->max_permitted_error()=0.05;
395
problem
.fish_mesh_pt()->min_permitted_error()=0.005;
396
}
397
else
398
{
399
problem
.fish_mesh_pt()->max_permitted_error()=0.005;
400
problem
.fish_mesh_pt()->min_permitted_error()=0.0005;
401
}
402
problem
.fish_mesh_pt()->doc_adaptivity_targets(
cout
);
403
404
405
// Do some uniform mesh refinement first
406
//--------------------------------------
407
problem
.refine_uniformly();
408
problem
.refine_uniformly();
409
410
// Initial value for the vertical displacement of the fish's back
411
problem
.y_c()=-0.3;
412
413
// Loop for different fish shapes
414
//-------------------------------
415
416
// Number of steps
417
unsigned
nstep
=5;
418
if
(CommandLineArgs::Argc>1)
nstep
=1;
419
420
// Increment in displacement
421
double
dyc
=0.6/
double
(
nstep
-1);
422
423
// Loop over different fish shapes
424
for
(
unsigned
istep
=0;
istep
<
nstep
;
istep
++)
425
{
426
// Solve/doc
427
unsigned
max_solve
=2;
428
problem
.newton_solve(
max_solve
);
429
problem
.doc_solution();
430
431
//Increment counter for solutions
432
problem
.doc_info().number()++;
433
434
// Change vertical displacement
435
problem
.y_c()+=
dyc
;
436
}
437
438
}
439
440
441
//========================================================================
442
/// Demonstrate how to solve coupled "elastic" 2D Poisson problem in deformable
443
/// fish-shaped domain with mesh adaptation.
444
//========================================================================
445
template
<
class
ELEMENT>
446
void
demo_elastic_fish_poisson
(
const
string
&
directory_name
)
447
{
448
449
//Set up the problem with "elastic" fish back
450
bool
fix_position
=
false
;
451
RefineableFishPoissonProblem<ELEMENT>
problem
(
fix_position
,
directory_name
);
452
453
// Change/doc targets for mesh adaptation
454
if
(CommandLineArgs::Argc>1)
455
{
456
problem
.fish_mesh_pt()->max_permitted_error()=0.05;
457
problem
.fish_mesh_pt()->min_permitted_error()=0.005;
458
}
459
problem
.fish_mesh_pt()->doc_adaptivity_targets(
cout
);
460
461
462
// Do some uniform mesh refinement first
463
problem
.refine_uniformly();
464
problem
.refine_uniformly();
465
466
// Initial guess for "load" on fish back
467
problem
.load()=0.0;
468
469
// Solve/doc fully coupled problem
470
unsigned
max_solve
=2;
471
problem
.newton_solve(
max_solve
);
472
problem
.doc_solution();
473
474
}
475
476
477
478
479
480
//========================================================================
481
/// Driver for "elastic" fish poisson solver with adaptation.
482
/// If there are any command line arguments, we regard this as a
483
/// validation run and reduce the targets for the mesh adaptation.
484
//========================================================================
485
int
main
(
int
argc
,
char
*
argv
[])
486
{
487
488
// Store command line arguments
489
CommandLineArgs::setup(
argc
,
argv
);
490
491
// Shorthand for element type
492
typedef
MacroElementNodeUpdateElement<RefineableQPoissonElement<2,3>
>
ELEMENT
;
493
494
// Compute solution of Poisson equation in various domains -- prescribed
495
// boundary shape.
496
demo_fish_poisson<ELEMENT>
(
"RESLT"
);
497
498
// Compute coupled "elastic" coupled solution directly
499
demo_elastic_fish_poisson<ELEMENT>
(
"RESLT_coupled"
);
500
501
}
502
503
demo_fish_poisson
void demo_fish_poisson(const string &directory_name)
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
Definition
algebraic_free_boundary_poisson.cc:460
main
int main()
Driver.
Definition
circle.cc:40
circle_as_generalised_element.h
RefineableFishPoissonProblem
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
Definition
algebraic_free_boundary_poisson.cc:81
RefineableFishPoissonProblem::RefineableFishPoissonProblem
RefineableFishPoissonProblem(const bool &fix_position, const string &directory_name, const unsigned &i_case)
Constructor: Bool flag specifies if position of fish back is prescribed or computed from the coupled ...
Definition
algebraic_free_boundary_poisson.cc:240
RefineableFishPoissonProblem::~RefineableFishPoissonProblem
virtual ~RefineableFishPoissonProblem()
Destructor.
RefineableFishPoissonProblem::load
double & load()
Return value of the "load" on the elastically supported ring that represents the fish's back.
Definition
old_for_doc.cc:123
RefineableFishPoissonProblem::y_c
double & y_c()
Return value of the vertical displacement of the ring that represents the fish's back.
Definition
old_for_doc.cc:130
RefineableFishPoissonProblem::Fix_position
bool Fix_position
Is the position of the fish back prescribed?
Definition
algebraic_free_boundary_poisson.cc:220
RefineableFishPoissonProblem::doc_info
DocInfo & doc_info()
Access to DocInfo object.
Definition
old_for_doc.cc:140
RefineableFishPoissonProblem::actions_before_newton_solve
void actions_before_newton_solve()
Update the problem specs before solve: Update nodal positions.
Definition
old_for_doc.cc:107
RefineableFishPoissonProblem::Doc_node_pt
Node * Doc_node_pt
Node at which the solution of the Poisson equation is documented.
Definition
algebraic_free_boundary_poisson.cc:204
RefineableFishPoissonProblem::doc_solution
void doc_solution()
Doc the solution.
RefineableFishPoissonProblem::~RefineableFishPoissonProblem
virtual ~RefineableFishPoissonProblem()
Destructor.
Definition
algebraic_free_boundary_poisson.cc:390
RefineableFishPoissonProblem::Fish_mesh_pt
MacroElementNodeUpdateRefineableFishMesh< ELEMENT > * Fish_mesh_pt
Pointer to fish mesh.
Definition
old_for_doc.cc:153
RefineableFishPoissonProblem::fish_mesh_pt
AlgebraicRefineableFishMesh< ELEMENT > * fish_mesh_pt()
Definition
algebraic_free_boundary_poisson.cc:112
RefineableFishPoissonProblem::actions_after_newton_solve
void actions_after_newton_solve()
Update the problem specs after solve (empty)
Definition
old_for_doc.cc:113
RefineableFishPoissonProblem::actions_before_newton_convergence_check
void actions_before_newton_convergence_check()
Update after Newton step: Update in response to possible changes in the wall shape.
Definition
old_for_doc.cc:100
RefineableFishPoissonProblem::Load_pt
Data * Load_pt
Pointer to data item that stores the "load" on the fish back.
Definition
algebraic_free_boundary_poisson.cc:217
RefineableFishPoissonProblem::Trace_file
ofstream Trace_file
Trace file.
Definition
algebraic_free_boundary_poisson.cc:207
RefineableFishPoissonProblem::Fish_back_mesh_pt
Mesh * Fish_back_mesh_pt
Pointer to single-element mesh that stores the GeneralisedElement that represents the fish back.
Definition
algebraic_free_boundary_poisson.cc:214
RefineableFishPoissonProblem::Doc_info
DocInfo Doc_info
Doc info object.
Definition
algebraic_free_boundary_poisson.cc:223
RefineableFishPoissonProblem::fish_mesh_pt
MacroElementNodeUpdateRefineableFishMesh< ELEMENT > * fish_mesh_pt()
Definition
old_for_doc.cc:116
RefineableFishPoissonProblem::Fish_mesh_pt
AlgebraicRefineableFishMesh< ELEMENT > * Fish_mesh_pt
Pointer to fish mesh.
Definition
algebraic_free_boundary_poisson.cc:210
ConstSourceForPoisson
//////////////////////////////////////////////////////////////////// ////////////////////////////////...
Definition
algebraic_free_boundary_poisson.cc:56
ConstSourceForPoisson::get_source
void get_source(const Vector< double > &x, double &source)
Const source function.
Definition
algebraic_free_boundary_poisson.cc:61
ConstSourceForPoisson::Strength
double Strength
Strength of source function: default value 1.0.
Definition
algebraic_free_boundary_poisson.cc:58
oomph
Definition
circle.h:34
demo_elastic_fish_poisson
void demo_elastic_fish_poisson(const string &directory_name)
Demonstrate how to solve coupled "elastic" 2D Poisson problem in deformable fish-shaped domain with m...
Definition
old_for_doc.cc:446
demo_fish_poisson
void demo_fish_poisson(const string &directory_name)
///////////////////////////////////////////////////////////////////// ///////////////////////////////...
Definition
old_for_doc.cc:383