Coupled Fluid-Structure Eigen Analysis

General discussion about Elmer
eschenk
Posts: 8
Joined: 09 Apr 2024, 07:20
Antispam: Yes

Coupled Fluid-Structure Eigen Analysis

Post by eschenk »

I'm doing analysis of classical guitar models where I want to look at eigen modes of the guitar structure when coupled with the air in the body cavity. I've managed to build a coupled model with an FSI interaction that I can solve at any particular frequency following the ShoeboxFsiHarmonic example.

I've also managed to use this to scan across the frequency space of interest (about 50-600 Hz) and I'm getting back results that look about what I would expect having done tests on physical guitars.

Ideally, I want to tweak various design parameters of the model and materials and see the changes relativelty quickly, but the scaning method is taking me a couple of days for each run. I'm currently scanning about 8 frequencies at a time (all I can fit into 32 GB of ram on the VM I'm running on right now) to get some paralellism.

I've been trying to run a joint eigen analysis, and I just various forms of crashing. To simplify the case, I've tried to do joint eigen analysis on the ShoeboxFsiHarmonic data set. I'm using the Wave Solver for the fluid, and the linear elasticity solver for the solid.

When I do this I get the following errors:

WaveSolver: Solving the compressional pressure wave
WaveSolver: We have a harmonic or eigenmode system
DefaultSlaveSolvers: Executing slave solvers: Pre Solvers
StressSolve:
StressSolve: --------------------------------------------------
StressSolve: Solving displacements from linear elasticity model
StressSolve: --------------------------------------------------
StressSolve: Starting assembly...
StressSolve: Assembly:
EnforceDirichletConditions: Dirichlet conditions enforced for dofs: 900
StressSolver: All done
StressSolver: ------------------------------------------
BlockSolveInt: ---------------------------------------
BlockSolveInt: Using block preconditioning mode by default
BlockInitMatrix: Block matrix will be of size 2
BlockInitMatrix: Number of field components: 2
BlockInitMatrix: Using existing variable > displacement <
BlockInitMatrix: Using existing variable > u <
FsiCouplingAssembly: Creating coupling matrix for FSI
ERROR:: FsiCouplingAssembly: Inconsistent number of real dofs in NS solver: 3
Note: The following floating-point exceptions are signalling: IEEE_UNDERFLOW_FLAG IEEE_DENORMAL

I've attached the .sif file I'm trying this with.

I'm not sure if I should expect this to work, but it would speed up my process a bunch if I could get it working.

Can anyone suggest an approach here other than scanning?

Cheers,

Eric Schenk
Attachments
case3.sif
(3.05 KiB) Downloaded 5 times
raback
Site Admin
Posts: 4832
Joined: 22 Aug 2009, 11:57
Antispam: Yes
Location: Espoo, Finland
Contact:

Re: Coupled Fluid-Structure Eigen Analysis

Post by raback »

Hi

Did you look at test case ShoeboxFsiEigen2D? Just needs 3 instead of 2 dofs for displacement.

-Peter
eschenk
Posts: 8
Joined: 09 Apr 2024, 07:20
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by eschenk »

Hi Peter,

I just went and tried the 2D case as well.

If I use the iterative solver I get similar errors there.

Here is the error I get based on the original 2D case sif file, modified to use the wave equations and do Eigen analsysis.

