00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifndef XPETRA_STRIDEDMAP_HPP
00050 #define XPETRA_STRIDEDMAP_HPP
00051
00052
00053
00054 #include <Kokkos_DefaultNode.hpp>
00055 #include <Teuchos_Describable.hpp>
00056 #include "Xpetra_Map.hpp"
00057 #include "Xpetra_ConfigDefs.hpp"
00058
00059 #include "Xpetra_Exceptions.hpp"
00060
00061
00062 #define sumAll(rcpComm, in, out) \
00063 Teuchos::reduceAll(*rcpComm, Teuchos::REDUCE_SUM, in, Teuchos::outArg(out));
00064 #define minAll(rcpComm, in, out) \
00065 Teuchos::reduceAll(*rcpComm, Teuchos::REDUCE_MIN, in, Teuchos::outArg(out));
00066 #define maxAll(rcpComm, in, out) \
00067 Teuchos::reduceAll(*rcpComm, Teuchos::REDUCE_MAX, in, Teuchos::outArg(out));
00068
00069 namespace Xpetra {
00070
00099 template <class LocalOrdinal, class GlobalOrdinal = LocalOrdinal, class Node = Kokkos::DefaultNode::DefaultNodeType>
00100 class StridedMap
00101 : public virtual Map<LocalOrdinal, GlobalOrdinal, Node>
00102 {
00103
00104 public:
00105
00107
00108
00109 StridedMap(global_size_t numGlobalElements, GlobalOrdinal indexBase, std::vector<size_t>& stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId, GlobalOrdinal offset = 0)
00110 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId), offset_(offset)
00111 {
00112 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo.size() == 0, Exceptions::RuntimeError, "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
00113
00114
00115 }
00116
00117 StridedMap(global_size_t numGlobalElements, size_t numLocalElements, GlobalOrdinal indexBase, std::vector<size_t>& stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId, GlobalOrdinal offset = 0)
00118 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId), offset_(offset)
00119 {
00120 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo.size() == 0, Exceptions::RuntimeError, "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
00121
00122
00123
00124 }
00125
00126 StridedMap(std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId, GlobalOrdinal offset = 0)
00127 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId), offset_(offset)
00128 {
00129 }
00130
00131 StridedMap(global_size_t numGlobalElements, const Teuchos::ArrayView< const GlobalOrdinal > &elementList, GlobalOrdinal indexBase, std::vector<size_t>& stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId=-1)
00132 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId)
00133 {
00134 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo.size() == 0, Exceptions::RuntimeError, "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
00135 TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId < -1, Exceptions::RuntimeError, "StridedMap::StridedMap: stridedBlockId must not be smaller than -1.");
00136
00137
00138 if(stridedBlockId == -1) {
00139 TEUCHOS_TEST_FOR_EXCEPTION(numGlobalElements % getFixedBlockSize() != 0, Exceptions::RuntimeError, "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of numGlobalElements.");
00140 TEUCHOS_TEST_FOR_EXCEPTION(elementList.size() % getFixedBlockSize() != 0, Exceptions::RuntimeError, "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of elementList.size().");
00141 } else {
00142
00143
00144 TEUCHOS_TEST_FOR_EXCEPTION(elementList.size() % stridingInfo[stridedBlockId] != 0, Exceptions::RuntimeError, "StridedMap::StridedMap: stridingInfo not valid: stridingBlockInfo[stridedBlockId] is not an integer multiple of elementList.size().");
00145 }
00146
00147
00148
00149
00150 GlobalOrdinal minGidOnCurProc = 99999;
00151 for(Teuchos_Ordinal k=0; k<elementList.size(); ++k) {
00152 if(elementList[k] < minGidOnCurProc) minGidOnCurProc = elementList[k];
00153 }
00154 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MIN, minGidOnCurProc, Teuchos::outArg(offset_));
00155
00156
00157 size_t nStridedOffset = 0;
00158 for(int j=0; j<stridedBlockId; j++) {
00159 nStridedOffset += stridingInfo[j];
00160 }
00161 const GlobalOrdinal goStridedOffset = Teuchos::as<GlobalOrdinal>(nStridedOffset);
00162
00163
00164 offset_ -= goStridedOffset;
00165 }
00166
00168 virtual ~StridedMap() { }
00169
00171
00173
00174
00175 std::vector<size_t> getStridingData() const { return stridingInfo_; }
00176
00177 void setStridingData(std::vector<size_t> stridingInfo) { stridingInfo_ = stridingInfo; }
00178
00179 size_t getFixedBlockSize() const {
00180
00181 size_t blkSize = 0;
00182 std::vector<size_t>::const_iterator it;
00183 for(it = stridingInfo_.begin(); it != stridingInfo_.end(); ++it) {
00184 blkSize += *it;
00185 }
00186 return blkSize;
00187 }
00188
00191 LocalOrdinal getStridedBlockId() const { return stridedBlockId_; }
00192
00194 bool isStrided() { return stridingInfo_.size() > 1 ? true : false; }
00195
00198 bool isBlocked() { return getFixedBlockSize() > 1 ? true : false; }
00199
00200 GlobalOrdinal getOffset() const { return offset_; }
00201
00202 void setOffset( GlobalOrdinal offset ) { offset_ = offset; }
00203
00204
00205 size_t GID2StridingBlockId( GlobalOrdinal gid ) const {
00206 GlobalOrdinal tgid = gid - offset_;
00207 tgid = tgid % getFixedBlockSize();
00208
00209 size_t nStridedOffset = 0;
00210 size_t stridedBlockId = 0;
00211 for(size_t j=0; j<stridingInfo_.size(); j++) {
00212 nStridedOffset += stridingInfo_[j];
00213 if(Teuchos::as<size_t>(tgid) < nStridedOffset) {
00214 stridedBlockId = j;
00215 break;
00216 }
00217 }
00218 return stridedBlockId;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00254
00255 private:
00256 virtual bool CheckConsistency() = 0;
00257
00258 protected:
00259 std::vector<size_t> stridingInfo_;
00260 LocalOrdinal stridedBlockId_;
00261
00262
00263 GlobalOrdinal offset_;
00264
00265 };
00266
00267 }
00268
00269 #define XPETRA_STRIDEDMAP_SHORT
00270 #endif // XPETRA_STRIDEDMAP_HPP