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.