/usr/include/trilinos/Kokkos_MultiVector.hpp is in libtrilinos-dev 10.4.0.dfsg-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | //@HEADER
// ************************************************************************
//
// Kokkos: Node API and Parallel Node Kernels
// Copyright (2009) Sandia Corporation
//
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
// license for use of this work by or on behalf of the U.S. Government.
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
//
// ************************************************************************
//@HEADER
#ifndef KOKKOS_MULTIVECTOR_H
#define KOKKOS_MULTIVECTOR_H
#include "Kokkos_ConfigDefs.hpp"
#include "Kokkos_DefaultNode.hpp"
#include <Teuchos_RCP.hpp>
#include <Teuchos_ArrayRCP.hpp>
#include <Teuchos_TestForException.hpp>
#include <Teuchos_TypeNameTraits.hpp>
namespace Kokkos {
//! Kokkos::MultiVector: Kokkos default implementation of the abstract Kokkos::MultiVector.
/*! The Kokkos::MultiVector provides a default implementation of Kokkos::MultiVector interface.
At this time, the primary functions provided by Kokkos::MultiVector is wrapping of a
set of dense vector and providing access to multivector entries. Two basic
categories of data structures are supported:
<ol>
<li> MultiVector is described by an array of pointers: In this situation, the
ith entry of this array of pointers
is the starting address of a contiguous array of values for the ith vector
in the multivector. The storage mode
will be assumed if the getIsStrided() method returns false.
<li> MultiVector is a regular strided two-dimensional array of values: In this situation,
the increment between
elements in the row and column dimensions is specified by the getRowInc()
and getColInc() methods. This is
a very general mechanism for describing strided access. Typical situations include:
<ul>
<li> getRowInc() = getNumCols(), getColInc() = 1 - column entries are contiguous.
<li> getRowInc() = 1, getColInc() = getNumRows() - row entries are contiguous.
</ul>
However, this mechanism also allows extraction of array subsections, real or
imaginary parts from
complex-valued arrays.
This storage mode will be assumed if getIsStrided() returns true. The base
address for the 2D array
will be obtain by call getValues() with the argument equal to 0.
</ol>
*/
template<class Scalar, class Node = DefaultNode::DefaultNodeType>
class MultiVector {
public:
typedef Scalar ScalarType;
typedef Node NodeType;
//! @name Constructors/Destructor
//@{
//! Default constructor
MultiVector(Teuchos::RCP<Node> node)
: node_(node)
, numRows_(0)
, numCols_(0)
, stride_(0) {
}
//! Copy constructor.
MultiVector(const MultiVector& source)
: node_(source.node_)
, contigValues_(source.contigValues_)
, numRows_(source.numRows_)
, numCols_(source.numCols_)
, stride_(source.stride_) {
}
//! MultiVector Destructor
~MultiVector() {
}
//@}
//! @name Initialization methods
//@{
//! Initialize using a two-dimensional array
/*!
This interface supports multivectors that are stored as 2D arrays, or subsections of one.
\param numRows (In) Number of rows in multivector (length of each vector).
\param numCols (In) Number of columns in multivector (number of vectors).
\param values (In) Pointer to the first entry in the multivector. Subsequent column
entries are spaced a distance of getColInc(). Subsequent row entries
are spaced by getRowInc() increments.
\param rowInc (In) The increment between two elements in a row of the multivector.
Typically this value should be set to numRows.
\param colInc (In) The increment between two elements in a column of the multivector.
Typically this value should be set to 1, which is the default value.
\return Integer error code, set to 0 if successful.
*/
void initializeValues(size_t numRows, size_t numCols,
const Teuchos::ArrayRCP<Scalar> &values,
size_t stride) {
numRows_ = numRows;
numCols_ = numCols;
stride_ = stride;
contigValues_ = values;
};
//@}
//! @name Multivector entry access methods
//@{
//! Returns a copy of the ArrayRCP passed to initializeValues().
Teuchos::ArrayRCP<Scalar>
getValuesNonConst() {
return contigValues_;
}
//! Returns a copy of the ArrayRCP passed to initializeValues().
Teuchos::ArrayRCP<const Scalar>
getValues() const {
return contigValues_;
}
//! Returns a pointer to an array of values for the ith column of the multivector.
/*! Extract a pointer to the values in the ith column of the multivector. Note that
the values are not copied by this method. Memory allocation is
handled by the multivector object itself. Also, if the getIsStrided() method returns
true, then the getColInc() should be used to access values in the ith column
of the multivector, especially if getColInc() != 1.
\param i (In) The column that should be returned.
*/
Teuchos::ArrayRCP<Scalar>
getValuesNonConst(size_t i) {
TEST_FOR_EXCEPTION((contigValues_ == Teuchos::null) || // No data to return
i < 0 || i >= numCols_, // Out of range
std::runtime_error,
Teuchos::typeName(*this) << "::getValuesNonConst(): index out of range or data structure not initialized.");
return contigValues_.persistingView(stride_*i,numRows_);
};
//! Returns a pointer to an array of values for the ith column of the multivector.
/*! Extract a pointer to the values in the ith column of the multivector. Note that
the values are not copied by this method. Memory allocation is
handled by the multivector object itself. Also, if the getIsStrided() method returns
true, then the getColInc() should be used to access values in the ith column
of the multivector, especially if getColInc() != 1.
\param i (In) The column that should be returned.
*/
Teuchos::ArrayRCP<const Scalar>
getValues(size_t i) const {
TEST_FOR_EXCEPTION((contigValues_ == Teuchos::null) || // No data to return
i < 0 || i >= numCols_, // Out of range
std::runtime_error,
Teuchos::typeName(*this) << "::getValues(): index out of range or data structure not initialized.");
return contigValues_.persistingView(stride_*i,numRows_);
};
//@}
//! @name MultiVector Attribute access methods
//@{
Teuchos::RCP<Node> getNode() const {return node_;}
//! Number of rows
size_t getNumRows() const {return(numRows_);};
//! Number of columns
size_t getNumCols() const{return(numCols_);};
//! Increment between entries in a row of the multivector, normally = numRows().
size_t getStride() const {return(stride_);};
//@}
protected:
Teuchos::RCP<Node> node_;
Teuchos::ArrayRCP<Scalar> contigValues_;
bool dataInitialized_;
size_t numRows_, numCols_, stride_;
};
} // namespace Kokkos
#endif /* KOKKOS_MULTIVECTOR_H */
|