26 #ifndef OOMPH_GEOM_OBJ_WITH_BOUNDARY_HEADER
27 #define OOMPH_GEOM_OBJ_WITH_BOUNDARY_HEADER
32 #include <oomph-lib-config.h>
81 const double& zeta_bound,
92 const double& zeta_bound,
98 std::ostringstream error_message;
99 error_message <<
"You must create a <1,2> Geom Object that provides a\n"
100 <<
"mapping from the 1D boundary coordinate to the 2D\n"
101 <<
"intrinsic Lagrangian coordinate of disk-like object\n"
109 std::ostringstream error_message;
110 error_message <<
"Boundary_parametrising_geom_object_pt must point to\n"
111 <<
"GeomObject with one Lagrangian coordinate. Yours has "
120 std::ostringstream error_message;
121 error_message <<
"Boundary_parametrising_geom_object_pt must point to\n"
122 <<
"GeomObject with two Eulerian coordinates. Yours has "
160 const double& zeta_bound,
166 std::ostringstream error_message;
167 error_message <<
"Broken virtual function; please implement for your\n"
168 <<
"derived version of this class!" << std::endl;
177 std::ofstream& two_d_boundaries_file,
178 std::ofstream& three_d_boundaries_file)
180 std::ofstream boundaries_tangent_file;
181 std::ofstream boundaries_normal_file;
182 std::ofstream boundaries_binormal_file;
184 two_d_boundaries_file,
185 three_d_boundaries_file,
186 boundaries_tangent_file,
187 boundaries_normal_file,
188 boundaries_binormal_file);
199 std::ofstream& two_d_boundaries_file,
200 std::ofstream& three_d_boundaries_file,
201 std::ofstream& boundaries_tangent_file,
202 std::ofstream& boundaries_normal_file,
203 std::ofstream& boundaries_binormal_file)
207 double zeta_bound = 0.0;
212 for (
unsigned b = 0;
b <
nb;
b++)
214 two_d_boundaries_file <<
"ZONE" << std::endl;
215 three_d_boundaries_file <<
"ZONE" << std::endl;
216 boundaries_tangent_file <<
"ZONE" << std::endl;
217 boundaries_normal_file <<
"ZONE" << std::endl;
218 boundaries_binormal_file <<
"ZONE" << std::endl;
223 for (
unsigned i = 0;
i <
n;
i++)
226 zeta_min + (zeta_max - zeta_min) *
double(
i) /
double(
n - 1);
231 two_d_boundaries_file <<
zeta[0] <<
" " <<
zeta[1] <<
" "
232 << zeta_bound <<
" " << std::endl;
234 three_d_boundaries_file <<
r[0] <<
" " <<
r[1] <<
" " <<
r[2] <<
" "
236 << zeta_bound <<
" " << std::endl;
238 boundaries_tangent_file <<
r[0] <<
" " <<
r[1] <<
" " <<
r[2] <<
" "
239 << tangent[0] <<
" " << tangent[1] <<
" "
240 << tangent[2] <<
" " << std::endl;
242 boundaries_normal_file <<
r[0] <<
" " <<
r[1] <<
" " <<
r[2] <<
" "
244 <<
normal[2] <<
" " << std::endl;
246 boundaries_binormal_file <<
r[0] <<
" " <<
r[1] <<
" " <<
r[2] <<
" "
247 << binormal[0] <<
" " << binormal[1] <<
" "
248 << binormal[2] <<
" " << std::endl;
262 std::ostringstream error_message;
264 <<
"Please use another region id different from zero.\n"
265 <<
"It is internally used as the default region number.\n";
274 std::ostringstream error_message;
275 error_message <<
"Vector specifying zeta coordinates of point in\n"
276 <<
"region has be length 2; yours has length " <<
n
284 std::map<unsigned, Vector<double>>::iterator it;
290 std::ostringstream error_message;
291 error_message <<
"The region id (" <<
r <<
") that you are using for"
293 <<
"your region is already in use. Use another\n"
294 <<
"region id and verify that you are not re-using\n"
295 <<
" previously defined regions ids.\n"
349 const double& z_offset = 0.0)
388 for (
unsigned b = 0;
b <
n;
b++)
408 double phi =
atan2(
r[1],
r[0]);
426 const double& zeta_bound,
432 double phi = zeta_bound;
442 dr_dr[2] =
dwdr(1.0, phi);
443 double inv_norm = 1.0 /
sqrt(dr_dr[0] * dr_dr[0] + dr_dr[1] * dr_dr[1] +
444 dr_dr[2] * dr_dr[2]);
446 normal[0] = dr_dr[0] * inv_norm;
447 normal[1] = dr_dr[1] * inv_norm;
448 normal[2] = dr_dr[2] * inv_norm;
451 dr_dphi[0] = -
sin(phi);
452 dr_dphi[1] =
cos(phi);
453 dr_dphi[2] =
dwdphi(1.0, phi);
455 inv_norm = 1.0 /
sqrt(dr_dphi[0] * dr_dphi[0] + dr_dphi[1] * dr_dphi[1] +
456 dr_dphi[2] * dr_dphi[2]);
458 tangent[0] = dr_dphi[0] * inv_norm;
459 tangent[1] = dr_dphi[1] * inv_norm;
460 tangent[2] = dr_dphi[2] * inv_norm;
462 binormal[0] = tangent[1] *
normal[2] - tangent[2] *
normal[1];
463 binormal[1] = tangent[2] *
normal[0] - tangent[0] *
normal[2];
464 binormal[2] = tangent[0] *
normal[1] - tangent[1] *
normal[0];
469 double w(
const double&
r,
const double& phi)
const
475 double dwdr(
const double&
r,
const double& phi)
const
481 double dwdphi(
const double&
r,
const double& phi)
const
518 const double& z_offset = 0.0)
531 new Ellipse(r_annulus, r_annulus);
537 new Ellipse(r_annulus, r_annulus);
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar atan2(const AnnoyingScalar &y, const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:139
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Scalar * b
Definition: benchVecAdd.cpp:17
Definition: geom_obj_with_boundary.h:67
void add_region_coordinates(const unsigned &r, Vector< double > &zeta_in_region)
Definition: geom_obj_with_boundary.h:256
GeomObject * boundary_parametrising_geom_object_pt(const unsigned &b) const
Definition: geom_obj_with_boundary.h:137
Vector< double > Zeta_boundary_start
Definition: geom_obj_with_boundary.h:315
void position_on_boundary(const unsigned &b, const double &zeta_bound, Vector< double > &r) const
Definition: geom_obj_with_boundary.h:80
std::map< unsigned, Vector< double > > zeta_in_region() const
Return map that stores zeta coordinates of points that identify regions.
Definition: geom_obj_with_boundary.h:307
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)
Definition: geom_obj_with_boundary.h:198
std::map< unsigned, Vector< double > > Zeta_in_region
Map to store zeta coordinates of points that identify regions.
Definition: geom_obj_with_boundary.h:327
Vector< GeomObject * > Boundary_parametrising_geom_object_pt
Definition: geom_obj_with_boundary.h:324
DiskLikeGeomObjectWithBoundaries()
Constructor.
Definition: geom_obj_with_boundary.h:70
double zeta_boundary_end(const unsigned &b) const
Definition: geom_obj_with_boundary.h:151
virtual void boundary_triad(const unsigned &b, const double &zeta_bound, Vector< double > &r, Vector< double > &tangent, Vector< double > &normal, Vector< double > &binormal)
Definition: geom_obj_with_boundary.h:159
unsigned nboundary() const
How many boundaries do we have?
Definition: geom_obj_with_boundary.h:73
void zeta_on_boundary(const unsigned &b, const double &zeta_bound, Vector< double > &zeta) const
Definition: geom_obj_with_boundary.h:91
void output_boundaries(const unsigned &nplot, std::ofstream &two_d_boundaries_file, std::ofstream &three_d_boundaries_file)
Definition: geom_obj_with_boundary.h:176
double zeta_boundary_start(const unsigned &b) const
Definition: geom_obj_with_boundary.h:144
Vector< double > Zeta_boundary_end
Definition: geom_obj_with_boundary.h:319
Definition: geom_objects.h:644
Definition: geom_objects.h:101
unsigned ndim() const
Access function to # of Eulerian coordinates.
Definition: geom_objects.h:177
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.
Definition: geom_objects.h:171
Definition: oomph_definitions.h:222
Definition: oomph_definitions.h:267
Definition: geom_obj_with_boundary.h:510
virtual ~WarpedCircularDiskWithAnnularInternalBoundary()
Destructor (empty; cleanup happens in base class)
Definition: geom_obj_with_boundary.h:559
double H_annulus
Definition: geom_obj_with_boundary.h:572
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)
Definition: geom_obj_with_boundary.h:515
double h_annulus() const
Definition: geom_obj_with_boundary.h:564
Definition: geom_obj_with_boundary.h:342
double dwdphi(const double &r, const double &phi) const
Deriv of vertical deflection w.r.t. angle.
Definition: geom_obj_with_boundary.h:481
void operator=(const WarpedCircularDisk &)=delete
Broken assignment operator.
double Epsilon
Amplitude of non-axisymmetric deformation.
Definition: geom_obj_with_boundary.h:487
void position(const Vector< double > &zeta, Vector< double > &r) const
Position Vector at Lagrangian coordinate zeta.
Definition: geom_obj_with_boundary.h:402
double & epsilon()
Access fct to amplitude of disk warping.
Definition: geom_obj_with_boundary.h:396
WarpedCircularDisk(const WarpedCircularDisk &dummy)=delete
Broken copy constructor.
WarpedCircularDisk()
Empty default constructor.
Definition: geom_obj_with_boundary.h:370
WarpedCircularDisk(const double &epsilon, const unsigned &n, const double &z_offset=0.0)
Definition: geom_obj_with_boundary.h:347
double Z_offset
Vertical offset.
Definition: geom_obj_with_boundary.h:493
void boundary_triad(const unsigned &b, const double &zeta_bound, Vector< double > &r, Vector< double > &tangent, Vector< double > &normal, Vector< double > &binormal)
Boundary triad on boundary b at boundary coordinate zeta_bound.
Definition: geom_obj_with_boundary.h:425
unsigned N
Wavenumber of non-axisymmetric deformation.
Definition: geom_obj_with_boundary.h:490
double w(const double &r, const double &phi) const
Vertical deflection.
Definition: geom_obj_with_boundary.h:469
virtual ~WarpedCircularDisk()
Destructor.
Definition: geom_obj_with_boundary.h:385
double dwdr(const double &r, const double &phi) const
Deriv of vertical deflection w.r.t. radius.
Definition: geom_obj_with_boundary.h:475
void position(const unsigned &t, const Vector< double > &zeta, Vector< double > &r) const
Definition: geom_obj_with_boundary.h:416
int nb
Definition: level2_impl.h:286
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp< Eigen::internal::scalar_zeta_op< typename DerivedX::Scalar >, const DerivedX, const DerivedQ > zeta(const Eigen::ArrayBase< DerivedX > &x, const Eigen::ArrayBase< DerivedQ > &q)
Definition: SpecialFunctionsArrayAPI.h:152
void normal(const Vector< double > &x, Vector< double > &normal)
Definition: free_surface_rotation.cc:65
const double Pi
50 digits from maple
Definition: oomph_utilities.h:157
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
t
Definition: plotPSD.py:36
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86