ELMER SOLVER (v 9.0) STARTED AT: 2024/04/09 07:26:27
ParCommInit: Initialize #PEs: 1
MAIN:
MAIN: =============================================================
MAIN: ElmerSolver finite element software, Welcome!
MAIN: This program is free software licensed under (L)GPL
MAIN: Copyright 1st April 1995 - , CSC - IT Center for Science Ltd.
MAIN: Webpage http://www.csc.fi/elmer, Email elmeradm@csc.fi
MAIN: Version: 9.0 (Rev: unknown, Compiled: 2024-03-22)
MAIN: Running one task without MPI parallelization.
MAIN: Running with just one thread per task.
MAIN: HYPRE library linked in.
MAIN: MUMPS library linked in.
MAIN: Lua interpreter linked in.
MAIN: =============================================================
MAIN:
MAIN:
MAIN: -------------------------------------
MAIN: Reading Model: case2.sif
LoadInputFile: Scanning input file: case2.sif
LoadInputFile: Scanning only size info
LoadInputFile: First time visiting
LoadInputFile: Reading base load of sif file
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
LoadInputFile: Loading input file: case2.sif
LoadInputFile: Reading base load of sif file
CheckKeyword: Unlisted keyword: [p] in section: [initial condition 1]
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
LoadInputFile: Number of BCs: 4
LoadInputFile: Number of Body Forces: 0
LoadInputFile: Number of Initial Conditions: 1
LoadInputFile: Number of Materials: 2
LoadInputFile: Number of Equations: 2
LoadInputFile: Number of Solvers: 3
LoadInputFile: Number of Bodies: 2
ListTagKeywords: Setting weight for keywords!
ListTagKeywords: No parameters width suffix: normalize by area
ListTagKeywords: Setting weight for keywords!
ListTagKeywords: No parameters width suffix: normalize by volume
Loading user function library: [WaveSolver]...[WaveSolver_Init0]
Loading user function library: [StressSolve]...[StressSolver_Init0]
Loading user function library: [SaveData]...[SaveScalars_Init0]
ElmerAsciiMesh: Base mesh name: ./shoebox2d
PermuteNodeNumbering: Performing node mapping
MapBodiesAndBCs: Minimum initial boundary index: 1
MapBodiesAndBCs: Maximum initial boundary index: 7
LoadMesh: Elapsed REAL time: 0.0396 (s)
MeshStabParams: Computing stabilization parameters
MeshStabParams: Elapsed REAL time: 0.0001 (s)
MAIN: -------------------------------------
AddVtuOutputSolverHack: Adding ResultOutputSolver to write VTU output in file: harm
Loading user function library: [WaveSolver]...[WaveSolver_Init]
Loading user function library: [WaveSolver]...[WaveSolver_bulk]
Loading user function library: [WaveSolver]...[WaveSolver]
OptimizeBandwidth: ---------------------------------------------------------
OptimizeBandwidth: Computing matrix structure for: wave equation
OptimizeBandwidth: Initial bandwidth for wave equation: 83
OptimizeBandwidth: Optimized bandwidth for wave equation: 43
OptimizeBandwidth: ---------------------------------------------------------
Loading user function library: [StressSolve]...[StressSolver_Init]
StressSolve_init: --------------------------------------------------
StressSolve_init: Solving displacements from linear elasticity model
StressSolve_init: --------------------------------------------------
Loading user function library: [StressSolve]...[StressSolver_bulk]
Loading user function library: [StressSolve]...[StressSolver]
OptimizeBandwidth: ---------------------------------------------------------
OptimizeBandwidth: Computing matrix structure for: navier solver
OptimizeBandwidth: Initial bandwidth for navier solver: 83
OptimizeBandwidth: ---------------------------------------------------------
AddEquationSolution: Repointing 2 eigenvalue components for: u
AddEquationSolution: Eigenvalue component 1: u 1
AddEquationSolution: Eigenvalue component 2: u 2
Loading user function library: [SaveData]...[SaveScalars_Init]
Loading user function library: [SaveData]...[SaveScalars_bulk]
Loading user function library: [SaveData]...[SaveScalars]
Loading user function library: [ResultOutputSolve]...[ResultOutputSolver_Init]
Loading user function library: [ResultOutputSolve]...[ResultOutputSolver_bulk]
Loading user function library: [ResultOutputSolve]...[ResultOutputSolver]
MAIN: Number of timesteps to be saved: 1
MAIN:
MAIN: -------------------------------------
MAIN: Steady state iteration: 1
MAIN: -------------------------------------
MAIN:
WaveSolver: Solving the compressional pressure wave
WaveSolver: We have a harmonic or eigenmode system
DefaultSlaveSolvers: Executing slave solvers: Pre Solvers
StressSolve:
StressSolve: --------------------------------------------------
StressSolve: Solving displacements from linear elasticity model
StressSolve: --------------------------------------------------
StressSolve: Starting assembly...
StressSolve: Assembly:
EnforceDirichletConditions: Dirichlet conditions enforced for dofs: 24
StressSolver: All done
StressSolver: ------------------------------------------
BlockSolveInt: ---------------------------------------
BlockInitMatrix: Block matrix will be of size 2
BlockInitMatrix: Number of field components: 2
BlockInitMatrix: Using existing variable > pressure <
BlockInitMatrix: Using existing variable > u <
FsiCouplingAssembly: Creating coupling matrix for FSI
BlockSolveInt: Using block preconditioning strategy
EigenSolve: ...............................................
EigenSolve: Eigen system solution complete:
EigenSolve:
EigenSolve: Convergence criterion is: 1.000E-07
EigenSolve: Number of converged Ritz values is: 15
EigenSolve: Number of update iterations taken: 1
EigenSolve: Computed 15 Eigen Values
EigenSolve: 1: -8.581210E-07 0.000000E+00
EigenSolve: 2: 1.944972E+07 0.000000E+00
EigenSolve: 3: 7.802901E+07 0.000000E+00
EigenSolve: 4: 1.761608E+08 0.000000E+00
EigenSolve: 5: 3.150743E+08 0.000000E+00
EigenSolve: 6: 4.677429E+08 0.000000E+00
EigenSolve: 7: 4.871927E+08 0.000000E+00
EigenSolve: 8: 4.955020E+08 0.000000E+00
EigenSolve: 9: 5.457719E+08 0.000000E+00
EigenSolve: 10: 6.439038E+08 0.000000E+00
EigenSolve: 11: 7.199547E+08 0.000000E+00
EigenSolve: 12: 7.828173E+08 0.000000E+00
EigenSolve: 13: 9.632450E+08 0.000000E+00
EigenSolve: 14: 9.892090E+08 0.000000E+00
EigenSolve: 15: 1.187698E+09 0.000000E+00
EigenSolve: --------------------------------
EigenSolve: ...............................................
EigenSolve: Eigen system solution complete:
EigenSolve:
EigenSolve: Convergence criterion is: 1.000E-07
EigenSolve: Number of converged Ritz values is: 15
EigenSolve: Number of update iterations taken: 1
EigenSolve: Computed 15 Eigen Values
EigenSolve: 1: 4.367323E+06 0.000000E+00
EigenSolve: 2: 3.362192E+07 0.000000E+00
EigenSolve: 3: 1.487179E+08 0.000000E+00
EigenSolve: 4: 4.062046E+08 0.000000E+00
EigenSolve: 5: 9.432216E+08 0.000000E+00
EigenSolve: 6: 1.853166E+09 0.000000E+00
EigenSolve: 7: 3.374426E+09 0.000000E+00
EigenSolve: 8: 4.686586E+09 0.000000E+00
EigenSolve: 9: 5.644272E+09 0.000000E+00
EigenSolve: 10: 9.030100E+09 0.000000E+00
EigenSolve: 11: 1.373689E+10 0.000000E+00
EigenSolve: 12: 1.878800E+10 0.000000E+00
EigenSolve: 13: 2.028584E+10 0.000000E+00
EigenSolve: 14: 2.899788E+10 0.000000E+00
EigenSolve: 15: 4.055568E+10 0.000000E+00
EigenSolve: --------------------------------
gcr: 1 NaN NaN
ERROR:: IterSolve: Numerical Error: System diverged over maximum tolerance.
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO IEEE_UNDERFLOW_FLAG IEEE_DENORMAL
STOP 1

