fish_domain.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 code for mucking around with GeomObjects, MacroElements
27/// and Domains
28
29// Generic oomph-lib headers
30#include "generic.h"
31
32// The fish domain
33#include "meshes/fish_domain.h"
34
35using namespace std;
36
37using namespace oomph;
38
39//=======================start_of_unit_circle==============================
40/// Unit circle in 2D, centred at the origin, parametrised by a single
41/// Lagrangian coordinate, the polar angle.
42//=========================================================================
43class UnitCircle : public GeomObject
44{
45
46 public:
47
48 /// Constructor: Pass the number of Lagrangian
49 /// and Eulerian coordinates to the constructor of the
50 /// GeomObject base class.
51 UnitCircle() : GeomObject(1,2) {}
52
53 /// Destructor -- emtpy
54 virtual ~UnitCircle(){}
55
56 /// Position vector, r, to the point on the circle identified by
57 /// its 1D Lagrangian coordinate, xi (passed as a 1D Vector):
58 void position(const Vector<double>& xi, Vector<double>& r) const
59 {
60 // Eulerian position vector
61 r[0] = cos(xi[0]);
62 r[1] = sin(xi[0]);
63 }
64
65
66 /// Position vector, r, to the point on the circle identified by
67 /// its 1D Lagrangian coordinate, xi (passed as a 1D Vector) at discrete time
68 /// level t (t=0: present; t>0: previous). The shape of the object
69 /// is not time-dependent, therefore we forward this call to the
70 /// steady version.
71 void position(const unsigned& t, const Vector<double>& xi,
72 Vector<double>& r) const
73 {
74 position(xi,r);
75 }
76
77}; // end of unit circle class
78
79
80
81
82
83
84//===================================================================
85/// Driver code for mucking around with GeomObjects, MacroElements
86/// and domains
87//===================================================================
88int main()
89{
90
91
92 // Play around with a GeomObject
93 //------------------------------
94
95 // Create a unit circle
96 UnitCircle unit_circle;
97
98 // Plot:
99 ofstream circle_file("unit_circle.dat");
100
101 // Number of plot points
102 unsigned nplot=50;
103
104 // 1D vector for the Lagrangian coordinate
105 Vector<double> s(1);
106
107 // 2D vector for the Eulerian position
108 Vector<double> r(2);
109
110 for (unsigned i=0;i<nplot;i++)
111 {
112 // Lagrangian coordinate at plot point
113 s[0]=2.0*MathematicalConstants::Pi*double(i)/double(nplot-1);
114
115 // Get Eulerian position vector from GeomObject:
116 unit_circle.position(s,r);
117
118 // Plot
119 circle_file << r[0] << " " << r[1] << std::endl;
120 }
121
122
123 // Close output file
124 circle_file.close();
125
126
127
128
129
130 // Build a FishDomain and plot it
131 //-------------------------------
132
133
134 // Create the fish's back as a circle of radius 1, centred at (0.5,0.0)
135 double x_c=0.5;
136 double y_c=0.0;
137 double r_back=1.0;
138 GeomObject* back_pt=new Circle(x_c,y_c,r_back);
139
140
141 // Start and end coordinates of the fish back
142 double s_nose=2.6;
143 double s_tail=0.4;
144
145 // Create the domain
146 Domain* domain_pt=new FishDomain(back_pt,s_nose,s_tail);
147
148
149 // Plot the domain
150
151 // Number of plot points in each coordinate direction.
152 unsigned npts=10;
153
154 // Output domain (= plot its macro elements) and the macro element boundaries
155 ofstream domain_file("fish_domain.dat");
156 domain_pt->output(domain_file,npts);
157 domain_pt->output_macro_element_boundaries(domain_file,npts);
158 domain_file.close();
159
160
161}
Unit circle in 2D, centred at the origin, parametrised by a single Lagrangian coordinate,...
UnitCircle()
Constructor: Pass the number of Lagrangian and Eulerian coordinates to the constructor of the GeomObj...
virtual ~UnitCircle()
Destructor – emtpy.
void position(const Vector< double > &xi, Vector< double > &r) const
Position vector, r, to the point on the circle identified by its 1D Lagrangian coordinate,...
void position(const unsigned &t, const Vector< double > &xi, Vector< double > &r) const
Position vector, r, to the point on the circle identified by its 1D Lagrangian coordinate,...
int main()
Driver code for mucking around with GeomObjects, MacroElements and domains.