33#include "time_harmonic_linear_elasticity.h"
34#include "multi_physics.h"
37#include "meshes/annular_mesh.h"
69 TimeHarmonicIsotropicElasticityTensor
E(
Nu);
89 Vector<std::complex<double> >& u)
91 Vector<double> normal(2);
92 double norm=sqrt(x[0]*x[0]+x[1]*x[1]);
93 double phi=atan2(x[1],x[0]);
97 u[0]=complex<double>(normal[0]*cos(
double(
N)*phi),0.0);
98 u[1]=complex<double>(normal[1]*cos(
double(
N)*phi),0.0);
109 std::complex<double>
HankelH1(
const double& k,
const double& x)
111 Vector<std::complex<double> > h(2);
112 Vector<std::complex<double> > hp(2);
113 Hankel_functions_for_helmholtz_problem::Hankel_first(2,x,h,hp);
125 cout <<
"Never get here. k=" << k << std::endl;
128 return std::complex<double>(1.0,1.0);
137 std::complex<double> MapleGenVar1;
138 std::complex<double> MapleGenVar2;
139 std::complex<double> MapleGenVar3;
140 std::complex<double> MapleGenVar4;
141 std::complex<double> MapleGenVar5;
142 std::complex<double> MapleGenVar6;
143 std::complex<double> MapleGenVar7;
144 std::complex<double> MapleGenVar8;
145 std::complex<double> t0;
148 MapleGenVar3 = (-2.0/(2.0+2.0*
Nu)*1.0+2.0/(2.0+2.0*
Nu)*1.0*
151 MapleGenVar5 = -1/(
Nu/(1.0+
Nu)/(1.0-2.0*
Nu)+2.0/(2.0+2.0*
Nu)-2.0/(2.0+2.0
164 MapleGenVar4 = MapleGenVar5*MapleGenVar6;
165 MapleGenVar2 = MapleGenVar3+MapleGenVar4;
166 MapleGenVar3 = MapleGenVar2;
167 MapleGenVar5 = -(2.0/(2.0+2.0*
Nu)*1.0-2.0/(2.0+2.0*
Nu)*1.0*
169)/(1.0-2.0*
Nu))/(
Nu/(1.0+
Nu)/(1.0-2.0*
Nu)+2.0/(2.0+2.0*
Nu)-2.0/(2.0+2.0*
Nu)*
186 MapleGenVar6 = MapleGenVar7*MapleGenVar8;
187 MapleGenVar4 = MapleGenVar5+MapleGenVar6;
188 MapleGenVar1 = MapleGenVar3+MapleGenVar4;
190 t0 = MapleGenVar1*MapleGenVar2;
198 Vector<double>& soln)
201 double r=sqrt(x[0]*x[0]+x[1]*x[1]);
219 Vector<std::complex<double> > h(2),hp(2);
220 Hankel_functions_for_helmholtz_problem::Hankel_first(1,rr,h,hp);
223 double power=sqrt(
K_squared)*0.5*r*2.0*MathematicalConstants::Pi*
224 (imag(C*hp[0])*real(C*h[0])-real(C*hp[0])*imag(C*h[0]));
236template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
310template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
316 double azimuthal_fraction_of_coating=1.0;
331 RefineableTwoDAnnularMesh<ELASTICITY_ELEMENT>
332 (periodic,azimuthal_fraction_of_coating,
352 Helmholtz_mesh_pt =
new
353 RefineableTwoDAnnularMesh<HELMHOLTZ_ELEMENT>
354 (periodic,azimuthal_fraction_of_coating,
355 ntheta_helmholtz,nr_helmholtz,a,h_thick_helmholtz);
359 Solid_mesh_pt->spatial_error_estimator_pt()=
new Z2ErrorEstimator;
360 Helmholtz_mesh_pt->spatial_error_estimator_pt()=
new Z2ErrorEstimator;
366 unsigned nfourier=20;
367 Helmholtz_outer_boundary_mesh_pt =
373 unsigned n_element=Solid_mesh_pt->nelement();
374 for(
unsigned i=0;i<n_element;i++)
377 ELASTICITY_ELEMENT *el_pt =
378 dynamic_cast<ELASTICITY_ELEMENT*
>(Solid_mesh_pt->element_pt(i));
389 n_element =Helmholtz_mesh_pt->nelement();
390 for(
unsigned i=0;i<n_element;i++)
393 HELMHOLTZ_ELEMENT *el_pt =
394 dynamic_cast<HELMHOLTZ_ELEMENT*
>(Helmholtz_mesh_pt->element_pt(i));
403 Solid_mesh_pt->output(
"solid_mesh.dat");
404 Helmholtz_mesh_pt->output(
"helmholtz_mesh.dat");
405 Solid_mesh_pt->output_boundaries(
"solid_mesh_boundary.dat");
406 Helmholtz_mesh_pt->output_boundaries(
"helmholtz_mesh_boundary.dat");
413 FSI_traction_mesh_pt=
new Mesh;
414 create_fsi_traction_elements();
417 Helmholtz_fsi_flux_mesh_pt=
new Mesh;
418 create_helmholtz_fsi_flux_elements();
421 create_helmholtz_DtN_elements();
428 add_sub_mesh(Solid_mesh_pt);
431 add_sub_mesh(FSI_traction_mesh_pt);
434 add_sub_mesh(Helmholtz_mesh_pt);
437 add_sub_mesh(Helmholtz_fsi_flux_mesh_pt);
440 add_sub_mesh(Helmholtz_outer_boundary_mesh_pt);
449 unsigned n_node = Solid_mesh_pt->nboundary_node(0);
450 Vector<std::complex<double> > u(2);
452 for(
unsigned i=0;i<n_node;i++)
454 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(0,i);
466 nod_pt->set_value(0,u[0].real());
469 nod_pt->set_value(1,u[1].real());
472 nod_pt->set_value(2,u[0].imag());
475 nod_pt->set_value(3,u[1].imag());
484 oomph_info <<
"Number of unknowns: " << assign_eqn_numbers() << std::endl;
491 snprintf(filename,
sizeof(filename),
"%s/trace.dat",Doc_info.directory().c_str());
492 Trace_file.open(filename);
501template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
506 delete_face_elements(FSI_traction_mesh_pt);
509 delete_face_elements(Helmholtz_fsi_flux_mesh_pt);
512 delete_face_elements(Helmholtz_outer_boundary_mesh_pt);
515 rebuild_global_mesh();
524template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
530 create_fsi_traction_elements();
533 create_helmholtz_fsi_flux_elements();
537 create_helmholtz_DtN_elements();
543 rebuild_global_mesh();
551template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
556 unsigned n_element = boundary_mesh_pt->nelement();
559 for(
unsigned e=0;e<n_element;e++)
562 delete boundary_mesh_pt->element_pt(e);
566 boundary_mesh_pt->flush_element_and_node_storage();
575template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
583 unsigned n_element = Solid_mesh_pt->nboundary_element(b);
586 for(
unsigned e=0;e<n_element;e++)
589 ELASTICITY_ELEMENT* bulk_elem_pt =
dynamic_cast<ELASTICITY_ELEMENT*
>(
590 Solid_mesh_pt->boundary_element_pt(b,e));
593 int face_index = Solid_mesh_pt->face_index_at_boundary(b,e);
596 TimeHarmonicLinElastLoadedByHelmholtzPressureBCElement
597 <ELASTICITY_ELEMENT,HELMHOLTZ_ELEMENT>* el_pt=
598 new TimeHarmonicLinElastLoadedByHelmholtzPressureBCElement
599 <ELASTICITY_ELEMENT,HELMHOLTZ_ELEMENT>(bulk_elem_pt,
602 FSI_traction_mesh_pt->add_element_pt(el_pt);
606 el_pt->set_boundary_number_in_bulk_mesh(b);
621template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
630 unsigned n_element = Helmholtz_mesh_pt->nboundary_element(b);
633 for(
unsigned e=0;e<n_element;e++)
636 HELMHOLTZ_ELEMENT* bulk_elem_pt =
dynamic_cast<HELMHOLTZ_ELEMENT*
>(
637 Helmholtz_mesh_pt->boundary_element_pt(b,e));
640 int face_index = Helmholtz_mesh_pt->face_index_at_boundary(b,e);
643 HelmholtzFluxFromNormalDisplacementBCElement
644 <HELMHOLTZ_ELEMENT,ELASTICITY_ELEMENT>* el_pt=
645 new HelmholtzFluxFromNormalDisplacementBCElement
646 <HELMHOLTZ_ELEMENT,ELASTICITY_ELEMENT>(bulk_elem_pt,
650 Helmholtz_fsi_flux_mesh_pt->add_element_pt(el_pt);
654 el_pt->set_boundary_number_in_bulk_mesh(b);
665template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
673 unsigned n_element = Helmholtz_mesh_pt->nboundary_element(b);
676 for(
unsigned e=0;e<n_element;e++)
679 HELMHOLTZ_ELEMENT* bulk_elem_pt =
dynamic_cast<HELMHOLTZ_ELEMENT*
>(
680 Helmholtz_mesh_pt->boundary_element_pt(b,e));
683 int face_index = Helmholtz_mesh_pt->face_index_at_boundary(b,e);
686 HelmholtzDtNBoundaryElement<HELMHOLTZ_ELEMENT>* flux_element_pt =
new
687 HelmholtzDtNBoundaryElement<HELMHOLTZ_ELEMENT>(bulk_elem_pt,face_index);
691 flux_element_pt->set_outer_boundary_mesh_pt(
692 Helmholtz_outer_boundary_mesh_pt);
695 Helmholtz_outer_boundary_mesh_pt->add_element_pt(flux_element_pt);
706template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
711 unsigned boundary_in_helmholtz_mesh=0;
712 Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh
713 <HELMHOLTZ_ELEMENT,2>
714 (
this,boundary_in_helmholtz_mesh,Helmholtz_mesh_pt,FSI_traction_mesh_pt);
717 unsigned boundary_in_solid_mesh=2;
718 Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh
719 <ELASTICITY_ELEMENT,2>(
720 this,boundary_in_solid_mesh,Solid_mesh_pt,Helmholtz_fsi_flux_mesh_pt);
728template<
class ELASTICITY_ELEMENT,
class HELMHOLTZ_ELEMENT>
732 ofstream some_file,some_file2;
740 snprintf(filename,
sizeof(filename),
"%s/power%i.dat",Doc_info.directory().c_str(),
742 some_file.open(filename);
746 unsigned nn_element=Helmholtz_outer_boundary_mesh_pt->nelement();
747 for(
unsigned e=0;e<nn_element;e++)
749 HelmholtzBCElementBase<HELMHOLTZ_ELEMENT> *el_pt =
750 dynamic_cast<HelmholtzBCElementBase<HELMHOLTZ_ELEMENT>*
>(
751 Helmholtz_outer_boundary_mesh_pt->element_pt(e));
752 power += el_pt->global_power_contribution(some_file);
755 oomph_info <<
"Step: " << Doc_info.number()
760 <<
" Total radiated power " << power <<
"\n"
761 <<
" Axisymmetric radiated power " <<
"\n"
775 std::ostringstream case_string;
776 case_string <<
"TEXT X=10,Y=90, T=\"Q="
778 <<
", k<sup>2</sup>="
780 <<
", density ratio="
789 snprintf(filename,
sizeof(filename),
"%s/elast_soln%i.dat",Doc_info.directory().c_str(),
791 some_file.open(filename);
792 Solid_mesh_pt->output(some_file,n_plot);
798 snprintf(filename,
sizeof(filename),
"%s/traction_soln%i.dat",Doc_info.directory().c_str(),
800 some_file.open(filename);
801 FSI_traction_mesh_pt->output(some_file,n_plot);
807 snprintf(filename,
sizeof(filename),
"%s/flux_bc_soln%i.dat",Doc_info.directory().c_str(),
809 some_file.open(filename);
810 Helmholtz_fsi_flux_mesh_pt->output(some_file,n_plot);
816 snprintf(filename,
sizeof(filename),
"%s/helmholtz_soln%i.dat",Doc_info.directory().c_str(),
818 some_file.open(filename);
819 Helmholtz_mesh_pt->output(some_file,n_plot);
820 some_file << case_string.str();
826 snprintf(filename,
sizeof(filename),
"%s/exact_helmholtz_soln%i.dat",Doc_info.directory().c_str(),
828 some_file.open(filename);
829 Helmholtz_mesh_pt->output_fct(some_file,n_plot,
835 << Doc_info.number() <<
")\n";
851 CommandLineArgs::setup(argc,argv);
857 CommandLineArgs::specify_command_line_flag(
"--dir",
864 CommandLineArgs::specify_command_line_flag(
"--el_multiplier",
868 CommandLineArgs::specify_command_line_flag(
"--outer_radius",
873 CommandLineArgs::specify_command_line_flag(
"--nstep",&nstep);
876 double q_increment=5.0;
877 CommandLineArgs::specify_command_line_flag(
"--q_increment",&q_increment);
880 unsigned max_adapt=3;
881 CommandLineArgs::specify_command_line_flag(
"--max_adapt",&max_adapt);
884 CommandLineArgs::parse_and_assign();
887 CommandLineArgs::doc_specified_flags();
891 RefineableQHelmholtzElement<2,3> > problem;
899 for(
unsigned i=0;i<nstep;i++)
903 problem.newton_solve(max_adapt);
int main(int argc, char **argv)
Driver for acoustic fsi problem.
HelmholtzDtNMesh< HELMHOLTZ_ELEMENT > * Helmholtz_outer_boundary_mesh_pt
Pointer to mesh containing the DtN elements.
void create_fsi_traction_elements()
Create FSI traction elements.
Mesh * Helmholtz_fsi_flux_mesh_pt
Pointer to mesh of Helmholtz FSI flux elements.
void create_helmholtz_DtN_elements()
Create DtN face elements.
void create_helmholtz_fsi_flux_elements()
Create Helmholtz FSI flux elements.
void actions_before_newton_solve()
Update function (empty)
void delete_face_elements(Mesh *const &boundary_mesh_pt)
Delete (face) elements in specified mesh.
ofstream Trace_file
Trace file.
void actions_before_adapt()
Actions before adapt: Wipe the mesh of traction elements.
void actions_before_newton_convergence_check()
Recompute gamma integral before checking Newton residuals.
void actions_after_adapt()
Actions after adapt: Rebuild the mesh of traction elements.
CoatedDiskProblem()
Constructor:
void actions_after_newton_solve()
Update function (empty)
TreeBasedRefineableMeshBase * Solid_mesh_pt
Pointer to solid mesh.
DocInfo Doc_info
DocInfo object for output.
void setup_interaction()
Setup interaction.
TreeBasedRefineableMeshBase * Helmholtz_mesh_pt
Pointer to Helmholtz mesh.
Mesh * FSI_traction_mesh_pt
Pointer to mesh of FSI traction elements.
void doc_solution()
Doc the solution.
double Nu
Poisson's ratio.
string Directory
Output directory.
std::complex< double > axisym_coefficient()
Coefficient in front of Hankel function for axisymmetric solution of Helmholtz potential.
unsigned El_multiplier
Multiplier for number of elements.
double Density_ratio
Density ratio: solid to fluid.
double exact_axisym_radiated_power()
Exact radiated power for axisymmetric solution.
double Outer_radius
Radius of outer boundary of Helmholtz domain.
double K_squared
Square of wavenumber for the Helmholtz equation.
void solid_boundary_displacement(const Vector< double > &x, Vector< std::complex< double > > &u)
Displacement field on inner boundary of solid.
std::complex< double > HankelH1(const double &k, const double &x)
Interface to Hankel function in maple style.
void update_parameter_values()
Function to update dependent parameter values.
double H_coating
Non-dim thickness of elastic coating.
TimeHarmonicIsotropicElasticityTensor E(Nu)
The elasticity tensor for the solid.
void exact_axisym_potential(const Vector< double > &x, Vector< double > &soln)
Exact solution for Helmholtz potential for axisymmetric solution.
double Omega_sq
Non-dim square of frequency for solid – dependent variable!
unsigned N
Azimuthal wavenumber for imposed displacement of coating on inner boundary.