circle.h
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#ifndef CIRCLE_HEADER
27#define CIRCLE_HEADER
28
29
30// Generic oomph-lib headers
31#include "generic.h"
32
33namespace oomph
34{
35
36//=====start_of_circle=====================================================
37/// Simple circle in 2D space.
38/// \f[ x = X_c + R \cos(\zeta) \f]
39/// \f[ y = Y_c + R \sin(\zeta) \f]
40//=========================================================================
41class SimpleCircle : public GeomObject
42{
43
44public:
45
46 /// Constructor: Pass x and y-coords of centre and radius
47 SimpleCircle(const double& x_c, const double& y_c,
48 const double& r) : GeomObject(1,2), X_c(x_c), Y_c(y_c), R(r)
49 {}
50
51 /// Position Vector at Lagrangian coordinate zeta
53 {
54 // Position vector
55 r[0] = X_c+R*cos(zeta[0]);
56 r[1] = Y_c+R*sin(zeta[0]);
57 }
58
59 /// Position Vector at Lagrangian coordinate zeta at time level t
60 /// (t=0: present; t>0: previous level). Steady object, so we
61 /// simply forward the call to the steady version.
62 void position(const unsigned& t, const Vector<double>& zeta,
63 Vector<double>& r) const
64 {position(zeta,r);}
65
66protected:
67
68 /// X-coordinate of centre
69 double X_c;
70
71 /// Y-coordinate of centre
72 double Y_c;
73
74 /// Radius
75 double R;
76
77}; // end of SimpleCircle class
78
79
80
81
82///////////////////////////////////////////////////////////////////////
83///////////////////////////////////////////////////////////////////////
84///////////////////////////////////////////////////////////////////////
85
86
87
88//=========================================================================
89/// GeneralCircle in 2D space.
90/// \f[ x = X_c + R \cos(\zeta) \f]
91/// \f[ y = Y_c + R \sin(\zeta) \f]
92/// The three parameters \f$ X_c, Y_c \f$ and \f$ R \f$ are represented
93/// by Data and can therefore be unknowns in the problem.
94//=========================================================================
95class GeneralCircle : public GeomObject
96{
97
98public:
99
100 /// Constructor: Pass x and y-coords of centre and radius (all pinned)
101 GeneralCircle(const double& x_c, const double& y_c,
102 const double& r) : GeomObject(1,2)
103 {
104 // Create Data: We have one Data item with 3 values. The Data object
105 // stores the x position of the circle's centre as value 0,
106 // the y position of the circle's centre as value 1, and the
107 // circle's radius as value 2.
108 Geom_data_pt.resize(1);
109 Geom_data_pt[0] = new Data(3);
110
111 // Assign data: X_c -- the value is free by default: Need to pin it.
112
113 // Pin the data
114 Geom_data_pt[0]->pin(0);
115 // Give it a value:
116 Geom_data_pt[0]->set_value(0,x_c);
117
118 // Assign data: Y_c -- the value is free by default: Need to pin it.
119
120 // Pin the data
121 Geom_data_pt[0]->pin(1);
122 // Give it a value:
123 Geom_data_pt[0]->set_value(1,y_c);
124
125 // Assign data: R -- the value is free by default: Need to pin it.
126
127 // Pin the data
128 Geom_data_pt[0]->pin(2);
129 // Give it a value:
130 Geom_data_pt[0]->set_value(2,r);
131
132 // I've created the data, I need to clean up
133 Must_clean_up=true;
134 }
135
136 /// Alternative constructor: Pass x and y-coords of centre and radius
137 /// (all as part of Data)
138 /// \code
139 /// Geom_data_pt[0]->value(0) = X_c;
140 /// Geom_data_pt[0]->value(1) = Y_c;
141 /// Geom_data_pt[0]->value(2) = R;
142 /// \endcode
143 GeneralCircle(Data* geom_data_pt) : GeomObject(1,2)
144 {
145#ifdef PARANOID
146 if (geom_data_pt->nvalue()!=3)
147 {
148 std::ostringstream error_stream;
149 error_stream << "Geometric Data must have 3 values, not "
150 << geom_data_pt->nvalue() << std::endl;
151
152 throw OomphLibError(error_stream.str(),
155 }
156#endif
157 Geom_data_pt.resize(1);
159
160 // Data has been created externally: Must not clean up
161 Must_clean_up=false;
162
163 } //end of alternative constructor
164
165
166 /// Destructor: Clean up if necessary
168 {
169 // Do I need to clean up?
170 if (Must_clean_up)
171 {
172 unsigned ngeom_data=Geom_data_pt.size();
173 for (unsigned i=0;i<ngeom_data;i++)
174 {
175 delete Geom_data_pt[i];
176 Geom_data_pt[i]=0;
177 }
178 }
179 } // end of destructor
180
181
182 /// Position Vector at Lagrangian coordinate zeta
184 {
185 // Extract data
186 double X_c= Geom_data_pt[0]->value(0);
187 double Y_c= Geom_data_pt[0]->value(1);
188 double R= Geom_data_pt[0]->value(2);
189
190 // Position vector
191 r[0] = X_c+R*cos(zeta[0]);
192 r[1] = Y_c+R*sin(zeta[0]);
193
194 } // end of position(...)
195
196
197 /// Position Vector at Lagrangian coordinate zeta at time level t
198 /// (t=0: present; t>0: previous level). Steady object, so we
199 /// simply forward the call to the steady version.
200 void position(const unsigned& t, const Vector<double>& zeta,
201 Vector<double>& r) const
202 {position(zeta,r);}
203
204 /// Access function to x-coordinate of centre of circle
205 double& x_c(){return *Geom_data_pt[0]->value_pt(0);}
206
207 /// Access function to y-coordinate of centre of circle
208 double& y_c(){return *Geom_data_pt[0]->value_pt(1);}
209
210 /// Access function to radius of circle
211 double& R(){return *Geom_data_pt[0]->value_pt(2);}
212
213 /// How many items of Data does the shape of the object depend on?
214 unsigned ngeom_data() const {return Geom_data_pt.size();}
215
216 /// Return pointer to the j-th Data item that the object's
217 /// shape depends on
218 Data* geom_data_pt(const unsigned& j) {return Geom_data_pt[j];}
219
220
221protected:
222
223 /// Vector of pointers to Data items that affects the object's shape
225
226 /// Do I need to clean up?
228
229};
230
231}
232
233#endif
void demo_fish_poisson(const string &directory_name)
Demonstrate how to solve 2D Poisson problem in deformable fish-shaped domain with mesh adaptation.
GeneralCircle in 2D space.
Definition circle.h:96
double & R()
Access function to radius of circle.
Definition circle.h:211
Vector< Data * > Geom_data_pt
Vector of pointers to Data items that affects the object's shape.
Definition circle.h:224
virtual ~GeneralCircle()
Destructor: Clean up if necessary.
Definition circle.h:167
bool Must_clean_up
Do I need to clean up?
Definition circle.h:227
double & x_c()
Access function to x-coordinate of centre of circle.
Definition circle.h:205
unsigned ngeom_data() const
How many items of Data does the shape of the object depend on?
Definition circle.h:214
void position(const unsigned &t, const Vector< double > &zeta, Vector< double > &r) const
Position Vector at Lagrangian coordinate zeta at time level t (t=0: present; t>0: previous level)....
Definition circle.h:200
GeneralCircle(const double &x_c, const double &y_c, const double &r)
Constructor: Pass x and y-coords of centre and radius (all pinned)
Definition circle.h:101
void position(const Vector< double > &zeta, Vector< double > &r) const
Position Vector at Lagrangian coordinate zeta.
Definition circle.h:183
Data * geom_data_pt(const unsigned &j)
Return pointer to the j-th Data item that the object's shape depends on.
Definition circle.h:218
double & y_c()
Access function to y-coordinate of centre of circle.
Definition circle.h:208
GeneralCircle(Data *geom_data_pt)
Alternative constructor: Pass x and y-coords of centre and radius (all as part of Data)
Definition circle.h:143
Simple circle in 2D space.
Definition circle.h:42
void position(const unsigned &t, const Vector< double > &zeta, Vector< double > &r) const
Position Vector at Lagrangian coordinate zeta at time level t (t=0: present; t>0: previous level)....
Definition circle.h:62
double Y_c
Y-coordinate of centre.
Definition circle.h:72
SimpleCircle(const double &x_c, const double &y_c, const double &r)
Constructor: Pass x and y-coords of centre and radius.
Definition circle.h:47
void position(const Vector< double > &zeta, Vector< double > &r) const
Position Vector at Lagrangian coordinate zeta.
Definition circle.h:52
double X_c
X-coordinate of centre.
Definition circle.h:69
double R
Radius.
Definition circle.h:75
Definition circle.h:34