I've attached my edited sif file. This one used the GCR iterative solver, but if i switch to the direct solver I just get a crash as well.

If I switch to block monolithic with the MUMPS direct solver, I get back a run that competes:

ELMER SOLVER (v 9.0) STARTED AT: 2024/04/09 07:37:30
ParCommInit: Initialize #PEs: 1
MAIN:
MAIN: =============================================================
MAIN: ElmerSolver finite element software, Welcome!
MAIN: This program is free software licensed under (L)GPL
MAIN: Copyright 1st April 1995 - , CSC - IT Center for Science Ltd.
MAIN: Webpage http://www.csc.fi/elmer, Email elmeradm@csc.fi
MAIN: Version: 9.0 (Rev: unknown, Compiled: 2024-03-22)
MAIN: Running one task without MPI parallelization.
MAIN: Running with just one thread per task.
MAIN: HYPRE library linked in.
MAIN: MUMPS library linked in.
MAIN: Lua interpreter linked in.
MAIN: =============================================================
MAIN:
MAIN:
MAIN: -------------------------------------
MAIN: Reading Model: case2.sif
LoadInputFile: Scanning input file: case2.sif
LoadInputFile: Scanning only size info
LoadInputFile: First time visiting
LoadInputFile: Reading base load of sif file
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
LoadInputFile: Loading input file: case2.sif
LoadInputFile: Reading base load of sif file
CheckKeyword: Unlisted keyword: [p] in section: [initial condition 1]
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 2
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: operator 3
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: variable 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 4
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 5
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
CheckKeyword: Found keyword type assuming suffix 1 for: operator 6
LoadInputFile: Number of BCs: 4
LoadInputFile: Number of Body Forces: 0
LoadInputFile: Number of Initial Conditions: 1
LoadInputFile: Number of Materials: 2
LoadInputFile: Number of Equations: 2
LoadInputFile: Number of Solvers: 3
LoadInputFile: Number of Bodies: 2
ListTagKeywords: Setting weight for keywords!
ListTagKeywords: No parameters width suffix: normalize by area
ListTagKeywords: Setting weight for keywords!
ListTagKeywords: No parameters width suffix: normalize by volume
Loading user function library: [WaveSolver]...[WaveSolver_Init0]
Loading user function library: [StressSolve]...[StressSolver_Init0]
Loading user function library: [SaveData]...[SaveScalars_Init0]
ElmerAsciiMesh: Base mesh name: ./shoebox2d
PermuteNodeNumbering: Performing node mapping
MapBodiesAndBCs: Minimum initial boundary index: 1
MapBodiesAndBCs: Maximum initial boundary index: 7
LoadMesh: Elapsed REAL time: 0.0106 (s)
MeshStabParams: Computing stabilization parameters
MeshStabParams: Elapsed REAL time: 0.0000 (s)
MAIN: -------------------------------------
AddVtuOutputSolverHack: Adding ResultOutputSolver to write VTU output in file: harm
Loading user function library: [WaveSolver]...[WaveSolver_Init]
Loading user function library: [WaveSolver]...[WaveSolver_bulk]
Loading user function library: [WaveSolver]...[WaveSolver]
OptimizeBandwidth: ---------------------------------------------------------
OptimizeBandwidth: Computing matrix structure for: wave equation
OptimizeBandwidth: Initial bandwidth for wave equation: 83
OptimizeBandwidth: Optimized bandwidth for wave equation: 43
OptimizeBandwidth: ---------------------------------------------------------
Loading user function library: [StressSolve]...[StressSolver_Init]
StressSolve_init: --------------------------------------------------
StressSolve_init: Solving displacements from linear elasticity model
StressSolve_init: --------------------------------------------------
Loading user function library: [StressSolve]...[StressSolver_bulk]
Loading user function library: [StressSolve]...[StressSolver]
OptimizeBandwidth: ---------------------------------------------------------
OptimizeBandwidth: Computing matrix structure for: navier solver
OptimizeBandwidth: Initial bandwidth for navier solver: 83
OptimizeBandwidth: ---------------------------------------------------------
AddEquationSolution: Repointing 2 eigenvalue components for: u
AddEquationSolution: Eigenvalue component 1: u 1
AddEquationSolution: Eigenvalue component 2: u 2
Loading user function library: [SaveData]...[SaveScalars_Init]
Loading user function library: [SaveData]...[SaveScalars_bulk]
Loading user function library: [SaveData]...[SaveScalars]
Loading user function library: [ResultOutputSolve]...[ResultOutputSolver_Init]
Loading user function library: [ResultOutputSolve]...[ResultOutputSolver_bulk]
Loading user function library: [ResultOutputSolve]...[ResultOutputSolver]
MAIN: Number of timesteps to be saved: 1
MAIN:
MAIN: -------------------------------------
MAIN: Steady state iteration: 1
MAIN: -------------------------------------
MAIN:
WaveSolver: Solving the compressional pressure wave
WaveSolver: We have a harmonic or eigenmode system
DefaultSlaveSolvers: Executing slave solvers: Pre Solvers
StressSolve:
StressSolve: --------------------------------------------------
StressSolve: Solving displacements from linear elasticity model
StressSolve: --------------------------------------------------
StressSolve: Starting assembly...
StressSolve: Assembly:
EnforceDirichletConditions: Dirichlet conditions enforced for dofs: 24
StressSolver: All done
StressSolver: ------------------------------------------
BlockSolveInt: ---------------------------------------
BlockInitMatrix: Block matrix will be of size 2
BlockInitMatrix: Number of field components: 2
BlockInitMatrix: Using existing variable > pressure <
BlockInitMatrix: Using existing variable > u <
FsiCouplingAssembly: Creating coupling matrix for FSI
BlockSolveInt: Using monolithic strategy for the block
BlockMonolithicSolve: Solving block matrix as monolithic!
BlockMonolithicSolve: Size of monolithic matrix: 1353
BlockMonolithicSolve: Estimated number of nonzeros in monolithic matrix: 15603
BlockMonolithicSolve: True number of nonzeros in monolithic matrix: 15603
EigenSolve: .....................................................................................................................................
EigenSolve: Eigen system solution complete:
EigenSolve:
EigenSolve: Convergence criterion is: 1.000E-07
EigenSolve: Number of converged Ritz values is: 15
EigenSolve: Number of update iterations taken: 4
EigenSolve: Computed 15 Eigen Values
EigenSolve: 1: 1.555687E-04 0.000000E+00
EigenSolve: 2: -6.335722E-01 2.231030E-01
EigenSolve: 3: -6.335722E-01 -2.231030E-01
EigenSolve: 4: -6.108601E-01 3.474310E-01
EigenSolve: 5: -6.108601E-01 -3.474310E-01
EigenSolve: 6: -9.184706E-02 -7.021240E-01
EigenSolve: 7: -9.184706E-02 7.021240E-01
EigenSolve: 8: -5.513253E-01 4.480324E-01
EigenSolve: 9: -5.513253E-01 -4.480324E-01
EigenSolve: 10: -4.665661E-01 5.418434E-01
EigenSolve: 11: -4.665661E-01 -5.418434E-01
EigenSolve: 12: -2.395427E-01 6.760835E-01
EigenSolve: 13: -2.395427E-01 -6.760835E-01
EigenSolve: 14: -3.600932E-01 6.208157E-01
EigenSolve: 15: -3.600932E-01 -6.208157E-01
EigenSolve: --------------------------------
BlockSolveInt: All done
BlockSolveInt: -------------------------------------------------
ComputeChange: SS (ITER=1) (NRM,RELC): ( 3139.6328 2.0000000 ) :: wave equation
SaveScalars: -----------------------------------------
SaveScalars: Saving scalar values of various kinds
WARNING:: SaveScalars: Requested variable does not exist: pressure re
SaveScalars: Performed 6 reduction operations
SaveScalars: Found 5 values to save in total
SaveScalars: Saving names of values to file: ./harm.dat.names
SaveScalars: Data is appended to existing file
SaveScalars: Saving values to file: ./harm.dat
SaveScalars: -----------------------------------------
ResultOutputSolver: -------------------------------------
ResultOutputSolver: Saving with prefix: harm
ResultOutputSolver: Creating list for saving - if not present
CreateListForSaving: Field Variables for Saving
CreateListForSaving: Scalar Field 1: pressure
CreateListForSaving: Vector Field 1: u
ResultOutputSolver: Saving in unstructured VTK XML (.vtu) format
VtuOutputSolver: Saving results in VTK XML format with prefix: harm
VtuOutputSolver: Saving number of partitions: 1
VtuOutputSolver: Maximum number of eigen/harmonic modes: 15
VtuOutputSolver: Setting offset for boundary entities: 100
VtuOutputSolver: Writing the vtu file: shoebox2d/harm_t0001.vtu
ResultOutputSolver: -------------------------------------
ReloadInputFile: Realoading input file
LoadInputFile: Loading input file:
MAIN: Reporting unused list entries for sif improvement!
MAIN: If you do not want these lines undefine > DEVEL_LISTUSAGE < !
Unused keywords:
Simulation frequency
Initial Condition 1 p
Solver 1 linear system block method
Solver 1 block gauss-seidel
Solver 2 linear system positive definite
Solver 2 steady state convergence tolerance
Solver 2 linear system complex
Solver 2 eigen system select
Solver 2 eigen system convergence tolerance
Solver 2 eigen system max iterations
Solver 3 operator 4
MAIN: *** Elmer Solver: ALL DONE ***
MAIN: The end
SOLVER TOTAL TIME(CPU,REAL): 0.14 0.55
ELMER SOLVER FINISHED AT: 2024/04/09 07:37:30


