MueLu
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
MueLu_VerboseObject.cpp
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
#include "
MueLu_VerboseObject.hpp
"
47
48
#include <fstream>
49
#ifdef HAVE_MPI
50
#include <mpi.h>
51
#endif
52
53
#include <Teuchos_VerboseObject.hpp>
54
55
#include "
MueLu_ConfigDefs.hpp
"
56
#include "
MueLu_VerbosityLevel.hpp
"
57
#include "
MueLu_Exceptions.hpp
"
58
59
namespace
MueLu
{
60
61
VerboseObject::VerboseObject
():
62
verbLevel_
(
NotSpecified
),
// = use global verbose level by default
63
numProcs_
(0)
64
{
65
// Note: using MPI_COMM_RANK is bad idea (because a subcommunicator may be used to run MueLu)
66
// Belos have the same problem in the class BelosOutputManager.
67
//
68
// How to fix this: the FancyOStream provides setProcRankAndSize() to change the proc rank info used by setOutputToRootOnly().
69
// Adding a method FancyOStream::getProcRank() would be enough. And it makes sense to use the info that come from the stream configuration.
70
//
71
// Documentation: after the patch, it migh be nice to add to the documentation (Teuchos and MueLu)
72
// that users of subcommunicators have to setup the output stream (of Teuchos::VerboseObject) separately.
73
procRank_
= 0;
74
#ifdef HAVE_MPI
75
int
mpiStarted = 0; MPI_Initialized(&mpiStarted);
76
if
(mpiStarted) {
77
MPI_Comm_rank(MPI_COMM_WORLD, &
procRank_
);
78
MPI_Comm_size(MPI_COMM_WORLD, &
numProcs_
);
79
}
80
#endif
81
}
82
83
VerboseObject::~VerboseObject
() { }
84
85
VerbLevel
VerboseObject::GetVerbLevel
()
const
{
86
return
(
verbLevel_
!=
NotSpecified
?
verbLevel_
:
globalVerbLevel_
);
87
}
88
89
void
VerboseObject::SetVerbLevel
(
const
VerbLevel
verbLevel) {
90
verbLevel_
= verbLevel;
91
}
92
93
int
VerboseObject::GetProcRankVerbose
()
const
{
94
return
procRank_
;
95
}
96
97
int
VerboseObject::SetProcRankVerbose
(
int
procRank)
const
{
98
int
oldRank =
procRank_
;
99
procRank_
= procRank;
100
return
oldRank;
101
}
102
103
bool
VerboseObject::IsPrint
(
MsgType
type,
int
thisProcRankOnly)
const
{
104
return
((type &
GetVerbLevel
()) && (thisProcRankOnly < 0 ||
procRank_
== thisProcRankOnly));
105
}
106
107
Teuchos::FancyOStream &
VerboseObject::GetOStream
(
MsgType
type,
int
thisProcRankOnly)
const
{
108
if
(!
IsPrint
(type, thisProcRankOnly))
109
return
*
blackHole_
;
110
111
Teuchos::FancyOStream& os = *
GetMueLuOStream
();
112
if
(!(type & ((
Extreme
|
Test
) ^
Warnings
)))
113
os <<
"\n******* WARNING *******"
<< std::endl;
114
115
return
os;
116
}
117
118
Teuchos::FancyOStream&
VerboseObject::GetBlackHole
()
const
{
119
return
*
blackHole_
;
120
}
121
122
void
VerboseObject::SetDefaultVerbLevel
(
const
VerbLevel
defaultVerbLevel) {
123
TEUCHOS_TEST_FOR_EXCEPTION(defaultVerbLevel ==
NotSpecified
,
Exceptions::RuntimeError
,
124
"MueLu::VerboseObject::GetVerbLevel(): global verbose level cannot be 'NotSpecified'."
);
125
globalVerbLevel_
= defaultVerbLevel;
126
}
127
128
VerbLevel
VerboseObject::GetDefaultVerbLevel
() {
129
return
globalVerbLevel_
;
130
}
131
132
void
VerboseObject::SetMueLuOStream
(
const
Teuchos::RCP<Teuchos::FancyOStream>& mueluOStream) {
133
mueluOStream->setOutputToRootOnly(-1);
134
mueluOutputStream_
= mueluOStream;
135
}
136
137
void
VerboseObject::SetMueLuOFileStream
(
const
std::string& filename) {
138
std::string fn;
139
#ifdef HAVE_MPI
140
int
mpiStarted = 0; MPI_Initialized(&mpiStarted);
141
if
(mpiStarted) {
142
int
procRank;
143
MPI_Comm_rank(MPI_COMM_WORLD, &procRank);
144
fn = filename +
"."
+ std::to_string(procRank);
145
}
else
146
#endif
147
fn = filename;
148
RCP<std::ofstream> outFile(
new
std::ofstream(fn));
149
Teuchos::RCP<Teuchos::FancyOStream> fancyOutFile = Teuchos::fancyOStream(Teuchos::rcp_implicit_cast<std::ostream>(outFile));
150
SetMueLuOStream
(fancyOutFile);
151
}
152
153
Teuchos::RCP<Teuchos::FancyOStream>
VerboseObject::GetMueLuOStream
() {
154
if
(
mueluOutputStream_
.get()==NULL) {
155
mueluOutputStream_
= fancyOStream(rcpFromRef(std::cout));
156
mueluOutputStream_
->setOutputToRootOnly(-1);
157
}
158
return
mueluOutputStream_
;
159
}
160
161
VerbLevel
VerboseObject::globalVerbLevel_
=
High
;
// Default global verbose level.
162
163
RCP<Teuchos::FancyOStream>
VerboseObject::blackHole_
= Teuchos::getFancyOStream(rcp(
new
Teuchos::oblackholestream()));
164
165
RCP<Teuchos::FancyOStream>
VerboseObject::mueluOutputStream_
= Teuchos::null;
166
167
}
// namespace MueLu
MueLu_ConfigDefs.hpp
MueLu_Exceptions.hpp
MueLu_VerboseObject.hpp
MueLu_VerbosityLevel.hpp
MueLu::Exceptions::RuntimeError
Exception throws to report errors in the internal logical of the program.
Definition
MueLu_Exceptions.hpp:70
MueLu::VerboseObject::GetOStream
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
Definition
MueLu_VerboseObject.cpp:107
MueLu::VerboseObject::GetVerbLevel
VerbLevel GetVerbLevel() const
Get the verbosity level.
Definition
MueLu_VerboseObject.cpp:85
MueLu::VerboseObject::procRank_
int procRank_
Definition
MueLu_VerboseObject.hpp:137
MueLu::VerboseObject::SetProcRankVerbose
int SetProcRankVerbose(int procRank) const
Set proc rank used for printing.
Definition
MueLu_VerboseObject.cpp:97
MueLu::VerboseObject::verbLevel_
VerbLevel verbLevel_
Verbose level specific to 'this'.
Definition
MueLu_VerboseObject.hpp:135
MueLu::VerboseObject::blackHole_
static Teuchos::RCP< Teuchos::FancyOStream > blackHole_
Definition
MueLu_VerboseObject.hpp:141
MueLu::VerboseObject::GetDefaultVerbLevel
static VerbLevel GetDefaultVerbLevel()
Get the default (global) verbosity level.
Definition
MueLu_VerboseObject.cpp:128
MueLu::VerboseObject::GetMueLuOStream
static Teuchos::RCP< Teuchos::FancyOStream > GetMueLuOStream()
Definition
MueLu_VerboseObject.cpp:153
MueLu::VerboseObject::SetVerbLevel
void SetVerbLevel(const VerbLevel verbLevel)
Set the verbosity level of this object.
Definition
MueLu_VerboseObject.cpp:89
MueLu::VerboseObject::IsPrint
bool IsPrint(MsgType type, int thisProcRankOnly=-1) const
Find out whether we need to print out information for a specific message type.
Definition
MueLu_VerboseObject.cpp:103
MueLu::VerboseObject::mueluOutputStream_
static Teuchos::RCP< Teuchos::FancyOStream > mueluOutputStream_
Definition
MueLu_VerboseObject.hpp:140
MueLu::VerboseObject::SetMueLuOStream
static void SetMueLuOStream(const Teuchos::RCP< Teuchos::FancyOStream > &mueluOStream)
Definition
MueLu_VerboseObject.cpp:132
MueLu::VerboseObject::globalVerbLevel_
static VerbLevel globalVerbLevel_
Global verbose level. This verbose level is used when the verbose level of the object is not specifie...
Definition
MueLu_VerboseObject.hpp:144
MueLu::VerboseObject::GetBlackHole
Teuchos::FancyOStream & GetBlackHole() const
Definition
MueLu_VerboseObject.cpp:118
MueLu::VerboseObject::VerboseObject
VerboseObject()
Definition
MueLu_VerboseObject.cpp:61
MueLu::VerboseObject::numProcs_
int numProcs_
Definition
MueLu_VerboseObject.hpp:138
MueLu::VerboseObject::SetDefaultVerbLevel
static void SetDefaultVerbLevel(const VerbLevel defaultVerbLevel)
Set the default (global) verbosity level.
Definition
MueLu_VerboseObject.cpp:122
MueLu::VerboseObject::~VerboseObject
virtual ~VerboseObject()
Destructor.
Definition
MueLu_VerboseObject.cpp:83
MueLu::VerboseObject::SetMueLuOFileStream
static void SetMueLuOFileStream(const std::string &filename)
Definition
MueLu_VerboseObject.cpp:137
MueLu::VerboseObject::GetProcRankVerbose
int GetProcRankVerbose() const
Get proc rank used for printing. Do not use this information for any other purpose....
Definition
MueLu_VerboseObject.cpp:93
MueLu
Namespace for MueLu classes and methods.
Definition
MueLu_BrickAggregationFactory_decl.hpp:78
MueLu::VerbLevel
int VerbLevel
Definition
MueLu_VerbosityLevel.hpp:113
MueLu::MsgType
MsgType
Definition
MueLu_VerbosityLevel.hpp:54
MueLu::Warnings
@ Warnings
Print all warning messages.
Definition
MueLu_VerbosityLevel.hpp:89
MueLu::Extreme
@ Extreme
Definition
MueLu_VerbosityLevel.hpp:105
MueLu::High
@ High
Definition
MueLu_VerbosityLevel.hpp:101
MueLu::Test
@ Test
Definition
MueLu_VerbosityLevel.hpp:94
MueLu::NotSpecified
@ NotSpecified
Definition
MueLu_VerbosityLevel.hpp:109
src
MueCentral
MueLu_VerboseObject.cpp
Generated by
1.17.0