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.