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-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 /// 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 
35 using namespace std;
36 
37 using 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 //=========================================================================
43 class 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 //===================================================================
88 int 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,...
Definition: fish_domain.cc:44
UnitCircle()
Constructor: Pass the number of Lagrangian and Eulerian coordinates to the constructor of the GeomObj...
Definition: fish_domain.cc:51
virtual ~UnitCircle()
Destructor – emtpy.
Definition: fish_domain.cc:54
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,...
Definition: fish_domain.cc:58
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,...
Definition: fish_domain.cc:71
int main()
Driver code for mucking around with GeomObjects, MacroElements and domains.
Definition: fish_domain.cc:88