30 #ifndef OOMPH_SIMPLE_RECTANGULAR_TRIMESH_TEMPLATE_CC 31 #define OOMPH_SIMPLE_RECTANGULAR_TRIMESH_TEMPLATE_CC 36 #include "../generic/Telements.h" 60 template <
class ELEMENT>
64 const double &l_x,
const double &l_y,
65 TimeStepper* time_stepper_pt) : Nx(n_x), Ny(n_y), Lx(l_x), Ly(l_y)
68 using namespace MathematicalConstants;
71 MeshChecker::assert_geometric_element<TElementGeometricBase,ELEMENT>(2);
74 this->set_nboundary(4);
77 unsigned n_element = (
Nx)*(
Ny)*2;
78 Element_pt.resize(n_element,0);
81 Element_pt[0] =
new ELEMENT;
84 if ((finite_element_pt(0)->nnode_1d()!=2)
85 && (finite_element_pt(0)->nnode_1d()!=3)
86 && (finite_element_pt(0)->nnode_1d()!=4))
89 "Currently this mesh only works for 3, 6 & 10-noded triangles",
90 OOMPH_CURRENT_FUNCTION,
91 OOMPH_EXCEPTION_LOCATION);
96 unsigned additional_nnode=0;
99 if (finite_element_pt(0)->nnode_1d()==2)
101 n_node = (
Nx+1)*(
Ny+1);
104 if (finite_element_pt(0)->nnode_1d()==3)
106 additional_nnode = 3;
108 n_node = (2*
Nx + 1)*(2*
Ny + 1);
111 if (finite_element_pt(0)->nnode_1d()==4)
113 additional_nnode = 7;
115 n_node = (3*
Nx + 1)*(3*
Ny + 1);
118 Node_pt.resize(n_node);
122 unsigned long node_count=0;
123 unsigned long element_count=0;
124 double xinit=0.0, yinit=0.0;
126 double xstep =
Lx/(
Nx);
127 double ystep =
Ly/(
Ny);
137 Node_pt[node_count] = finite_element_pt(0)->construct_node(1,time_stepper_pt);
140 finite_element_pt(0)->node_pt(1) = Node_pt[node_count];
154 for (
unsigned j=0;j<
Ny+1;++j)
156 for (
unsigned i=0;i<
Nx+1;++i)
164 if (element_count != 0)
166 Element_pt[element_count] =
new ELEMENT;
169 Element_pt[element_count+1] =
new ELEMENT;
177 Node_pt[node_count+Nx+1] = finite_element_pt(element_count)->
178 construct_node(0,time_stepper_pt);
184 Node_pt[node_count+1] = finite_element_pt(element_count)->
185 construct_node(2,time_stepper_pt);
189 Node_pt[node_count+Nx+2] = finite_element_pt(element_count+1)->
190 construct_node(1,time_stepper_pt);
197 finite_element_pt(element_count)->node_pt(0) = Node_pt[node_count+Nx+1];
198 finite_element_pt(element_count)->node_pt(1) = Node_pt[node_count];
199 finite_element_pt(element_count)->node_pt(2) = Node_pt[node_count+1];
200 finite_element_pt(element_count+1)->node_pt(0)=Node_pt[node_count+1];
201 finite_element_pt(element_count+1)->node_pt(1)=Node_pt[node_count+Nx+2];
202 finite_element_pt(element_count+1)->node_pt(2)=Node_pt[node_count+Nx+1];
209 Node_pt[node_count]->x(0) = xinit + i*xstep;
210 Node_pt[node_count]->x(1) = yinit + j*ystep;
215 this->convert_to_boundary_node(Node_pt[node_count]);
216 add_boundary_node(0,Node_pt[node_count]);
220 this->convert_to_boundary_node(Node_pt[node_count]);
221 add_boundary_node(2,Node_pt[node_count]);
225 this->convert_to_boundary_node(Node_pt[node_count]);
226 add_boundary_node(3,Node_pt[node_count]);
230 this->convert_to_boundary_node(Node_pt[node_count]);
231 add_boundary_node(1,Node_pt[node_count]);
240 if (additional_nnode==3)
246 for (
unsigned j=0;j<Ny+1 ;++j)
250 for (
unsigned i=0;i<
Nx ;++i)
263 Node_pt[node_count] = finite_element_pt(element_count)->
264 construct_node(4,time_stepper_pt);
269 Node_pt[node_count+
Nx] = finite_element_pt(element_count+1)->
270 construct_node(4,time_stepper_pt);
274 finite_element_pt(element_count)->node_pt(4)=Node_pt[node_count];
276 finite_element_pt(element_count+1)->node_pt(4)=Node_pt[node_count+
Nx];
284 Node_pt[node_count]->x(0)=xinit + double(i+0.5)*xstep;
285 Node_pt[node_count]->x(1)=yinit + j*ystep;
291 this->convert_to_boundary_node(Node_pt[node_count]);
292 add_boundary_node(0,Node_pt[node_count]);
296 this->convert_to_boundary_node(Node_pt[node_count]);
297 add_boundary_node(2,Node_pt[node_count]);
312 for (
unsigned j=0;j<
Ny;++j)
314 for (
unsigned i=0;i<
Nx+1;++i)
322 Node_pt[node_count] = finite_element_pt(element_count)->
323 construct_node(3,time_stepper_pt);
328 Node_pt[node_count+1] = finite_element_pt(element_count+1)->
329 construct_node(3,time_stepper_pt);
332 finite_element_pt(element_count)->node_pt(3)=Node_pt[node_count];
333 finite_element_pt(element_count+1)->node_pt(3)=Node_pt[node_count+1];
340 Node_pt[node_count]->x(0)=xinit + i*xstep;
341 Node_pt[node_count]->x(1)=yinit + double(j+0.5)*ystep;
346 this->convert_to_boundary_node(Node_pt[node_count]);
347 add_boundary_node(3,Node_pt[node_count]);
351 this->convert_to_boundary_node(Node_pt[node_count]);
352 add_boundary_node(1,Node_pt[node_count]);
366 for (
unsigned j=0;j<
Ny;++j)
368 for (
unsigned i=0;i<
Nx;++i)
371 Node_pt[node_count] = finite_element_pt(element_count)->
372 construct_node(5,time_stepper_pt);
375 finite_element_pt(element_count)->node_pt(5)=Node_pt[node_count];
376 finite_element_pt(element_count+1)->node_pt(5)=Node_pt[node_count];
383 Node_pt[node_count]->x(0)=xinit + double(i+0.5)*xstep;
384 Node_pt[node_count]->x(1)=yinit + double(j+0.5)*ystep;
400 if (additional_nnode==7)
406 for (
unsigned j=0;j<Ny+1 ;++j)
410 for (
unsigned i=0;i<
Nx ;++i)
424 Node_pt[node_count] = finite_element_pt(element_count)->
425 construct_node(5,time_stepper_pt);
430 Node_pt[node_count+
Nx] = finite_element_pt(element_count+1)->
431 construct_node(6,time_stepper_pt);
435 finite_element_pt(element_count)->node_pt(5)=Node_pt[node_count];
437 finite_element_pt(element_count+1)->node_pt(6)=Node_pt[node_count+
Nx];
445 Node_pt[node_count]->x(0)=xinit + double(i+ 1.0/3.0)*xstep;
446 Node_pt[node_count]->x(1)=yinit + j*ystep;
451 this->convert_to_boundary_node(Node_pt[node_count]);
452 add_boundary_node(0,Node_pt[node_count]);
456 this->convert_to_boundary_node(Node_pt[node_count]);
457 add_boundary_node(2,Node_pt[node_count]);
470 for (
unsigned j=0;j<Ny+1 ;++j)
473 for (
unsigned i=0;i<
Nx ;++i)
481 Node_pt[node_count] = finite_element_pt(element_count)->
482 construct_node(6,time_stepper_pt);
487 Node_pt[node_count+
Nx] = finite_element_pt(element_count+1)->
488 construct_node(5,time_stepper_pt);
492 finite_element_pt(element_count)->node_pt(6)=Node_pt[node_count];
494 finite_element_pt(element_count+1)->node_pt(5)=Node_pt[node_count+
Nx];
502 Node_pt[node_count]->x(0)=xinit + double(i+ 2.0/3.0)*xstep;
503 Node_pt[node_count]->x(1)=yinit + j*ystep;
508 this->convert_to_boundary_node(Node_pt[node_count]);
509 add_boundary_node(0,Node_pt[node_count]);
513 this->convert_to_boundary_node(Node_pt[node_count]);
514 add_boundary_node(2,Node_pt[node_count]);
530 for (
unsigned j=0;j<
Ny;++j)
532 for (
unsigned i=0;i<
Nx+1;++i)
540 Node_pt[node_count] = finite_element_pt(element_count)->
541 construct_node(4,time_stepper_pt);
546 Node_pt[node_count+1] = finite_element_pt(element_count+1)->
547 construct_node(3,time_stepper_pt);
550 finite_element_pt(element_count)->node_pt(4)=Node_pt[node_count];
551 finite_element_pt(element_count+1)->node_pt(3)=Node_pt[node_count+1];
558 Node_pt[node_count]->x(0)=xinit + i*xstep;
559 Node_pt[node_count]->x(1)=yinit + double(j+ 1.0/3.0)*ystep;
564 this->convert_to_boundary_node(Node_pt[node_count]);
565 add_boundary_node(3,Node_pt[node_count]);
569 this->convert_to_boundary_node(Node_pt[node_count]);
570 add_boundary_node(1,Node_pt[node_count]);
585 for (
unsigned j=0;j<
Ny;++j)
587 for (
unsigned i=0;i<
Nx+1;++i)
595 Node_pt[node_count] = finite_element_pt(element_count)->
596 construct_node(3,time_stepper_pt);
601 Node_pt[node_count+1] = finite_element_pt(element_count+1)->
602 construct_node(4,time_stepper_pt);
605 finite_element_pt(element_count)->node_pt(3)=Node_pt[node_count];
606 finite_element_pt(element_count+1)->node_pt(4)=Node_pt[node_count+1];
613 Node_pt[node_count]->x(0)=xinit + i*xstep;
614 Node_pt[node_count]->x(1)=yinit + double(j+ 2.0/3.0)*ystep;
619 this->convert_to_boundary_node(Node_pt[node_count]);
620 add_boundary_node(3,Node_pt[node_count]);
624 this->convert_to_boundary_node(Node_pt[node_count]);
625 add_boundary_node(1,Node_pt[node_count]);
637 for (
unsigned j=0;j<
Ny;++j)
639 for (
unsigned i=0;i<
Nx;++i)
642 Node_pt[node_count] = finite_element_pt(element_count)->
643 construct_node(9,time_stepper_pt);
646 finite_element_pt(element_count)->node_pt(9)=Node_pt[node_count];
652 Node_pt[node_count]->x(0)=xinit + double(i+ 1.0/3.0)*xstep;
653 Node_pt[node_count]->x(1)=yinit + double(j+ 1.0/3.0)*ystep;
668 for (
unsigned j=0;j<
Ny;++j)
670 for (
unsigned i=0;i<
Nx;++i)
673 Node_pt[node_count] = finite_element_pt(element_count)->
674 construct_node(7,time_stepper_pt);
677 finite_element_pt(element_count)->node_pt(7)=Node_pt[node_count];
678 finite_element_pt(element_count+1)->node_pt(8)=Node_pt[node_count];
684 Node_pt[node_count]->x(0)=xinit + double(i+ 2.0/3.0)*xstep;
685 Node_pt[node_count]->x(1)=yinit + double(j+ 1.0/3.0)*ystep;
701 for (
unsigned j=0;j<
Ny;++j)
703 for (
unsigned i=0;i<
Nx;++i)
706 Node_pt[node_count] = finite_element_pt(element_count)->
707 construct_node(8,time_stepper_pt);
710 finite_element_pt(element_count)->node_pt(8)=Node_pt[node_count];
711 finite_element_pt(element_count+1)->node_pt(7)=Node_pt[node_count];
717 Node_pt[node_count]->x(0)=xinit + double(i+ 1.0/3.0)*xstep;
718 Node_pt[node_count]->x(1)=yinit + double(j+ 2.0/3.0)*ystep;
731 for (
unsigned j=0;j<
Ny;++j)
733 for (
unsigned i=0;i<
Nx;++i)
736 Node_pt[node_count] = finite_element_pt(element_count+1)->
737 construct_node(9,time_stepper_pt);
740 finite_element_pt(element_count+1)->node_pt(9)=Node_pt[node_count];
746 Node_pt[node_count]->x(0)=xinit + double(i+ 2.0/3.0)*xstep;
747 Node_pt[node_count]->x(1)=yinit + double(j+ 2.0/3.0)*ystep;
unsigned Nx
Number of elements in x direction.
double Ly
Length of mesh in y-direction.
SimpleRectangularTriMesh(const unsigned &n_x, const unsigned &n_y, const double &l_x, const double &l_y, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor n_x : number of elements in the x direction; n_y : number of elements in the y direction;...
double Lx
Length of mesh in x-direction.
unsigned Ny
Number of elements in y directions.