adjoint_linop_csp Derived Type

type, public, extends(abstract_linop_csp) :: adjoint_linop_csp

Utility type to define an adjoint linear operator. The definition of matvec and rmatvec are directly inherited from those used to define A. Note that this utility does not compute the adjoint for you. It simply provides a utility to define a new operator with matvec and rmatvec being switched.


Components

Type Visibility Attributes Name Initial
class(abstract_linop_csp), public, allocatable :: A

Linear operator whose adjoint needs to be defined.

type(lightkrylov_timer), public :: matvec_timer = lightkrylov_timer('matvec timer')
type(lightkrylov_timer), public :: rmatvec_timer = lightkrylov_timer('rmatvec timer')

Type-Bound Procedures

procedure, public, pass(self) :: apply_matvec => apply_matvec_csp

Wrapper for matvec including the counter increment

procedure, public, pass(self) :: apply_rmatvec => apply_rmatvec_csp

Wrapper for rmatvec including the counter increment

procedure, public, pass(self) :: finalize_timer => finalize_linop_timer

Finalize timers and print complete history_info

  • private subroutine finalize_linop_timer(self)

    Finalize the matvec/rmatvec timers Note: Wrapper of the corresponding routine from lightkrylov_timer

    Arguments

    Type IntentOptional Attributes Name
    class(abstract_linop), intent(inout) :: self

procedure, public, pass(self) :: get_counter

Return matvec/rmatvec counter value

  • private pure function get_counter(self, trans) result(count)

    Getter function for the number of matvec calls

    Arguments

    Type IntentOptional Attributes Name
    class(abstract_linop), intent(in) :: self
    logical, intent(in) :: trans

    matvec or rmatvec?

    Return Value integer

procedure, public, pass(self) :: matvec => adjoint_matvec_csp

procedure, public, pass(self) :: print_timer_info

Print current timing data

  • private subroutine print_timer_info(self, trans)

    Getter routine to print the current timing information for matvec/rmatvec Note: Wrapper of the corresponding routine from lightkrylov_timer

    Arguments

    Type IntentOptional Attributes Name
    class(abstract_linop), intent(inout) :: self
    logical, intent(in), optional :: trans

    matvec or rmatvec?

procedure, public, pass(self) :: reset_counter

Reset matvec/rmatvec counter

  • private subroutine reset_counter(self, trans, procedure, counter, reset_timer, soft_reset, clean_timer)

    Setter routine to reset the matvec counter and reset timers

    Arguments

    Type IntentOptional Attributes Name
    class(abstract_linop), intent(inout) :: self
    logical, intent(in) :: trans

    matvec or rmatvec?

    character(len=*), intent(in) :: procedure

    name of the caller routine

    integer, intent(in), optional :: counter

    optional flag to reset to an integer other than zero.

    logical, intent(in), optional :: reset_timer

    optional flag to reset also the timers

    logical, intent(in), optional :: soft_reset

    optional flag to choose whether to save previous timing data (default: .true.)

    logical, intent(in), optional :: clean_timer

    optional flag to choose whether to fully reset the timer (default: .false.)

procedure, public, pass(self) :: reset_timer => reset_linop_timer

Reset current timing data

  • private subroutine reset_linop_timer(self, trans, soft, clean)

    Setter routine to reset the matvec/rmatvec timers Note: Wrapper of the corresponding routine from lightkrylov_timer

    Arguments

    Type IntentOptional Attributes Name
    class(abstract_linop), intent(inout) :: self
    logical, intent(in), optional :: trans

    matvec or rmatvec?

    logical, intent(in), optional :: soft
    logical, intent(in), optional :: clean

procedure, public, pass(self) :: rmatvec => adjoint_rmatvec_csp