30 #ifndef OOMPH_BACKWARD_STEP_MESH_TEMPLATE_CC    31 #define OOMPH_BACKWARD_STEP_MESH_TEMPLATE_CC    51  template<
class ELEMENT>
    55   const unsigned& nx_cut_out,
    56   const unsigned& ny_cut_out,
    62   MeshChecker::assert_geometric_element<QElementGeometricBase,ELEMENT>(2);
    65   std::map<Node*,bool> keep;
    68   Vector<FiniteElement*> el_retained_pt;
    69   Vector<FiniteElement*> el_killed_pt;
    70   for (
unsigned i=0;i<nx;i++)
    72     for (
unsigned j=0;j<ny;j++)
    74       FiniteElement* el_pt=this->finite_element_pt(i+nx*j);
    75       if ((i>(nx_cut_out-1))&&(j<ny_cut_out))
    77         el_killed_pt.push_back(el_pt);
    81         el_retained_pt.push_back(el_pt);
    82         unsigned nnod_el=el_pt->nnode();
    83         for (
unsigned jj=0;jj<nnod_el;jj++)
    85           keep[el_pt->node_pt(jj)]=
true;
    94   std::map<Node*,std::set<unsigned> > boundaries; 
    95   unsigned nnod=this->nnode();
    96   for (
unsigned j=0;j<nnod;j++)
    98     std::set<unsigned>* aux_pt=0;
    99     this->node_pt(j)->get_boundaries_pt(aux_pt);
   102       boundaries[this->node_pt(j)]=(*aux_pt);
   107   this->remove_boundary_nodes();
   110   this->set_nboundary(6);
   113   Vector<Node*> node_backup_pt(this->Node_pt);
   114   this->Node_pt.clear();
   115   for (
unsigned j=0;j<nnod;j++)
   117     Node* nod_pt=node_backup_pt[j];
   120       this->Node_pt.push_back(nod_pt);
   121       std::set<unsigned> aux=boundaries[nod_pt];
   122       for (std::set<unsigned>::iterator it=boundaries[nod_pt].begin();
   123            it!=boundaries[nod_pt].end();it++)
   127         this->add_boundary_node(b,nod_pt);
   132       delete node_backup_pt[j];
   137   unsigned i=nx_cut_out-1;
   138   for (
unsigned j=0;j<ny_cut_out;j++)
   140     FiniteElement* el_pt=this->finite_element_pt(i+nx*j);     
   141     unsigned nnod_1d=el_pt->nnode_1d();
   142     for (
unsigned jj=0;jj<nnod_1d;jj++)
   144       unsigned jnod=(nnod_1d-1)+jj*nnod_1d;
   145       if (!(el_pt->node_pt(jnod)->is_on_boundary()))
   147         Node* nod_pt=el_pt->node_pt(jnod);
   148         this->convert_to_boundary_node(nod_pt);
   150       this->add_boundary_node(1,el_pt->node_pt(jnod));
   155   unsigned j=ny_cut_out;
   156   for (
unsigned i=nx_cut_out;i<nx;i++)
   158     FiniteElement* el_pt=this->finite_element_pt(i+nx*j);     
   159     unsigned nnod_1d=el_pt->nnode_1d();
   160     for (
unsigned jj=0;jj<nnod_1d;jj++)
   163       if (!(el_pt->node_pt(jnod)->is_on_boundary()))
   165         Node* nod_pt=el_pt->node_pt(jnod);
   166         this->convert_to_boundary_node(nod_pt);
   168       this->add_boundary_node(2,el_pt->node_pt(jnod));
   175   this->Element_pt.clear();
   176   unsigned n_retained=el_retained_pt.size();
   177   for (
unsigned e=0;e<n_retained;e++)
   179     this->Element_pt.push_back(el_retained_pt[e]);
   181   unsigned n_killed=el_killed_pt.size();
   182   for (
unsigned e=0;e<n_killed;e++)
   184     delete el_killed_pt[e];
   189   this->setup_boundary_element_info();
 
void build_mesh(const unsigned &nx, const unsigned &ny, const unsigned &nx_cut_out, const unsigned &ny_cut_out, const double &lx, const double &ly)
Actual build function.