FEI Version of the Day
fei_SparseRowGraph.hpp
00001 /*
00002 // @HEADER
00003 // ************************************************************************
00004 //             FEI: Finite Element Interface to Linear Solvers
00005 //                  Copyright (2005) Sandia Corporation.
00006 //
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the
00008 // 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 Alan Williams (william@sandia.gov) 
00038 //
00039 // ************************************************************************
00040 // @HEADER
00041 */
00042 
00043 
00044 
00045 #ifndef _fei_SparseRowGraph_hpp_
00046 #define _fei_SparseRowGraph_hpp_
00047 
00048 #include <fei_macros.hpp>
00049 #include <vector>
00050 #include <algorithm>
00051 
00052 namespace fei {
00058   class SparseRowGraph {
00059   public:
00061     SparseRowGraph()
00062       : rowNumbers(), rowOffsets(), packedColumnIndices(), blockEntries(false)
00063       {}
00064 
00066     SparseRowGraph(const SparseRowGraph& src)
00067       : rowNumbers(src.rowNumbers), rowOffsets(src.rowOffsets),
00068       packedColumnIndices(src.packedColumnIndices), blockEntries(src.blockEntries)
00069       {}
00070 
00072     virtual ~SparseRowGraph() {}
00073 
00075     bool operator==(const fei::SparseRowGraph& othergraph) const;
00076 
00078     bool operator!=(const fei::SparseRowGraph& othergraph) const;
00079 
00081     std::vector<int> rowNumbers;
00082 
00089     std::vector<int> rowOffsets;
00090 
00094     std::vector<int> packedColumnIndices;
00095 
00097     bool blockEntries;
00098   };//class SparseRowGraph
00099 
00100 inline bool SparseRowGraph::operator==(const fei::SparseRowGraph& othergraph) const
00101 {
00102   if (rowNumbers != othergraph.rowNumbers) return(false);
00103   if (rowOffsets != othergraph.rowOffsets) return(false);
00104   if (packedColumnIndices != othergraph.packedColumnIndices) return(false);
00105   return(true);
00106 }
00107 
00108 inline bool SparseRowGraph::operator!=(const fei::SparseRowGraph& othergraph) const
00109 {
00110   return( !(*this == othergraph) );
00111 }
00112 
00120 inline
00121 int find_row_start(int row, const SparseRowGraph& srg)
00122 {
00123   std::vector<int>::const_iterator rowNumbers_iter =
00124     std::lower_bound(srg.rowNumbers.begin(), srg.rowNumbers.end(), row);
00125   if (rowNumbers_iter == srg.rowNumbers.end() || *rowNumbers_iter != row) {
00126     return -1;
00127   }
00128 
00129   size_t offset = rowNumbers_iter - srg.rowNumbers.begin();
00130   return srg.rowOffsets[offset];
00131 }
00132 
00133 }//namespace fei
00134 
00135 #endif
00136 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends