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

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to dealii+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/dealii/96b55f2e-2d69-4ead-a8d5-9df3056ec3af%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to