CHROMA
|
Even-odd and time preconditioned linear operator. More...
#include <teoprec_linop.h>
Public Member Functions | |
virtual | ~EvenOddTimePrecLinearOperator () |
Virtual destructor to help with cleanup;. More... | |
const Subset & | subset () const |
Only defined on the odd lattice. More... | |
virtual void | evenEvenTimeLinOp (T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the even-even block onto a source std::vector. More... | |
virtual void | evenEvenTimeInvLinOp (T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the inverse of the even-even block onto a source std::vector. More... | |
virtual void | evenOddSpaceLinOp (T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the the even-odd block onto a source std::vector. More... | |
virtual void | oddEvenSpaceLinOp (T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the the odd-even block onto a source std::vector. More... | |
virtual void | oddOddTimeLinOp (T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the the odd-odd block onto a source std::vector. More... | |
virtual void | operator() (T &chi, const T &psi, enum PlusMinus isign) const |
Apply the operator onto a source std::vector. More... | |
virtual void | unprecLinOp (T &chi, const T &psi, enum PlusMinus isign) const |
Apply the UNPRECONDITIONED operator onto a source std::vector. More... | |
virtual void | derivEvenEvenTimeLinOp (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the even-even block onto a source std::vector. More... | |
virtual void | derivEvenOddSpaceLinOp (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the the even-odd block onto a source std::vector. More... | |
virtual void | derivOddEvenSpaceLinOp (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the the odd-even block onto a source std::vector. More... | |
virtual void | derivOddOddTimeLinOp (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the the odd-odd block onto a source std::vector. More... | |
virtual void | deriv (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const =0 |
Apply the derivative of the operator onto a source std::vector. More... | |
virtual void | derivUnprecLinOp (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const |
Apply the derivative of the UNPRECONDITIONED operator onto a source std::vector. More... | |
Public Member Functions inherited from Chroma::DiffLinearOperator< T, P, Q > | |
virtual | ~DiffLinearOperator () |
Virtual destructor to help with cleanup;. More... | |
virtual const FermBC< T, P, Q > & | getFermBC () const =0 |
Return the fermion BC object for this linear operator. More... | |
virtual void | deriv (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign, const Real &epsilon) const |
Apply the derivative of the operator onto a source std::vector to some precision. More... | |
virtual void | derivMultipole (P &ds_u, const multi1d< T > &chi, const multi1d< T > &psi, enum PlusMinus isign) const |
Return the force for multiple poles. More... | |
Public Member Functions inherited from Chroma::LinearOperator< T > | |
virtual | ~LinearOperator () |
Virtual destructor to help with cleanup;. More... | |
virtual void | operator() (T &chi, const T &psi, enum PlusMinus isign, Real epsilon) const |
Apply the operator onto a source std::vector to some precision. More... | |
virtual unsigned long | nFlops () const |
Even-odd and time preconditioned linear operator.
Given a matrix M written in separate time and space operators
M = D_t + D_s
The time preconditioning consists of multiplying by the inverse of the time operator to give
M' = 1 + D_t^(-1)*D_s
For spatial even-odd precond., this interface requires the D_t to be diagonal in spatial components - have no space-space or space-time components. Hence, this means no even-odd component. Also, the D_s must no time coupling, and no even-even or odd-odd component - e.g. all diagonal terms have been pushed into D_t.
Rewrite M' into block form:
[ A D ] [ E,E E,O ]
M' = [ ] [ D A ] [ O,E O,O ]
where the E,O refer to only the spatial dimensions and
A(e,e) = 1 + D_t^(-1)(e,e) * D_s(e,e) -> 1 # D_s(e,e)=0 D(e,o) = D_t^(-1)(e,e) * D_s(e,o) # is a matrix in time-time D(o,e) = D_t^(-1)(o,o) * D_s(o,e) # is a matrix in time-time A(o,o) = 1 + D_t^(-1)(o,o) * D_s(o,o) -> 1 # D_s(o,o)=0
A(e,e)^(-1) = <diagonal in space, matrix in time-time components>
Spatial even-odd preconditioning consists of using the triangular matrices
[ 1 0 ] [ E,E E,O ]
L = [ ] [ D A^(-1) 1 ] [ O,E E,E O,O ]
and
[ A D ] [ E,E E,O ]
U = [ ] [ 0 1 ] [ O,E O,O ]
The preconditioned matrix is formed from
~ M = L^-1 * M' * U^-1
where
[ 1 0 ] [ E,E E,O ]
L^(-1) = [ ] [ - D A^(-1) 1 ] [ O,E E,E O,O ]
and
[ A^(-1) - A^(-1) D ] [ E,E E,E E,O ]
U^(-1) = [ ] [ 0 1 ] [ O,E O,O ]
Resulting in a new M
[ 1 0 ]
~ [ E,E E,O ] M = [ ] [ 0 A - D A^(-1) D ] [ O,E O,O O,E E,E E,O ]
This class is used to implement the resulting linear operator
~ M = A(o,o) - D(o,e) * A^-1(e,e) * D(e,o) = 1 - D_t^(-1)(o,o) * D_s(o,e) * D_t^(-1)(e,e) * D_s(e,o)
~ M^dag = 1 - D_s(o,e)^dag * D_t^(-1)(e,e)^dag * D_s(e,o)^dag * D_t^(-1)(o,o)^dag
By construction, the linear operator is ONLY defined on the odd subset
The non-symmetrical nature of the daggered version means the two cases (no-dagger and dagger) must be handled separately. This is in contrast to the standard (4D) even-odd precond. case where the the daggered version has the same structure, except the dagger is pushed down into the individual pieces.
Definition at line 115 of file teoprec_linop.h.
|
inlinevirtual |
Virtual destructor to help with cleanup;.
Definition at line 119 of file teoprec_linop.h.
|
pure virtual |
Apply the derivative of the operator onto a source std::vector.
User should make sure deriv routines do a resize
Reimplemented from Chroma::DiffLinearOperator< T, P, Q >.
Implemented in Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >.
|
pure virtual |
Apply the even-even block onto a source std::vector.
Implemented in Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >.
Referenced by Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivUnprecLinOp().
|
pure virtual |
Apply the the even-odd block onto a source std::vector.
Implemented in Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >.
Referenced by Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivUnprecLinOp().
|
pure virtual |
Apply the the odd-even block onto a source std::vector.
Implemented in Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >.
Referenced by Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivUnprecLinOp().
|
pure virtual |
Apply the the odd-odd block onto a source std::vector.
Implemented in Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >.
Referenced by Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivUnprecLinOp().
|
inlinevirtual |
Apply the derivative of the UNPRECONDITIONED operator onto a source std::vector.
Mainly intended for debugging
Definition at line 217 of file teoprec_linop.h.
References Chroma::chi(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivEvenEvenTimeLinOp(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivEvenOddSpaceLinOp(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivOddEvenSpaceLinOp(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::derivOddOddTimeLinOp(), Chroma::isign, Chroma::psi, and tmp2.
|
pure virtual |
Apply the inverse of the even-even block onto a source std::vector.
Referenced by Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::deriv(), and Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::operator()().
|
pure virtual |
Apply the even-even block onto a source std::vector.
This does not need to be optimized
Referenced by Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::unprecLinOp().
|
pure virtual |
Apply the the even-odd block onto a source std::vector.
Referenced by Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::deriv(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::operator()(), and Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::unprecLinOp().
|
pure virtual |
Apply the the odd-even block onto a source std::vector.
Referenced by Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::deriv(), and Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::unprecLinOp().
|
pure virtual |
Apply the the odd-odd block onto a source std::vector.
Referenced by Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::unprecLinOp().
|
inlinevirtual |
Apply the operator onto a source std::vector.
Implements Chroma::LinearOperator< T >.
Definition at line 146 of file teoprec_linop.h.
References Chroma::chi(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::evenEvenTimeInvLinOp(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::evenOddSpaceLinOp(), Chroma::isign, Chroma::MINUS, Chroma::PLUS, Chroma::psi, and tmp2.
|
inlinevirtual |
Only defined on the odd lattice.
Implements Chroma::LinearOperator< T >.
Reimplemented in Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >.
Definition at line 122 of file teoprec_linop.h.
|
inlinevirtual |
Apply the UNPRECONDITIONED operator onto a source std::vector.
Mainly intended for debugging
Definition at line 179 of file teoprec_linop.h.
References Chroma::chi(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::evenEvenTimeLinOp(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::evenOddSpaceLinOp(), Chroma::isign, Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::oddEvenSpaceLinOp(), Chroma::EvenOddTimePrecLinearOperator< T, P, Q >::oddOddTimeLinOp(), Chroma::psi, and tmp2.