1 #ifndef DUNE_FEM_LDLSOLVER_HH 2 #define DUNE_FEM_LDLSOLVER_HH 47 template<
class DF,
class Op>
48 class LDLOp:
public Operator<DF, DF>
51 typedef DF DiscreteFunctionType;
52 typedef Op OperatorType;
55 typedef ColCompMatrix<typename OperatorType::MatrixType::MatrixBaseType> CCSMatrixType;
56 typedef typename DiscreteFunctionType::DofType DofType;
57 typedef typename DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
66 LDLOp(
const OperatorType& op,
const double& redEps,
const double& absLimit,
const int& maxIter,
const bool& verbose,
68 op_(op), verbose_(verbose), ccsmat_(), isloaded_(false)
77 LDLOp(
const OperatorType& op,
const double& redEps,
const double& absLimit,
const int& maxIter,
79 op_(op), verbose_(parameter.getValue<bool>(
"fem.solver.verbose",false)), ccsmat_(), isloaded_(false)
83 op_(op), verbose_(parameter.getValue<bool>(
"fem.solver.verbose",false)), ccsmat_(), isloaded_(false)
93 void operator()(
const DiscreteFunctionType& arg, DiscreteFunctionType& dest)
const 101 template<
typename... A>
102 void prepare(A... )
const 106 ccsmat_ = op_.systemMatrix().matrix();
113 inline void finalize()
const 135 void apply(
const DofType*& arg, DofType*& dest)
const 137 const std::size_t dimMat(ccsmat_.N());
138 ldl_perm(dimMat, Y_, const_cast<DofType*>(arg), P_);
139 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);
140 ldl_dsolve(dimMat, Y_, D_);
141 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);
142 ldl_permt(dimMat, dest, Y_, P_);
151 void apply(
const AdaptiveDiscreteFunction<DiscreteFunctionSpaceType>& arg,
152 AdaptiveDiscreteFunction<DiscreteFunctionSpaceType>& dest)
const 154 const DofType* argPtr(arg.leakPointer());
155 DofType* destPtr(dest.leakPointer());
156 apply(argPtr,destPtr);
165 void apply(
const ISTLBlockVectorDiscreteFunction<DiscreteFunctionSpaceType>& arg,
166 ISTLBlockVectorDiscreteFunction<DiscreteFunctionSpaceType>& dest)
const 169 std::vector<DofType> vecArg(arg.size());
170 std::copy(arg.dbegin(),arg.dend(),vecArg.begin());
171 std::vector<DofType> vecDest(dest.size());
173 const DofType* argDataPtr(vecArg.data());
174 DofType* destDataPtr(vecDest.data());
175 apply(argDataPtr,destDataPtr);
177 std::copy(vecDest.begin(),vecDest.end(),dest.dbegin());
180 inline void printTexInfo(std::ostream& out)
const 182 out<<
"Solver: LDL direct solver";
186 inline double averageCommTime()
const 191 inline int iterations()
const 199 inline DofType*& getD()
223 inline DofType*& getLx()
231 inline CCSMatrixType& getCCSMatrix()
237 const OperatorType& op_;
239 mutable CCSMatrixType ccsmat_;
240 mutable bool isloaded_;
242 mutable int* Parent_;
245 mutable int* Pattern_;
250 mutable DofType* Lx_;
254 void decompose()
const 257 const std::size_t dimMat(ccsmat_.N());
258 D_ =
new DofType [dimMat];
259 Y_ =
new DofType [dimMat];
260 Lp_ =
new int [dimMat + 1];
261 Parent_ =
new int [dimMat];
262 Lnz_ =
new int [dimMat];
263 Flag_ =
new int [dimMat];
264 Pattern_ =
new int [dimMat];
265 P_ =
new int [dimMat];
266 Pinv_ =
new int [dimMat];
268 double Info [AMD_INFO];
269 if(amd_order (dimMat, ccsmat_.getColStart(), ccsmat_.getRowIndex(), P_, (DofType *) NULL, Info) < AMD_OK)
270 std::cout<<
"WARNING: call to AMD failed."<<std::endl;
274 ldl_symbolic(dimMat, ccsmat_.getColStart(), ccsmat_.getRowIndex(), Lp_, Parent_, Lnz_, Flag_, P_, Pinv_);
276 Lx_ =
new DofType [Lp_[dimMat]];
277 Li_ =
new int [Lp_[dimMat]];
279 const int rank(ldl_numeric(dimMat, ccsmat_.getColStart(), ccsmat_.getRowIndex(), ccsmat_.getValues(),
280 Lp_, Parent_, Lnz_, Li_, Lx_, D_, Y_, Pattern_, Flag_, P_, Pinv_));
288 std::cout<<
"WARNING: matrix is singular."<<std::endl;
295 #endif // #if HAVE_SPQR 297 #endif // #ifndef DUNE_FEM_SPQRSOLVER_HH
BasicParameterReader< std::function< const std::string *(const std::string &, const std::string *) > > ParameterReader
Definition: reader.hh:264
Definition: coordinate.hh:4
static ParameterContainer & container()
Definition: io/parameter.hh:190