Epetra Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
Epetra_OskiMultiVector.cpp
Go to the documentation of this file.
1
2//@HEADER
3// ************************************************************************
4//
5// Epetra: Linear Algebra Services Package
6// Copyright 2011 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 Michael A. Heroux (maherou@sandia.gov)
39//
40// ************************************************************************
41//@HEADER
42
43#include "Epetra_ConfigDefs.h"
44
45#ifdef HAVE_OSKI
46#ifdef HAVE_EPETRA_TEUCHOS
48
49//=============================================================================
50
52 : Epetra_MultiVector(Source),
53 Epetra_View_(Source.Epetra_View_),
54 Copy_Created_(Source.Copy_Created_) {
55 Oski_View_ = oski_CopyVecView(Source.Oski_View_);
56}
57
59 : Epetra_MultiVector(Source),
60 Epetra_View_(&Source),
61 Copy_Created_(false) {
62 double* A;
63 double** Aptr;
64 int LDA;
65 int* LDAptr;
66 LDAptr = new int[1];
67 Aptr = new double*[1];
68 if(Source.ConstantStride() || (Source.NumVectors() == 1)) {
69 if(Source.ExtractView(Aptr, LDAptr))
70 std::cerr << "Extract view failed\n";
71 else
72 Oski_View_ = oski_CreateMultiVecView(*Aptr, Source.MyLength(), Source.NumVectors(), LAYOUT_COLMAJ, *LDAptr);
73 }
74 else {
75 Copy_Created_ = true;
76 LDA = Source.MyLength();
77 A = new double[LDA*Source.NumVectors()];
78 if(Source.ExtractCopy(A, LDA))
79 std::cerr << "Extract copy failed\n";
80 else
81 Oski_View_ = oski_CreateMultiVecView(A, Source.MyLength(), Source.NumVectors(), LAYOUT_COLMAJ, LDA);
82 }
83 delete [] LDAptr;
84 delete [] Aptr;
85}
86
88 if(oski_DestroyVecView(Oski_View_))
89 std::cerr << "Vector destroy failed\n";
90}
91
93 return Copy_Created_;
94}
95
96oski_vecview_t Epetra_OskiMultiVector::Oski_View() const {
97 return Oski_View_;
98}
99
101 return Epetra_View_;
102}
103
105 Epetra_View_ = Source.Epetra_View_;
106 Oski_View_ = Source.Oski_View_;
108 return(*this);
109}
110
111#endif
112#endif
Epetra_MultiVector: A class for constructing and using dense multi-vectors, vectors and matrices in p...
int NumVectors() const
Returns the number of vectors in the multi-vector.
int MyLength() const
Returns the local vector length on the calling processor of vectors in the multi-vector.
int ExtractView(double **A, int *MyLDA) const
Set user-provided addresses of A and MyLDA.
bool ConstantStride() const
Returns true if this multi-vector has constant stride between vectors.
int ExtractCopy(double *A, int MyLDA) const
Put multi-vector values into user-provided two-dimensional array.
Epetra_OskiMultiVector: A class for constructing and using dense Oski multi-vectors on a single proce...
bool Copy_Created() const
Returns true if a deep copy of the multi-vector was created by the constructor.
virtual ~Epetra_OskiMultiVector()
Destructor.
Epetra_OskiMultiVector(const Epetra_OskiMultiVector &Source)
Copy constructor.
oski_vecview_t Oski_View() const
Returns the Oski portion of the Multi-Vector.
Epetra_OskiMultiVector & operator=(const Epetra_OskiMultiVector &Source)
Sets this equal to Source.
const Epetra_MultiVector * Epetra_View_
const Epetra_MultiVector * Epetra_View() const
Returns the Epetra portion of the Multi-Vector.