However, the eigen values coming out of this are all much smaller than I wold expect. I will have to run a scan version on the 2D model this evening to see if the shapes are what I would expect as well, but at first glance they didn't look right. I don't have a great intuition for the 2D case yet though.

Ultimately, I do need the solution working in 3D to be useful for me though.

Cheers,

Eric
Attachments
case2.sif
(4.36 KiB) Downloaded 8 times
eschenk
Posts: 8
Joined: 09 Apr 2024, 07:20
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by eschenk »

I managed to do one more test before I have to head off to work.

I modified the solver to do Eigen Analysis of the structure and fluid independently to see what kind of strutures I should be expecting for the modes.

I get modes as follows:

WaveSolver: Solving the compressional pressure wave
WaveSolver: We have a harmonic or eigenmode system
EigenSolve: ...............................................
EigenSolve: Eigen system solution complete:
EigenSolve: Convergence criterion is: 1.000E-07
EigenSolve: Number of converged Ritz values is: 15
EigenSolve: Number of update iterations taken: 1
EigenSolve: Computed 15 Eigen Values
EigenSolve: 1: -1.256780E-06 0.000000E+00
EigenSolve: 2: 1.944972E+07 0.000000E+00
EigenSolve: 3: 7.802901E+07 0.000000E+00
EigenSolve: 4: 1.761608E+08 0.000000E+00
EigenSolve: 5: 3.150743E+08 0.000000E+00
EigenSolve: 6: 4.677429E+08 0.000000E+00
EigenSolve: 7: 4.871927E+08 0.000000E+00
EigenSolve: 8: 4.955020E+08 0.000000E+00
EigenSolve: 9: 5.457719E+08 0.000000E+00
EigenSolve: 10: 6.439038E+08 0.000000E+00
EigenSolve: 11: 7.199547E+08 0.000000E+00
EigenSolve: 12: 7.828173E+08 0.000000E+00
EigenSolve: 13: 9.632450E+08 0.000000E+00
EigenSolve: 14: 9.892090E+08 0.000000E+00
EigenSolve: 15: 1.187698E+09 0.000000E+00
EigenSolve: --------------------------------
ComputeChange: SS (ITER=1) (NRM,RELC): ( 0.0000000 0.0000000 ) :: wave equation
StressSolve:
StressSolve: --------------------------------------------------
StressSolve: Solving displacements from linear elasticity model
StressSolve: --------------------------------------------------
StressSolve: Starting assembly...
StressSolve: Assembly:
EnforceDirichletConditions: Dirichlet conditions enforced for dofs: 24
EigenSolve: ...............................................
EigenSolve: Eigen system solution complete:
EigenSolve:
EigenSolve: Convergence criterion is: 1.000E-07
EigenSolve: Number of converged Ritz values is: 15
EigenSolve: Number of update iterations taken: 1
EigenSolve: Computed 15 Eigen Values
EigenSolve: 1: 4.367323E+06 0.000000E+00
EigenSolve: 2: 3.362192E+07 0.000000E+00
EigenSolve: 3: 1.487179E+08 0.000000E+00
EigenSolve: 4: 4.062046E+08 0.000000E+00
EigenSolve: 5: 9.432216E+08 0.000000E+00
EigenSolve: 6: 1.853166E+09 0.000000E+00
EigenSolve: 7: 3.374426E+09 0.000000E+00
EigenSolve: 8: 4.686586E+09 0.000000E+00
EigenSolve: 9: 5.644272E+09 0.000000E+00
EigenSolve: 10: 9.030100E+09 0.000000E+00
EigenSolve: 11: 1.373689E+10 0.000000E+00
EigenSolve: 12: 1.878800E+10 0.000000E+00
EigenSolve: 13: 2.028584E+10 0.000000E+00
EigenSolve: 14: 2.899788E+10 0.000000E+00
EigenSolve: 15: 4.055568E+10 0.000000E+00
EigenSolve: --------------------------------

