Tutorial 03 A Local Eigenvalue Solver
This tutorial will teach you the details of the local eigenvalue solver. The solver is a generalization of the method of successive linear problems [1], in the sense that it enables not only Newton's method for root finding, but also high order Householder iterations. The implementation closely follows the considerations in [2].
Model set-up.
The model is the same Rijke tube configuration as in Tutorial 01:
using WavesAndEigenvalues.Helmholtz
mesh=Mesh("Rijke_mm.msh",scale=0.001) #load mesh
dscrp=Dict() #initialize model descriptor
dscrp["Interior"]=(:interior, ()) #define resonant cavity
dscrp["Outlet"]=(:admittance, (:Y,1E15)) #specify outlet BC
γ=1.4 #ratio of specific heats
ρ=1.225 #density at the reference location upstream to the flame in kg/m^3
Tu=300.0 #K unburnt gas temperature
Tb=1200.0 #K burnt gas temperature
P0=101325.0 #ambient pressure in Pa
A=pi*0.025^2 #cross sectional area of the tube
Q02U0=P0*(Tb/Tu-1)*A*γ/(γ-1) #the ratio of mean heat release to mean velocity Q02U0
x_ref=[0.0; 0.0; -0.00101] #reference point
n_ref=[0.0; 0.0; 1.00] #directional unit vector of reference velocity
n=0.01 #interaction index
τ=0.001 #time delay
dscrp["Flame"]=(:flame,(γ,ρ,Q02U0,x_ref,n_ref,:n,:τ,n,τ)) #flame dynamics
R=287.05 # J/(kg*K) specific gas constant (air)
speedofsound(x,y,z) = z<0. ? sqrt(γ*R*Tu) : sqrt(γ*R*Tb)
c=generate_field(mesh,speedofsound)
L=discretize(mesh,dscrp,c)
1006×1006-dimensional operator family: ω^2*M+K+n*exp(-iωτ)*Q+ω*Y*C Parameters ---------- n 0.01 + 0.0im λ Inf + 0.0im ω 0.0 + 0.0im τ 0.001 + 0.0im Y 1.0e15 + 0.0im
The local solver
The key idea behind the local solver is simple: The eigenvalue problem L(ω)p==0
is reinterpreted as L(ω)p == λ*Y*p
. This means, the nonlinear eigenvalue ω
becomes a parameter in a linear eigenvalue problem with (auxiliary) eigenvalue λ
. If an ω
is found such that λ==0
, this very ω
solves the original non-linear eigenvalue problem. Because the auxiliary eigenvalue problem is linear the implicit relation λ=λ(ω)
can be examined with established perturbation theory of linear eigenvalue problems. This theory can be used to compute the derivative dλ/dω
and iteratively find the root of λ=λ(ω)
. Each of these iterations requires solving a linear eigenvalue problem and higher order derivatives improve the iteration. The options of the local-solver mslp
allows the user to control the solution process.
Mandatory inputs
Mandatory input arguments are only the linear operator family L
and an initial guess z
for the eigenvalue ω
` iteration.
z=300.0*2*pi
sol,nn,flag = mslp(L, z)
(####Solution#### eigval: ω = 1710.697777239353 + 9.615018460173289im Parameters: n = 0.01 + 0.0im λ = 5.651909078169025e-9 - 2.1943594673003478e-9im τ = 0.001 + 0.0im Y = 1.0e15 + 0.0im , 10, 1)
Maximum iterations
As per default five iterations are performed. This iteration number can be customized using the keyword maxiter
For instance the following command runs 30 iterations
sol,nn,flag = mslp(L, z, maxiter=30)
(####Solution#### eigval: ω = 1710.6977772393518 + 9.615018460173305im Parameters: n = 0.01 + 0.0im λ = 9.760252616451751e-10 + 3.336860359086741e-11im τ = 0.001 + 0.0im Y = 1.0e15 + 0.0im , 30, 1)
A stopping crtierion
Usually, the procedure converges after a few iteration steps and further iterations do not significantly improve the solution. For this reason the keyword tol
allows for setting a threshold, such that two consecutive iterates for the eigenvalue fulfill abs(ω_0-ω_1)
, the iteration is terminated. This keyword defaults to tol=0.0
and, thus, maxiter
iterations will be performed. However, it is highly recommended to set the parameter to some positive value whenever possible.
sol,nn,flag = mslp(L, z, maxiter=30, tol=1E-10)
(####Solution#### eigval: ω = 1710.6977772393564 + 9.615018460168587im Parameters: n = 0.01 + 0.0im λ = 4.764019356461564e-8 + 1.294322420737599e-9im τ = 0.001 + 0.0im Y = 1.0e15 + 0.0im , 5, 0)
Note that the tolerance is also a bound for the error associated with the computed eigenvalue. Tip: The 64-bit floating numbers have an accuracy of eps≈1E-16
. Hence, the threshold tol
should not be chosen less than 16 orders of magnitude smaller than the expected eigenvalue. Indeed, tol=1E-10
is already close to the machine-precision we can expect for the Rijke-tube model.
Convergence checks
Technically, the iteration may stop because of slow progress in the iteration rather than actual convergence. A simple indicator for actual convergence is the auxiliary eigenvalue λ
. The closer it is to 0
the better is the quality of the computed solution. To help the identification of falsely terminated iterations you can specify another tolerance lam_tol
. If abs(λ)>lam_tol
the computed eigenvalue is deemed to be spurious. This feature only makes sense when a termination threshold has been specified. As in the following example:
sol,nn,flag = mslp(L, z, maxiter=30, tol=1E-10, lam_tol=1E-8)
(####Solution#### eigval: ω = 1710.6977772393564 + 9.615018460168587im Parameters: n = 0.01 + 0.0im λ = 4.764019356461564e-8 + 1.294322420737599e-9im τ = 0.001 + 0.0im Y = 1.0e15 + 0.0im , 5, 2)
Faster convergence
In order to improve the convergence rate, higher-order derivatives may be computed. You high-order perturbation theory to improve the iteration via the order
keyword. For instance, third-order theory is used in this example
sol,nn,flag = mslp(L, z, maxiter=30, tol=1E-10, lam_tol=1E-8, order=3)
(####Solution#### eigval: ω = 1710.697777239355 + 9.61501846017461im Parameters: n = 0.01 + 0.0im λ = 1.3232946190208242e-8 - 2.641362455195392e-9im τ = 0.001 + 0.0im Y = 1.0e15 + 0.0im , 3, 2)
Under the hood the routine calls ARPACK to utilize Arnoldi's method to solve the linear (auxiliary) eigenvalue problem. This method can compute more than one eigenvalue close to some initial guess. Per default, only one is sought but via the nev
keyword the number can be increased. This results in an increased computation time but provides more candidates for the next iteration, potentially improving the convergence.
sol,nn,flag = mslp(L, z, maxiter=30, tol=1E-10, lam_tol=1E-8, nev=3)
(####Solution#### eigval: ω = 1710.6977772393564 + 9.615018460168587im Parameters: n = 0.01 + 0.0im λ = 4.764019356461564e-8 + 1.294322420737599e-9im τ = 0.001 + 0.0im Y = 1.0e15 + 0.0im , 5, 2)
Summary
Iterative solver like the mslp
solver are a great opportunity to refine solutions found from Beyn's integration-based method. The tutorial gave you more insight in how to use the keywords for mslp
.
The next tutorial will explain how to post-process highly accurate solutions from an iterative solver using perturbation theory.
References
[1] S. Güttel and F. Tisseur, The Nonlinear Eigenvalue Problem, 2017, http://eprints.ma.man.ac.uk/2538/
[2] G.A. Mensah, A. Orchini, J.P. Moeck, Perturbation theory of nonlinear, non-self-adjoint eigenvalue problems: Simple eigenvalues, JSV, 2020, doi:10.1016/j.jsv.2020.115200
This page was generated using Literate.jl.