26 #ifndef OOMPH_SINGLE_LAYER_CUBIC_SPINE_MESH_TEMPLATE_CC
27 #define OOMPH_SINGLE_LAYER_CUBIC_SPINE_MESH_TEMPLATE_CC
40 template<
class ELEMENT>
48 TimeStepper* time_stepper_pt)
52 MeshChecker::assert_geometric_element<QElementGeometricBase, ELEMENT>(3);
55 MeshChecker::assert_geometric_element<SpineFiniteElement, ELEMENT>(3);
65 template<
class ELEMENT>
67 TimeStepper* time_stepper_pt)
70 unsigned n_x = this->Nx;
72 unsigned n_y = this->Ny;
74 unsigned n_z = this->Nz;
79 unsigned n_p =
dynamic_cast<ELEMENT*
>(finite_element_pt(0))->nnode_1d();
83 Spine_pt.reserve(((n_p - 1) * n_x + 1) * ((n_p - 1) * n_y + 1));
89 for (
unsigned l1 = 0; l1 < n_p; l1++)
91 for (
unsigned l2 = 0; l2 < n_p; l2++)
94 Spine* new_spine_pt =
new Spine(1.0);
95 Spine_pt.push_back(new_spine_pt);
98 SpineNode* nod_pt = element_node_pt(0, l2 + l1 * n_p);
100 nod_pt->spine_pt() = new_spine_pt;
102 nod_pt->fraction() = 0.0;
104 nod_pt->spine_mesh_pt() =
this;
108 for (
unsigned long k = 0; k < n_z; k++)
111 for (
unsigned l3 = 1; l3 < n_p; l3++)
115 element_node_pt(k * n_x * n_y, l3 * n_p * n_p + l2 + l1 * n_p);
117 nod_pt->spine_pt() = new_spine_pt;
120 (double(k) + double(l3) / double(n_p - 1)) /
double(n_z);
122 nod_pt->spine_mesh_pt() =
this;
135 for (
unsigned j = 1; j < n_x; j++)
138 for (
unsigned l1 = 0; l1 < n_p; l1++)
142 for (
unsigned l2 = 1; l2 < n_p; l2++)
146 Spine* new_spine_pt =
new Spine(1.0);
147 Spine_pt.push_back(new_spine_pt);
150 SpineNode* nod_pt = element_node_pt(j, l2 + l1 * n_p);
153 nod_pt->spine_pt() = new_spine_pt;
155 nod_pt->fraction() = 0.0;
157 nod_pt->spine_mesh_pt() =
this;
161 for (
unsigned long k = 0; k < n_z; k++)
164 for (
unsigned l3 = 1; l3 < n_p; l3++)
167 SpineNode* nod_pt = element_node_pt(
168 j + k * n_x * n_y, l3 * n_p * n_p + l2 + l1 * n_p);
170 nod_pt->spine_pt() = new_spine_pt;
173 (double(k) + double(l3) / double(n_p - 1)) /
double(n_z);
175 nod_pt->spine_mesh_pt() =
this;
185 for (
unsigned long i = 1; i < n_y; i++)
190 for (
unsigned l1 = 1; l1 < n_p; l1++)
192 for (
unsigned l2 = 0; l2 < n_p; l2++)
196 Spine* new_spine_pt =
new Spine(1.0);
197 Spine_pt.push_back(new_spine_pt);
202 SpineNode* nod_pt = element_node_pt(i * n_x, l2 + l1 * n_p);
204 nod_pt->spine_pt() = new_spine_pt;
206 nod_pt->fraction() = 0.0;
208 nod_pt->spine_mesh_pt() =
this;
212 for (
unsigned long k = 0; k < n_z; k++)
215 for (
unsigned l3 = 1; l3 < n_p; l3++)
218 SpineNode* nod_pt = element_node_pt(
219 i * n_x + k * n_x * n_y, l3 * n_p * n_p + l2 + l1 * n_p);
221 nod_pt->spine_pt() = new_spine_pt;
224 (double(k) + double(l3) / double(n_p - 1)) /
double(n_z);
226 nod_pt->spine_mesh_pt() =
this;
234 for (
unsigned j = 1; j < n_x; j++)
237 for (
unsigned l1 = 1; l1 < n_p; l1++)
239 for (
unsigned l2 = 1; l2 < n_p; l2++)
243 Spine* new_spine_pt =
new Spine(1.0);
244 Spine_pt.push_back(new_spine_pt);
249 SpineNode* nod_pt = element_node_pt(j + i * n_x, l2 + l1 * n_p);
251 nod_pt->spine_pt() = new_spine_pt;
253 nod_pt->fraction() = 0.0;
255 nod_pt->spine_mesh_pt() =
this;
259 for (
unsigned long k = 0; k < n_z; k++)
262 for (
unsigned l3 = 1; l3 < n_p; l3++)
265 SpineNode* nod_pt = element_node_pt(
266 j + i * n_x + k * n_x * n_y, l3 * n_p * n_p + l2 + l1 * n_p);
268 nod_pt->spine_pt() = new_spine_pt;
271 (double(k) + double(l3) / double(n_p - 1)) /
double(n_z);
273 nod_pt->spine_mesh_pt() =
this;
Simple cubic 3D Brick mesh class.
virtual void build_single_layer_mesh(TimeStepper *time_stepper_pt)
Helper function to actually build the single-layer spine mesh (called from various constructors)
SingleLayerCubicSpineMesh(const unsigned &nx, const unsigned &ny, const unsigned &nz, const double &lx, const double &ly, const double &h, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor: Pass number of elements in x-direction, number of elements in y-direction,...
////////////////////////////////////////////////////////////////////// //////////////////////////////...