In the joint system I would expect modes to be in similar ranges, with the fluid modes driving some vibrations in the structure that interleave with the structural modes and vice versa (which is what I see in the scanning version of the 3D system).

Not sure how to easily include a screen shot here to show the visualization from Paraview.

As a quick test I also shifted the Eigen system in the joint direct solver, and I still get modes that look quite wrong, and are all more or less at the same frequency, e.g.

EigenSolve: Computed 15 Eigen Values
EigenSolve: 1: 1.944452E+07 1.717087E+03
EigenSolve: 2: 1.944452E+07 -1.717087E+03
EigenSolve: 3: 1.944497E+07 1.678806E+03
EigenSolve: 4: 1.944497E+07 -1.678806E+03
EigenSolve: 5: 1.944506E+07 2.530098E+03
EigenSolve: 6: 1.944506E+07 -2.530098E+03
EigenSolve: 7: 1.944545E+07 -3.256084E+03
EigenSolve: 8: 1.944545E+07 3.256084E+03
EigenSolve: 9: 1.944602E+07 3.956328E+03
EigenSolve: 10: 1.944602E+07 -3.956328E+03
EigenSolve: 11: 1.944675E+07 4.565443E+03
EigenSolve: 12: 1.944675E+07 -4.565443E+03
EigenSolve: 13: 1.944758E+07 5.015769E+03
EigenSolve: 14: 1.944758E+07 -5.015769E+03
EigenSolve: 15: 1.944863E+07 -5.255122E+03
EigenSolve: --------------------------------

