Teko Version of the Day
Loading...
Searching...
No Matches
Teko_DiagonalPreconditionerFactory.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#include "Teko_DiagonalPreconditionerFactory.hpp"
48#include "Teko_DiagonalPreconditionerOp.hpp"
49#include "Thyra_get_Epetra_Operator.hpp"
50#include "Epetra_CrsMatrix.h"
51#include "EpetraExt_PointToBlockDiagPermute.h"
52
53#include "Teko_TpetraHelpers.hpp"
54#include "Thyra_TpetraLinearOp.hpp"
55
56using Teuchos::rcp;
57using Teuchos::RCP;
58
59namespace Teko {
60
61DiagonalPrecondState::DiagonalPrecondState() {}
62
63/*****************************************************/
64
65DiagonalPreconditionerFactory::DiagonalPreconditionerFactory() {}
66
68{
69 return Teuchos::rcp(new DiagonalPrecondState());
70}
71
73{
74 if(diagonalType_==BlkDiag) {
75 // Sanity check the state
76 DiagonalPrecondState & MyState = Teuchos::dyn_cast<DiagonalPrecondState>(state);
77
78 TEUCHOS_TEST_FOR_EXCEPTION(TpetraHelpers::isTpetraLinearOp(lo),std::runtime_error,"BlkDiag not implemented for Tpetra operators");
79
80 // Get the underlying Epetra_CrsMatrix, if we have one
81 Teuchos::RCP<const Epetra_Operator> eo=Thyra::get_Epetra_Operator(*lo);
82 TEUCHOS_ASSERT(eo!=Teuchos::null);
83 Teuchos::RCP<const Epetra_CrsMatrix> MAT = Teuchos::rcp_dynamic_cast<const Epetra_CrsMatrix>(eo);
84 TEUCHOS_ASSERT(MAT!=Teuchos::null);
85
86 // Create a new EpetraExt_PointToBlockDiagPermute for the state object, if we don't have one
87 Teuchos::RCP<EpetraExt_PointToBlockDiagPermute> BDP;
88 if(MyState.BDP_==Teuchos::null) {
89 BDP = Teuchos::rcp(new EpetraExt_PointToBlockDiagPermute(*MAT));
90 BDP->SetParameters(List_);
91 BDP->Compute();
92 MyState.BDP_ = BDP;
93 }
94
95 RCP<Epetra_FECrsMatrix> Hcrs=rcp(MyState.BDP_->CreateFECrsMatrix());
96 return Thyra::epetraLinearOp(Hcrs);
97
98 // Build the LinearOp object (NTS: swapping the range and domain)
99 // LinearOp MyOp = Teuchos::rcp(new DiagonalPreconditionerOp(MyState.BDP_,lo->domain(),lo->range()));
100 }
101
102 return getInvDiagonalOp(lo,diagonalType_);
103}
104
106{
107 List_=pl;
108
109 diagonalType_ = BlkDiag;
110 if(pl.isParameter("Diagonal Type")) {
111 diagonalType_ = getDiagonalType(pl.get<std::string>("Diagonal Type"));
112 TEUCHOS_TEST_FOR_EXCEPT(diagonalType_==NotDiag);
113 }
114
115 if(diagonalType_==BlkDiag) {
116 // Reset default to invert mode if the user hasn't specified something else
117 Teuchos::ParameterList & SubList=List_.sublist("blockdiagmatrix: list");
118 SubList.set("apply mode",SubList.get("apply mode","invert"));
119 }
120}
121
122} // end namespace Teko
@ BlkDiag
Specifies that a block diagonal approximation is to be used.
@ NotDiag
For user convenience, if Teko recieves this value, exceptions will be thrown.
virtual void initializeFromParameterList(const Teuchos::ParameterList &pl)
Initialize from a parameter list.
Teuchos::RCP< PreconditionerState > buildPreconditionerState() const
Builds a preconditioner state object.
LinearOp buildPreconditionerOperator(LinearOp &lo, PreconditionerState &state) const
An implementation of a state object preconditioners.