fourier_decomposed_acoustic_fsi.cc
Go to the documentation of this file.
1//LIC// ====================================================================
2//LIC// This file forms part of oomph-lib, the object-oriented,
3//LIC// multi-physics finite-element library, available
4//LIC// at http://www.oomph-lib.org.
5//LIC//
6//LIC// Copyright (C) 2006-2025 Matthias Heil and Andrew Hazel
7//LIC//
8//LIC// This library is free software; you can redistribute it and/or
9//LIC// modify it under the terms of the GNU Lesser General Public
10//LIC// License as published by the Free Software Foundation; either
11//LIC// version 2.1 of the License, or (at your option) any later version.
12//LIC//
13//LIC// This library is distributed in the hope that it will be useful,
14//LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15//LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16//LIC// Lesser General Public License for more details.
17//LIC//
18//LIC// You should have received a copy of the GNU Lesser General Public
19//LIC// License along with this library; if not, write to the Free Software
20//LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21//LIC// 02110-1301 USA.
22//LIC//
23//LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24//LIC//
25//LIC//====================================================================
26// Driver for Helmholtz/TimeHarmonicTimeHarmonicLinElast coupling
27#include <complex>
28#include <cmath>
29
30//Oomph-lib includes
31#include "generic.h"
32
33//The Helmholtz equation
34#include "fourier_decomposed_helmholtz.h"
35
36//The Elasticity equation
37#include "time_harmonic_fourier_decomposed_linear_elasticity.h"
38
39// The interaction elements
40#include "multi_physics.h"
41
42// The mesh
43#include "meshes/annular_mesh.h"
44
45// Get the Bessel functions
46#include "oomph_crbond_bessel.h"
47
48using namespace oomph;
49using namespace std;
50
51
52//////////////////////////////////////////////////////////////////////
53//////////////////////////////////////////////////////////////////////
54//////////////////////////////////////////////////////////////////////
55
56
57//=======start_of_namespace==========================================
58/// Global variables
59//===================================================================
61{
62
63 /// Square of wavenumber for the Helmholtz equation
64 double K_squared=10.0;
65
66 /// Radius of outer boundary of Helmholtz domain
67 double Outer_radius=2.0;
68
69 /// FSI parameter
70 double Q=10.0;
71
72 /// Non-dim thickness of elastic coating
73 double H_coating=0.2;
74
75 /// Define azimuthal Fourier wavenumber
77
78 /// Poisson's ratio Nu
79 std::complex<double> Nu(std::complex<double>(0.3,0.0));
80
81 /// Non-dim square of frequency for solid -- dependent variable!
82 std::complex<double> Omega_sq(std::complex<double>(100.0,0.0));
83
84 /// Density ratio: solid to fluid
85 double Density_ratio=1.0;
86
87 /// Function to update dependent parameter values
92
93 /// Wavenumber "zenith"-variation of imposed displacement of coating
94 /// on inner boundary
95 unsigned M=4;
96
97 /// Displacement field on inner boundary of solid
98 void solid_boundary_displacement(const Vector<double>& x,
99 Vector<std::complex<double> >& u)
100 {
101 Vector<double> normal(2);
102 double norm=sqrt(x[0]*x[0]+x[1]*x[1]);
103 double theta=atan2(x[1],x[0]);
104 normal[0]=x[0]/norm;
105 normal[1]=x[1]/norm;
106
107 u[0]=complex<double>(normal[0]*cos(double(M)*theta),0.0);
108 u[1]=complex<double>(normal[1]*cos(double(M)*theta),0.0);
109 }
110
111
112 /// Output directory
113 string Directory="RESLT";
114
115 /// Multiplier for number of elements
116 unsigned El_multiplier=1;
117
118} //end_of_namespace
119
120
121
122//=============start_of_problem_class===================================
123/// Coated sphere FSI
124//======================================================================
125template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
126class CoatedSphereProblem : public Problem
127{
128
129public:
130
131 /// Constructor:
133
134 /// Update function (empty)
136
137 /// Update function (empty)
139
140 /// Recompute gamma integral before checking Newton residuals
145
146 /// Doc the solution
147 void doc_solution(DocInfo& doc_info);
148
149private:
150
151 /// Create FSI traction elements
153
154 /// Create Helmholtz FSI flux elements
156
157 /// Setup interaction
158 void setup_interaction();
159
160 /// Create DtN elements on outer boundary
162
163 /// Pointer to solid mesh
164 TwoDAnnularMesh<ELASTICITY_ELEMENT>* Solid_mesh_pt;
165
166 /// Pointer to mesh of FSI traction elements
168
169 /// Pointer to Helmholtz mesh
170 TwoDAnnularMesh<HELMHOLTZ_ELEMENT>* Helmholtz_mesh_pt;
171
172 /// Pointer to mesh of Helmholtz FSI flux elements
174
175 /// Pointer to mesh containing the DtN elements
176 FourierDecomposedHelmholtzDtNMesh<HELMHOLTZ_ELEMENT>* Helmholtz_DtN_mesh_pt;
177
178 /// Trace file
179 ofstream Trace_file;
180
181};// end_of_problem_class
182
183
184//===========start_of_constructor=======================================
185/// Constructor:
186//======================================================================
187template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
190{
191
192 // Parameters for meshes
193 bool periodic=false;
194 double azimuthal_fraction_of_coating=0.5;
195 double phi=0.5*MathematicalConstants::Pi;
196
197 // Solid mesh
198 //-----------
199 // Number of elements in azimuthal direction
200 unsigned ntheta_solid=10*Global_Parameters::El_multiplier;
201
202 // Number of elements in radial direction
203 unsigned nr_solid=3*Global_Parameters::El_multiplier;
204
205 // Innermost radius for solid mesh
206 double a=1.0-Global_Parameters::H_coating;
207
208 // Build solid mesh
209 Solid_mesh_pt = new
210 TwoDAnnularMesh<ELASTICITY_ELEMENT>(periodic,azimuthal_fraction_of_coating,
211 ntheta_solid,nr_solid,a,
213
214
215 // Helmholtz mesh
216 //---------------
217
218 // Number of elements in azimuthal direction in Helmholtz mesh
219 unsigned ntheta_helmholtz=11*Global_Parameters::El_multiplier;
220
221 // Number of elements in radial direction in Helmholtz mesh
222 unsigned nr_helmholtz=3*Global_Parameters::El_multiplier;
223
224 // Innermost radius of Helmholtz mesh
225 a=1.0;
226
227 // Thickness of Helmholtz mesh
228 double h_thick_helmholtz=Global_Parameters::Outer_radius-a;
229
230 // Build mesh
231 Helmholtz_mesh_pt = new TwoDAnnularMesh<HELMHOLTZ_ELEMENT>
232 (periodic,azimuthal_fraction_of_coating,
233 ntheta_helmholtz,nr_helmholtz,a,h_thick_helmholtz,phi);
234
235
236 // Create mesh for DtN elements on outer boundary
237 unsigned nfourier=20;
238 Helmholtz_DtN_mesh_pt=
239 new FourierDecomposedHelmholtzDtNMesh<HELMHOLTZ_ELEMENT>(
241
242 // Complete the solid problem setup to make the elements fully functional
243 unsigned nel=Solid_mesh_pt->nelement();
244 for (unsigned e=0;e<nel;e++)
245 {
246 // Cast to a bulk element
247 ELASTICITY_ELEMENT* el_pt=dynamic_cast<ELASTICITY_ELEMENT*>(
248 Solid_mesh_pt->element_pt(e));
249
250 // Set the pointer to Fourier wavenumber
251 el_pt->fourier_wavenumber_pt() = &Global_Parameters::Fourier_wavenumber;
252
253 // Set the pointer to Poisson's ratio
254 el_pt->nu_pt() = &Global_Parameters::Nu;
255
256 // Set the pointer to square of the angular frequency
257 el_pt->omega_sq_pt() = &Global_Parameters::Omega_sq;
258 }
259
260 // Complete the build of all Helmholtz elements so they are fully functional
261 unsigned n_element = Helmholtz_mesh_pt->nelement();
262 for(unsigned i=0;i<n_element;i++)
263 {
264 // Upcast from GeneralsedElement to the present element
265 HELMHOLTZ_ELEMENT *el_pt = dynamic_cast<HELMHOLTZ_ELEMENT*>(
266 Helmholtz_mesh_pt->element_pt(i));
267
268 //Set the k_squared pointer
269 el_pt->k_squared_pt()=&Global_Parameters::K_squared;
270
271 // Set pointer to Fourier wave number
272 el_pt->fourier_wavenumber_pt()=&Global_Parameters::Fourier_wavenumber;
273 }
274
275 // Output meshes and their boundaries so far so we can double
276 // check the boundary enumeration
277 Solid_mesh_pt->output("solid_mesh.dat");
278 Helmholtz_mesh_pt->output("helmholtz_mesh.dat");
279 Solid_mesh_pt->output_boundaries("solid_mesh_boundary.dat");
280 Helmholtz_mesh_pt->output_boundaries("helmholtz_mesh_boundary.dat");
281
282 // Create FaceElement meshes for boundary conditions
283 //--------------------------------------------------
284
285 // Construct the fsi traction element mesh
286 FSI_traction_mesh_pt=new Mesh;
287 create_fsi_traction_elements();
288
289 // Construct the Helmholtz fsi flux element mesh
290 Helmholtz_fsi_flux_mesh_pt=new Mesh;
291 create_helmholtz_fsi_flux_elements();
292
293 // Create DtN elements
294 create_helmholtz_DtN_elements();
295
296
297 // Combine sub meshes
298 //-------------------
299 add_sub_mesh(Solid_mesh_pt);
300 add_sub_mesh(FSI_traction_mesh_pt);
301 add_sub_mesh(Helmholtz_mesh_pt);
302 add_sub_mesh(Helmholtz_fsi_flux_mesh_pt);
303 add_sub_mesh(Helmholtz_DtN_mesh_pt);
304
305 // Build the Problem's global mesh from its various sub-meshes
306 build_global_mesh();
307
308
309 // Solid boundary conditions:
310 //---------------------------
311
312 // Pin the solid inner boundary (boundary 0) in all directions
313 unsigned b=0;
314 unsigned n_node = Solid_mesh_pt->nboundary_node(b);
315
316 Vector<std::complex<double> > u(2);
317 Vector<double> x(2);
318
319 //Loop over the nodes to pin and assign boundary displacements on
320 //solid boundary
321 for(unsigned i=0;i<n_node;i++)
322 {
323 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(b,i);
324 nod_pt->pin(0);
325 nod_pt->pin(1);
326 nod_pt->pin(2);
327 nod_pt->pin(3);
328 nod_pt->pin(4);
329 nod_pt->pin(5);
330
331 // Assign prescribed displacements
332 x[0]=nod_pt->x(0);
333 x[1]=nod_pt->x(1);
335
336 // Real part of radial displacement
337 nod_pt->set_value(0,u[0].real());
338 // Real part of axial displacement
339 nod_pt->set_value(1,u[1].real());
340 // Real part of azimuthal displacement
341 nod_pt->set_value(2,0.0);
342 // Imag part of radial displacement
343 nod_pt->set_value(3,u[0].imag());
344 // Imag part of axial displacement
345 nod_pt->set_value(4,u[1].imag());
346 // Imag part of azimuthal displacement
347 nod_pt->set_value(5,0.0);
348 }
349
350 // Vertical Symmetry boundary (r=0 and z<0)
351 {
352 unsigned ibound=1;
353 {
354 unsigned num_nod= Solid_mesh_pt->nboundary_node(ibound);
355 for (unsigned inod=0;inod<num_nod;inod++)
356 {
357 // Get pointer to node
358 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(ibound,inod);
359
360 // Pin radial displacement (u_0 (real) and u_3 (imag))
361 nod_pt->pin(0);
362 nod_pt->set_value(0,0.0);
363 nod_pt->pin(3);
364 nod_pt->set_value(3,0.0);
365
366 // Pin azimuthal displacement (u_2 (real) and u_5 (imag))
367 nod_pt->pin(2);
368 nod_pt->set_value(2,0.0);
369 nod_pt->pin(5);
370 nod_pt->set_value(5,0.0);
371 }
372 }
373 }
374
375
376 // Vertical Symmetry boundary (r=0 and z>0)
377 {
378 unsigned ibound=3;
379 {
380 unsigned num_nod= Solid_mesh_pt->nboundary_node(ibound);
381 for (unsigned inod=0;inod<num_nod;inod++)
382 {
383 // Get pointer to node
384 Node* nod_pt=Solid_mesh_pt->boundary_node_pt(ibound,inod);
385
386 // Pin radial displacement (u_0 (real) and u_3 (imag))
387 nod_pt->pin(0);
388 nod_pt->set_value(0,0.0);
389 nod_pt->pin(3);
390 nod_pt->set_value(3,0.0);
391
392 // Pin azimuthal displacement (u_2 (real) and u_5 (imag))
393 nod_pt->pin(2);
394 nod_pt->set_value(2,0.0);
395 nod_pt->pin(5);
396 nod_pt->set_value(5,0.0);
397 }
398 }
399 } // done sym bc
400
401 // Setup fluid-structure interaction
402 //----------------------------------
403 setup_interaction();
404
405 // Open trace file
406 char filename[100];
407 snprintf(filename, sizeof(filename), "%s/trace.dat",Global_Parameters::Directory.c_str());
408 Trace_file.open(filename);
409
410 // Setup equation numbering scheme
411 cout <<"Number of equations: " << assign_eqn_numbers() << std::endl;
412
413}//end_of_constructor
414
415
416
417//============start_of_create_outer_bc_elements===========================
418/// Create BC elements on outer boundary
419//========================================================================
420template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
423{
424 // Outer boundary is boundary 2:
425 unsigned b=2;
426
427 // Loop over the bulk elements adjacent to boundary b?
428 unsigned n_element = Helmholtz_mesh_pt->nboundary_element(b);
429 for(unsigned e=0;e<n_element;e++)
430 {
431 // Get pointer to the bulk element that is adjacent to boundary b
432 HELMHOLTZ_ELEMENT* bulk_elem_pt = dynamic_cast<HELMHOLTZ_ELEMENT*>(
433 Helmholtz_mesh_pt->boundary_element_pt(b,e));
434
435 //Find the index of the face of element e along boundary b
436 int face_index = Helmholtz_mesh_pt->face_index_at_boundary(b,e);
437
438 // Build the corresponding DtN element
439 FourierDecomposedHelmholtzDtNBoundaryElement<HELMHOLTZ_ELEMENT>*
440 flux_element_pt = new
441 FourierDecomposedHelmholtzDtNBoundaryElement<HELMHOLTZ_ELEMENT>
442 (bulk_elem_pt,face_index);
443
444 //Add the flux boundary element to the helmholtz_DtN_mesh
445 Helmholtz_DtN_mesh_pt->add_element_pt(flux_element_pt);
446
447 // Set pointer to the mesh that contains all the boundary condition
448 // elements on this boundary
449 flux_element_pt->set_outer_boundary_mesh_pt(Helmholtz_DtN_mesh_pt);
450 }
451
452} // end_of_create_outer_bc_elements
453
454
455
456
457
458//=====================start_of_setup_interaction======================
459/// Setup interaction between two fields
460//========================================================================
461template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
464{
465
466 // Setup Helmholtz "pressure" load on traction elements
467 unsigned boundary_in_helmholtz_mesh=0;
468
469 // Doc boundary coordinate for Helmholtz
470 ofstream the_file;
471 the_file.open("boundary_coordinate_hh.dat");
472 Helmholtz_mesh_pt->Mesh::template doc_boundary_coordinates<HELMHOLTZ_ELEMENT>
473 (boundary_in_helmholtz_mesh, the_file);
474 the_file.close();
475
476 // Setup interaction
477 Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh
478 <HELMHOLTZ_ELEMENT,2>
479 (this,boundary_in_helmholtz_mesh,Helmholtz_mesh_pt,FSI_traction_mesh_pt);
480
481 // Setup Helmholtz flux from normal displacement interaction
482 unsigned boundary_in_solid_mesh=2;
483
484 // Doc boundary coordinate for solid mesh
485 the_file.open("boundary_coordinate_solid.dat");
486 Solid_mesh_pt->Mesh::template doc_boundary_coordinates<ELASTICITY_ELEMENT>
487 (boundary_in_solid_mesh, the_file);
488 the_file.close();
489
490 // Setup interaction
491 Multi_domain_functions::setup_bulk_elements_adjacent_to_face_mesh
492 <ELASTICITY_ELEMENT,2>(
493 this,boundary_in_solid_mesh,Solid_mesh_pt,Helmholtz_fsi_flux_mesh_pt);
494
495}// end_of_setup_interaction
496
497
498
499
500
501//============start_of_create_fsi_traction_elements======================
502/// Create fsi traction elements
503//=======================================================================
504template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
507{
508 // We're on boundary 2 of the solid mesh
509 unsigned b=2;
510
511 // How many bulk elements are adjacent to boundary b?
512 unsigned n_element = Solid_mesh_pt->nboundary_element(b);
513
514 // Loop over the bulk elements adjacent to boundary b
515 for(unsigned e=0;e<n_element;e++)
516 {
517 // Get pointer to the bulk element that is adjacent to boundary b
518 ELASTICITY_ELEMENT* bulk_elem_pt = dynamic_cast<ELASTICITY_ELEMENT*>(
519 Solid_mesh_pt->boundary_element_pt(b,e));
520
521 //Find the index of the face of element e along boundary b
522 int face_index = Solid_mesh_pt->face_index_at_boundary(b,e);
523
524 // Create element
525 FourierDecomposedTimeHarmonicLinElastLoadedByHelmholtzPressureBCElement
526 <ELASTICITY_ELEMENT,HELMHOLTZ_ELEMENT>* el_pt=
527 new FourierDecomposedTimeHarmonicLinElastLoadedByHelmholtzPressureBCElement
528 <ELASTICITY_ELEMENT,HELMHOLTZ_ELEMENT>(bulk_elem_pt,
529 face_index);
530 // Add to mesh
531 FSI_traction_mesh_pt->add_element_pt(el_pt);
532
533 // Associate element with bulk boundary (to allow it to access
534 // the boundary coordinates in the bulk mesh)
535 el_pt->set_boundary_number_in_bulk_mesh(b);
536
537 // Set FSI parameter
538 el_pt->q_pt()=&Global_Parameters::Q;
539 }
540
541} // end_of_create_fsi_traction_elements
542
543
544
545//============start_of_create_helmholtz_fsi_flux_elements================
546/// Create Helmholtz fsi flux elements
547//=======================================================================
548template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
551{
552
553 // Attach to inner boundary of Helmholtz mesh (0)
554 unsigned b=0;
555
556 // How many bulk elements are adjacent to boundary b?
557 unsigned n_element = Helmholtz_mesh_pt->nboundary_element(b);
558
559 // Loop over the bulk elements adjacent to boundary b
560 for(unsigned e=0;e<n_element;e++)
561 {
562 // Get pointer to the bulk element that is adjacent to boundary b
563 HELMHOLTZ_ELEMENT* bulk_elem_pt = dynamic_cast<HELMHOLTZ_ELEMENT*>(
564 Helmholtz_mesh_pt->boundary_element_pt(b,e));
565
566 //Find the index of the face of element e along boundary b
567 int face_index = Helmholtz_mesh_pt->face_index_at_boundary(b,e);
568
569 // Create element
570 FourierDecomposedHelmholtzFluxFromNormalDisplacementBCElement
571 <HELMHOLTZ_ELEMENT,ELASTICITY_ELEMENT>* el_pt=
572 new FourierDecomposedHelmholtzFluxFromNormalDisplacementBCElement
573 <HELMHOLTZ_ELEMENT,ELASTICITY_ELEMENT>(bulk_elem_pt,
574 face_index);
575
576 // Add to mesh
577 Helmholtz_fsi_flux_mesh_pt->add_element_pt(el_pt);
578
579 // Associate element with bulk boundary (to allow it to access
580 // the boundary coordinates in the bulk mesh)
581 el_pt->set_boundary_number_in_bulk_mesh(b);
582 }
583
584} // end_of_create_helmholtz_fsi_flux_elements
585
586
587
588//==============start_of_doc_solution===============================
589/// Doc the solution
590//==================================================================
591template<class ELASTICITY_ELEMENT, class HELMHOLTZ_ELEMENT>
593doc_solution(DocInfo& doc_info)
594{
595
596 // Doc parameters
597 oomph_info << "Writing result for step " << doc_info.number()
598 << ". Parameters: "<< std::endl;
599 oomph_info << "Fourier mode number : N = "
601 oomph_info << "FSI parameter : Q = " << Global_Parameters::Q << std::endl;
602 oomph_info << "Fluid outer radius : R = " << Global_Parameters::Outer_radius
603 << std::endl;
604 oomph_info << "Fluid wavenumber : k^2 = " << Global_Parameters::K_squared
605 << std::endl;
606 oomph_info << "Solid wavenumber : Omega_sq = " << Global_Parameters::Omega_sq
607 << std::endl << std::endl;
608
609
610 ofstream some_file,some_file2;
611 char filename[100];
612
613 // Number of plot points
614 unsigned n_plot=5;
615
616 // Compute/output the radiated power
617 //----------------------------------
618 snprintf(filename, sizeof(filename), "%s/power%i.dat",doc_info.directory().c_str(),
619 doc_info.number());
620 some_file.open(filename);
621
622 // Accumulate contribution from elements
623 double power=0.0;
624 unsigned nn_element=Helmholtz_DtN_mesh_pt->nelement();
625 for(unsigned e=0;e<nn_element;e++)
626 {
627 FourierDecomposedHelmholtzBCElementBase<HELMHOLTZ_ELEMENT> *el_pt =
628 dynamic_cast<FourierDecomposedHelmholtzBCElementBase<HELMHOLTZ_ELEMENT>*>(
629 Helmholtz_DtN_mesh_pt->element_pt(e));
630 power += el_pt->global_power_contribution(some_file);
631 }
632 some_file.close();
633 oomph_info << "Radiated power: " << power << std::endl;
634
635 // Output displacement field
636 //--------------------------
637 snprintf(filename, sizeof(filename), "%s/elast_soln%i.dat",doc_info.directory().c_str(),
638 doc_info.number());
639 some_file.open(filename);
640 Solid_mesh_pt->output(some_file,n_plot);
641 some_file.close();
642
643 // Output Helmholtz
644 //-----------------
645 snprintf(filename, sizeof(filename), "%s/helmholtz_soln%i.dat",doc_info.directory().c_str(),
646 doc_info.number());
647 some_file.open(filename);
648 Helmholtz_mesh_pt->output(some_file,n_plot);
649 some_file.close();
650
651
652 // Output fsi traction elements
653 //-----------------------------
654 snprintf(filename, sizeof(filename), "%s/fsi_traction_soln%i.dat",doc_info.directory().c_str(),
655 doc_info.number());
656 some_file.open(filename);
657 FSI_traction_mesh_pt->output(some_file,n_plot);
658 some_file.close();
659
660
661 // Output Helmholtz fsi flux elements
662 //-----------------------------------
663 snprintf(filename, sizeof(filename), "%s/fsi_flux_bc_soln%i.dat",doc_info.directory().c_str(),
664 doc_info.number());
665 some_file.open(filename);
666 Helmholtz_fsi_flux_mesh_pt->output(some_file,n_plot);
667 some_file.close();
668
669 // Write trace file
670 Trace_file << Global_Parameters::Q << " "
673 << Global_Parameters::Omega_sq.real() << " "
674 << power << " "
675 << std::endl;
676
677 // Bump up counter
678 doc_info.number()++;
679
680} //end_of_doc_solution
681
682
683
684//=======start_of_main==================================================
685/// Driver for coated sphere loaded by lineared fluid loading
686//======================================================================
687int main(int argc, char **argv)
688{
689
690 // Store command line arguments
691 CommandLineArgs::setup(argc,argv);
692
693 // Define possible command line arguments and parse the ones that
694 // were actually specified
695
696 // Output directory
697 CommandLineArgs::specify_command_line_flag("--dir",
699
700 // Parameter for the Helmholtz equation
701 CommandLineArgs::specify_command_line_flag("--k_squared",
703
704 // Initial value of Q
705 CommandLineArgs::specify_command_line_flag("--q_initial",
707
708 // Number of steps in parameter study
709 unsigned nstep=2;
710 CommandLineArgs::specify_command_line_flag("--nstep",&nstep);
711
712 // Increment in FSI parameter in parameter study
713 double q_increment=5.0;
714 CommandLineArgs::specify_command_line_flag("--q_increment",&q_increment);
715
716
717 // Wavenumber "zenith"-variation of imposed displacement of coating
718 // on inner boundary
719 CommandLineArgs::specify_command_line_flag("--M",
721
722 // Multiplier for number of elements
723 CommandLineArgs::specify_command_line_flag("--el_multiplier",
725
726 // Parse command line
727 CommandLineArgs::parse_and_assign();
728
729 // Doc what has actually been specified on the command line
730 CommandLineArgs::doc_specified_flags();
731
732 // Update dependent parameters values
734
735 // Set up doc info
736 DocInfo doc_info;
737
738 // Set output directory
739 doc_info.set_directory(Global_Parameters::Directory);
740
741 // Set up the problem
743 QFourierDecomposedHelmholtzElement<3> > problem;
744
745 //Parameter incrementation
746 for(unsigned i=0;i<nstep;i++)
747 {
748 // Solve the problem with Newton's method
749 problem.newton_solve();
750
751 // Doc solution
752 problem.doc_solution(doc_info);
753
754 // Increment FSI parameter
755 Global_Parameters::Q+=q_increment;
757 }
758
759} //end_of_main
760
761
762
763
764
765
766
767
void create_fsi_traction_elements()
Create FSI traction elements.
void actions_before_newton_convergence_check()
Recompute gamma integral before checking Newton residuals.
Mesh * FSI_traction_mesh_pt
Pointer to mesh of FSI traction elements.
TwoDAnnularMesh< ELASTICITY_ELEMENT > * Solid_mesh_pt
Pointer to solid mesh.
TwoDAnnularMesh< HELMHOLTZ_ELEMENT > * Helmholtz_mesh_pt
Pointer to Helmholtz mesh.
void create_helmholtz_DtN_elements()
Create DtN elements on outer boundary.
void create_helmholtz_fsi_flux_elements()
Create Helmholtz FSI flux elements.
void actions_before_newton_solve()
Update function (empty)
void doc_solution(DocInfo &doc_info)
Doc the solution.
FourierDecomposedHelmholtzDtNMesh< HELMHOLTZ_ELEMENT > * Helmholtz_DtN_mesh_pt
Pointer to mesh containing the DtN elements.
void actions_after_newton_solve()
Update function (empty)
void setup_interaction()
Setup interaction.
Mesh * Helmholtz_fsi_flux_mesh_pt
Pointer to mesh of Helmholtz FSI flux elements.
int main(int argc, char **argv)
Driver for coated sphere loaded by lineared fluid loading.
string Directory
Output directory.
unsigned El_multiplier
Multiplier for number of elements.
std::complex< double > Nu(std::complex< double >(0.3, 0.0))
Poisson's ratio Nu.
double Density_ratio
Density ratio: solid to fluid.
std::complex< double > Omega_sq(std::complex< double >(100.0, 0.0))
Non-dim square of frequency for solid – dependent variable!
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.
unsigned M
Wavenumber "zenith"-variation of imposed displacement of coating on inner boundary.
void update_parameter_values()
Function to update dependent parameter values.
int Fourier_wavenumber
Define azimuthal Fourier wavenumber.
double H_coating
Non-dim thickness of elastic coating.