Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_DefaultScaledAdjointLinearOp_decl.hpp
1// @HEADER
2// ***********************************************************************
3//
4// Thyra: Interfaces and Support for Abstract Numerical Algorithms
5// Copyright (2004) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38//
39// ***********************************************************************
40// @HEADER
41
42#ifndef THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DECL_HPP
43#define THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DECL_HPP
44
45
46#include "Thyra_ScaledAdjointLinearOpBase.hpp"
47#include "Teuchos_ConstNonconstObjectContainer.hpp"
48
49
50namespace Thyra {
51
52
125template<class Scalar>
127 : virtual public ScaledAdjointLinearOpBase<Scalar>
128{
129public:
130
133
141
149 const Scalar &scalar,
150 const EOpTransp &transp,
151 const RCP<LinearOpBase<Scalar> > &Op
152 );
153
161 const Scalar &scalar,
162 const EOpTransp &transp,
163 const RCP<const LinearOpBase<Scalar> > &Op
164 );
165
187 void initialize(
188 const Scalar &scalar,
189 const EOpTransp &transp,
190 const RCP<LinearOpBase<Scalar> > &Op
191 );
192
213 void initialize(
214 const Scalar &scalar
215 ,const EOpTransp &transp
216 ,const RCP<const LinearOpBase<Scalar> > &Op
217 );
218
223
228
235 void uninitialize();
236
238
241
246 std::string description() const;
247
256 void describe(
258 const Teuchos::EVerbosityLevel verbLevel
259 ) const;
260
262
265
274
283
286
288
291
293 Scalar overallScalar() const;
295 EOpTransp overallTransp() const;
300
302
303protected:
304
307
316 bool opSupportedImpl(EOpTransp M_trans) const;
317
326 void applyImpl(
327 const EOpTransp M_trans,
329 const Ptr<MultiVectorBase<Scalar> > &Y,
330 const Scalar alpha,
331 const Scalar beta
332 ) const;
333
335
336private:
337
338 // ////////////////////////////////
339 // Private types
340
341 template <class Scalar2>
342 struct ScalarETransp {
343 Scalar2 scalar;
344 EOpTransp transp;
345 ScalarETransp()
346 {}
347 ScalarETransp( const Scalar2 &_scalar, const EOpTransp &_transp )
348 : scalar(_scalar), transp(_transp)
349 {}
350 };
351
352 typedef std::vector<ScalarETransp<Scalar> > allScalarETransp_t;
353
355
356 // ////////////////////////////////
357 // Private data members
358
359 CNLOC origOp_;
360 Scalar overallScalar_;
361 EOpTransp overallTransp_;
362 int my_index_;
363
364 RCP<allScalarETransp_t> allScalarETransp_;
365
366 // ////////////////////////////////
367 // Private member functions
368
369 void initializeImpl(
370 const Scalar &scalar,
371 const EOpTransp &transp,
372 const RCP<const LinearOpBase<Scalar> > &Op,
373 const bool isConst
374 );
375 CNLOC getOpImpl() const;
376 void assertInitialized() const;
377
378 // Not defined and not to be called
381
382};
383
384
400template<class Scalar>
403 const Scalar &scalar,
404 const RCP<LinearOpBase<Scalar> > &Op,
405 const std::string &label = ""
406 );
407
408
424template<class Scalar>
427 const Scalar &scalar,
428 const RCP<const LinearOpBase<Scalar> > &Op,
429 const std::string &label = ""
430 );
431
432
448template<class Scalar>
451 const RCP<LinearOpBase<Scalar> > &Op,
452 const std::string &label = ""
453 );
454
455
471template<class Scalar>
474 const RCP<const LinearOpBase<Scalar> > &Op,
475 const std::string &label = ""
476 );
477
478
494template<class Scalar>
497 const RCP<LinearOpBase<Scalar> > &Op,
498 const std::string &label = ""
499 );
500
501
517template<class Scalar>
520 const RCP<const LinearOpBase<Scalar> > &Op,
521 const std::string &label = ""
522 );
523
524
541template<class Scalar>
544 const Scalar &scalar, const EOpTransp &transp,
545 const RCP<LinearOpBase<Scalar> > &Op,
546 const std::string &label = ""
547 );
548
549
566template<class Scalar>
569 const Scalar &scalar, const EOpTransp &transp,
570 const RCP<const LinearOpBase<Scalar> > &Op,
571 const std::string &label = ""
572 );
573
574
575// /////////////////////////////////
576// Inline members
577
578
579template<class Scalar>
580inline
582 :overallScalar_(Teuchos::ScalarTraits<Scalar>::zero())
583 ,overallTransp_(NOTRANS)
584 ,my_index_(0)
585{}
586
587
588template<class Scalar>
589inline
591 const Scalar &scalar
592 ,const EOpTransp &transp
593 ,const RCP<LinearOpBase<Scalar> > &Op
594 )
595 :overallScalar_(Teuchos::ScalarTraits<Scalar>::zero())
596 ,overallTransp_(NOTRANS)
597{
598 this->initialize(scalar,transp,Op);
599}
600
601
602template<class Scalar>
603inline
605 const Scalar &scalar
606 ,const EOpTransp &transp
607 ,const RCP<const LinearOpBase<Scalar> > &Op
608 )
609 :overallScalar_(Teuchos::ScalarTraits<Scalar>::zero())
610 ,overallTransp_(NOTRANS)
611{
612 this->initialize(scalar,transp,Op);
613}
614
615
616template<class Scalar>
617inline
619{
620#ifdef TEUCHOS_DEBUG
621 TEUCHOS_TEST_FOR_EXCEPT( origOp_.getConstObj().get() == NULL );
622#endif
623}
624
625
626} // end namespace Thyra
627
628
629// /////////////////////////////////
630// Inline non-members
631
632
633template<class Scalar> inline
635Thyra::nonconstScale(
636 const Scalar &scalar,
637 const RCP<LinearOpBase<Scalar> > &Op,
638 const std::string &label
639 )
640{
641 RCP<Thyra::LinearOpBase<Scalar> >
642 salo = Teuchos::rcp(
643 new DefaultScaledAdjointLinearOp<Scalar>(
644 scalar,NOTRANS,Op
645 )
646 );
647 if (label.length())
648 salo->setObjectLabel(label);
649 return salo;
650}
651
652
653template<class Scalar> inline
655Thyra::scale(
656 const Scalar &scalar,
657 const RCP<const LinearOpBase<Scalar> > &Op,
658 const std::string &label
659 )
660{
661 RCP<Thyra::LinearOpBase<Scalar> >
662 salo = Teuchos::rcp(
663 new DefaultScaledAdjointLinearOp<Scalar>(scalar,NOTRANS,Op)
664 );
665 if (label.length())
666 salo->setObjectLabel(label);
667 return salo;
668}
669
670
671template<class Scalar> inline
673Thyra::nonconstAdjoint(
674 const RCP<LinearOpBase<Scalar> > &Op,
675 const std::string &label
676 )
677{
678 RCP<Thyra::LinearOpBase<Scalar> >
679 salo = Teuchos::rcp(
680 new DefaultScaledAdjointLinearOp<Scalar>(
682 )
683 );
684 if (label.length())
685 salo->setObjectLabel(label);
686 return salo;
687}
688
689
690template<class Scalar> inline
692Thyra::adjoint(
693 const RCP<const LinearOpBase<Scalar> > &Op,
694 const std::string &label
695 )
696{
697 RCP<Thyra::LinearOpBase<Scalar> >
698 salo = Teuchos::rcp(
699 new DefaultScaledAdjointLinearOp<Scalar>(
701 )
702 );
703 if (label.length())
704 salo->setObjectLabel(label);
705 return salo;
706}
707
708
709template<class Scalar> inline
711Thyra::nonconstTranspose(
712 const RCP<LinearOpBase<Scalar> > &Op,
713 const std::string &label
714 )
715{
716 RCP<Thyra::LinearOpBase<Scalar> >
717 salo = Teuchos::rcp(
718 new DefaultScaledAdjointLinearOp<Scalar>(
720 )
721 );
722 if (label.length())
723 salo->setObjectLabel(label);
724 return salo;
725}
726
727
728template<class Scalar> inline
730Thyra::transpose(
731 const RCP<const LinearOpBase<Scalar> > &Op,
732 const std::string &label
733 )
734{
735 RCP<Thyra::LinearOpBase<Scalar> >
736 salo = Teuchos::rcp(
737 new DefaultScaledAdjointLinearOp<Scalar>(
739 )
740 );
741 if (label.length())
742 salo->setObjectLabel(label);
743 return salo;
744}
745
746
747template<class Scalar> inline
749Thyra::nonconstScaleAndAdjoint(
750 const Scalar &scalar,
751 const EOpTransp &transp,
752 const RCP<LinearOpBase<Scalar> > &Op,
753 const std::string &label
754 )
755{
756 RCP<Thyra::LinearOpBase<Scalar> >
757 salo = Teuchos::rcp(
758 new DefaultScaledAdjointLinearOp<Scalar>(scalar,transp,Op)
759 );
760 if (label.length())
761 salo->setObjectLabel(label);
762 return salo;
763}
764
765
766template<class Scalar> inline
768Thyra::scaleAndAdjoint(
769 const Scalar &scalar,
770 const EOpTransp &transp,
771 const RCP<const LinearOpBase<Scalar> > &Op,
772 const std::string &label
773 )
774{
775 RCP<Thyra::LinearOpBase<Scalar> >
776 salo = Teuchos::rcp(
777 new DefaultScaledAdjointLinearOp<Scalar>(
778 scalar, transp, Op
779 )
780 );
781 if (label.length())
782 salo->setObjectLabel(label);
783 return salo;
784}
785
786
787#endif // THYRA_DEFAULT_SCALED_ADJOINT_LINEAR_OP_DECL_HPP
Concrete decorator LinearOpBase subclass that wraps a LinearOpBase object and adds on an extra scalin...
RCP< LinearOpBase< Scalar > > getNonconstOp()
Return the non-const linear operator passed into initialize().
bool opSupportedImpl(EOpTransp M_trans) const
Return if the operation is supported on the logical linear operator.
std::string description() const
Outputs DefaultScaledAdjointLinearOp<Scalar>{this->getOrigOp().description()) along with the dimensio...
RCP< const LinearOpBase< Scalar > > scale(const Scalar &scalar, const RCP< const LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit const scaled linear operator.
RCP< const VectorSpaceBase< Scalar > > domain() const
Return the domain space of the logical linear operator.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Prints out the original operator as well as all of the scalings and transpositions in the order that ...
void uninitialize()
Set to uninitialized and (optionally) extract the objects passed into initialize().
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
Apply the linear operator (or its transpose) to a multi-vector : Y = alpha*op(M)*X + beta*Y.
RCP< const LinearOpBase< Scalar > > transpose(const RCP< const LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit const transposed linear operator.
RCP< LinearOpBase< Scalar > > nonconstAdjoint(const RCP< LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit non-const adjoined linear operator.
RCP< const LinearOpBase< Scalar > > clone() const
RCP< LinearOpBase< Scalar > > nonconstScale(const Scalar &scalar, const RCP< LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit non-const scaled linear operator.
RCP< const LinearOpBase< Scalar > > getOrigOp() const
RCP< const VectorSpaceBase< Scalar > > range() const
Return the range space of the logical linear operator.
void initialize(const Scalar &scalar, const EOpTransp &transp, const RCP< LinearOpBase< Scalar > > &Op)
Initialize with an operator with by defining adjoint (transpose) and scaling arguments.
RCP< LinearOpBase< Scalar > > nonconstTranspose(const RCP< LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit non-const transposed linear operator.
RCP< const LinearOpBase< Scalar > > scaleAndAdjoint(const Scalar &scalar, const EOpTransp &transp, const RCP< const LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit const scaled and/or adjoined (transposed) linear operator.
RCP< const LinearOpBase< Scalar > > adjoint(const RCP< const LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit const adjoined linear operator.
RCP< LinearOpBase< Scalar > > nonconstScaleAndAdjoint(const Scalar &scalar, const EOpTransp &transp, const RCP< LinearOpBase< Scalar > > &Op, const std::string &label="")
Build an implicit non-const scaled and/or adjoined (transposed) linear operator.
RCP< const LinearOpBase< Scalar > > getOp() const
Return the const linear operator passed into initialize().
Base class for all linear operators.
Interface for a collection of column vectors called a multi-vector.
Base class for LinearOpBase decorator subclasses that wrap a LinearOpBase object and adds on an extra...
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
@ NOTRANS
Use the non-transposed operator.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)