38 #include "fourier_decomposed_helmholtz.h" 41 #include "time_harmonic_fourier_decomposed_linear_elasticity.h" 44 #include "multi_physics.h" 47 #include "meshes/annular_mesh.h" 50 #include "oomph_crbond_bessel.h" 52 using namespace oomph;
83 std::complex<double>
Nu(std::complex<double>(0.3,0.0));
86 std::complex<double>
Omega_sq(std::complex<double>(100.0,0.0));
103 Vector<std::complex<double> >& u)
105 Vector<double> normal(2);
106 double norm=sqrt(x[0]*x[0]+x[1]*x[1]);
107 double theta=atan2(x[1],x[0]);
111 u[0]=complex<double>(normal[0]*cos(
double(M)*theta),0.0);
112 u[1]=complex<double>(normal[1]*cos(
double(M)*theta),0.0);
129 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
147 Helmholtz_DtN_mesh_pt->setup_gamma();
151 void doc_solution(DocInfo& doc_info);
156 void create_fsi_traction_elements();
159 void create_helmholtz_fsi_flux_elements();
162 void setup_interaction();
165 void create_helmholtz_DtN_elements();
191 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
198 double azimuthal_fraction_of_coating=0.5;
199 double phi=0.5*MathematicalConstants::Pi;
214 TwoDAnnularMesh<ELASTICITY_ELEMENT>(periodic,azimuthal_fraction_of_coating,
215 ntheta_solid,nr_solid,a,
235 Helmholtz_mesh_pt =
new TwoDAnnularMesh<HELMHOLTZ_ELEMENT>
236 (periodic,azimuthal_fraction_of_coating,
237 ntheta_helmholtz,nr_helmholtz,a,h_thick_helmholtz,phi);
241 unsigned nfourier=20;
242 Helmholtz_DtN_mesh_pt=
243 new FourierDecomposedHelmholtzDtNMesh<HELMHOLTZ_ELEMENT>(
247 unsigned nel=Solid_mesh_pt->nelement();
248 for (
unsigned e=0;e<nel;e++)
251 ELASTICITY_ELEMENT* el_pt=
dynamic_cast<ELASTICITY_ELEMENT*
>(
252 Solid_mesh_pt->element_pt(e));
265 unsigned n_element = Helmholtz_mesh_pt->nelement();
266 for(
unsigned i=0;i<n_element;i++)
269 HELMHOLTZ_ELEMENT *el_pt =
dynamic_cast<HELMHOLTZ_ELEMENT*
>(
270 Helmholtz_mesh_pt->element_pt(i));
281 Solid_mesh_pt->output(
"solid_mesh.dat");
282 Helmholtz_mesh_pt->output(
"helmholtz_mesh.dat");
283 Solid_mesh_pt->output_boundaries(
"solid_mesh_boundary.dat");
284 Helmholtz_mesh_pt->output_boundaries(
"helmholtz_mesh_boundary.dat");
290 FSI_traction_mesh_pt=
new Mesh;
291 create_fsi_traction_elements();
294 Helmholtz_fsi_flux_mesh_pt=
new Mesh;
295 create_helmholtz_fsi_flux_elements();
298 create_helmholtz_DtN_elements();
303 add_sub_mesh(Solid_mesh_pt);
304 add_sub_mesh(FSI_traction_mesh_pt);
305 add_sub_mesh(Helmholtz_mesh_pt);
306 add_sub_mesh(Helmholtz_fsi_flux_mesh_pt);
307 add_sub_mesh(Helmholtz_DtN_mesh_pt);
318 unsigned n_node = Solid_mesh_pt->nboundary_node(b);
320 Vector<std::complex<double> > u(2);
325 for(
unsigned i=0;i<n_node;i++)
327 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(b,i);
341 nod_pt->set_value(0,u[0].real());
343 nod_pt->set_value(1,u[1].real());
345 nod_pt->set_value(2,0.0);
347 nod_pt->set_value(3,u[0].imag());
349 nod_pt->set_value(4,u[1].imag());
351 nod_pt->set_value(5,0.0);
358 unsigned num_nod= Solid_mesh_pt->nboundary_node(ibound);
359 for (
unsigned inod=0;inod<num_nod;inod++)
362 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(ibound,inod);
366 nod_pt->set_value(0,0.0);
368 nod_pt->set_value(3,0.0);
372 nod_pt->set_value(2,0.0);
374 nod_pt->set_value(5,0.0);
384 unsigned num_nod= Solid_mesh_pt->nboundary_node(ibound);
385 for (
unsigned inod=0;inod<num_nod;inod++)
388 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(ibound,inod);
392 nod_pt->set_value(0,0.0);
394 nod_pt->set_value(3,0.0);
398 nod_pt->set_value(2,0.0);
400 nod_pt->set_value(5,0.0);
412 Trace_file.open(filename);
415 cout <<
"Number of equations: " << assign_eqn_numbers() << std::endl;
424 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
432 unsigned n_element = Helmholtz_mesh_pt->nboundary_element(b);
433 for(
unsigned e=0;e<n_element;e++)
436 HELMHOLTZ_ELEMENT* bulk_elem_pt =
dynamic_cast<HELMHOLTZ_ELEMENT*
>(
437 Helmholtz_mesh_pt->boundary_element_pt(b,e));
440 int face_index = Helmholtz_mesh_pt->face_index_at_boundary(b,e);
443 FourierDecomposedHelmholtzDtNBoundaryElement<HELMHOLTZ_ELEMENT>*
444 flux_element_pt =
new 445 FourierDecomposedHelmholtzDtNBoundaryElement<HELMHOLTZ_ELEMENT>
446 (bulk_elem_pt,face_index);
449 Helmholtz_DtN_mesh_pt->add_element_pt(flux_element_pt);
453 flux_element_pt->set_outer_boundary_mesh_pt(Helmholtz_DtN_mesh_pt);
465 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
471 unsigned boundary_in_helmholtz_mesh=0;
475 the_file.open(
"boundary_coordinate_hh.dat");
476 Helmholtz_mesh_pt->Mesh::template doc_boundary_coordinates<HELMHOLTZ_ELEMENT>
477 (boundary_in_helmholtz_mesh, the_file);
481 Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh
482 <HELMHOLTZ_ELEMENT,2>
483 (
this,boundary_in_helmholtz_mesh,Helmholtz_mesh_pt,FSI_traction_mesh_pt);
486 unsigned boundary_in_solid_mesh=2;
489 the_file.open(
"boundary_coordinate_solid.dat");
490 Solid_mesh_pt->Mesh::template doc_boundary_coordinates<ELASTICITY_ELEMENT>
491 (boundary_in_solid_mesh, the_file);
495 Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh
496 <ELASTICITY_ELEMENT,2>(
497 this,boundary_in_solid_mesh,Solid_mesh_pt,Helmholtz_fsi_flux_mesh_pt);
508 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
516 unsigned n_element = Solid_mesh_pt->nboundary_element(b);
519 for(
unsigned e=0;e<n_element;e++)
522 ELASTICITY_ELEMENT* bulk_elem_pt =
dynamic_cast<ELASTICITY_ELEMENT*
>(
523 Solid_mesh_pt->boundary_element_pt(b,e));
526 int face_index = Solid_mesh_pt->face_index_at_boundary(b,e);
529 FourierDecomposedTimeHarmonicLinElastLoadedByHelmholtzPressureBCElement
530 <ELASTICITY_ELEMENT,HELMHOLTZ_ELEMENT>* el_pt=
531 new FourierDecomposedTimeHarmonicLinElastLoadedByHelmholtzPressureBCElement
532 <ELASTICITY_ELEMENT,HELMHOLTZ_ELEMENT>(bulk_elem_pt,
535 FSI_traction_mesh_pt->add_element_pt(el_pt);
539 el_pt->set_boundary_number_in_bulk_mesh(b);
552 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
561 unsigned n_element = Helmholtz_mesh_pt->nboundary_element(b);
564 for(
unsigned e=0;e<n_element;e++)
567 HELMHOLTZ_ELEMENT* bulk_elem_pt =
dynamic_cast<HELMHOLTZ_ELEMENT*
>(
568 Helmholtz_mesh_pt->boundary_element_pt(b,e));
571 int face_index = Helmholtz_mesh_pt->face_index_at_boundary(b,e);
574 FourierDecomposedHelmholtzFluxFromNormalDisplacementBCElement
575 <HELMHOLTZ_ELEMENT,ELASTICITY_ELEMENT>* el_pt=
576 new FourierDecomposedHelmholtzFluxFromNormalDisplacementBCElement
577 <HELMHOLTZ_ELEMENT,ELASTICITY_ELEMENT>(bulk_elem_pt,
581 Helmholtz_fsi_flux_mesh_pt->add_element_pt(el_pt);
585 el_pt->set_boundary_number_in_bulk_mesh(b);
595 template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
601 oomph_info <<
"Writing result for step " << doc_info.number()
602 <<
". Parameters: "<< std::endl;
603 oomph_info <<
"Fourier mode number : N = " 611 << std::endl << std::endl;
614 ofstream some_file,some_file2;
622 sprintf(filename,
"%s/power%i.dat",doc_info.directory().c_str(),
624 some_file.open(filename);
628 unsigned nn_element=Helmholtz_DtN_mesh_pt->nelement();
629 for(
unsigned e=0;e<nn_element;e++)
631 FourierDecomposedHelmholtzBCElementBase<HELMHOLTZ_ELEMENT> *el_pt =
632 dynamic_cast<FourierDecomposedHelmholtzBCElementBase<HELMHOLTZ_ELEMENT>*
>(
633 Helmholtz_DtN_mesh_pt->element_pt(e));
634 power += el_pt->global_power_contribution(some_file);
637 oomph_info <<
"Radiated power: " << power << std::endl;
641 sprintf(filename,
"%s/elast_soln%i.dat",doc_info.directory().c_str(),
643 some_file.open(filename);
644 Solid_mesh_pt->output(some_file,n_plot);
649 sprintf(filename,
"%s/helmholtz_soln%i.dat",doc_info.directory().c_str(),
651 some_file.open(filename);
652 Helmholtz_mesh_pt->output(some_file,n_plot);
658 sprintf(filename,
"%s/fsi_traction_soln%i.dat",doc_info.directory().c_str(),
660 some_file.open(filename);
661 FSI_traction_mesh_pt->output(some_file,n_plot);
667 sprintf(filename,
"%s/fsi_flux_bc_soln%i.dat",doc_info.directory().c_str(),
669 some_file.open(filename);
670 Helmholtz_fsi_flux_mesh_pt->output(some_file,n_plot);
691 int main(
int argc,
char **argv)
695 CommandLineArgs::setup(argc,argv);
701 CommandLineArgs::specify_command_line_flag(
"--dir",
705 CommandLineArgs::specify_command_line_flag(
"--k_squared",
709 CommandLineArgs::specify_command_line_flag(
"--q_initial",
714 CommandLineArgs::specify_command_line_flag(
"--nstep",&nstep);
717 double q_increment=5.0;
718 CommandLineArgs::specify_command_line_flag(
"--q_increment",&q_increment);
723 CommandLineArgs::specify_command_line_flag(
"--M",
727 CommandLineArgs::specify_command_line_flag(
"--el_multiplier",
731 CommandLineArgs::parse_and_assign();
734 CommandLineArgs::doc_specified_flags();
747 QFourierDecomposedHelmholtzElement<3> > problem;
750 for(
unsigned i=0;i<nstep;i++)
753 problem.newton_solve();
void create_fsi_traction_elements()
Create FSI traction elements.
double Outer_radius
Radius of outer boundary of Helmholtz domain.
FourierDecomposedHelmholtzDtNMesh< HELMHOLTZ_ELEMENT > * Helmholtz_DtN_mesh_pt
Pointer to mesh containing the DtN elements.
void update_parameter_values()
Function to update dependent parameter values.
int Fourier_wavenumber
Define azimuthal Fourier wavenumber.
double Density_ratio
Density ratio: solid to fluid.
void create_helmholtz_DtN_elements()
Create DtN elements on outer boundary.
void actions_before_newton_solve()
Update function (empty)
std::complex< double > Omega_sq(std::complex< double >(100.0, 0.0))
Non-dim square of frequency for solid – dependent variable!
TwoDAnnularMesh< HELMHOLTZ_ELEMENT > * Helmholtz_mesh_pt
Pointer to Helmholtz mesh.
Mesh * Helmholtz_fsi_flux_mesh_pt
Pointer to mesh of Helmholtz FSI flux elements.
void actions_before_newton_convergence_check()
Recompute gamma integral before checking Newton residuals.
ofstream Trace_file
Trace file.
std::complex< double > Nu(std::complex< double >(0.3, 0.0))
Poisson's ratio Nu.
double K_squared
Square of wavenumber for the Helmholtz equation.
int main(int argc, char **argv)
Driver for coated sphere loaded by lineared fluid loading.
void setup_interaction()
Setup interaction.
void actions_after_newton_solve()
Update function (empty)
string Directory
Output directory.
CoatedSphereProblem()
Constructor:
unsigned El_multiplier
Multiplier for number of elements.
double H_coating
Non-dim thickness of elastic coating.
TwoDAnnularMesh< ELASTICITY_ELEMENT > * Solid_mesh_pt
Pointer to solid mesh.
void solid_boundary_displacement(const Vector< double > &x, Vector< std::complex< double > > &u)
Displacement field on inner boundary of solid.
void create_helmholtz_fsi_flux_elements()
Create Helmholtz FSI flux elements.
unsigned M
Wavenumber "zenith"-variation of imposed displacement of coating on inner boundary.
Mesh * FSI_traction_mesh_pt
Pointer to mesh of FSI traction elements.
void doc_solution(DocInfo &doc_info)
Doc the solution.