Stokhos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Stokhos_PCECovarianceOp.cpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Stokhos Package
4 //
5 // Copyright 2009 NTESS and the Stokhos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
11 
12 #include "Epetra_LocalMap.h"
13 #include "Epetra_Map.h"
14 #include "Epetra_MultiVector.h"
15 
18  : label("Stokhos::PCECovarianceOp"),
19  X(),
20  s(X_poly.basis()->norm_squared()),
21  useTranspose(false),
22  tmp_map(),
23  tmp()
24 {
25  const Epetra_BlockMap& base_map = X_poly[0].Map();
26  int sz = X_poly.size();
28  Teuchos::rcp(new Epetra_MultiVector(base_map, sz-1));
29  for (int i=0; i<sz-1; i++)
30  (*XX)(i)->Scale(1.0, X_poly[i+1]);
31  X = XX;
32  tmp_map =
33  Teuchos::rcp(new Epetra_LocalMap(X->NumVectors(), 0, X->Map().Comm()));
34 }
35 
39  : label("Stokhos::PCECovarianceOp"),
40  X(),
41  s(basis.norm_squared()),
42  useTranspose(false),
43  tmp_map(),
44  tmp()
45 {
46  const Epetra_BlockMap& base_map = X_bv->GetBaseMap();
47  int N = base_map.NumMyElements();
48  int sz = basis.size();
49  X = Teuchos::rcp(new Epetra_MultiVector(View, base_map, X_bv->Values()+N,
50  N, sz-1));
51  tmp_map =
52  Teuchos::rcp(new Epetra_LocalMap(X->NumVectors(), 0, X->Map().Comm()));
53 }
54 
58  : label("Stokhos::PCECovarianceOp"),
59  X(X_),
60  s(basis.norm_squared()),
61  useTranspose(false),
62  tmp_map(),
63  tmp()
64 {
65  tmp_map =
66  Teuchos::rcp(new Epetra_LocalMap(X->NumVectors(), 0, X->Map().Comm()));
67 }
68 
70 {
71 }
72 
73 int
75 {
76  useTranspose = UseTheTranspose;
77  return 0;
78 }
79 
80 int
82  Epetra_MultiVector& Result) const
83 {
84  // Allocate temporary storage
85  int m = Input.NumVectors();
86  if (tmp == Teuchos::null || tmp->NumVectors() != m)
87  tmp = Teuchos::rcp(new Epetra_MultiVector(*tmp_map, m));
88 
89  // Compute X^T*Input
90  tmp->Multiply('T', 'N', 1.0, *X, Input, 0.0);
91 
92  // Compute S*tmp
93  for (int j=0; j<m; j++)
94  for (int i=0; i<X->NumVectors(); i++)
95  (*tmp)[j][i] *= s[i+1];
96 
97  // Compute X*tmp
98  Result.Multiply('N', 'N', 1.0, *X, *tmp, 0.0);
99 
100  return 0;
101 }
102 
103 int
105  Epetra_MultiVector& Result) const
106 {
107  throw "PCECovarianceOp::ApplyInverse not defined!";
108  return -1;
109 }
110 
111 double
113 {
114  return 1.0;
115 }
116 
117 
118 const char*
120 {
121  return const_cast<char*>(label.c_str());
122 }
123 
124 bool
126 {
127  return useTranspose;
128 }
129 
130 bool
132 {
133  return false;
134 }
135 
136 const Epetra_Comm &
138 {
139  return X->Map().Comm();
140 }
141 const Epetra_Map&
143 {
144  return dynamic_cast<const Epetra_Map&>(X->Map());
145 }
146 
147 const Epetra_Map&
149 {
150  return dynamic_cast<const Epetra_Map&>(X->Map());
151 }
152 
153 const Epetra_BlockMap&
155 {
156  return X->Map();
157 }
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 Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this matrix operator.
virtual double NormInf() const
Returns an approximate infinity norm of the operator matrix.
virtual const Epetra_Comm & Comm() const
Returns a reference to the Epetra_Comm communicator associated with this operator.
virtual bool UseTranspose() const
Returns the current UseTranspose setting.
PCECovarianceOp(const Stokhos::VectorOrthogPoly< Epetra_Vector > &X_poly)
Constructor with polynomial X.
int NumMyElements() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual const Epetra_BlockMap & Map() const =0
virtual ~PCECovarianceOp()
Destructor.
virtual bool HasNormInf() const
Returns true if the this object can provide an approximate Inf-norm, false otherwise.
const Epetra_Comm & Comm() const
Teuchos::RCP< const Epetra_MultiVector > X
Multivector X defining A = X*S*X^T.
const Epetra_BlockMap & CoeffMap() const
Returns PCE coefficient map.
Teuchos::RCP< Epetra_Map > tmp_map
Map needed for temporary vector.
ordinal_type size() const
Return size.
virtual const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this matrix operator. ...
virtual ordinal_type size() const =0
Return total size of basis.
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 const char * Label() const
Returns a character std::string describing the operator.
virtual int SetUseTranspose(bool UseTranspose)
Set to true if the transpose of the operator is requested.