Stokhos Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
Stokhos_EpetraMultiVectorOperator.cpp
Go to the documentation of this file.
1// $Id$
2// $Source$
3// @HEADER
4// ***********************************************************************
5//
6// Stokhos Package
7// Copyright (2009) Sandia Corporation
8//
9// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
10// license for use of this work by or on behalf of the U.S. Government.
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 T. Phipps (etphipp@sandia.gov).
40//
41// ***********************************************************************
42// @HEADER
43
45#include "Epetra_Vector.h"
46#include "Epetra_LocalMap.h"
47
50 const Teuchos::RCP<const Epetra_MultiVector>& multi_vec_,
51 bool is_multi_vec_transposed_)
52 : label("Epetra MultiVector Operator"),
53 multi_vec(multi_vec_),
54 nonconst_multi_vec(),
55 is_multi_vec_transposed(is_multi_vec_transposed_),
56 useTranspose(is_multi_vec_transposed),
57 domain_map()
58{
59 domain_map = Teuchos::rcp(new Epetra_LocalMap(multi_vec->NumVectors(), 0,
60 multi_vec->Map().Comm()));
61}
62
65 const Teuchos::RCP<Epetra_MultiVector>& multi_vec_,
66 bool is_multi_vec_transposed_)
67 : label("Epetra MultiVector Operator"),
68 multi_vec(multi_vec_),
69 nonconst_multi_vec(multi_vec_),
70 is_multi_vec_transposed(is_multi_vec_transposed_),
71 useTranspose(is_multi_vec_transposed),
72 domain_map()
73{
74 domain_map = Teuchos::rcp(new Epetra_LocalMap(multi_vec->NumVectors(), 0,
75 multi_vec->Map().Comm()));
76}
77
82
83int
85SetUseTranspose(bool UseTranspose)
86{
87 if (is_multi_vec_transposed)
88 useTranspose = !UseTranspose;
89 else
90 useTranspose = UseTranspose;
91
92 return 0;
93}
94
95int
97Apply(const Epetra_MultiVector& Input, Epetra_MultiVector& Result) const
98{
99 char trans = 'N';
100 if (useTranspose)
101 trans = 'T';
102
103 int ret = Result.Multiply(trans, 'N', 1.0, *multi_vec, Input, 0.0);
104 TEUCHOS_TEST_FOR_EXCEPTION(ret != 0, std::logic_error,
105 "Error! Stokhos::EpetraMultiVectorOperator: " <<
106 "Result.Multiply() returned " << ret << "!");
107
108 return ret;
109}
110
111int
113ApplyInverse(const Epetra_MultiVector& Input,
114 Epetra_MultiVector& Result) const
115{
116 throw "EpetraMultiVectorOperator::ApplyInverse not defined!";
117 return -1;
118}
119
120double
122NormInf() const
123{
124 // ||A||_inf = || (|A_1| + ... + |A_n|) ||_inf where A_i is the i-th column
125 // of the multi-vector A
126 Epetra_Vector tmp1(multi_vec->Map());
127 Epetra_Vector tmp2(multi_vec->Map());
128 for (int j=0; j<multi_vec->NumVectors(); j++) {
129 tmp1.Abs(*((*multi_vec)(j)));
130 tmp2.Update(1.0, tmp1, 1.0);
131 }
132 double nrm;
133 tmp2.NormInf(&nrm);
134
135 return nrm;
136}
137
138
139const char*
141Label() const
142{
143 return const_cast<char*>(label.c_str());
144}
145
146bool
148UseTranspose() const
149{
150 if (is_multi_vec_transposed)
151 return !useTranspose;
152 return useTranspose;
153}
154
155bool
157HasNormInf() const
158{
159 return true;
160}
161
162const Epetra_Comm &
164Comm() const
165{
166 return domain_map->Comm();
167}
168const Epetra_Map&
170OperatorDomainMap() const
171{
172 if (useTranspose)
173 return dynamic_cast<const Epetra_Map&>(multi_vec->Map());
174 return *domain_map;
175}
176
177const Epetra_Map&
179OperatorRangeMap() const
180{
181 if (useTranspose)
182 return *domain_map;
183 return dynamic_cast<const Epetra_Map&>(multi_vec->Map());
184}
virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Returns the result of the inverse of the operator applied to a Epetra_MultiVector Input in Result as ...
virtual bool UseTranspose() const
Returns the current UseTranspose setting.
virtual const Epetra_Comm & Comm() const
Returns a reference to the Epetra_Comm communicator associated with this operator.
virtual const Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this matrix operator.
Teuchos::RCP< const Epetra_MultiVector > multi_vec
Multi-vector.
virtual double NormInf() const
Returns an approximate infinity norm of the operator matrix.
virtual bool HasNormInf() const
Returns true if the this object can provide an approximate Inf-norm, false otherwise.
virtual int SetUseTranspose(bool UseTranspose)
Set to true if the transpose of the operator is requested.
virtual const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this matrix operator.
Teuchos::RCP< Epetra_Map > domain_map
Domain map ( = number of columns of multi_vec)
virtual int Apply(const Epetra_MultiVector &Input, Epetra_MultiVector &Result) const
Returns the result of a Epetra_Operator applied to a Epetra_MultiVector Input in Result as described ...
virtual const char * Label() const
Returns a character string describing the operator.
EpetraMultiVectorOperator(const Teuchos::RCP< const Epetra_MultiVector > &multi_vec, bool is_multi_vec_transposed)
Constructor.