30 #ifndef OOMPH_EIGHTH_SPHERE_MESH_TEMPLATE_CC 31 #define OOMPH_EIGHTH_SPHERE_MESH_TEMPLATE_CC 43 template<
class ELEMENT>
45 TimeStepper* time_stepper_pt) :
50 MeshChecker::assert_geometric_element<QElementGeometricBase,ELEMENT>(3);
53 this->set_nboundary(4);
56 this->Element_pt.resize(4);
62 Vector<double> s(3), s_fraction(3);
67 this->Element_pt[0]=
new ELEMENT;
72 unsigned nnode1d = this->finite_element_pt(0)->nnode_1d();
75 for (
unsigned i = 0; i < nnode1d; i++)
77 for (
unsigned j = 0; j < nnode1d; j++)
79 for (
unsigned k = 0; k < nnode1d; k++)
81 unsigned jnod = k * nnode1d * nnode1d + j * nnode1d + i;
84 if((i==0) || (j==0) || (k==0))
87 this->Node_pt.push_back(
88 this->finite_element_pt(0)->
89 construct_boundary_node(jnod,time_stepper_pt));
95 this->Node_pt.push_back(this->finite_element_pt(0)->
96 construct_node(jnod,time_stepper_pt));
101 this->finite_element_pt(0)->local_fraction_of_node(jnod,s_fraction);
105 s[0]=-1.0+2.0*s_fraction[0];
106 s[1]=-1.0+2.0*s_fraction[1];
107 s[2]=-1.0+2.0*s_fraction[2];
108 Domain_pt->macro_element_pt(0)->macro_map(s,r);
111 this->finite_element_pt(0)->node_pt(jnod)->x(0) = r[0];
112 this->finite_element_pt(0)->node_pt(jnod)->x(1) = r[1];
113 this->finite_element_pt(0)->node_pt(jnod)->x(2) = r[2];
117 add_boundary_node(0,this->finite_element_pt(0)->node_pt(jnod));
119 add_boundary_node(1,this->finite_element_pt(0)->node_pt(jnod));
121 add_boundary_node(2,this->finite_element_pt(0)->node_pt(jnod));
130 this->Element_pt[1]=
new ELEMENT;;
135 for (
unsigned i = 0; i < nnode1d; i++)
137 for (
unsigned j = 0; j < nnode1d; j++)
139 for (
unsigned k = 0; k < nnode1d; k++)
141 unsigned jnod = k*nnode1d*nnode1d+j*nnode1d+i;
147 if((i==nnode1d-1) || (j==0) || (k==0))
150 Node_pt.push_back(this->
151 finite_element_pt(1)->
152 construct_boundary_node(jnod,time_stepper_pt));
157 this->Node_pt.push_back(this->finite_element_pt(1)->
158 construct_node(jnod,time_stepper_pt));
163 this->finite_element_pt(1)->local_fraction_of_node(jnod,s_fraction);
166 s[0]=-1.0+2.0*s_fraction[0];
167 s[1]=-1.0+2.0*s_fraction[1];
168 s[2]=-1.0+2.0*s_fraction[2];
169 Domain_pt->macro_element_pt(1)->macro_map(s,r);
172 this->finite_element_pt(1)->node_pt(jnod)->x(0) = r[0];
173 this->finite_element_pt(1)->node_pt(jnod)->x(1) = r[1];
174 this->finite_element_pt(1)->node_pt(jnod)->x(2) = r[2];
178 add_boundary_node(1,this->finite_element_pt(1)->node_pt(jnod));
180 add_boundary_node(2,this->finite_element_pt(1)->node_pt(jnod));
182 add_boundary_node(3,this->finite_element_pt(1)->node_pt(jnod));
188 this->finite_element_pt(1)->node_pt(jnod)=
189 this->finite_element_pt(0)->node_pt(jnod+nnode1d-1);
200 this->Element_pt[2]=
new ELEMENT;
205 for (
unsigned i = 0; i < nnode1d; i++)
207 for (
unsigned j = 0; j < nnode1d; j++)
209 for (
unsigned k = 0; k < nnode1d; k++)
211 unsigned jnod=k*nnode1d*nnode1d+j*nnode1d+i;
214 if((i<nnode1d-1) && (j>0))
217 if((i==0) || (j==nnode1d-1) || (k==0))
221 Node_pt.push_back(this->
222 finite_element_pt(2)->
223 construct_boundary_node(jnod,time_stepper_pt));
229 this->Node_pt.push_back(this->finite_element_pt(2)->
230 construct_node(jnod,time_stepper_pt));
235 this->finite_element_pt(2)->local_fraction_of_node(jnod,s_fraction);
238 s[0]=-1.0+2.0*s_fraction[0];
239 s[1]=-1.0+2.0*s_fraction[1];
240 s[2]=-1.0+2.0*s_fraction[2];
241 Domain_pt->macro_element_pt(2)->macro_map(s,r);
244 this->finite_element_pt(2)->node_pt(jnod)->x(0) = r[0];
245 this->finite_element_pt(2)->node_pt(jnod)->x(1) = r[1];
246 this->finite_element_pt(2)->node_pt(jnod)->x(2) = r[2];
250 add_boundary_node(0,this->finite_element_pt(2)->node_pt(jnod));
252 add_boundary_node(2,this->finite_element_pt(2)->node_pt(jnod));
254 add_boundary_node(3,this->finite_element_pt(2)->node_pt(jnod));
262 this->finite_element_pt(2)->node_pt(jnod)=
263 this->finite_element_pt(0)->node_pt(jnod+nnode1d*(nnode1d-1));
268 this->finite_element_pt(2)->node_pt(jnod)=
269 this->finite_element_pt(1)->node_pt(nnode1d*nnode1d*k+j+i*nnode1d);
278 this->Element_pt[3]=
new ELEMENT;
283 for (
unsigned i = 0; i < nnode1d; i++)
285 for (
unsigned j = 0; j < nnode1d; j++)
287 for (
unsigned k = 0; k < nnode1d; k++)
289 unsigned jnod=k*nnode1d*nnode1d+j*nnode1d+i;
292 if((k>0) && (i<nnode1d-1) && (j<nnode1d-1))
295 if((i==0) || (j==0) || (k==nnode1d-1))
299 Node_pt.push_back(this->
300 finite_element_pt(3)->
301 construct_boundary_node(jnod,time_stepper_pt));
307 this->Node_pt.push_back(this->finite_element_pt(3)->
308 construct_node(jnod,time_stepper_pt));
313 this->finite_element_pt(3)->local_fraction_of_node(jnod,s_fraction);
316 s[0]=-1.0+2.0*s_fraction[0];
317 s[1]=-1.0+2.0*s_fraction[1];
318 s[2]=-1.0+2.0*s_fraction[2];
319 Domain_pt->macro_element_pt(3)->macro_map(s,r);
322 this->finite_element_pt(3)->node_pt(jnod)->x(0) = r[0];
323 this->finite_element_pt(3)->node_pt(jnod)->x(1) = r[1];
324 this->finite_element_pt(3)->node_pt(jnod)->x(2) = r[2];
328 add_boundary_node(0,this->finite_element_pt(3)->node_pt(jnod));
330 add_boundary_node(1,this->finite_element_pt(3)->node_pt(jnod));
332 add_boundary_node(3,this->finite_element_pt(3)->node_pt(jnod));
341 this->finite_element_pt(3)->node_pt(jnod)=
342 this->finite_element_pt(0)->
343 node_pt(jnod+nnode1d*nnode1d*(nnode1d-1));
349 this->finite_element_pt(3)->node_pt(jnod)=
350 this->finite_element_pt(1)->
351 node_pt(k+i*nnode1d*nnode1d+j*nnode1d);
356 this->finite_element_pt(3)->node_pt(jnod)=
357 this->finite_element_pt(2)->
358 node_pt(i+k*nnode1d+j*nnode1d*nnode1d);
366 setup_boundary_element_info();
Domain * Domain_pt
Pointer to the domain.
EighthSphereMesh(const double &radius, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass radius and timestepper; defaults to static default timestepper. ...
double Radius
Radius of the sphere.
Eighth sphere as domain. Domain is parametrised by four macro elements.