CHROMA
Public Member Functions | List of all members
Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q > Class Template Reference

Even-odd and time preconditioned linear operator. More...

#include <teoprec_logdet_linop.h>

Inheritance diagram for Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >:
Chroma::EvenOddTimePrecLinearOperator< T, P, Q > Chroma::DiffLinearOperator< T, P, Q > Chroma::LinearOperator< T >

Public Member Functions

virtual ~EvenOddTimePrecLogDetLinearOperator ()
 Virtual destructor to help with cleanup;. More...
 
const Subset & subset () const
 Only defined on the odd lattice. More...
 
virtual void deriv (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const
 Apply the derivative of the operator onto a source std::vector. More...
 
virtual void derivEvenEvenTimeLinOp (P &ds_u, const T &chi, const T &psi, enum PlusMinus isign) const
 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
 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
 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
 Apply the the odd-odd block onto a source std::vector. More...
 
- Public Member Functions inherited from Chroma::EvenOddTimePrecLinearOperator< T, P, Q >
virtual ~EvenOddTimePrecLinearOperator ()
 Virtual destructor to help with cleanup;. 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 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
 

Detailed Description

template<typename T, typename P, typename Q>
class Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >

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.

Here A^{-1}_{ee} does depend on the gauge fields but we can exactly simulate the determinant without pseudofermion fields since we know det A_{ee} and can write it in the action as exp( log det A ) = exp( Tr Ln A )

Since we can explicitly evaluate Tr Ln A for the action, we can also evaluate the force contribution

d/dt ( Tr Ln A ) = Tr ( (d/dt)A A^{-1} )

and d/dt ( A^{-1} ) = A^{-1} [ (d/dt)A ] A^{-1}

hence we have functions logDetEvenEvenLinOp() and derivEvenEvenLinOp() and derivLogDetEvenEvenLinOp()

Definition at line 131 of file teoprec_logdet_linop.h.

Constructor & Destructor Documentation

◆ ~EvenOddTimePrecLogDetLinearOperator()

template<typename T , typename P , typename Q >
virtual Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::~EvenOddTimePrecLogDetLinearOperator ( )
inlinevirtual

Virtual destructor to help with cleanup;.

Definition at line 135 of file teoprec_logdet_linop.h.

Member Function Documentation

◆ deriv()

template<typename T , typename P , typename Q >
virtual void Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::deriv ( P ds_u,
const T chi,
const T psi,
enum PlusMinus  isign 
) const
inlinevirtual

◆ derivEvenEvenTimeLinOp()

template<typename T , typename P , typename Q >
virtual void Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::derivEvenEvenTimeLinOp ( P ds_u,
const T chi,
const T psi,
enum PlusMinus  isign 
) const
inlinevirtual

Apply the even-even block onto a source std::vector.

Implements Chroma::EvenOddTimePrecLinearOperator< T, P, Q >.

Definition at line 238 of file teoprec_logdet_linop.h.

Referenced by Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::deriv().

◆ derivEvenOddSpaceLinOp()

template<typename T , typename P , typename Q >
virtual void Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::derivEvenOddSpaceLinOp ( P ds_u,
const T chi,
const T psi,
enum PlusMinus  isign 
) const
inlinevirtual

Apply the the even-odd block onto a source std::vector.

Implements Chroma::EvenOddTimePrecLinearOperator< T, P, Q >.

Definition at line 246 of file teoprec_logdet_linop.h.

◆ derivOddEvenSpaceLinOp()

template<typename T , typename P , typename Q >
virtual void Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::derivOddEvenSpaceLinOp ( P ds_u,
const T chi,
const T psi,
enum PlusMinus  isign 
) const
inlinevirtual

Apply the the odd-even block onto a source std::vector.

Implements Chroma::EvenOddTimePrecLinearOperator< T, P, Q >.

Definition at line 254 of file teoprec_logdet_linop.h.

◆ derivOddOddTimeLinOp()

template<typename T , typename P , typename Q >
virtual void Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::derivOddOddTimeLinOp ( P ds_u,
const T chi,
const T psi,
enum PlusMinus  isign 
) const
inlinevirtual

Apply the the odd-odd block onto a source std::vector.

Implements Chroma::EvenOddTimePrecLinearOperator< T, P, Q >.

Definition at line 262 of file teoprec_logdet_linop.h.

Referenced by Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::deriv().

◆ subset()

template<typename T , typename P , typename Q >
const Subset& Chroma::EvenOddTimePrecLogDetLinearOperator< T, P, Q >::subset ( void  ) const
inlinevirtual

Only defined on the odd lattice.

Reimplemented from Chroma::EvenOddTimePrecLinearOperator< T, P, Q >.

Definition at line 138 of file teoprec_logdet_linop.h.


The documentation for this class was generated from the following file: