00001 /* @HEADER@ */ 00002 // ************************************************************************ 00003 // 00004 // Playa: Programmable Linear Algebra 00005 // Copyright 2012 Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Kevin Long (kevin.long@ttu.edu) 00038 // 00039 00040 /* @HEADER@ */ 00041 00042 #ifndef PLAYA_LOADABLEVECTOR_HPP 00043 #define PLAYA_LOADABLEVECTOR_HPP 00044 00045 #include "PlayaDefs.hpp" 00046 00047 namespace Playa 00048 { 00049 /** 00050 * LoadableVector defines an interface through which elements can 00051 * be loaded into a vector. Element loading is used extensively 00052 * by application codes in creating vectors, 00053 * but should never be used by high-performance solver codes. 00054 * 00055 * A vector type that will be 00056 * used in a context where loading is required should multiply inherit 00057 * from both VectorBase andLoadableVector. 00058 * 00059 * Elements can by loaded one at a time 00060 * or in batches. The methods to load single elements arew pure virtual 00061 * and thus must be defined by derived classes. 00062 * Loading in batches will usually be more efficient 00063 * provided the underlying vector implementation supports it. 00064 * For those types not supporting batch loading, LoadableVector provides 00065 * default batch loading functions which delegate to single-element loading. 00066 * 00067 * Elements can by loaded either by setting a value, or adding to an 00068 * existing value. The latter will typically by used in finite-element 00069 * codes. 00070 * 00071 * @author Kevin Long (kevin.long@ttu.edu) 00072 */ 00073 template <class Scalar> 00074 class LoadableVector 00075 { 00076 public: 00077 /** virtual dtor */ 00078 virtual ~LoadableVector() {;} 00079 00080 /** set a single element at the given global index */ 00081 virtual void setElement(int globalIndex, const Scalar& value) = 0 ; 00082 00083 /** add to the existing value of 00084 * a single element at the given global index */ 00085 virtual void addToElement(int globalIndex, const Scalar& value) = 0 ; 00086 00087 /** set a group of elements */ 00088 virtual void setElements(int numElems, 00089 const int* globalIndices, 00090 const Scalar* values) ; 00091 00092 /** add to a group of elements */ 00093 virtual void addToElements(int numElems, 00094 const int* globalIndices, 00095 const Scalar* values); 00096 00097 /** Do whatever finalization steps are needed by the implementation, 00098 for instance, synchronizing border elements. The default implementation 00099 * is a no-op. */ 00100 virtual void finalizeAssembly() {;} 00101 }; 00102 00103 /* Default implementation of setElements makes multiple calls to 00104 * setElement(). If at all possible, this should be overridden 00105 * with a method specialized to the underlying type. */ 00106 template <class Scalar> 00107 inline void LoadableVector<Scalar>::setElements(int numElems, 00108 const int* globalIndices, 00109 const Scalar* values) 00110 { 00111 for (int i=0; i<numElems; i++) 00112 { 00113 setElement(globalIndices[i], values[i]); 00114 } 00115 } 00116 00117 /* Default implementation of addToElements makes multiple calls to 00118 * addToElement(). If at all possible, this should be overridden 00119 * with a method specialized to the underlying type. */ 00120 template <class Scalar> 00121 inline void LoadableVector<Scalar>::addToElements(int numElems, 00122 const int* globalIndices, 00123 const Scalar* values) 00124 { 00125 for (int i=0; i<numElems; i++) 00126 { 00127 addToElement(globalIndices[i], values[i]); 00128 } 00129 } 00130 00131 00132 00133 } 00134 00135 #endif