Epetra Package Browser (Single Doxygen Collection) Development
Epetra_OskiMultiVector.cpp
Go to the documentation of this file.
00001 
00002 //@HEADER
00003 // ************************************************************************
00004 //
00005 //               Epetra: Linear Algebra Services Package
00006 //                 Copyright 2011 Sandia Corporation
00007 //
00008 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00009 // the U.S. Government retains certain rights in this software.
00010 //
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00039 //
00040 // ************************************************************************
00041 //@HEADER
00042 
00043 #include "Epetra_ConfigDefs.h"
00044 
00045 #ifdef HAVE_OSKI
00046 #ifdef HAVE_EPETRA_TEUCHOS
00047 #include "Epetra_OskiMultiVector.h"
00048 
00049 //=============================================================================
00050 
00051 Epetra_OskiMultiVector::Epetra_OskiMultiVector(const Epetra_OskiMultiVector& Source)
00052   : Epetra_MultiVector(Source),
00053   Epetra_View_(Source.Epetra_View_),
00054   Copy_Created_(Source.Copy_Created_) {
00055     Oski_View_ = oski_CopyVecView(Source.Oski_View_);
00056 }
00057 
00058 Epetra_OskiMultiVector::Epetra_OskiMultiVector(const Epetra_MultiVector& Source)
00059   : Epetra_MultiVector(Source),
00060   Epetra_View_(&Source),
00061   Copy_Created_(false) {
00062     double* A;
00063     double** Aptr;
00064     int LDA;
00065     int* LDAptr;
00066     LDAptr = new int[1];
00067     Aptr = new double*[1];
00068     if(Source.ConstantStride() || (Source.NumVectors() == 1)) {
00069       if(Source.ExtractView(Aptr, LDAptr))
00070         std::cerr << "Extract view failed\n";
00071       else
00072         Oski_View_ = oski_CreateMultiVecView(*Aptr, Source.MyLength(), Source.NumVectors(), LAYOUT_COLMAJ, *LDAptr);
00073     }
00074     else {
00075       Copy_Created_ = true;
00076       LDA = Source.MyLength();
00077       A = new double[LDA*Source.NumVectors()];
00078       if(Source.ExtractCopy(A, LDA))
00079         std::cerr << "Extract copy failed\n";
00080       else
00081         Oski_View_ = oski_CreateMultiVecView(A, Source.MyLength(), Source.NumVectors(), LAYOUT_COLMAJ, LDA);
00082     }
00083     delete [] LDAptr;
00084     delete [] Aptr;
00085 }
00086 
00087 Epetra_OskiMultiVector::~Epetra_OskiMultiVector() {
00088   if(oski_DestroyVecView(Oski_View_))
00089     std::cerr << "Vector destroy failed\n";
00090 }
00091 
00092 bool Epetra_OskiMultiVector::Copy_Created() const {
00093   return Copy_Created_;
00094 }
00095 
00096 oski_vecview_t Epetra_OskiMultiVector::Oski_View() const {
00097   return Oski_View_;
00098 }
00099 
00100 const Epetra_MultiVector* Epetra_OskiMultiVector::Epetra_View() const {
00101   return Epetra_View_;
00102 }
00103 
00104 Epetra_OskiMultiVector& Epetra_OskiMultiVector::operator = (const Epetra_OskiMultiVector& Source) {
00105   Epetra_View_ = Source.Epetra_View_;
00106   Oski_View_ = Source.Oski_View_;
00107   Copy_Created_ = Source.Copy_Created_;
00108   return(*this);
00109 }
00110 
00111 #endif
00112 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines