|
Tpetra Matrix/Vector Services
Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Tpetra: Templated Linear Algebra Services Package 00005 // Copyright (2008) 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 Michael A. Heroux (maherou@sandia.gov) 00038 // 00039 // ************************************************************************ 00040 // @HEADER 00041 00042 #ifndef TPETRA_BLOCKMAP_DECL_HPP 00043 #define TPETRA_BLOCKMAP_DECL_HPP 00044 00045 #include <map> 00046 00047 #include "Tpetra_Map.hpp" 00048 00053 namespace Tpetra { 00054 00070 template <class LocalOrdinal = Map<>::local_ordinal_type, 00071 class GlobalOrdinal = typename Map<LocalOrdinal>::global_ordinal_type, 00072 class Node = typename Map<LocalOrdinal, GlobalOrdinal>::node_type> 00073 class BlockMap : public Teuchos::Describable { 00074 public: 00075 typedef LocalOrdinal local_ordinal_type; 00076 typedef GlobalOrdinal global_ordinal_type; 00077 typedef Node node_type; 00078 00080 00081 00084 BlockMap(global_size_t numGlobalBlocks, 00085 LocalOrdinal blockSize, 00086 GlobalOrdinal indexBase, 00087 const Teuchos::RCP<const Teuchos::Comm<int> > &comm, 00088 const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ()); 00089 00092 BlockMap(global_size_t numGlobalBlocks, 00093 size_t numLocalBlocks, 00094 LocalOrdinal blockSize, 00095 GlobalOrdinal indexBase, 00096 const Teuchos::RCP<const Teuchos::Comm<int> > &comm, 00097 const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ()); 00098 00101 BlockMap(global_size_t numGlobalBlocks, 00102 const Teuchos::ArrayView<const GlobalOrdinal>& myGlobalBlockIDs, 00103 const Teuchos::ArrayView<const GlobalOrdinal>& myFirstGlobalPointInBlocks, 00104 const Teuchos::ArrayView<const LocalOrdinal>& myBlockSizes, 00105 GlobalOrdinal indexBase, 00106 const Teuchos::RCP<const Teuchos::Comm<int> > &comm, 00107 const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ()); 00108 00115 BlockMap(const Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> >& pointMap, 00116 const Teuchos::ArrayView<const GlobalOrdinal>& myGlobalBlockIDs, 00117 const Teuchos::ArrayView<const LocalOrdinal>& myBlockSizes, 00118 const Teuchos::RCP<Node> &node = defaultArgNode<node_type> ()); 00119 00121 ~BlockMap(){} 00122 00124 00126 00127 00129 Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > getPointMap () const 00130 { return pointMap_; } 00131 00133 global_size_t getGlobalNumBlocks() const; 00134 00136 size_t getNodeNumBlocks() const; 00137 00139 Teuchos::ArrayView<const GlobalOrdinal> getNodeBlockIDs() const; 00140 00142 bool isBlockSizeConstant() const; 00143 00145 Teuchos::ArrayRCP<const LocalOrdinal> getNodeFirstPointInBlocks() const; 00146 00148 00151 Teuchos::ArrayRCP<const LocalOrdinal> getNodeFirstPointInBlocks_Device() const; 00152 00154 00156 GlobalOrdinal getGlobalBlockID(LocalOrdinal localBlockID) const; 00157 00159 00161 LocalOrdinal getLocalBlockID(GlobalOrdinal globalBlockID) const; 00162 00164 00167 LocalOrdinal getLocalBlockSize(LocalOrdinal localBlockID) const; 00168 00170 00173 LocalOrdinal getFirstLocalPointInLocalBlock(LocalOrdinal localBlockID) const; 00174 00176 00179 GlobalOrdinal getFirstGlobalPointInLocalBlock(LocalOrdinal localBlockID) const; 00180 00182 void getRemoteBlockInfo(const Teuchos::ArrayView<const GlobalOrdinal>& GBIDs, 00183 const Teuchos::ArrayView<GlobalOrdinal>& firstGlobalPointInBlocks, 00184 const Teuchos::ArrayView<LocalOrdinal>& blockSizes) const; 00186 00187 private: 00188 void setup_noncontig_mapping(); 00189 00190 Teuchos::RCP<const Map<LocalOrdinal,GlobalOrdinal,Node> > pointMap_; 00191 global_size_t globalNumBlocks_; 00192 Teuchos::Array<GlobalOrdinal> myGlobalBlockIDs_; 00193 Teuchos::ArrayRCP<LocalOrdinal> pbuf_firstPointInBlock_; 00194 Teuchos::ArrayRCP<const LocalOrdinal> view_firstPointInBlock_; 00195 bool blockIDsAreContiguous_; 00196 LocalOrdinal constantBlockSize_; 00200 std::map<GlobalOrdinal,LocalOrdinal> map_global_to_local_; 00201 };//class BlockMap 00202 00203 //----------------------------------------------------------------- 00204 template<class LocalOrdinal,class GlobalOrdinal,class Node> 00205 Teuchos::RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > 00206 convertBlockMapToPointMap(const Tpetra::BlockMap<LocalOrdinal,GlobalOrdinal,Node>& blockMap) 00207 { 00208 global_size_t numGlobalElems = Teuchos::OrdinalTraits<global_size_t>::invalid(); 00209 GlobalOrdinal indexBase = blockMap.getPointMap()->getIndexBase(); 00210 const Teuchos::RCP<const Teuchos::Comm<int> >& comm = blockMap.getPointMap()->getComm(); 00211 const Teuchos::RCP<Node>& node = blockMap.getPointMap()->getNode(); 00212 00213 //Create a point-entry map where each point 00214 //corresponds to a block in the block-map: 00215 return Teuchos::rcp(new Map<LocalOrdinal,GlobalOrdinal,Node>(numGlobalElems, blockMap.getNodeBlockIDs(), indexBase, comm, node)); 00216 } 00217 00218 }//namespace Tpetra 00219 00220 #endif 00221
1.7.6.1