From a shift of 1.944972E+07


Cheers,

Eric
eschenk
Posts: 8
Joined: 09 Apr 2024, 07:20
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by eschenk »

A bit more exploration on this one.

First off, I did a bit of reading, I found a number of papers on solving joint fluid structure eigen value problems, which all seemed to indicate that some kind of more complex approach would be needed than simply applying an Eigenvalue solver over the joint block matrices. This rather old paper https://apps.dtic.mil/sti/tr/pdf/ADA220793.pdf (from 1989) points out a number of problems and possible formulations, but the main objection to a displacement/pressure coupling for an Eigenvalue problem cited there is that the resulting system is non-symetric. From reading the code it seems the ARPACK routine DNAUPD being used to solve the eigensystem should not have a problem with that. But, I'm unclear if there is a problem with the coupled system being complex.

This more recent paper goes into a number of approaches to the problem https://www.researchgate.net/publicatio ... nteraction, but at least at my first read and current level of familiarity with Elmer, it's not clear to me any of these can be applied in Elmer without writing some new solvers.

For the 2D case based on ShoeboxFSI2D, I ran a scanned simulation across 1-2000Hz in 1 Hz steps to visulaize the coupled modes. I get modes that are more or less what I expected, but here is an example from around 1401 Hz.
Screenshot 2024-04-10 231755.png
(23.98 KiB) Not downloaded yet
This shows the real part of the fluid potential field, and the corresponding displacement on field on the structural membrane looks like this:
Screenshot 2024-04-10 232616.png
(25.1 KiB) Not downloaded yet
When I solve the joint eigen system, I get back solutions that are all close to 0 if I don't shift the system. If I do shift the system I get back results close to the shift point regardless of where I shift it. These have some structure, but nothing like what I would expect, for example like this:
Screenshot 2024-04-10 232913.png
(157.55 KiB) Not downloaded yet
If I try and shift the system close to a known solution that I found with scanning, the result is a crash during solve.

