31 #ifndef OOMPH_TUBE_DOMAIN_HEADER 32 #define OOMPH_TUBE_DOMAIN_HEADER 35 #include "../generic/quadtree.h" 36 #include "../generic/domain.h" 37 #include "../generic/geom_objects.h" 87 const Vector<double> ¢reline_limits,
88 const Vector<double> &theta_positions,
89 const Vector<double> &radius_box,
90 const unsigned& nlayer) :
96 const unsigned n_macro=5*nlayer;
97 Macro_element_pt.resize(n_macro);
100 for (
unsigned i=0;i<n_macro;i++)
102 Macro_element_pt[i]=
new QMacroElement<3>(
this,i);
109 BrokenCopy::broken_copy(
"TubeDomain");
115 BrokenCopy::broken_assign(
"TubeDomain");
122 for (
unsigned i=0;i<5*
Nlayer;i++)
124 delete Macro_element_pt[i];
134 const unsigned& i_macro,
135 const unsigned& i_direct,
136 const Vector<double>& s,
164 const Vector<double> &high,
169 for(
unsigned i=0;i<3;i++)
171 f[i] = low[i] + (high[i] - low[i])*0.5*(s+1.0);
192 const unsigned& imacro,
193 const unsigned& idirect,
194 const Vector<double>& s,
198 using namespace OcTreeNames;
200 #ifdef WARN_ABOUT_SUBTLY_CHANGED_OOMPH_INTERFACES 203 "Order of function arguments has changed between versions 0.8 and 0.85",
204 "TubeDomain::macro_element_boundary(...)",
205 OOMPH_EXCEPTION_LOCATION);
209 unsigned ilayer=unsigned(imacro/5);
213 Vector<Vector<Vector<double> > > Box(2);
216 Vector<double> zeta_centre(2);
218 Vector<double> zeta(3);
221 for(
unsigned i=0;i<2;i++)
232 zeta[0] = zeta_centre[i];
235 for(
unsigned j=0;j<4;j++)
250 Vector<double> pos_1(3), pos_2(3);
252 const double pi = MathematicalConstants::Pi;
268 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
287 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
306 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
324 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
359 std::ostringstream error_stream;
360 error_stream <<
"idirect is " << idirect
361 <<
" not one of L, R, D, U, B, F" << std::endl;
365 OOMPH_CURRENT_FUNCTION,
366 OOMPH_EXCEPTION_LOCATION);
381 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
397 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
413 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
424 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
441 zeta[0] = zeta_centre[0];
457 zeta[0] = zeta_centre[1];
474 std::ostringstream error_stream;
475 error_stream <<
"idirect is " << idirect
476 <<
" not one of L, R, D, U, B, F" << std::endl;
480 OOMPH_CURRENT_FUNCTION,
481 OOMPH_EXCEPTION_LOCATION);
497 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
514 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
524 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
540 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
556 zeta[0] = zeta_centre[0];
571 zeta[0] = zeta_centre[1];
586 std::ostringstream error_stream;
587 error_stream <<
"idirect is " << idirect
588 <<
" not one of L, R, D, U, B, F" << std::endl;
592 OOMPH_CURRENT_FUNCTION,
593 OOMPH_EXCEPTION_LOCATION);
606 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
623 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
642 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
660 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
670 zeta[0] = zeta_centre[0];
686 zeta[0] = zeta_centre[1];
702 std::ostringstream error_stream;
703 error_stream <<
"idirect is " << idirect
704 <<
" not one of L, R, D, U, B, F" << std::endl;
708 OOMPH_CURRENT_FUNCTION,
709 OOMPH_EXCEPTION_LOCATION);
725 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
738 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
756 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
774 zeta[0] = zeta_centre[0] + (zeta_centre[1] - zeta_centre[0])
791 zeta[0] = zeta_centre[0];
808 zeta[0] = zeta_centre[1];
823 std::ostringstream error_stream;
824 error_stream <<
"idirect is " << idirect
825 <<
" not one of L, R, D, U, B, F" << std::endl;
829 OOMPH_CURRENT_FUNCTION,
830 OOMPH_EXCEPTION_LOCATION);
837 std::ostringstream error_stream;
838 error_stream <<
"Wrong imacro " << imacro << std::endl;
841 OOMPH_CURRENT_FUNCTION,
842 OOMPH_EXCEPTION_LOCATION);
Vector< double > Radius_box
Vector< double > Centreline_limits
Storage for the limits of the centreline coordinate.
void lin_interpolate(const Vector< double > &low, const Vector< double > &high, const double &s, Vector< double > &f)
A very little linear interpolation helper. Interpolate from the low point to the high point using the...
TubeDomain(const TubeDomain &)
Broken copy constructor.
Tube as a domain. The entire domain must be defined by a GeomObject with the following convention: ze...
~TubeDomain()
Destructor: Kill all macro elements.
void macro_element_boundary(const unsigned &t, const unsigned &i_macro, const unsigned &i_direct, const Vector< double > &s, Vector< double > &f)
Vector representation of the i_macro-th macro element boundary i_direct (L/R/D/U/B/F) at time level t...
TubeDomain(GeomObject *volume_geom_object_pt, const Vector< double > ¢reline_limits, const Vector< double > &theta_positions, const Vector< double > &radius_box, const unsigned &nlayer)
Constructor: Pass geometric object; start and end limit of the centreline coordinate; the theta locat...
void operator=(const TubeDomain &)
Broken assignment operator.
Vector< double > Theta_positions
Storage for the dividing lines on the boundary starting from the lower left and proceeding anticlockw...
unsigned Nlayer
Number of axial layers.
GeomObject * Volume_pt
Pointer to geometric object that represents the domain.