geom_obj_with_boundary.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-2026 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 OOMPH_GEOM_OBJ_WITH_BOUNDARY_HEADER
27#define OOMPH_GEOM_OBJ_WITH_BOUNDARY_HEADER
28
29
30// Config header
31#ifdef HAVE_CONFIG_H
32#include <oomph-lib-config.h>
33#endif
34
35
36// oomph-lib headers
37#include "geom_objects.h"
38#include "fixed_size_vector.h"
39
40namespace oomph
41{
42 //===========================================================================
43 /// Base class for upgraded disk-like GeomObject (i.e. 2D surface in 3D space)
44 /// with specification of boundaries. The GeomObject's position(...)
45 /// function computes the 3D (Eulerian) position vector r as a function of the
46 /// 2D intrinsic (Lagrangian) coordinates, zeta, without reference to
47 /// any boundaries. This class specifies the boundaries by specifying
48 /// a mapping from a 1D intrinsic boundary coordinate, zeta_bound,
49 /// to the 2D intrinsic (Lagrangian) coordinates, zeta. Here, zeta_bound
50 /// is a local parameter defined on each boundary segment, while a new global
51 /// boundary coordinate, zeta_global, is defined over the entire boundary of
52 /// the object, taking values in [0, 2π]. The class also establishes a mapping
53 /// between zeta_bound (local) and zeta_global.
54 ///
55 /// The class is made functional by provision (in the derived class!) of:
56 /// - a pointer to a GeomObject<1,2> that parametrises the 2D intrinisic
57 /// coordinates zeta along boundary b in terms of the 1D boundary
58 /// coordinate, zeta_bound,
59 /// - the initial value of the 1D boundary coordinate zeta_bound on boundary
60 /// b,
61 /// - the final value of the 1D boundary coordinate zeta_bound on boundary b
62 /// .
63 /// for each of these boundaries. All three containers for these
64 /// must be resized (consistently) and populated in the derived class.
65 /// Number of boundaries is inferred from their size.
66 ///
67 /// Class also provides broken virtual function to specify boundary triads,
68 /// and various output functions.
69 //===========================================================================
71 {
72 public:
73 /// Constructor
75 {
76 R_work_space.resize(3);
77 Zeta_work_space.resize(2);
78 }
79
80 /// How many boundaries do we have?
81 unsigned nboundary() const
82 {
84 }
85
86 /// Parametrised position on object at current time: r(zeta).
87 /// but specialised to 2D disk in 3D space
101
102
103 /// Compute 3D vector of Eulerian coordinates at 1D boundary
104 /// coordinate zeta_bound on boundary b:
113
114 /// Compute 2D vector of intrinsic coordinates at 1D boundary
115 /// coordinate zeta_bound on boundary b:
116 void zeta_on_boundary(const unsigned& b,
117 const double& zeta_bound,
119 {
120#ifdef PARANOID
122 {
123 std::ostringstream error_message;
124 error_message << "You must create a <1,2> Geom Object that provides a\n"
125 << "mapping from the 1D boundary coordinate to the 2D\n"
126 << "intrinsic Lagrangian coordinate of disk-like object\n"
127 << std::endl;
128 throw OomphLibError(error_message.str(),
131 }
133 {
134 std::ostringstream error_message;
135 error_message << "Boundary_parametrising_geom_object_pt must point to\n"
136 << "GeomObject with one Lagrangian coordinate. Yours has "
138 << std::endl;
139 throw OomphLibError(error_message.str(),
142 }
144 {
145 std::ostringstream error_message;
146 error_message << "Boundary_parametrising_geom_object_pt must point to\n"
147 << "GeomObject with two Eulerian coordinates. Yours has "
149 << std::endl;
150 throw OomphLibError(error_message.str(),
153 }
154#endif
158 zeta2);
159 zeta[0] = zeta2[0];
160 zeta[1] = zeta2[1];
161 }
162
163 /// Pointer to GeomObject<1,2> that parametrises intrinisc
164 /// coordinates along boundary b
169
170 /// Initial value of 1D boundary coordinate
171 /// zeta_bound on boundary b:
172 double zeta_boundary_start(const unsigned& b) const
173 {
174 return Zeta_boundary_start[b];
175 }
176
177 /// Final value of 1D boundary coordinate
178 /// zeta_bound on boundary b:
179 double zeta_boundary_end(const unsigned& b) const
180 {
181 return Zeta_boundary_end[b];
182 }
183
184 /// Initial value of 1D global boundary coordinate on boundary b
185 double zeta_global_boundary_start(const unsigned& b) const
186 {
188 }
189
190 /// Final value of 1D global boundary coordinate on boundary b
191 double zeta_global_boundary_end(const unsigned& b) const
192 {
193 return Zeta_global_boundary_end[b];
194 }
195
196
197 /// Boundary triad on boundary b at boundary coordinate zeta_bound.
198 /// Broken virtual.
199 virtual void boundary_triad(const unsigned& b,
200 const double& zeta_bound,
205 {
206 std::ostringstream error_message;
207 error_message << "Broken virtual function; please implement for your\n"
208 << "derived version of this class!" << std::endl;
209 throw OomphLibError(
211 }
212
213 /// Output boundaries at nplot plot points. Streams:
214 /// - two_d_boundaries_file: zeta_0, zeta_1, zeta_bound
215 /// - three_d_boundaries_file : x, y, z, zeta_0, zeta_1, zeta_bound
230
231
232 /// Output boundaries and triad at nplot plot points. Streams:
233 /// - two_d_boundaries_file: zeta_0, zeta_1, zeta_bound
234 /// - three_d_boundaries_file : x, y, z, zeta_0, zeta_1, zeta_bound
235 /// - boundaries_tangent_file : x, y, z, t_x, t_y, t_z
236 /// - boundaries_normal_file : x, y, z, n_x, n_y, n_z
237 /// - boundaries_binormal_file: x, y, z, N_x, N_y, N_z
239 std::ofstream& two_d_boundaries_file,
240 std::ofstream& three_d_boundaries_file,
241 std::ofstream& boundaries_tangent_file,
242 std::ofstream& boundaries_normal_file,
243 std::ofstream& boundaries_binormal_file)
244 {
247 double zeta_bound = 0.0;
251 unsigned nb = nboundary();
252 for (unsigned b = 0; b < nb; b++)
253 {
254 two_d_boundaries_file << "ZONE" << std::endl;
255 three_d_boundaries_file << "ZONE" << std::endl;
256 boundaries_tangent_file << "ZONE" << std::endl;
257 boundaries_normal_file << "ZONE" << std::endl;
258 boundaries_binormal_file << "ZONE" << std::endl;
259
260 double zeta_min = zeta_boundary_start(b);
261 double zeta_max = zeta_boundary_end(b);
262 unsigned n = 100;
263 for (unsigned i = 0; i < n; i++)
264 {
265 zeta_bound =
266 zeta_min + (zeta_max - zeta_min) * double(i) / double(n - 1);
269
270 two_d_boundaries_file << zeta[0] << " " << zeta[1] << " "
271 << zeta_bound << " " << std::endl;
272
273 three_d_boundaries_file << r[0] << " " << r[1] << " " << r[2] << " "
274 << zeta[0] << " " << zeta[1] << " "
275 << zeta_bound << " " << std::endl;
276
277 boundaries_tangent_file << r[0] << " " << r[1] << " " << r[2] << " "
278 << tangent[0] << " " << tangent[1] << " "
279 << tangent[2] << " " << std::endl;
280
281 boundaries_normal_file << r[0] << " " << r[1] << " " << r[2] << " "
282 << normal[0] << " " << normal[1] << " "
283 << normal[2] << " " << std::endl;
284
285 boundaries_binormal_file << r[0] << " " << r[1] << " " << r[2] << " "
286 << binormal[0] << " " << binormal[1] << " "
287 << binormal[2] << " " << std::endl;
288 }
289 }
290 }
291
292
293 /// Specify intrinsic coordinates of a point within a specified
294 /// region -- region ID, r, should be positive.
295 void add_region_coordinates(const unsigned& r,
297 {
298 // Verify if not using the default region number (zero)
299 if (r == 0)
300 {
301 std::ostringstream error_message;
302 error_message
303 << "Please use another region id different from zero.\n"
304 << "It is internally used as the default region number.\n";
305 throw OomphLibError(error_message.str(),
308 }
309 // Need two coordinates
310 unsigned n = zeta_in_region.size();
311 if (n != 2)
312 {
313 std::ostringstream error_message;
314 error_message << "Vector specifying zeta coordinates of point in\n"
315 << "region has be length 2; yours has length " << n
316 << std::endl;
317 throw OomphLibError(error_message.str(),
320 }
321
322 // First check if the region with the specified id does not already exist
323 std::map<unsigned, Vector<double>>::iterator it;
324 it = Zeta_in_region.find(r);
325
326 // If it is already a region defined with that id throw an error
327 if (it != Zeta_in_region.end())
328 {
329 std::ostringstream error_message;
330 error_message << "The region id (" << r << ") that you are using for"
331 << "defining\n"
332 << "your region is already in use. Use another\n"
333 << "region id and verify that you are not re-using\n"
334 << " previously defined regions ids.\n"
335 << std::endl;
336 OomphLibWarning(error_message.str(),
339 }
340
341 // If it does not exist then create the map
343 }
344
345 /// Return map that stores zeta coordinates of points that identify regions
346 std::map<unsigned, Vector<double>> zeta_in_region() const
347 {
348 return Zeta_in_region;
349 }
350
351
352 /// Lagrangian coordinates on the boundary
353 /// (zeta_1(zeta_bound),zeta_2(zeta_bound)) As described in the class
354 /// description, zeta_global is enforced to lie between 0 and 2pi
356 const double& zeta_global, FixedSizeVector<double, 2>& zeta) const
357 {
358 // The number of the boundaries
359 unsigned n_boundary = nboundary();
360
361 // Loop over all boundary segments
362 for (unsigned b = 0; b < n_boundary; b++)
363 {
364 // Flag indicating whether implements the process to obtain the
365 // Lagriangian coordinates
366 bool do_it = false;
367
368 // Check if zeta_global is to the right of (or equal to)
369 // the start of boundary segment b
371 {
372 // For all segments except the last one, require
373 // zeta_global < Zeta_global_boundary_end[b]
374 // so that segments are half-open intervals [start, end)
375 if (b < n_boundary - 1)
376 {
378 {
379 do_it = true;
380 }
381 }
382 // For the last boundary segment, accept all remaining values
383 // (in particular, this includes the endpoint zeta_global = 2*pi)
384 else
385 {
386 do_it = true;
387 }
388 }
389
390 // If the correct boundary segment has been identified
391 if (do_it == true)
392 {
393 // Compute the linear mapping ratio between the global
394 // zeta and the zeta_bound (local)
395 double ratio =
398
399 // Map the global zeta to the zeta_bound (local) on boundary segment b
400 double zeta_bound =
403
404 // Obtain the Lagrangian coordinates corresponding to
405 // boundary segment b at the zeta_bound (local)
407
408 // Exit the loop since the correct boundary segment is identified
409 break;
410 }
411 }
412 }
413
414
415 protected:
416 /// Storage for initial value of 1D local boundary coordinate
417 /// on boundary b:
419
420 /// Storage for final value of 1D local boundary coordinate
421 /// on boundary b:
423
424 /// Storage for initial value of 1D global boundary coordinate
425 /// As described in the class description, the global coordinate
426 /// is enforced to lie between 0 and 2pi
428
429 /// Storage for final value of 1D global boundary coordinate
430 /// As described in the class description, the global coordinate
431 /// is enforced to lie between 0 and 2pi
433
434 /// Pointer to GeomObject<1,2> that parametrises intrinisc
435 /// coordinates along boundary b; essentially provides a wrapper to
436 /// zeta_on_boundary(...)
438
439 /// Map to store zeta coordinates of points that identify regions
440 std::map<unsigned, Vector<double>> Zeta_in_region;
441
442 /// Workspace to avoid re-allocation in wrapped call to position()
443 /// Mutable qualifier implies that it's only used as scratch workspace
444 /// so doesn't actualy change the state of the object.
445 /// It's resized once (to size 3) and must not be resized!
447
448 /// Workspace to avoid re-allocation in wrapped call to position()
449 /// Mutable qualifier implies that it's only used as scratch workspace
450 /// so doesn't actualy change the state of the object
451 /// It's resized once (to size 2) and must not be resized!
453 };
454
455
456 /////////////////////////////////////////////////////////////////////
457 /////////////////////////////////////////////////////////////////////
458 /////////////////////////////////////////////////////////////////////
459
460
461 //=========================================================================
462 /// Warped disk in 3d: zeta[0]=x; zeta[1]=y (so it doesn't have
463 /// coordinate singularities), with specification of two boundaries (b=0,1)
464 /// that turn the whole thing into a circular disk.
465 //=========================================================================
467 {
468 public:
469 /// Constructor. Pass amplitude and azimuthal wavenumber of
470 /// warping as arguments. Can specify vertical offset as final, optional
471 /// argument.
473 const unsigned& n,
474 const double& z_offset = 0.0)
476 {
477 // How many boundaries do we have?
478 unsigned nb = 2;
480 Zeta_boundary_start.resize(nb, 0.0);
481 Zeta_boundary_end.resize(nb, 0.0);
482
483 // GeomObject<1,2> representing the first boundary
485 Zeta_boundary_start[0] = 0.0;
487
488 // GeomObject<1,2> representing the second boundary
492 }
493
494 /// Empty default constructor.
496 {
497 throw OomphLibError("Don't call default constructor!",
500 }
501
502
503 /// Broken copy constructor
505
506 /// Broken assignment operator
507 void operator=(const WarpedCircularDisk&) = delete;
508
509 /// Destructor
511 {
512 unsigned n = nboundary();
513 for (unsigned b = 0; b < n; b++)
514 {
517 }
518 }
519
520 /// Access fct to amplitude of disk warping
521 double& epsilon()
522 {
523 return Epsilon;
524 }
525
526 /// Position Vector at Lagrangian coordinate zeta
528 {
529 // Position Vector
530 r[0] = zeta[0];
531 r[1] = zeta[1];
532 double radius = sqrt(r[0] * r[0] + r[1] * r[1]);
533 double phi = atan2(r[1], r[0]);
534 r[2] = Z_offset + w(radius, phi);
535 }
536
537
538 /// Parametrised position on object: r(zeta). Evaluated at
539 /// previous timestep. t=0: current time; t>0: previous
540 /// timestep. Object is steady so calls time-independent version
541 void position(const unsigned& t,
542 const Vector<double>& zeta,
543 Vector<double>& r) const
544 {
545 position(zeta, r);
546 }
547
548
549 /// Boundary triad on boundary b at boundary coordinate zeta_bound
550 void boundary_triad(const unsigned& b,
551 const double& zeta_bound,
556 {
557 double phi = zeta_bound;
558
559 // Position Vector
560 r[0] = cos(phi);
561 r[1] = sin(phi);
562 r[2] = Z_offset + w(1.0, phi);
563
565 dr_dr[0] = cos(phi);
566 dr_dr[1] = sin(phi);
567 dr_dr[2] = dwdr(1.0, phi);
568 double inv_norm = 1.0 / sqrt(dr_dr[0] * dr_dr[0] + dr_dr[1] * dr_dr[1] +
569 dr_dr[2] * dr_dr[2]);
570
571 normal[0] = dr_dr[0] * inv_norm;
572 normal[1] = dr_dr[1] * inv_norm;
573 normal[2] = dr_dr[2] * inv_norm;
574
576 dr_dphi[0] = -sin(phi);
577 dr_dphi[1] = cos(phi);
578 dr_dphi[2] = dwdphi(1.0, phi);
579
580 inv_norm = 1.0 / sqrt(dr_dphi[0] * dr_dphi[0] + dr_dphi[1] * dr_dphi[1] +
581 dr_dphi[2] * dr_dphi[2]);
582
583 tangent[0] = dr_dphi[0] * inv_norm;
584 tangent[1] = dr_dphi[1] * inv_norm;
585 tangent[2] = dr_dphi[2] * inv_norm;
586
587 binormal[0] = tangent[1] * normal[2] - tangent[2] * normal[1];
588 binormal[1] = tangent[2] * normal[0] - tangent[0] * normal[2];
589 binormal[2] = tangent[0] * normal[1] - tangent[1] * normal[0];
590 }
591
592 private:
593 /// Vertical deflection
594 double w(const double& r, const double& phi) const
595 {
596 return Epsilon * cos(double(N) * phi) * pow(r, 2);
597 }
598
599 /// Deriv of vertical deflection w.r.t. radius
600 double dwdr(const double& r, const double& phi) const
601 {
602 return Epsilon * cos(double(N) * phi) * 2.0 * r;
603 }
604
605 /// Deriv of vertical deflection w.r.t. angle
606 double dwdphi(const double& r, const double& phi) const
607 {
608 return -Epsilon * double(N) * sin(double(N) * phi) * pow(r, 2);
609 }
610
611 /// Amplitude of non-axisymmetric deformation
612 double Epsilon;
613
614 /// Wavenumber of non-axisymmetric deformation
615 unsigned N;
616
617 /// Vertical offset
618 double Z_offset;
619 };
620
621 /////////////////////////////////////////////////////////////////////
622 /////////////////////////////////////////////////////////////////////
623 /////////////////////////////////////////////////////////////////////
624
625
626 //=========================================================================
627 /// Warped disk in 3d: zeta[0]=x; zeta[1]=y (so it doesn't have
628 /// coordinate singularities), with specification of two boundaries (b=0,1)
629 /// that turn the whole thing into a circular disk. In addition
630 /// has two internal boundaries (b=2,3), a distance h_annulus from
631 /// the outer edge. Annual (outer) region is region 1.
632 //=========================================================================
634 : public virtual WarpedCircularDisk
635 {
636 public:
637 /// Constructor. Pass amplitude and azimuthal wavenumber of
638 /// warping as arguments. Can specify vertical offset as final, optional
639 /// argument.
641 const double& epsilon,
642 const unsigned& n,
643 const double& z_offset = 0.0)
645 {
646 // We have two more boundaries!
648 Zeta_boundary_start.resize(4);
649 Zeta_boundary_end.resize(4);
650
651 // Radius of the internal annular boundary
652 double r_annulus = 1.0 - h_annulus;
653
654 // GeomObject<1,2> representing the third boundary
657 Zeta_boundary_start[2] = 0.0;
659
660 // GeomObject<1,2> representing the fourth boundary
665
666 // Region 1 is the annular region; identify it by a point in
667 // this region.
668 unsigned r = 1;
670 zeta_in_region[0] = 0.0;
671 zeta_in_region[0] = 1.0 - 0.5 * h_annulus;
673 }
674
675 /// Broken copy constructor
678
679 /// Broken assignment operator
681 delete;
682
683 /// Destructor (empty; cleanup happens in base class)
685
686
687 /// Thickness of annular region (distance of internal boundary
688 /// from outer edge of unit circle)
689 double h_annulus() const
690 {
691 return H_annulus;
692 }
693
694 protected:
695 /// Thickness of annular region (distance of internal boundary
696 /// from outer edge of unit circle)
697 double H_annulus;
698 };
699
700
701} // namespace oomph
702
703#endif
cstr elem_len * i
Definition cfortran.h:603
char t
Definition cfortran.h:568
Base class for upgraded disk-like GeomObject (i.e. 2D surface in 3D space) with specification of boun...
virtual void boundary_triad(const unsigned &b, const double &zeta_bound, FixedSizeVector< double, 3 > &r, FixedSizeVector< double, 3 > &tangent, FixedSizeVector< double, 3 > &normal, FixedSizeVector< double, 3 > &binormal)
Boundary triad on boundary b at boundary coordinate zeta_bound. Broken virtual.
void add_region_coordinates(const unsigned &r, Vector< double > &zeta_in_region)
Specify intrinsic coordinates of a point within a specified region – region ID, r,...
void zeta_on_boundary(const unsigned &b, const double &zeta_bound, FixedSizeVector< double, 2 > &zeta) const
Compute 2D vector of intrinsic coordinates at 1D boundary coordinate zeta_bound on boundary b:
double zeta_global_boundary_end(const unsigned &b) const
Final value of 1D global boundary coordinate on boundary b.
Vector< double > Zeta_work_space
Workspace to avoid re-allocation in wrapped call to position() Mutable qualifier implies that it's on...
Vector< double > Zeta_global_boundary_end
Storage for final value of 1D global boundary coordinate As described in the class description,...
GeomObject * boundary_parametrising_geom_object_pt(const unsigned &b) const
Pointer to GeomObject<1,2> that parametrises intrinisc coordinates along boundary b.
Vector< double > Zeta_boundary_start
Storage for initial value of 1D local boundary coordinate on boundary b:
virtual void boundary_lagrangian_coordinates(const double &zeta_global, FixedSizeVector< double, 2 > &zeta) const
Lagrangian coordinates on the boundary (zeta_1(zeta_bound),zeta_2(zeta_bound)) As described in the cl...
std::map< unsigned, Vector< double > > zeta_in_region() const
Return map that stores zeta coordinates of points that identify regions.
void output_boundaries_and_triads(const unsigned &nplot, std::ofstream &two_d_boundaries_file, std::ofstream &three_d_boundaries_file, std::ofstream &boundaries_tangent_file, std::ofstream &boundaries_normal_file, std::ofstream &boundaries_binormal_file)
Output boundaries and triad at nplot plot points. Streams:
double zeta_global_boundary_start(const unsigned &b) const
Initial value of 1D global boundary coordinate on boundary b.
Vector< double > Zeta_global_boundary_start
Storage for initial value of 1D global boundary coordinate As described in the class description,...
void position_on_boundary(const unsigned &b, const double &zeta_bound, FixedSizeVector< double, 3 > &r) const
Compute 3D vector of Eulerian coordinates at 1D boundary coordinate zeta_bound on boundary b:
std::map< unsigned, Vector< double > > Zeta_in_region
Map to store zeta coordinates of points that identify regions.
Vector< GeomObject * > Boundary_parametrising_geom_object_pt
Pointer to GeomObject<1,2> that parametrises intrinisc coordinates along boundary b; essentially prov...
double zeta_boundary_end(const unsigned &b) const
Final value of 1D boundary coordinate zeta_bound on boundary b:
unsigned nboundary() const
How many boundaries do we have?
void output_boundaries(const unsigned &nplot, std::ofstream &two_d_boundaries_file, std::ofstream &three_d_boundaries_file)
Output boundaries at nplot plot points. Streams:
void position_from_fixed_size_vectors(const FixedSizeVector< double, 2 > &zeta, FixedSizeVector< double, 3 > &r) const
Parametrised position on object at current time: r(zeta). but specialised to 2D disk in 3D space.
double zeta_boundary_start(const unsigned &b) const
Initial value of 1D boundary coordinate zeta_bound on boundary b:
Vector< double > Zeta_boundary_end
Storage for final value of 1D local boundary coordinate on boundary b:
Vector< double > R_work_space
Workspace to avoid re-allocation in wrapped call to position() Mutable qualifier implies that it's on...
Steady ellipse with half axes A and B as geometric object:
void position(const Vector< double > &zeta, Vector< double > &r) const
Return the parametrised position of the FiniteElement in its incarnation as a GeomObject,...
Definition elements.h:2680
double size() const
Calculate the size of the element (length, area, volume,...) in Eulerian computational coordinates....
Definition elements.cc:4320
A geometric object is an object that provides a parametrised description of its shape via the functio...
unsigned ndim() const
Access function to # of Eulerian coordinates.
virtual void position(const Vector< double > &zeta, Vector< double > &r) const =0
Parametrised position on object at current time: r(zeta).
unsigned nlagrangian() const
Access function to # of Lagrangian coordinates.
An OomphLibError object which should be thrown when an run-time error is encountered....
An OomphLibWarning object which should be created as a temporary object to issue a warning....
TAdvectionDiffusionReactionElement<NREAGENT,DIM,NNODE_1D> elements are isoparametric triangular DIM-d...
Warped disk in 3d: zeta[0]=x; zeta[1]=y (so it doesn't have coordinate singularities),...
virtual ~WarpedCircularDiskWithAnnularInternalBoundary()
Destructor (empty; cleanup happens in base class)
double H_annulus
Thickness of annular region (distance of internal boundary from outer edge of unit circle)
WarpedCircularDiskWithAnnularInternalBoundary(const WarpedCircularDiskWithAnnularInternalBoundary &dummy)=delete
Broken copy constructor.
void operator=(const WarpedCircularDiskWithAnnularInternalBoundary &)=delete
Broken assignment operator.
WarpedCircularDiskWithAnnularInternalBoundary(const double &h_annulus, const double &epsilon, const unsigned &n, const double &z_offset=0.0)
Constructor. Pass amplitude and azimuthal wavenumber of warping as arguments. Can specify vertical of...
double h_annulus() const
Thickness of annular region (distance of internal boundary from outer edge of unit circle)
Warped disk in 3d: zeta[0]=x; zeta[1]=y (so it doesn't have coordinate singularities),...
double dwdphi(const double &r, const double &phi) const
Deriv of vertical deflection w.r.t. angle.
void operator=(const WarpedCircularDisk &)=delete
Broken assignment operator.
double Epsilon
Amplitude of non-axisymmetric deformation.
void position(const Vector< double > &zeta, Vector< double > &r) const
Position Vector at Lagrangian coordinate zeta.
WarpedCircularDisk(const WarpedCircularDisk &dummy)=delete
Broken copy constructor.
WarpedCircularDisk()
Empty default constructor.
WarpedCircularDisk(const double &epsilon, const unsigned &n, const double &z_offset=0.0)
Constructor. Pass amplitude and azimuthal wavenumber of warping as arguments. Can specify vertical of...
double Z_offset
Vertical offset.
double & epsilon()
Access fct to amplitude of disk warping.
void boundary_triad(const unsigned &b, const double &zeta_bound, FixedSizeVector< double, 3 > &r, FixedSizeVector< double, 3 > &tangent, FixedSizeVector< double, 3 > &normal, FixedSizeVector< double, 3 > &binormal)
Boundary triad on boundary b at boundary coordinate zeta_bound.
unsigned N
Wavenumber of non-axisymmetric deformation.
double w(const double &r, const double &phi) const
Vertical deflection.
virtual ~WarpedCircularDisk()
Destructor.
double dwdr(const double &r, const double &phi) const
Deriv of vertical deflection w.r.t. radius.
void position(const unsigned &t, const Vector< double > &zeta, Vector< double > &r) const
Parametrised position on object: r(zeta). Evaluated at previous timestep. t=0: current time; t>0: pre...
const double Pi
50 digits from maple
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).