FEI Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
fei_VectorTraits_Epetra.hpp
Go to the documentation of this file.
1/*
2// @HEADER
3// ************************************************************************
4// FEI: Finite Element Interface to Linear Solvers
5// Copyright (2005) Sandia Corporation.
6//
7// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the
8// U.S. Government retains certain rights in this software.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Alan Williams (william@sandia.gov)
38//
39// ************************************************************************
40// @HEADER
41*/
42
43
44#ifndef _fei_VectorTraits_Epetra_h_
45#define _fei_VectorTraits_Epetra_h_
46
47#ifdef HAVE_FEI_EPETRA
48
49//
50//IMPORTANT NOTE: Make sure that wherever this file is included from, it
51//appears BEFORE any include of fei_base.hpp or fei_Vector.hpp !!!
52//
53#include <fei_VectorTraits.hpp>
55
56namespace fei {
63 template<>
64 struct VectorTraits<Epetra_MultiVector> {
65 static const char* typeName()
66 { return("Epetra_MultiVector"); }
67
68 static int setValues(Epetra_MultiVector* vec, int firstLocalOffset,
69 double scalar, bool isSolnVector=false)
70 {
71 return( vec->PutScalar(scalar) );
72 }
73
74 //note that incoming indices are point-entry indices, not block-indices.
75 static int putValuesIn(Epetra_MultiVector* vec,
76 int firstLocalOffset,
77 int numValues,
78 const int* indices,
79 const double* values,
80 bool sum_into,
81 bool isSolnVector=false,
82 int vectorIndex=0)
83 {
84 double* localVecValues = (*vec)[vectorIndex];
85 if (sum_into) {
86 for(int i=0; i<numValues; ++i) {
87 localVecValues[indices[i]-firstLocalOffset] += values[i];
88 }
89 }
90 else {
91 for(int i=0; i<numValues; ++i) {
92 localVecValues[indices[i]-firstLocalOffset] = values[i];
93 }
94 }
95 return(0);
96 }
97
98 //note that incoming indices are point-entry indices, not block-indices.
99 static int copyOut(Epetra_MultiVector* vec,
100 int firstLocalOffset,
101 int numValues, const int* indices, double* values,
102 bool isSolnVector=false,
103 int vectorIndex=0)
104 {
105 double* localVecValues = (*vec)[vectorIndex];
106 for(int i=0; i<numValues; ++i) {
107 values[i] = localVecValues[indices[i]-firstLocalOffset];
108 }
109
110 return(0);
111 }
112
113 static double* getLocalCoefsPtr(Epetra_MultiVector* vec,
114 bool isSolnVector=false,
115 int vectorIndex=0)
116 {
117 return((*vec)[vectorIndex]);
118 }
119
120 static int update(Epetra_MultiVector* vec,
121 double a,
122 const Epetra_MultiVector* x,
123 double b)
124 {
125 return( vec->Update(a, *x, b) );
126 }
127
128 };//struct VectorTraits<Epetra_MultiVector>
129}//namespace fei
130
131#endif //HAVE_FEI_EPETRA
132
133#endif // _fei_VectorTraits_Epetra_hpp_
int Update(double ScalarA, const Epetra_MultiVector &A, double ScalarThis)
int PutScalar(double ScalarConstant)
static double * getLocalCoefsPtr(T *vec, bool isSolnVector=false, int vectorIndex=0)
static int update(T *vec, double a, const T *x, double b)
static const char * typeName()
static int putValuesIn(T *vec, int firstLocalOffset, int numValues, const int *indices, const double *values, bool sum_into, bool isSolnVector=false, int vectorIndex=0)
static int setValues(T *vec, int firstLocalOffset, double scalar, bool isSolnVector=false)
static int copyOut(T *vec, int firstLocalOffset, int numValues, const int *indices, double *values, bool isSolnVector=false, int vectorIndex=0)