Teko Version of the Day
Loading...
Searching...
No Matches
Teko_DiagonallyScaledPreconditionerFactory.cpp
1/*
2// @HEADER
3//
4// ***********************************************************************
5//
6// Teko: A package for block and physics based preconditioning
7// Copyright 2010 Sandia Corporation
8//
9// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
10// the U.S. Government retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
28// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
31// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38//
39// Questions? Contact Eric C. Cyr (eccyr@sandia.gov)
40//
41// ***********************************************************************
42//
43// @HEADER
44
45*/
46
47// Teko includes
48#include "Teko_DiagonallyScaledPreconditionerFactory.hpp"
49
50#include "Teko_PreconditionerInverseFactory.hpp"
51
52namespace Teko {
53
56 : invFactory_(Teuchos::null), scalingType_(ROW_SCALING), diagonalType_(AbsRowSum)
57{ }
58
62DiagonallyScaledPreconditionerFactory::DiagonallyScaledPreconditionerFactory(const Teuchos::RCP<Teko::InverseFactory> & invFactory,
63 ScalingType scalingType,DiagonalType diagonalType)
64 : invFactory_(invFactory), scalingType_(scalingType), diagonalType_(diagonalType)
65{
66}
67
71
76{
77 using Teuchos::RCP;
78 using Teuchos::rcp_dynamic_cast;
79 Teko_DEBUG_SCOPE("DiagonallyScaledPreconditionerFactory::buildPreconditionerOperator",10);
80
81 TEUCHOS_TEST_FOR_EXCEPTION(invFactory_==Teuchos::null,std::runtime_error,
82 "ERROR: Teko::DiagonallyScaledPreconditionerFactory::buildPreconditionerOperator requires that an "
83 << "inverse factory has been set. Currently it is null!");
84
85 // get diagonal matrix
86 LinearOp invD = getInvDiagonalOp(lo,diagonalType_);
87
88 // M = A * invD
89 ModifiableLinearOp & M = state.getModifiableOp("op_M");
90 if(scalingType_==COLUMN_SCALING)
91 M = explicitMultiply(lo,invD,M);
92 else
93 M = explicitMultiply(invD,lo,M);
94
95 // build inverse operator
96 ModifiableLinearOp & invM = state.getModifiableOp("op_invM");
97 if(invM==Teuchos::null)
98 invM = buildInverse(*invFactory_,M);
99 else
100 rebuildInverse(*invFactory_,M,invM);
101
102 // return invD * invM
103 if(scalingType_==COLUMN_SCALING)
104 return multiply(invD,invM.getConst());
105 else
106 return multiply(invM.getConst(),invD);
107}
108
113{
114 TEUCHOS_TEST_FOR_EXCEPTION(not settings.isParameter("Inverse Factory"),std::runtime_error,
115 "Parameter \"Inverse Factory\" is required by a Teko::DiagonallyScaledPreconditionerFactory");
116
117 // grab library and preconditioner name
118 std::string invName = settings.get<std::string>("Inverse Factory");
119
120 // build preconditioner factory
121 Teuchos::RCP<const InverseLibrary> il = getInverseLibrary();
122 invFactory_ = il->getInverseFactory(invName);
123 TEUCHOS_TEST_FOR_EXCEPTION(invFactory_==Teuchos::null,std::runtime_error,
124 "ERROR: \"Inverse Factory\" = " << invName
125 << " could not be found");
126
127 // get scaling type specified by XML file
128 const std::string defaultScaleType = "Row";
129 const std::string scalingTypeString = "Scaling Type";
130 std::string scaleType = defaultScaleType;
131 if(settings.isParameter(scalingTypeString))
132 scaleType = settings.get<std::string>(scalingTypeString);
133
134 if(defaultScaleType==scaleType)
135 scalingType_ = ROW_SCALING;
136 else
137 scalingType_ = COLUMN_SCALING;
138
139 if(settings.isParameter("Diagonal Type"))
140 diagonalType_ = Teko::getDiagonalType(settings.get<std::string>("Diagonal Type"));
141}
142
143} // end namespace Teko
InverseLinearOp buildInverse(const InverseFactory &factory, const LinearOp &A)
Build an inverse operator using a factory and a linear operator.
void rebuildInverse(const InverseFactory &factory, const LinearOp &A, InverseLinearOp &invA)
DiagonalType
Type describing the type of diagonal to construct.
@ AbsRowSum
Specifies that the diagonal entry is .
DiagonallyScaledPreconditionerFactory()
Default constructor, for use with the AutoClone class.
virtual ~DiagonallyScaledPreconditionerFactory()
default destructor: prints out diagnostic string
virtual void initializeFromParameterList(const Teuchos::ParameterList &settings)
This function builds the internals of the preconditioner factory from a parameter list.
virtual LinearOp buildPreconditionerOperator(LinearOp &lo, PreconditionerState &state) const
Function that is called to build the preconditioner for the linear operator that is passed in.
Teuchos::RCP< const InverseLibrary > getInverseLibrary() const
Get the inverse library used by this preconditioner factory.
An implementation of a state object preconditioners.