MueLu
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
MueLu_GenericRFactory_def.hpp
Go to the documentation of this file.
1
// @HEADER
2
//
3
// ***********************************************************************
4
//
5
// MueLu: A package for multigrid based preconditioning
6
// Copyright 2012 Sandia Corporation
7
//
8
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9
// the U.S. Government retains certain rights in this software.
10
//
11
// Redistribution and use in source and binary forms, with or without
12
// modification, are permitted provided that the following conditions are
13
// met:
14
//
15
// 1. Redistributions of source code must retain the above copyright
16
// notice, this list of conditions and the following disclaimer.
17
//
18
// 2. Redistributions in binary form must reproduce the above copyright
19
// notice, this list of conditions and the following disclaimer in the
20
// documentation and/or other materials provided with the distribution.
21
//
22
// 3. Neither the name of the Corporation nor the names of the
23
// contributors may be used to endorse or promote products derived from
24
// this software without specific prior written permission.
25
//
26
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
//
38
// Questions? Contact
39
// Jonathan Hu (jhu@sandia.gov)
40
// Andrey Prokopenko (aprokop@sandia.gov)
41
// Ray Tuminaro (rstumin@sandia.gov)
42
//
43
// ***********************************************************************
44
//
45
// @HEADER
46
#ifndef MUELU_GENERICRFACTORY_DEF_HPP
47
#define MUELU_GENERICRFACTORY_DEF_HPP
48
49
#include <Xpetra_Matrix.hpp>
50
51
#include "
MueLu_GenericRFactory_decl.hpp
"
52
53
#include "
MueLu_FactoryBase.hpp
"
54
#include "MueLu_PFactory.hpp"
55
#include "
MueLu_FactoryManagerBase.hpp
"
56
#include "
MueLu_DisableMultipleCallCheck.hpp
"
57
#include "
MueLu_Monitor.hpp
"
58
59
namespace
MueLu
{
60
61
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
62
RCP<const ParameterList>
GenericRFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::GetValidParameterList
()
const
{
63
RCP<ParameterList> validParamList = rcp(
new
ParameterList());
64
validParamList->set< RCP<const FactoryBase> >(
"P"
, Teuchos::null,
"Generating factory of the matrix P"
);
65
return
validParamList;
66
}
67
68
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
69
void
GenericRFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::DeclareInput
(
Level
&
/* fineLevel */
,
Level
&coarseLevel)
const
{
70
RCP<const FactoryBase> PFact1 =
GetFactory
(
"P"
);
71
if
(PFact1 == Teuchos::null) { PFact1 = coarseLevel.
GetFactoryManager
()->GetFactory(
"P"
); }
72
RCP<PFactory> PFact = Teuchos::rcp_const_cast<PFactory>(rcp_dynamic_cast<const PFactory>(PFact1));;
73
74
bool
rmode = PFact->isRestrictionModeSet();
75
PFact->setRestrictionMode(
true
);
// set restriction mode
76
77
// Force request call for PFact
78
// In general, Request is only called once for each factory, since we
79
// can reuse data generated by the factory. However, here we have to
80
// run the code in PFact.Build again, so we have to request the
81
// dependencies of PFact first! Thedependencies are (automatically)
82
// cleaned up after the second run of PFact.Build in
83
// coarseLevel.Get<RCP<Matrix> >("R",PFact.get())!
84
coarseLevel.
DeclareDependencies
(PFact.get());
85
86
coarseLevel.
DeclareInput
(
"R"
, PFact.get(),
this
);
// we expect the prolongation operator factory to produce "R" as output
87
// call declareInput is called within DeclareInput call
88
PFact->setRestrictionMode(rmode);
// reset restriciton mode flag
89
}
90
91
template
<
class
Scalar,
class
LocalOrdinal,
class
GlobalOrdinal,
class
Node>
92
void
GenericRFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Build
(
Level
&
/* fineLevel */
,
Level
& coarseLevel)
const
{
93
FactoryMonitor
m(*
this
,
"Call prolongator factory for calculating restrictor"
, coarseLevel);
94
95
RCP<const FactoryBase> PFact1 =
GetFactory
(
"P"
);
96
if
(PFact1 == Teuchos::null) { PFact1 = coarseLevel.
GetFactoryManager
()->GetFactory(
"P"
); }
97
RCP<PFactory> PFact = Teuchos::rcp_const_cast<PFactory>(rcp_dynamic_cast<const PFactory>(PFact1));;
98
MueLu::DisableMultipleCallCheck
check(PFact);
99
100
// BuildR
101
bool
rmode = PFact->isRestrictionModeSet();
102
PFact->setRestrictionMode(
true
);
// switch prolongator factory to restriction mode
103
104
//PFact->Build(fineLevel, coarseLevel); // call PFactory::Build explicitely
105
RCP<Matrix> R = coarseLevel.
Get
<RCP<Matrix> >(
"R"
,PFact.get());
106
107
PFact->setRestrictionMode(rmode);
// reset restriction mode flag
108
109
Set
(coarseLevel,
"R"
, R);
110
111
}
//BuildR
112
113
}
//namespace MueLu
114
115
#define MUELU_GENERICRFACTORY_SHORT
116
#endif
// MUELU_GENERICRFACTORY_DEF_HPP
MueLu_DisableMultipleCallCheck.hpp
MueLu_FactoryBase.hpp
MueLu_FactoryManagerBase.hpp
MueLu_GenericRFactory_decl.hpp
MueLu_Monitor.hpp
MueLu::DisableMultipleCallCheck
An exception safe way to call the method TwoLevelFactoryBase::DisableMultipleCallCheck.
Definition
MueLu_DisableMultipleCallCheck.hpp:56
MueLu::FactoryMonitor
Timer to be used in factories. Similar to Monitor but with additional timers.
Definition
MueLu_Monitor.hpp:202
MueLu::Factory::Set
void Set(Level &level, const std::string &varName, const T &data) const
Definition
MueLu_Factory.hpp:165
MueLu::Factory::GetFactory
const RCP< const FactoryBase > GetFactory(const std::string &varName) const
Default implementation of FactoryAcceptor::GetFactory().
Definition
MueLu_Factory.hpp:95
MueLu::GenericRFactory::GetValidParameterList
RCP< const ParameterList > GetValidParameterList() const
Input.
Definition
MueLu_GenericRFactory_def.hpp:62
MueLu::GenericRFactory::Build
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
Definition
MueLu_GenericRFactory_def.hpp:92
MueLu::GenericRFactory::DeclareInput
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
Definition
MueLu_GenericRFactory_def.hpp:69
MueLu::Level
Class that holds all level-specific information.
Definition
MueLu_Level.hpp:99
MueLu::Level::DeclareInput
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput().
Definition
MueLu_Level.cpp:150
MueLu::Level::GetFactoryManager
const RCP< const FactoryManagerBase > GetFactoryManager()
returns the current factory manager
Definition
MueLu_Level.cpp:96
MueLu::Level::Get
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
Definition
MueLu_Level.hpp:191
MueLu::Level::DeclareDependencies
void DeclareDependencies(const FactoryBase *factory, bool bRequestOnly=false, bool bReleaseOnly=false)
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput() to declare factory depe...
Definition
MueLu_Level.cpp:177
MueLu
Namespace for MueLu classes and methods.
Definition
MueLu_BrickAggregationFactory_decl.hpp:78
src
Transfers
Generic
MueLu_GenericRFactory_def.hpp
Generated by
1.17.0