6 #ifndef MYRAMATH_MULTIFRONTAL_LU_SCHURSOLVEU_H 7 #define MYRAMATH_MULTIFRONTAL_LU_SCHURSOLVEU_H 16 #include <myramath/multifrontal/detail/schursolve.h> 19 namespace multifrontal {
21 namespace schursolveu {
23 template<
class Number>
class JobGraphBase :
public ::myra::multifrontal::detail::schursolve::JobGraphBase2<Number>
29 typedef ::myra::multifrontal::detail::schursolve::JobGraphBase2<Number> Base;
32 typedef ::myra::multifrontal::detail::lu::LUContainer<Kernel>
LUContainer;
33 typedef ::myra::multifrontal::detail::XContainer<Number>
XContainer;
34 typedef ::myra::multifrontal::detail::XContributor<Number> XContributor;
37 JobGraphBase(
const LUContainer* in_lucontainer, XContainer* in_xcontainer,
const XContributor* in_xcontributor)
38 : Base(&in_xcontainer->tree(), in_xcontainer, in_xcontributor), lucontainer(in_lucontainer), xcontainer(in_xcontainer), xcontributor(in_xcontributor) { }
41 virtual ::myra::JobGraphBase* clone()
const 47 const Kernel& u(
int n,
int ij)
const 48 {
return lucontainer->lu(this->s2a(n),ij); }
50 {
return lucontainer->lu(this->s2a(n),i,j); }
53 virtual uint64_t backsolve(
int n,
int k,
int j)
56 if (k == 0) this->assign_contributions(n,k,j);
58 const Kernel& Un_kk = this->u(n,k);
59 return Un_kk.
solveU(Bn_kj,
'L',
'T');
63 virtual uint64_t downdate(
int n,
int k,
int i,
int j)
73 Number beta = k ? one : zero;
74 uint64_t w = gemm_nwork(Bn_ij, Un_ki,
'T', Xn_kj,
'N', -one, beta);
76 if (k == 0) this->add_contributions(n,i,j);
83 const LUContainer* lucontainer;
86 XContainer* xcontainer;
87 const XContributor* xcontributor;
Represents a const MatrixRange.
Definition: bothcat.h:22
Factors A into L*U, presents solve methods.
Definition: Kernel.h:35
Definition: schursolveu.h:23
Represents a mutable MatrixRange.
Definition: conjugate.h:26
uint64_t solveU(const MatrixRange< Number > &B, char side, char op) const
Solves op(U)*X=B or X*op(U)=B, overwrites B with X.
Definition: Kernel.h:135
Definition: partialsolve.h:32
Definition: schurgemm.h:25