Code: Select all

BlockSolveInt: Using block preconditioning mode by default
BlockInitMatrix: Block matrix will be of size 2
BlockInitMatrix: Number of field components: 2
BlockInitMatrix: Using existing variable > potential <
BlockInitMatrix: Using existing variable > u <
FsiCouplingAssembly: Creating coupling matrix for FSI
BlockSolveInt: Using monolithic strategy for the block
BlockMonolithicSolve: Solving block matrix as monolithic!
BlockMonolithicSolve: Creating complex system for eigen values!
BlockMonolithicSolve: Size of monolithic matrix: 2706
BlockMonolithicSolve: Estimated number of nonzeros in monolithic matrix: 62412
BlockMonolithicSolve: True number of nonzeros in monolithic matrix: 62412
EigenSolve: .........ERROR:: EigenSolve:  Error with DNAUPD, info =        -9999
Note: The following floating-point exceptions are signalling: IEEE_UNDERFLOW_FLAG IEEE_DENORMAL
STOP 1
The above outut was from the following .sif file run on the ShoeboxFsi2D data set:

Code: Select all

$ AirDensity = 1.21
$ SoundSpeed = sqrt( 1.402 * 0.402 * 716 * 293)


Header
  Mesh DB "." "shoebox2d"
End

Constants
End

Simulation
  Max Output Level = 7
  Coordinate System = Cartesian
  Simulation Type = Steady State
  Output Intervals = 1
  Steady State Max Iterations = 1
  Post File = "modes.vtu"

  Frequency = 10.0
End

Body 1
  Name = "fluid"
  Equation = 1
  Material = 1
  Initial Condition = 1
End

Body 2
  Name = "structure"
  Equation = 2
  Material = 2
End

Initial Condition 1
  Name = "guess p"
  P = Real 1.0e-12
End

Material 1
  Density = Real $ AirDensity
  Sound Speed = $ SoundSpeed
End

Material 2
  Density = 2710.0
  Youngs Modulus = 70e9
  Poisson Ratio = 0.3
End


Equation 1
  Active Solvers(1) = 1
End

Equation 2
  Active Solvers(1) = 2
End


Solver 1
  Equation = "WaveEq"
  Variable = "Potential"
  Procedure = "WaveSolver" "WaveSolver"

  Steady State Convergence Tolerance = 1e-09

  Linear System Solver = "Direct"
  Linear System Direct Method = MUMPS

  Linear System Scaling = Logical False
  Linear System Complex = False

  Eigen System Select = smalllest magnitude
  Eigen Analysis = True
  Eigen System Values = 10
  Eigen System Convergence Tolerance = Real 1.0e-6
  Eigen System Shift = $(1400*3.14159*2)^2
  Eigen System Complex = Logical True

  Automated Fluid-Structure Coupling = Logical True

End



Solver 2
  Equation = Navier Solver
  Variable = -dofs 2 U
  Procedure = "StressSolve" "StressSolver"
  Linear System Complex = False
End


Boundary Condition 1
  Target Boundaries(2) = 5 7
  Name = "Structure Sides"

  U 1 = Real 0.0
  U 2 = Real 0.0
End

Boundary Condition 2
  Target Boundaries(3) = 1 2 4
  Name = "Fluid Sides"
End

Boundary Condition 3
  Target Boundaries(1) = 3
  Name = "Fsi"
  !Save Scalars = True
End

Boundary Condition 4
  Target Boundaries(1) = 6
  Name = "Top"
!  Force 2 = Real -1.0e4
End

So, my key question remains: should I expect this to work at all as is? Or is the problem I'm trying to solve not covered by the current Elmer implementation? I'm willing to dive into code if I need to make some changes, but I'm rusty enough on numerical systems that I'll need some hints to get me started, since this kind of coding has not been my day job for a very long time now.

Cheers,

Eric
Last edited by eschenk on 11 Apr 2024, 09:51, edited 1 time in total.
kevinarden
Posts: 2319
Joined: 25 Jan 2019, 01:28
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by kevinarden »

I do not believe this is the calculation of the eigenvalues of the structure in fluid, which seems to be what your are looking for.
kevinarden
Posts: 2319
Joined: 25 Jan 2019, 01:28
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by kevinarden »

