30 #ifndef OOMPH_RECTANGULAR_QUADMESH_TEMPLATE_CC 31 #define OOMPH_RECTANGULAR_QUADMESH_TEMPLATE_CC 47 template <
class ELEMENT>
52 MeshChecker::assert_geometric_element<QElementGeometricBase,ELEMENT>(2);
58 Element_pt.resize(Nx*Ny);
60 Element_pt[0] =
new ELEMENT;
63 Np =
dynamic_cast<ELEMENT*
>(finite_element_pt(0))->nnode_1d();
66 Node_pt.resize((1 + (Np-1)*Nx)*(1 + (Np-1)*Ny));
69 unsigned long node_count=0;
82 finite_element_pt(0)->construct_boundary_node(0,time_stepper_pt);
85 Node_pt[node_count]->x(0) = x_spacing_function(0,0,0,0);
86 Node_pt[node_count]->x(1) = y_spacing_function(0,0,0,0);
89 add_boundary_node(0,Node_pt[node_count]);
90 add_boundary_node(3,Node_pt[node_count]);
96 for(
unsigned l2=1;l2<Np;l2++)
100 finite_element_pt(0)->construct_boundary_node(l2,time_stepper_pt);
103 Node_pt[node_count]->x(0) = x_spacing_function(0,l2,0,0);
104 Node_pt[node_count]->x(1) = y_spacing_function(0,l2,0,0);
107 add_boundary_node(0,Node_pt[node_count]);
110 if((Nx==1) && (l2==(Np-1)))
111 {add_boundary_node(1,Node_pt[node_count]);}
118 for(
unsigned l1=1;l1<Np;l1++)
121 Node_pt[node_count] =
122 finite_element_pt(0)->construct_boundary_node(l1*Np,time_stepper_pt);
125 Node_pt[node_count]->x(0) = x_spacing_function(0,0,0,l1);
126 Node_pt[node_count]->x(1) = y_spacing_function(0,0,0,l1);
129 add_boundary_node(3,Node_pt[node_count]);
132 if((Ny==1) && (l1==(Np-1)))
133 {add_boundary_node(2,Node_pt[node_count]);}
139 for(
unsigned l2=1;l2<Np;l2++)
143 if(((Nx==1) && (l2==(Np-1))) || ((Ny==1) && (l1==(Np-1))))
145 Node_pt[node_count] = finite_element_pt(0)->
146 construct_boundary_node(l1*Np+l2,time_stepper_pt);
151 Node_pt[node_count] =
152 finite_element_pt(0)->construct_node(l1*Np+l2,time_stepper_pt);
156 Node_pt[node_count]->x(0) = x_spacing_function(0,l2,0,l1);
157 Node_pt[node_count]->x(1) = y_spacing_function(0,l2,0,l1);
160 if((Nx==1) && l2==(Np-1))
161 {add_boundary_node(1,Node_pt[node_count]);}
163 if((Ny==1) && (l1==(Np-1)))
164 {add_boundary_node(2,Node_pt[node_count]);}
174 for(
unsigned j=1;j<(Nx-1);j++)
177 Element_pt[j] =
new ELEMENT;
180 finite_element_pt(j)->node_pt(0) =
181 finite_element_pt(j-1)->node_pt((Np-1));
183 for(
unsigned l2=1;l2<Np;l2++)
186 Node_pt[node_count] =
187 finite_element_pt(j)->construct_boundary_node(l2,time_stepper_pt);
190 Node_pt[node_count]->x(0) = x_spacing_function(j,l2,0,0);
191 Node_pt[node_count]->x(1) = y_spacing_function(j,l2,0,0);
194 add_boundary_node(0,Node_pt[node_count]);
201 for(
unsigned l1=1;l1<Np;l1++)
204 finite_element_pt(j)->node_pt(l1*Np) =
205 finite_element_pt(j-1)->node_pt(l1*Np+(Np-1));
207 for(
unsigned l2=1;l2<Np;l2++)
211 if((Ny==1) && (l1==(Np-1)))
213 Node_pt[node_count] = finite_element_pt(j)->
214 construct_boundary_node(l1*Np+l2,time_stepper_pt);
219 Node_pt[node_count] =
220 finite_element_pt(j)->construct_node(l1*Np+l2,time_stepper_pt);
224 Node_pt[node_count]->x(0) = x_spacing_function(j,l2,0,l1);
225 Node_pt[node_count]->x(1) = y_spacing_function(j,l2,0,l1);
228 if((Ny==1) && (l1==(Np-1)))
229 {add_boundary_node(2,Node_pt[node_count]);}
243 Element_pt[Nx-1] =
new ELEMENT;
246 finite_element_pt(Nx-1)->node_pt(0) =
247 finite_element_pt(Nx-2)->node_pt(Np-1);
250 for(
unsigned l2=1;l2<(Np-1);l2++)
253 Node_pt[node_count] =
254 finite_element_pt(Nx-1)->construct_boundary_node(l2,time_stepper_pt);
257 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,l2,0,0);
258 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,l2,0,0);
261 add_boundary_node(0,Node_pt[node_count]);
268 Node_pt[node_count] =
269 finite_element_pt(Nx-1)->construct_boundary_node(Np-1,time_stepper_pt);
274 Node_pt[node_count]->
275 make_periodic(finite_element_pt(0)->node_pt(0));
279 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,Np-1,0,0);
280 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,Np-1,0,0);
283 add_boundary_node(0,Node_pt[node_count]);
284 add_boundary_node(1,Node_pt[node_count]);
290 for(
unsigned l1=1;l1<Np;l1++)
293 finite_element_pt(Nx-1)->node_pt(l1*Np) =
294 finite_element_pt(Nx-2)->node_pt(l1*Np+(Np-1));
297 for(
unsigned l2=1;l2<(Np-1);l2++)
301 if((Ny==1) && (l1==(Np-1)))
303 Node_pt[node_count] = finite_element_pt(Nx-1)->
304 construct_boundary_node(l1*Np+l2,time_stepper_pt);
309 Node_pt[node_count] =
310 finite_element_pt(Nx-1)->construct_node(l1*Np+l2,time_stepper_pt);
314 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,l2,0,l1);
315 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,l2,0,l1);
318 if((Ny==1) && (l1==(Np-1)))
319 {add_boundary_node(2,Node_pt[node_count]);}
326 Node_pt[node_count] = finite_element_pt(Nx-1)->
327 construct_boundary_node(l1*Np+(Np-1),time_stepper_pt);
333 Node_pt[node_count]->
334 make_periodic(finite_element_pt(0)->node_pt(l1*Np));
338 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,Np-1,0,l1);
339 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,Np-1,0,l1);
342 add_boundary_node(1,Node_pt[node_count]);
345 if((Ny==1) && (l1==(Np-1)))
346 {add_boundary_node(2,Node_pt[node_count]);}
356 for(
unsigned i=1;i<(Ny-1);i++)
360 Element_pt[Nx*i] =
new ELEMENT;
363 for(
unsigned l2=0;l2<Np;l2++)
365 finite_element_pt(Nx*i)->node_pt(l2) =
366 finite_element_pt(Nx*(i-1))->node_pt((Np-1)*Np + l2);
370 for(
unsigned l1=1;l1<Np;l1++)
374 Node_pt[node_count] = finite_element_pt(Nx*i)->
375 construct_boundary_node(l1*Np,time_stepper_pt);
378 Node_pt[node_count]->x(0) = x_spacing_function(0,0,i,l1);
379 Node_pt[node_count]->x(1) = y_spacing_function(0,0,i,l1);
382 add_boundary_node(3,Node_pt[node_count]);
388 for(
unsigned l2=1;l2<Np;l2++)
392 if((Nx==1) && (l2==(Np-1)))
394 Node_pt[node_count] = finite_element_pt(Nx*i)->
395 construct_boundary_node(l1*Np+l2,time_stepper_pt);
399 Node_pt[node_count] =
400 finite_element_pt(Nx*i)->construct_node(l1*Np+l2,time_stepper_pt);
404 Node_pt[node_count]->x(0) = x_spacing_function(0,l2,i,l1);
405 Node_pt[node_count]->x(1) = y_spacing_function(0,l2,i,l1);
409 if((Nx==1) && (l2==(Np-1)))
410 {add_boundary_node(1,Node_pt[node_count]);}
418 for(
unsigned j=1;j<(Nx-1);j++)
421 Element_pt[Nx*i+j] =
new ELEMENT;
423 for(
unsigned l2=0;l2<Np;l2++)
425 finite_element_pt(Nx*i+j)->node_pt(l2) =
426 finite_element_pt(Nx*(i-1)+j)->node_pt((Np-1)*Np + l2);
429 for(
unsigned l1=1;l1<Np;l1++)
432 finite_element_pt(Nx*i+j)->node_pt(l1*Np) =
433 finite_element_pt(Nx*i+(j-1))->node_pt(l1*Np+(Np-1));
435 for(
unsigned l2=1;l2<Np;l2++)
438 Node_pt[node_count] =
439 finite_element_pt(Nx*i+j)->
440 construct_node(l1*Np+l2,time_stepper_pt);
443 Node_pt[node_count]->x(0) = x_spacing_function(j,l2,i,l1);
444 Node_pt[node_count]->x(1) = y_spacing_function(j,l2,i,l1);
457 Element_pt[Nx*i+Nx-1] =
new ELEMENT;
459 for(
unsigned l2=0;l2<Np;l2++)
461 finite_element_pt(Nx*i+Nx-1)->node_pt(l2) =
462 finite_element_pt(Nx*(i-1)+Nx-1)->node_pt((Np-1)*Np + l2);
465 for(
unsigned l1=1;l1<Np;l1++)
468 finite_element_pt(Nx*i+Nx-1)->node_pt(l1*Np) =
469 finite_element_pt(Nx*i+Nx-2)->node_pt(l1*Np+(Np-1));
472 for(
unsigned l2=1;l2<(Np-1);l2++)
475 Node_pt[node_count] =
476 finite_element_pt(Nx*i+Nx-1)->
477 construct_node(l1*Np+l2,time_stepper_pt);
480 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,l2,i,l1);
481 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,l2,i,l1);
488 Node_pt[node_count] =
489 finite_element_pt(Nx*i+Nx-1)->
490 construct_boundary_node(l1*Np+(Np-1),time_stepper_pt);
496 Node_pt[node_count]->
497 make_periodic(finite_element_pt(Nx*i)->node_pt(l1*Np));
501 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,Np-1,i,l1);
502 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,Np-1,i,l1);
505 add_boundary_node(1,Node_pt[node_count]);
521 Element_pt[Nx*(Ny-1)] =
new ELEMENT;
523 for(
unsigned l2=0;l2<Np;l2++)
525 finite_element_pt(Nx*(Ny-1))->node_pt(l2)
526 = finite_element_pt(Nx*(Ny-2))->node_pt((Np-1)*Np + l2);
531 for(
unsigned l1=1;l1<(Np-1);l1++)
534 Node_pt[node_count] = finite_element_pt(Nx*(Ny-1))->
535 construct_boundary_node(Np*l1,time_stepper_pt);
538 Node_pt[node_count]->x(0) = x_spacing_function(0,0,Ny-1,l1);
539 Node_pt[node_count]->x(1) = y_spacing_function(0,0,Ny-1,l1);
542 add_boundary_node(3,Node_pt[node_count]);
548 for(
unsigned l2=1;l2<Np;l2++)
552 if ((Nx==1)&&(l2==Np-1))
554 Node_pt[node_count] =
555 finite_element_pt(Nx*(Ny-1))->
556 construct_boundary_node(Np*l1+l2,time_stepper_pt);
560 Node_pt[node_count] =
561 finite_element_pt(Nx*(Ny-1))->
562 construct_node(Np*l1+l2,time_stepper_pt);
566 Node_pt[node_count]->x(0) = x_spacing_function(0,l2,Ny-1,l1);
567 Node_pt[node_count]->x(1) = y_spacing_function(0,l2,Ny-1,l1);
570 if ((Nx==1)&&(l2==Np-1))
572 add_boundary_node(1,Node_pt[node_count]);
584 Node_pt[node_count] = finite_element_pt(Nx*(Ny-1))->
585 construct_boundary_node(Np*(Np-1),time_stepper_pt);
588 Node_pt[node_count]->x(0) = x_spacing_function(0,0,Ny-1,Np-1);
589 Node_pt[node_count]->x(1) = y_spacing_function(0,0,Ny-1,Np-1);
592 add_boundary_node(2,Node_pt[node_count]);
593 add_boundary_node(3,Node_pt[node_count]);
599 for(
unsigned l2=1;l2<Np;l2++)
602 Node_pt[node_count] =
603 finite_element_pt(Nx*(Ny-1))->
604 construct_boundary_node(Np*(Np-1)+l2,time_stepper_pt);
607 Node_pt[node_count]->x(0) = x_spacing_function(0,l2,Ny-1,Np-1);
608 Node_pt[node_count]->x(1) = y_spacing_function(0,l2,Ny-1,Np-1);
611 add_boundary_node(2,Node_pt[node_count]);
614 if ((Nx==1)&&(l2==Np-1))
616 add_boundary_node(1,Node_pt[node_count]);
624 for(
unsigned j=1;j<(Nx-1);j++)
627 Element_pt[Nx*(Ny-1)+j] =
new ELEMENT;
629 for(
unsigned l2=0;l2<Np;l2++)
631 finite_element_pt(Nx*(Ny-1)+j)->node_pt(l2) =
632 finite_element_pt(Nx*(Ny-2)+j)->node_pt((Np-1)*Np + l2);
636 for(
unsigned l1=1;l1<(Np-1);l1++)
639 finite_element_pt(Nx*(Ny-1)+j)->node_pt(Np*l1)
640 = finite_element_pt(Nx*(Ny-1)+(j-1))->node_pt(Np*l1+(Np-1));
643 for(
unsigned l2=1;l2<Np;l2++)
646 Node_pt[node_count] =
647 finite_element_pt(Nx*(Ny-1)+j)->
648 construct_node(Np*l1+l2,time_stepper_pt);
651 Node_pt[node_count]->x(0) = x_spacing_function(j,l2,Ny-1,l1);
652 Node_pt[node_count]->x(1) = y_spacing_function(j,l2,Ny-1,l1);
661 finite_element_pt(Nx*(Ny-1)+j)->node_pt(Np*(Np-1))
662 = finite_element_pt(Nx*(Ny-1)+(j-1))->node_pt(Np*(Np-1)+(Np-1));
664 for(
unsigned l2=1;l2<Np;l2++)
667 Node_pt[node_count] =
668 finite_element_pt(Nx*(Ny-1)+j)->
669 construct_boundary_node(Np*(Np-1)+l2,time_stepper_pt);
672 Node_pt[node_count]->x(0) = x_spacing_function(j,l2,Ny-1,Np-1);
673 Node_pt[node_count]->x(1) = y_spacing_function(j,l2,Ny-1,Np-1);
676 add_boundary_node(2,Node_pt[node_count]);
688 Element_pt[Nx*(Ny-1)+Nx-1] =
new ELEMENT;
690 for(
unsigned l2=0;l2<Np;l2++)
692 finite_element_pt(Nx*(Ny-1)+Nx-1)->node_pt(l2) =
693 finite_element_pt(Nx*(Ny-2)+Nx-1)->node_pt((Np-1)*Np + l2);
697 for(
unsigned l1=1;l1<(Np-1);l1++)
700 finite_element_pt(Nx*(Ny-1)+Nx-1)->node_pt(Np*l1)
701 = finite_element_pt(Nx*(Ny-1)+Nx-2)->node_pt(Np*l1+(Np-1));
704 for(
unsigned l2=1;l2<(Np-1);l2++)
707 Node_pt[node_count] =
708 finite_element_pt(Nx*(Ny-1)+Nx-1)->
709 construct_node(Np*l1+l2,time_stepper_pt);
712 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,l2,Ny-1,l1);
713 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,l2,Ny-1,l1);
721 Node_pt[node_count] =
722 finite_element_pt(Nx*(Ny-1)+Nx-1)->
723 construct_boundary_node(Np*l1+(Np-1),time_stepper_pt);
728 Node_pt[node_count]->
729 make_periodic(finite_element_pt(Nx*(Ny-1))->node_pt(Np*l1));
733 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,Np-1,Ny-1,l1);
734 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,Np-1,Ny-1,l1);
737 add_boundary_node(1,Node_pt[node_count]);
746 finite_element_pt(Nx*(Ny-1)+Nx-1)->node_pt(Np*(Np-1))
747 = finite_element_pt(Nx*(Ny-1)+Nx-2)->node_pt(Np*(Np-1)+(Np-1));
750 for(
unsigned l2=1;l2<(Np-1);l2++)
753 Node_pt[node_count] =
754 finite_element_pt(Nx*(Ny-1)+Nx-1)->
755 construct_boundary_node(Np*(Np-1)+l2,time_stepper_pt);
758 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,l2,Ny-1,Np-1);
759 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,l2,Ny-1,Np-1);
762 add_boundary_node(2,Node_pt[node_count]);
770 Node_pt[node_count] = finite_element_pt(Nx*(Ny-1)+Nx-1)->
771 construct_boundary_node(Np*(Np-1)+(Np-1),time_stepper_pt);
776 Node_pt[node_count]->
777 make_periodic(finite_element_pt(Nx*(Ny-1))->node_pt(Np*(Np-1)));
781 Node_pt[node_count]->x(0) = x_spacing_function(Nx-1,Np-1,Ny-1,Np-1);
782 Node_pt[node_count]->x(1) = y_spacing_function(Nx-1,Np-1,Ny-1,Np-1);
785 add_boundary_node(1,Node_pt[node_count]);
786 add_boundary_node(2,Node_pt[node_count]);
795 setup_boundary_element_info();
804 template<
class ELEMENT>
808 unsigned long Nelement = nelement();
810 Vector<FiniteElement *> dummy;
813 for(
unsigned long j=0;j<Nx;j++)
816 for(
unsigned long i=0;i<Ny;i++)
819 dummy.push_back(finite_element_pt(Nx*i + j));
824 for(
unsigned long e=0;e<Nelement;e++) {Element_pt[e] = dummy[e];}
virtual void element_reorder()
Reorder the elements: By default they are ordered in "horizontal" layers (increasing in x...
void build_mesh(TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Generic mesh construction function: contains all the hard work.