35 #include "navier_stokes.h" 37 #include "constitutive.h" 40 #include "meshes/triangle_mesh.h" 45 using namespace oomph;
51 template<
class ELEMENT>
53 public virtual SolidMesh
60 const std::string& element_file_name,
61 const std::string& poly_file_name,
62 TimeStepper* time_stepper_pt=
63 &Mesh::Default_TimeStepper) :
64 TriangleMesh<ELEMENT>(node_file_name,element_file_name,
65 poly_file_name, time_stepper_pt)
68 set_lagrangian_nodal_coordinates();
71 this->identify_boundaries();
79 this->set_nboundary(3);
81 unsigned n_node=this->nnode();
82 for (
unsigned j=0;j<n_node;j++)
84 Node* nod_pt=this->node_pt(j);
87 if (nod_pt->x(0)<0.226)
91 if ((nod_pt->x(1)<4.08)&&(nod_pt->x(1)>0.113))
93 this->remove_boundary_node(0,nod_pt);
95 this->add_boundary_node(1,nod_pt);
99 if (nod_pt->x(0)>8.28)
103 if ((nod_pt->x(1)<4.08)&&(nod_pt->x(1)>0.113))
105 this->remove_boundary_node(0,nod_pt);
107 this->add_boundary_node(2,nod_pt);
110 this->setup_boundary_element_info();
149 template<
class ELEMENT>
164 return Fluid_mesh_pt;
168 void set_boundary_conditions();
171 void doc_solution(DocInfo& doc_info);
185 template<
class ELEMENT>
190 string fluid_node_file_name=
"fluid.fig.1.node";
191 string fluid_element_file_name=
"fluid.fig.1.ele";
192 string fluid_poly_file_name=
"fluid.fig.1.poly";
194 fluid_element_file_name,
195 fluid_poly_file_name);
198 this->set_boundary_conditions();
201 add_sub_mesh(fluid_mesh_pt());
207 cout <<
"Number of equations: " << assign_eqn_numbers() << std::endl;
217 template<
class ELEMENT>
221 std::ofstream solid_bc_file(
"pinned_solid_nodes.dat");
222 std::ofstream u_bc_file(
"pinned_u_nodes.dat");
223 std::ofstream v_bc_file(
"pinned_v_nodes.dat");
228 unsigned nbound=Fluid_mesh_pt->nboundary();
229 for(
unsigned ibound=0;ibound<nbound;ibound++)
231 unsigned num_nod=Fluid_mesh_pt->nboundary_node(ibound);
232 for (
unsigned inod=0;inod<num_nod;inod++)
235 Node* nod_pt=Fluid_mesh_pt->boundary_node_pt(ibound,inod);
244 u_bc_file << nod_pt->x(0) <<
" " << nod_pt->x(1) << std::endl;
249 v_bc_file << nod_pt->x(0) <<
" " << nod_pt->x(1) << std::endl;
252 for(
unsigned i=0;i<2;i++)
255 SolidNode* nod_pt=Fluid_mesh_pt->boundary_node_pt(ibound,inod);
256 nod_pt->pin_position(i);
259 solid_bc_file << nod_pt->x(i) <<
" ";
261 solid_bc_file << std::endl;
266 solid_bc_file.close();
269 unsigned n_element = fluid_mesh_pt()->nelement();
270 for(
unsigned e=0;e<n_element;e++)
273 ELEMENT* el_pt =
dynamic_cast<ELEMENT*
>(fluid_mesh_pt()->element_pt(e));
279 el_pt->constitutive_law_pt() =
290 double y_min=fluid_mesh_pt()->boundary_node_pt(ibound,0)->x(1);
293 unsigned num_nod= fluid_mesh_pt()->nboundary_node(ibound);
294 for (
unsigned inod=1;inod<num_nod;inod++)
296 double y=fluid_mesh_pt()->boundary_node_pt(ibound,inod)->x(1);
306 double y_mid=0.5*(y_min+y_max);
309 for (
unsigned ibound=0;ibound<fluid_mesh_pt()->nboundary();ibound++)
311 unsigned num_nod= fluid_mesh_pt()->nboundary_node(ibound);
312 for (
unsigned inod=0;inod<num_nod;inod++)
317 double y=fluid_mesh_pt()->boundary_node_pt(ibound,inod)->x(1);
318 double veloc=1.5/(y_max-y_min)*
319 (y-y_min)*(y_max-y)/((y_mid-y_min)*(y_max-y_mid));
320 fluid_mesh_pt()->boundary_node_pt(ibound,inod)->set_value(0,veloc);
321 fluid_mesh_pt()->boundary_node_pt(ibound,inod)->set_value(1,0.0);
328 fluid_mesh_pt()->boundary_node_pt(ibound,inod)->set_value(0,0.0);
330 fluid_mesh_pt()->boundary_node_pt(ibound,inod)->set_value(1,0.0);
342 template<
class ELEMENT>
353 sprintf(filename,
"%s/soln%i.dat",doc_info.directory().c_str(),
355 some_file.open(filename);
356 fluid_mesh_pt()->output(some_file,npts);
386 doc_info.set_directory(
"RESLT_TH");
393 TTaylorHoodElement<2>,
394 TPVDElement<2,3> > > problem;
397 problem.
fluid_mesh_pt()->output_boundaries(
"RESLT_TH/boundaries.dat");
400 problem.doc_solution(doc_info);
404 double re_increment=5.0;
406 for (
unsigned i=0;i<nstep;i++)
409 problem.newton_solve();
412 problem.doc_solution(doc_info);
425 doc_info.set_directory(
"RESLT_CR");
435 TCrouzeixRaviartElement<2>,
436 TPVDBubbleEnrichedElement<2,3> > > problem;
439 problem.
fluid_mesh_pt()->output_boundaries(
"RESLT_CR/boundaries.dat");
442 problem.doc_solution(doc_info);
446 double re_increment=5.0;
448 for (
unsigned i=0;i<nstep;i++)
451 problem.newton_solve();
454 problem.doc_solution(doc_info);
Unstructured fluid problem.
UnstructuredFluidProblem()
Constructor.
void set_boundary_conditions()
Set the boundary conditions.
~UnstructuredFluidProblem()
Destructor (empty)
virtual ~ElasticTriangleMesh()
Empty Destructor.
ConstitutiveLaw * Constitutive_law_pt
Constitutive law used to determine the mesh deformation.
ElasticTriangleMesh< ELEMENT > *& fluid_mesh_pt()
Access function for the fluid mesh.
double Re
Reynolds number.
Namespace for physical parameters.
void doc_solution(DocInfo &doc_info)
Doc the solution.
int main()
Driver for unstructured fluid test problem.
void identify_boundaries()
Function used to identify the domain boundaries.
ElasticTriangleMesh< ELEMENT > * Fluid_mesh_pt
Fluid mesh.
Triangle-based mesh upgraded to become a (pseudo-) solid mesh.
ElasticTriangleMesh(const std::string &node_file_name, const std::string &element_file_name, const std::string &poly_file_name, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Constructor:
double Nu
Pseudo-solid Poisson ratio.