You may be interested in this thread
viewtopic.php?t=7833&hilit=speaker
eschenk
Posts: 8
Joined: 09 Apr 2024, 07:20
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by eschenk »

Thanks Kevin,

I will look at both of those this evening.

I'm actually trying to study a number of questions here. It might help to give a bit more context.
Ultimately, I'm working on understanding the effects of structural choices in soundboard design for guitars. There are number of effects I'm interested in modelling here.

1) The spectral frequency output of the structure of the guitar under vibration at a range of frequencies (sound pressure level) as measured at a fixed point some distance in front of the instrument (say 2m or so). This ends up being a coupled system between the air in the body of the instrument acting as a hemlholtz resonator, and the body of the instrument itself. The first few coupled mode shapes (about 5 of them) are critical to the sound of the instrument, but further modes influence the character of the sound as well. The first mode is driven by the helmholtz resonance of the air coupling with the soundboard (generally in the range of 80-100 Hz, but it depends on the specific geometry and size of the instrument). The second mode is the first eigenmode of the soundboard itself, usually in the 180-200 Hz range. The third may either be the second mode of the soundboard, or the first mode of the back plate of the instrument, depending on construction, with further interesting modes being the higher soundboard modes. The coupling between the air in the instrument, the outer environment via the soundhole, and the instrument itself means that there is a significant different between the in vacuo analysis of the structure and the coupled system.

2) I also want to study the deflection of the instrument itself under various loads. This lets you model how responsive the instrument will be, and if it will be structurally sound when strung up. Generally I'm looking at (1) the angular deflection of the bridge under stead load (say 68kg for a 6 string classical guitar), which is expected to be in a certain range for good acoustic performance. (2) the deflection of the bridge under a small load, to measure the mobility of the vibrating modes, which will be related to the volume of the instrument relative to the string pluck force.

Ultimately I want to do sensitivity studies on changes in the bracing structure. I don't expect to get fully accurate results for any particular real instrument here, but a range of understanding of the effects of design choices, and how to steer the frequencies in a real built instrument by modifying design elements in the bracing.

I started down this path because I am looking at building intruments with additional strings, say 13 rathern than 6. This increases the load on the soundboard, and requires stronger bracing to be structurally sound, but at the same time, you want the instrument to stay responsive to a single string pluck, and the mode shapes need to be controlled to get the sound you are after. If the mode shapes are in the wrong places they negatively interfer with some notes when playing making the instrument impossible to tune, or they just make an instrument that doesn't sound they way you want.

I could just go build a few dozen test instruments, but that is expensive and slow given I'm doing this as a hobby in my spare time.

So far, I've managed to build models that study question (1) by scanning across the coupled simulation, starting from the ShoeboxFSI examples, but I'm not yet generating the spectral sound measurements, just looking at the positions and shapes of the modal frequencies of the coupled system, mostly as they appear on the body of the instrument, principly the soundboard and the back of the instrument.

In principle, I can use the same model to look at question (2), but that doesn't seem problematic, so I haven't spent more time on that just yet. The hard part there will appear to be to extract measurements of specific elements in the structure, but I think I understand how to use paraview to do that.

Here are some pictures of physical modal measurements made against a real instrument by scanning frequencies with a driving speaker.
PXL_20210118_221408104~2-COLLAGE.jpg
(801.68 KiB) Not downloaded yet
I have obtained similar results from Elmer with a coupled system scanning across frequencies.
Screenshot 2024-04-11 095641.png
(567.58 KiB) Not downloaded yet
Screenshot 2024-04-11 095914.png
(183.71 KiB) Not downloaded yet
The reason I am after the eigen frequencies of the coupled system, is that as I tweak design parameters, I'd like to quickly understand where the coupled modes (mostly as reflected on the soundboard) move, and to some extent what their shapes are.

I can run the full scan that I have, but that is currently taking about 1 day to scan from 1-600 Hz, which is rather slower than I would like for tweaking various parameters of the structure to see what happens. I was hoping that by being able to do the coupled Eigen Analysis, I could quickly identify how the structural changes cause the coupled modes to move.

Later on I'll want to look at how I reproduce the sound pressure level spectral responses, but I'm less worried about that immediately than I am about doing the sensitivity studies on the design space.

Hopefully this makes some sense!

Cheers,

Eric
Last edited by eschenk on 11 Apr 2024, 22:56, edited 1 time in total.
kevinarden
Posts: 2319
Joined: 25 Jan 2019, 01:28
Antispam: Yes

Re: Coupled Fluid-Structure Eigen Analysis

Post by kevinarden »

It looks like progress. The most help is available if you can post a complete case, sif and mesh. And ask questions around that. I use github to post mine.

Not necessarily a related case, but an example of a github repository

https://github.com/mrkearden/harmonic_response
Post Reply