30 #ifndef OOMPH_SIMPLE_CUBIC_TET_MESH_TEMPLATE_CC 31 #define OOMPH_SIMPLE_CUBIC_TET_MESH_TEMPLATE_CC 37 #include "../generic/map_matrix.h" 49 template <
class ELEMENT>
56 MeshChecker::assert_geometric_element<TElementGeometricBase,ELEMENT>(3);
59 unsigned nelem=Tmp_mesh_pt->nelement();
60 Element_pt.resize(nelem);
63 unsigned nnode_scaffold=Tmp_mesh_pt->nnode();
64 Node_pt.resize(nnode_scaffold);
67 unsigned nbound=Tmp_mesh_pt->nboundary();
68 set_nboundary(nbound);
71 for (
unsigned e=0;
e<nelem;
e++)
73 Element_pt[
e]=
new ELEMENT;
77 unsigned nnod_el=Tmp_mesh_pt->finite_element_pt(0)->nnode();
79 for (
unsigned e=0;
e<nelem;
e++)
82 for (
unsigned j=0;j<nnod_el;j++)
86 finite_element_pt(
e)->construct_node(j,time_stepper_pt);
94 std::map<Node*,unsigned> global_number;
95 unsigned global_count=0;
97 for (
unsigned e=0;
e<nelem;
e++)
100 for (
unsigned j=0;j<nnod_el;j++)
104 Node* scaffold_node_pt=Tmp_mesh_pt->finite_element_pt(
e)->node_pt(j);
108 unsigned j_global=global_number[scaffold_node_pt];
117 global_number[scaffold_node_pt]=global_count;
123 Node_pt[global_count-1]=finite_element_pt(
e)->node_pt(j);
126 Node_pt[global_count-1]->
x(0)=scaffold_node_pt->
x(0);
127 Node_pt[global_count-1]->x(1)=scaffold_node_pt->
x(1);
128 Node_pt[global_count-1]->x(2)=scaffold_node_pt->
x(2);
132 std::set<unsigned>* boundaries_pt;
137 if (boundaries_pt!=0)
139 this->convert_to_boundary_node(Node_pt[global_count-1]);
140 for(std::set<unsigned>::iterator it=boundaries_pt->begin();
141 it!=boundaries_pt->end();++it)
143 add_boundary_node(*it,Node_pt[global_count-1]);
151 delete finite_element_pt(
e)->node_pt(j);
156 finite_element_pt(
e)->node_pt(j)=Node_pt[j_global-1];
173 unsigned nnode_1d=finite_element_pt(0)->nnode_1d();
176 if ((nnode_1d!=2)&&(nnode_1d!=3))
178 std::ostringstream error_message;
179 error_message <<
"Mesh generation currently only works\n";
180 error_message <<
"for nnode_1d = 2 or 3. You're trying to use it\n";
181 error_message <<
"for nnode_1d=" << nnode_1d << std::endl;
184 OOMPH_CURRENT_FUNCTION,
185 OOMPH_EXCEPTION_LOCATION);
189 unsigned dim=finite_element_pt(0)->dim();
195 unsigned nnode=finite_element_pt(0)->nnode();
198 for (
unsigned e=0;
e<nelem;
e++)
201 for(
unsigned j=4;j<nnode;j++)
204 Node* new_node_pt=finite_element_pt(
e)->
205 construct_node(j,time_stepper_pt);
208 finite_element_pt(
e)->local_coordinate_of_node(j,s);
212 for(
unsigned i=0;
i<dim;
i++)
215 Tmp_mesh_pt->finite_element_pt(
e)->interpolated_x(s,
i);
228 Node* edge_node1_pt=0;
229 Node* edge_node2_pt=0;
232 for (
unsigned e=0;
e<nelem;
e++)
235 for(
unsigned j=4;j<nnode;j++)
238 Node* node_pt=finite_element_pt(
e)->node_pt(j);
253 edge_node1_pt=finite_element_pt(
e)->node_pt(0);
254 edge_node2_pt=finite_element_pt(
e)->node_pt(1);
255 if (central_edge_node_pt(edge_node1_pt,edge_node2_pt)==0)
258 central_edge_node_pt(edge_node1_pt,edge_node2_pt)=node_pt;
259 central_edge_node_pt(edge_node2_pt,edge_node1_pt)=node_pt;
267 edge_node1_pt=finite_element_pt(
e)->node_pt(0);
268 edge_node2_pt=finite_element_pt(
e)->node_pt(2);
269 if (central_edge_node_pt(edge_node1_pt,edge_node2_pt)==0)
272 central_edge_node_pt(edge_node1_pt,edge_node2_pt)=node_pt;
273 central_edge_node_pt(edge_node2_pt,edge_node1_pt)=node_pt;
281 edge_node1_pt=finite_element_pt(
e)->node_pt(0);
282 edge_node2_pt=finite_element_pt(
e)->node_pt(3);
283 if (central_edge_node_pt(edge_node1_pt,edge_node2_pt)==0)
286 central_edge_node_pt(edge_node1_pt,edge_node2_pt)=node_pt;
287 central_edge_node_pt(edge_node2_pt,edge_node1_pt)=node_pt;
295 edge_node1_pt=finite_element_pt(
e)->node_pt(1);
296 edge_node2_pt=finite_element_pt(
e)->node_pt(2);
297 if (central_edge_node_pt(edge_node1_pt,edge_node2_pt)==0)
300 central_edge_node_pt(edge_node1_pt,edge_node2_pt)=node_pt;
301 central_edge_node_pt(edge_node2_pt,edge_node1_pt)=node_pt;
309 edge_node1_pt=finite_element_pt(
e)->node_pt(2);
310 edge_node2_pt=finite_element_pt(
e)->node_pt(3);
311 if (central_edge_node_pt(edge_node1_pt,edge_node2_pt)==0)
314 central_edge_node_pt(edge_node1_pt,edge_node2_pt)=node_pt;
315 central_edge_node_pt(edge_node2_pt,edge_node1_pt)=node_pt;
323 edge_node1_pt=finite_element_pt(
e)->node_pt(1);
324 edge_node2_pt=finite_element_pt(
e)->node_pt(3);
325 if (central_edge_node_pt(edge_node1_pt,edge_node2_pt)==0)
328 central_edge_node_pt(edge_node1_pt,edge_node2_pt)=node_pt;
329 central_edge_node_pt(edge_node2_pt,edge_node1_pt)=node_pt;
335 OOMPH_CURRENT_FUNCTION,
336 OOMPH_EXCEPTION_LOCATION);
342 Node_pt.push_back(node_pt);
347 delete finite_element_pt(
e)->node_pt(j);
350 finite_element_pt(
e)->node_pt(j)=
351 central_edge_node_pt(edge_node1_pt,edge_node2_pt);
371 for (
unsigned e=0;
e<nelem;
e++)
373 orig_node_pt[
e].resize(nnode,0);
376 for(
unsigned j=4;j<nnode;j++)
379 orig_node_pt[
e][j]=finite_element_pt(
e)->node_pt(j);
385 for (
unsigned e=0;
e<nelem;
e++)
388 for(
unsigned j=4;j<nnode;j++)
391 for(
unsigned bo=0;bo<nbound;bo++)
394 Node* loc_node_pt=finite_element_pt(
e)->node_pt(j);
397 Node* orig_loc_node_pt=orig_node_pt[
e][j];
400 bool bound_test=bound_node_done(orig_loc_node_pt,bo);
402 if (bound_test==
false)
404 bound_node_done(orig_loc_node_pt,bo)=
true;
416 if (finite_element_pt(
e)->node_pt(0)->is_on_boundary(bo)&&
417 finite_element_pt(
e)->node_pt(1)->is_on_boundary(bo))
419 this->convert_to_boundary_node(loc_node_pt);
420 add_boundary_node(bo,loc_node_pt);
428 if (finite_element_pt(
e)->node_pt(0)->is_on_boundary(bo)&&
429 finite_element_pt(
e)->node_pt(2)->is_on_boundary(bo))
431 this->convert_to_boundary_node(loc_node_pt);
432 add_boundary_node(bo,loc_node_pt);
441 if (finite_element_pt(
e)->node_pt(0)->is_on_boundary(bo)&&
442 finite_element_pt(
e)->node_pt(3)->is_on_boundary(bo))
444 this->convert_to_boundary_node(loc_node_pt);
445 add_boundary_node(bo,loc_node_pt);
454 if (finite_element_pt(
e)->node_pt(1)->is_on_boundary(bo)&&
455 finite_element_pt(
e)->node_pt(2)->is_on_boundary(bo))
457 this->convert_to_boundary_node(loc_node_pt);
458 add_boundary_node(bo,loc_node_pt);
466 if (finite_element_pt(
e)->node_pt(2)->is_on_boundary(bo)&&
467 finite_element_pt(
e)->node_pt(3)->is_on_boundary(bo))
469 this->convert_to_boundary_node(loc_node_pt);
470 add_boundary_node(bo,loc_node_pt);
478 if (finite_element_pt(
e)->node_pt(1)->is_on_boundary(bo)&&
479 finite_element_pt(
e)->node_pt(3)->is_on_boundary(bo))
481 this->convert_to_boundary_node(loc_node_pt);
482 add_boundary_node(bo,loc_node_pt);
489 OOMPH_CURRENT_FUNCTION,
490 OOMPH_EXCEPTION_LOCATION);
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
virtual void get_boundaries_pt(std::set< unsigned > *&boundaries_pt)
Return a pointer to set of mesh boundaries that this node occupies; this will be overloaded by Bounda...
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Base class for time-stepping schemes. Timestepper provides an approximation of the temporal derivativ...
void build_from_scaffold(TimeStepper *time_stepper_pt)
Build mesh from scaffold mesh.