SundancePCDPreconditioner.cpp
Go to the documentation of this file.
00001 #include "SundancePCDPreconditioner.hpp"
00002 #include "Sundance.hpp"
00003 #include "TSFLinearSolverBuilder.hpp"
00004 #include "TSFLinearSolverImpl.hpp"
00005 #include "TSFSimpleIdentityOpDecl.hpp"
00006 #include "TSFSimpleComposedOpDecl.hpp"
00007 #include "TSFSimpleBlockOpDecl.hpp"
00008 #include "TSFSimpleScaledOpDecl.hpp"
00009 #include "TSFGenericRightPreconditioner.hpp"
00010 #include "TSFLinearCombinationImpl.hpp"
00011 
00012 using namespace TSFExtended;
00013 using namespace Sundance;
00014 
00015 PCDPreconditionerFactory::PCDPreconditionerFactory(
00016   const ParameterList& params,
00017   const LinearProblem& MpProb,
00018   const LinearProblem& ApProb,
00019   const LinearProblem& FpProb
00020   )
00021   : MpProb_(MpProb),
00022     ApProb_(ApProb),
00023     FpProb_(FpProb),
00024     MpSolver_(),
00025     ApSolver_(),
00026     FSolver_()
00027 {
00028   ParameterList msParams = params.sublist("MpSolver");
00029   MpSolver_ = LinearSolverBuilder::createSolver(msParams);
00030   ParameterList asParams = params.sublist("ApSolver");
00031   ApSolver_ = LinearSolverBuilder::createSolver(asParams);
00032   ParameterList fsParams = params.sublist("FSolver");
00033   FSolver_ = LinearSolverBuilder::createSolver(fsParams);
00034 }
00035 
00036 Preconditioner<double> 
00037 PCDPreconditionerFactory::
00038 createPreconditioner(const LinearOperator<double>& K) const
00039 {
00040   Tabs tab;
00041 
00042   LinearOperator<double> F = K.getBlock(0,0);
00043   F.setName("F");
00044   LinearOperator<double> FInv = inverse(F, FSolver_);
00045   FInv.setName("FInv");
00046   LinearOperator<double> Bt = K.getBlock(0,1);
00047   Bt.setName("Bt");
00048 
00049 
00050   LinearOperator<double> Fp = FpProb_.getOperator();
00051 
00052   LinearOperator<double> Mp = MpProb_.getOperator();
00053   Mp.setName("Mp");
00054 
00055   LinearOperator<double> MpInv = inverse(Mp, MpSolver_);
00056   MpInv.setName("MpInv");
00057 
00058   LinearOperator<double> Ap = ApProb_.getOperator();
00059   Ap.setName("Ap");
00060 
00061   LinearOperator<double> ApInv = inverse(Ap, ApSolver_);
00062   ApInv.setName("ApInv");
00063 
00064 
00065   VectorSpace<double> pDomain = Bt.domain();
00066   VectorSpace<double> uDomain = F.domain();
00067 
00068   LinearOperator<double> Iu = identityOperator(uDomain);
00069   Iu.setName("Iu");
00070   LinearOperator<double> Ip = identityOperator(pDomain);
00071   Ip.setName("Ip");
00072 
00073   LinearOperator<double> XInv = MpInv * Fp * ApInv;
00074 
00075   VectorSpace<double> rowSpace = K.range();
00076   VectorSpace<double> colSpace = K.domain();
00077    
00078   LinearOperator<double> Q1 = makeBlockOperator(colSpace, rowSpace);
00079   Q1.setName("Q1");
00080   LinearOperator<double> Q2 = makeBlockOperator(colSpace, rowSpace);
00081   Q2.setName("Q2");
00082   LinearOperator<double> Q3 = makeBlockOperator(colSpace, rowSpace);
00083   Q3.setName("Q3");
00084    
00085   Q1.setBlock(0, 0, FInv);
00086   Q1.setBlock(1, 1, Ip);
00087   Q1.endBlockFill();
00088    
00089   Q2.setBlock(0, 0, Iu);
00090   Q2.setBlock(0, 1, -1.0*Bt);
00091   Q2.setBlock(1, 1, Ip);
00092   Q2.endBlockFill();
00093    
00094   Q3.setBlock(0, 0, Iu);
00095   Q3.setBlock(1, 1, -1.0*XInv);
00096   Q3.endBlockFill();
00097    
00098   LinearOperator<double> P1 = Q2 * Q3;
00099   LinearOperator<double> PInv = Q1 * P1;
00100 
00101   return new GenericRightPreconditioner<double>(PInv);
00102 }
00103 
00104 

Site Contact