Hello,
I want to carry out a modal analysis of a full coupled system (piezoelectric system with displacements and potential as unknowns), which renders the eigenvalues and eigenvectors of the system.
The following blockmatrices describe the system. The first line describes the mechanical displacements while the second line is for the electric potential:
_ _
I I¯ M 0 ¯I *eigenvalue + I¯ Kmm Kme ¯I I *eigenvector =0
I I_ 0 0 _I I_ Kme Kee _I I
¯ ¯
When I express the potential with the displacements I get for the eigenvalueproblem:
potential=-(Kee)^-1*Kem *displacements
-> [M*eigenvalue+(Kmm-Kme*(Kee)^-1*Kem)]*eigenvector=0;
I implemented this with linear operators in the following way:
const auto &Kmm=stiffness.block(0,0); const auto op_Kmm = linear_operator(Kmm);
const auto &Kme=stiffness.block(0,1); const auto op_Kme = linear_operator(Kme);
const auto &Kem=stiffness.block(1,0); const auto op_Kem = linear_operator(Kem);
const auto &Kee=stiffness.block(1,1); const auto op_Kee = linear_operator(Kee);
const auto &M = mass.block(0,0); const auto op_M = linear_operator(M);
//Kee^1
ReductionControl reduction_control_Kee(200000, 1.0e-18, 1.0e-10);
SolverCG<> solver_Kee(reduction_control_Kee);
PreconditionJacobi<> preconditioner_Kee;
preconditioner_Kee.initialize(Kee);
const auto op_Kee_inv = inverse_operator(op_Kee, solver_Kee, preconditioner_Kee);
//K_Piezo=Kmm-Kme*(Kee)^-1*Kem
const auto op_K_Piezo=op_Kmm-op_Kme*op_Kee_inv*op_Kem;
//(K_Piezo)^-1 for Arpack solver
SolverControl solver_control_K_Piezo(200000, 1.0e-10);
SolverCG<> solver_K_Piezo(solver_control_K_Piezo);
const auto op_K_Piezo_inv=inverse_operator(op_K_Piezo, solver_K_Piezo, PreconditionIdentity()); Here I need a preconditioner
//solve Eigenproblem
SolverControl solver_control(dof_handler.n_dofs(), 1e-10);
ArpackSolver eigensolver(solver_control);//, additional_data);
eigensolver.solve(op_K_Piezo, op_M, op_K_Piezo_inv, eigenvalues_Arpack, eigenfunctions_Arpack, eigenvalues_Arpack.size());
This works but the code is very slow because I dont know how to build a preconditioner out of a linear operator. The following Questions arises:
1. Is it possible to build a preconditioner out of a linear operator in my application?
2. Are there better ways to solve this Eigenproblem, maybe with another solver?
Thank you very much in advance, every help is welcomed!
Andreas