30 #ifndef OOMPH_RECTANGLE_WITH_HOLE_MESH_HEADER 31 #define OOMPH_RECTANGLE_WITH_HOLE_MESH_HEADER 35 #include <oomph-lib-config.h> 39 #include "../generic/mesh.h" 40 #include "../generic/quadtree.h" 41 #include "../generic/quad_mesh.h" 42 #include "../generic/refineable_quad_mesh.h" 53 template<
class ELEMENT>
68 TimeStepper* time_stepper_pt=
69 &Mesh::Default_TimeStepper)
76 unsigned long node_count=0;
79 Vector<double> s(2),r(2);
82 Vector<Node*> Tmp_node_pt;
86 unsigned nmacro_element =
Domain_pt->nmacro_element();
87 for(
unsigned e=0;e<nmacro_element;e++)
90 Element_pt.push_back(
new ELEMENT);
94 dynamic_cast<ELEMENT*
>(finite_element_pt(e))->nnode_1d();
97 for(
unsigned l1=0;l1<np;l1++)
100 for(
unsigned l2=0;l2<np;l2++)
103 Tmp_node_pt.push_back(finite_element_pt(e)->
104 construct_node(l1*np+l2,time_stepper_pt));
107 s[0] = -1.0 + 2.0*(double)l2/(
double)(np-1);
108 s[1] = -1.0 + 2.0*(double)l1/(
double)(np-1);
109 Domain_pt->macro_element_pt(e)->macro_map(s,r);
112 Tmp_node_pt[node_count]->x(0) = r[0];
113 Tmp_node_pt[node_count]->x(1) = r[1];
128 unsigned np=
dynamic_cast<ELEMENT*
>(finite_element_pt(0))->nnode_1d();
131 for(
unsigned n=0;n<np;n++)
134 finite_element_pt(1)->node_pt(n*np)
135 = finite_element_pt(0)->node_pt((np-1)*np+np-1-n);
138 delete Tmp_node_pt[np*np + n*np];
139 Tmp_node_pt[np*np + n*np] = 0;
143 for(
unsigned n=0;n<np;n++)
146 finite_element_pt(3)->node_pt(n*np)
147 = finite_element_pt(0)->node_pt(n);
150 delete Tmp_node_pt[3*np*np + n*np];
151 Tmp_node_pt[3*np*np + n*np] = 0;
155 for(
unsigned n=0;n<np;n++)
158 finite_element_pt(2)->node_pt(np*(np-1)+n)
159 = finite_element_pt(1)->node_pt(np*n+np-1);
162 delete Tmp_node_pt[2*np*np + np*(np-1)+n];
163 Tmp_node_pt[2*np*np + np*(np-1)+n] = 0;
168 for(
unsigned n=0;n<np;n++)
171 finite_element_pt(2)->node_pt(n)
172 = finite_element_pt(3)->node_pt(np*(np-n-1)+np-1);
175 delete Tmp_node_pt[2*np*np + n];
176 Tmp_node_pt[2*np*np + n] = 0;
181 for(
unsigned long n=0;n<node_count;n++)
183 if(Tmp_node_pt[n]!=0) {Node_pt.push_back(Tmp_node_pt[n]);}
189 for(
unsigned n=0;n<np;n++)
192 Node* nod_pt=finite_element_pt(0)->node_pt(n*np);
193 convert_to_boundary_node(nod_pt);
194 add_boundary_node(3,nod_pt);
197 nod_pt=finite_element_pt(2)->node_pt(n*np+np-1);
198 convert_to_boundary_node(nod_pt);
199 add_boundary_node(1,nod_pt);
202 nod_pt=finite_element_pt(3)->node_pt(n);
203 convert_to_boundary_node(nod_pt);
204 add_boundary_node(0,nod_pt);
207 nod_pt=finite_element_pt(1)->node_pt(np*(np-1)+n);
208 convert_to_boundary_node(nod_pt);
209 add_boundary_node(2,nod_pt);
212 nod_pt=finite_element_pt(3)->node_pt(np*(np-1)+n);
213 convert_to_boundary_node(nod_pt);
214 add_boundary_node(4,nod_pt);
217 for(
unsigned n=1;n<np;n++)
220 Node* nod_pt=finite_element_pt(2)->node_pt(n*np);
221 convert_to_boundary_node(nod_pt);
222 add_boundary_node(4,nod_pt);
225 for(
unsigned n=1;n<np;n++)
228 Node* nod_pt=finite_element_pt(1)->node_pt(np-n-1);
229 convert_to_boundary_node(nod_pt);
230 add_boundary_node(4,nod_pt);
233 for(
unsigned n=1;n<np-1;n++)
236 Node* nod_pt=finite_element_pt(0)->node_pt(np*(np-n-1)+np-1);
237 convert_to_boundary_node(nod_pt);
238 add_boundary_node(4,nod_pt);
262 template<
class ELEMENT>
276 const double &length,
277 TimeStepper* time_stepper_pt=
278 &Mesh::Default_TimeStepper) :
286 for (
unsigned e=0;e<4;e++)
288 dynamic_cast<ELEMENT*
>(this->element_pt(e))->
289 set_macro_elem_pt(this->
Domain_pt->macro_element_pt(e));
293 this->setup_boundary_element_info();
297 this->setup_quadtree_forest();
Rectangular domain with circular whole.
virtual ~RefineableRectangleWithHoleMesh()
Destructor: Empty.
RectangleWithHoleMesh(GeomObject *cylinder_pt, const double &length, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass pointer to geometric object that represents the cylinder, the length and height of ...
RectangleWithHoleDomain * Domain_pt
Pointer to the domain.
RectangleWithHoleDomain * domain_pt()
Access function to the domain.
Domain-based mesh for rectangular mesh with circular hole.
RefineableRectangleWithHoleMesh(GeomObject *cylinder_pt, const double &length, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor. Pass pointer to geometric object that represents the cylinder, the length and height of ...