1 // The libMesh Finite Element Library. 2 // Copyright (C) 2002-2020 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 3 4 // This library is free software; you can redistribute it and/or 5 // modify it under the terms of the GNU Lesser General Public 6 // License as published by the Free Software Foundation; either 7 // version 2.1 of the License, or (at your option) any later version. 8 9 // This library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 // Lesser General Public License for more details. 13 14 // You should have received a copy of the GNU Lesser General Public 15 // License along with this library; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 18 19 20 #ifndef LIBMESH_DENSE_VECTOR_BASE_H 21 #define LIBMESH_DENSE_VECTOR_BASE_H 22 23 24 // Local Includes 25 #include "libmesh/libmesh_common.h" 26 27 // C++ includes 28 29 namespace libMesh 30 { 31 32 /** 33 * Defines an abstract dense vector base class for use in 34 * Finite Element-type computations. Specialized dense vectors, 35 * for example DenseSubVectors, can be derived from this class. 36 * 37 * \author John W. Peterson 38 * \date 2003 39 */ 40 template<typename T> 41 class DenseVectorBase 42 { 43 public: 44 /** 45 * Constructor. 46 */ 47 DenseVectorBase() = default; 48 49 /** 50 * The 5 special functions can be defaulted for this class, as it 51 * does not manage any memory itself. 52 */ 53 DenseVectorBase (DenseVectorBase &&) = default; 54 DenseVectorBase (const DenseVectorBase &) = default; 55 DenseVectorBase & operator= (const DenseVectorBase &) = default; 56 DenseVectorBase & operator= (DenseVectorBase &&) = default; 57 virtual ~DenseVectorBase() = default; 58 59 /** 60 * Set every element in the vector to 0. Needs to 61 * be pure virtual since the storage method may 62 * be different in derived classes. 63 */ 64 virtual void zero() = 0; 65 66 /** 67 * \returns The \p (i) element of the vector. 68 */ 69 virtual T el(const unsigned int i) const = 0; 70 71 /** 72 * \returns The \p (i) element of the vector as a writable reference. 73 */ 74 virtual T & el(const unsigned int i) = 0; 75 76 /** 77 * \returns The size of the vector. 78 */ 79 virtual unsigned int size() const = 0; 80 81 /** 82 * \returns \p true iff size() is 0. 83 */ empty()84 virtual bool empty() const { return (this->size() == 0); } 85 86 /** 87 * Pretty-print the vector to \p stdout. 88 */ 89 void print(std::ostream & os) const; 90 91 /** 92 * Same as above, but allows you to print using the 93 * usual stream syntax. 94 */ 95 friend std::ostream & operator << (std::ostream & os, const DenseVectorBase<T> & v) 96 { 97 v.print(os); 98 return os; 99 } 100 101 /** 102 * Prints the entries of the vector with additional 103 * decimal places in scientific notation. 104 */ 105 void print_scientific(std::ostream & os, unsigned precision=8) const; 106 }; 107 108 } // namespace libMesh 109 110 111 112 #endif // LIBMESH_DENSE_VECTOR_BASE_H 113