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 #ifndef TPETRA_EXPORT_HPP
00030 #define TPETRA_EXPORT_HPP
00031
00032 #include <Teuchos_Object.hpp>
00033 #include <Teuchos_as.hpp>
00034 #include <Teuchos_OrdinalTraits.hpp>
00035 #include <Teuchos_RCP.hpp>
00036 #include <Teuchos_Array.hpp>
00037 #include <Teuchos_ArrayRCP.hpp>
00038 #include "Tpetra_Map.hpp"
00039 #include "Tpetra_Util.hpp"
00040 #include "Tpetra_ImportExportData.hpp"
00041
00042
00043
00044 namespace Tpetra {
00045
00047
00060 template <typename Ordinal>
00061 class Export: public Teuchos::Object {
00062
00063 public:
00064
00066
00067
00069 Export(const Map<Ordinal> & source, const Map<Ordinal> & target);
00070
00072 Export(Export<Ordinal> const& rhs);
00073
00075 ~Export();
00076
00078
00080
00081
00083 Ordinal getNumSameIDs() const;
00084
00086 Ordinal getNumPermuteIDs() const;
00087
00089 Teuchos::ArrayView<const Ordinal> getPermuteFromLIDs() const;
00090
00092 Teuchos::ArrayView<const Ordinal> getPermuteToLIDs() const;
00093
00095 Ordinal getNumRemoteIDs() const;
00096
00098 Teuchos::ArrayView<const Ordinal> getRemoteLIDs() const;
00099
00101 Ordinal getNumExportIDs() const;
00102
00104 Teuchos::ArrayView<const Ordinal> getExportLIDs() const;
00105
00107 Teuchos::ArrayView<const Ordinal> getExportImageIDs() const;
00108
00110 const Map<Ordinal> & getSourceMap() const;
00111
00113 const Map<Ordinal> & getTargetMap() const;
00114
00115 Distributor<Ordinal>& getDistributor() const;
00116
00118 Export<Ordinal>& operator = (const Export<Ordinal> & Source);
00119
00121
00123
00124
00126 virtual void print(std::ostream& os) const;
00127
00129
00130 private:
00131
00132 Teuchos::RCP<ImportExportData<Ordinal> > ExportData_;
00133
00134
00135
00136
00137
00138
00139 void setupSamePermuteExport();
00140 void setupRemote();
00141 };
00142
00143 template <typename Ordinal>
00144 Export<Ordinal>::Export(const Map<Ordinal> & source, const Map<Ordinal> & target)
00145 : Teuchos::Object("Tpetra::Export")
00146 , ExportData_()
00147 {
00148 TEST_FOR_EXCEPT(true);
00149 ExportData_ = Teuchos::rcp(new ImportExportData<Ordinal>(source, target));
00150
00151 setupSamePermuteExport();
00152 if(source.isDistributed()) {
00153 setupRemote();
00154 }
00155 }
00156
00157 template <typename Ordinal>
00158 Export<Ordinal>::Export(const Export<Ordinal> & rhs)
00159 : Teuchos::Object(rhs.label())
00160 , ExportData_(rhs.ExportData_)
00161 {
00162 TEST_FOR_EXCEPT(true);
00163 }
00164
00165 template <typename Ordinal>
00166 Export<Ordinal>::~Export()
00167 {}
00168
00169 template <typename Ordinal>
00170 Ordinal Export<Ordinal>::getNumSameIDs() const {
00171 return ExportData_->numSameIDs_;
00172 }
00173
00174 template <typename Ordinal>
00175 Ordinal Export<Ordinal>::getNumPermuteIDs() const {
00176 return ExportData_->numPermuteIDs_;
00177 }
00178
00179 template <typename Ordinal>
00180 Teuchos::ArrayView<const Ordinal>
00181 Export<Ordinal>::getPermuteFromLIDs() const {
00182 return ExportData_->permuteFromLIDs_();
00183 }
00184
00185 template <typename Ordinal>
00186 Teuchos::ArrayView<const Ordinal>
00187 Export<Ordinal>::getPermuteToLIDs() const {
00188 return ExportData_->permuteToLIDs_();
00189 }
00190
00191 template <typename Ordinal>
00192 Ordinal Export<Ordinal>::getNumRemoteIDs() const {
00193 return ExportData_->numRemoteIDs_;
00194 }
00195
00196 template <typename Ordinal>
00197 Teuchos::ArrayView<const Ordinal>
00198 Export<Ordinal>::getRemoteLIDs() const {
00199 return ExportData_->remoteLIDs_();
00200 }
00201
00202 template <typename Ordinal>
00203 Ordinal Export<Ordinal>::getNumExportIDs() const {
00204 return ExportData_->numExportIDs_;
00205 }
00206
00207 template <typename Ordinal>
00208 Teuchos::ArrayView<const Ordinal>
00209 Export<Ordinal>::getExportLIDs() const {
00210 return ExportData_->exportLIDs_();
00211 }
00212
00213 template <typename Ordinal>
00214 Teuchos::ArrayView<const Ordinal>
00215 Export<Ordinal>::getExportImageIDs() const {
00216 return ExportData_->exportImageIDs_();
00217 }
00218
00219 template <typename Ordinal>
00220 const Map<Ordinal> &
00221 Export<Ordinal>::getSourceMap() const {
00222 return ExportData_->source_;
00223 }
00224
00225 template <typename Ordinal>
00226 const Map<Ordinal> &
00227 Export<Ordinal>::getTargetMap() const {
00228 return ExportData_->target_;
00229 }
00230
00231 template <typename Ordinal>
00232 Distributor<Ordinal>&
00233 Export<Ordinal>::getDistributor() const {
00234 return ExportData_->distributor_;
00235 }
00236
00237 template <typename Ordinal>
00238 Export<Ordinal>&
00239 Export<Ordinal>::operator=(const Export<Ordinal> & Source)
00240 {
00241 ExportData_ = Source.ExportData_;
00242 return *this;
00243 }
00244
00245 template <typename Ordinal>
00246 void Export<Ordinal>::print(std::ostream& os) const
00247 {
00248 using std::endl;
00249 os << "Export Data Members:" << endl;
00250 os << "permuteToLIDs: {"; std::copy(getPermuteToLIDs().begin() ,getPermuteToLIDs().end() ,std::ostream_iterator<Ordinal>(os," ")); os << " }" << endl;
00251 os << "permuteFromLIDs: {"; std::copy(getPermuteFromLIDs().begin(),getPermuteFromLIDs().end(),std::ostream_iterator<Ordinal>(os," ")); os << " }" << endl;
00252 os << "remoteLIDs: {"; std::copy(getRemoteLIDs().begin() ,getRemoteLIDs().end() ,std::ostream_iterator<Ordinal>(os," ")); os << " }" << endl;
00253 os << "exportLIDs: {"; std::copy(getExportLIDs().begin() ,getExportLIDs().end() ,std::ostream_iterator<Ordinal>(os," ")); os << " }" << endl;
00254 os << "exportImageIDs: {"; std::copy(getExportImageIDs().begin() ,getExportImageIDs().end() ,std::ostream_iterator<Ordinal>(os," ")); os << " }" << endl;
00255 os << "numSameIDs : " << getNumSameIDs() << endl;
00256 os << "numPermuteIDs: " << getNumPermuteIDs() << endl;
00257 os << "numRemoteIDs : " << getNumRemoteIDs() << endl;
00258 os << "numExportIDs : " << getNumExportIDs() << endl;
00259 os << "\nsource: " << endl << getSourceMap();
00260 os << "\ntarget: " << endl << getTargetMap();
00261 }
00262
00263
00264 template <typename Ordinal>
00265 void Export<Ordinal>::setupSamePermuteExport()
00266 {
00267 const Map<Ordinal> & source = getSourceMap();
00268 const Map<Ordinal> & target = getTargetMap();
00269 Teuchos::ArrayView<const Ordinal> sourceGIDs = source.getMyGlobalEntries();
00270 Teuchos::ArrayView<const Ordinal> targetGIDs = target.getMyGlobalEntries();
00271
00272
00273
00274
00275
00276 typename Teuchos::ArrayView<const Ordinal>::iterator sourceIter = sourceGIDs.begin(),
00277 targetIter = targetGIDs.begin();
00278 while( sourceIter != sourceGIDs.end() && targetIter != targetGIDs.end() && *sourceIter == *targetIter )
00279 {
00280 ++ExportData_->numSameIDs_;
00281 ++sourceIter;
00282 ++targetIter;
00283 }
00284
00285
00286
00287
00288
00289
00290
00291 for(; sourceIter != sourceGIDs.end(); ++sourceIter) {
00292 if(target.isMyGlobalIndex(*sourceIter)) {
00293
00294
00295 ExportData_->permuteToLIDs_.push_back( target.getLocalIndex(*sourceIter));
00296 ExportData_->permuteFromLIDs_.push_back(source.getLocalIndex(*sourceIter));
00297 }
00298 else {
00299 ExportData_->exportLIDs_.push_back(source.getLocalIndex(*sourceIter));
00300 ExportData_->exportGIDs_.push_back(*sourceIter);
00301 }
00302 }
00303 ExportData_->numPermuteIDs_ = Teuchos::as<Ordinal>(ExportData_->permuteToLIDs.size());
00304 ExportData_->numExportIDs_ = Teuchos::as<Ordinal>(ExportData_->exportLIDs_.size());
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 }
00321
00322 template <typename Ordinal>
00323 void Export<Ordinal>::setupRemote()
00324 {
00325 Ordinal const zero = Teuchos::OrdinalTraits<Ordinal>::zero();
00326 Ordinal const one = Teuchos::OrdinalTraits<Ordinal>::one();
00327 Map<Ordinal> const& target = getTargetMap();
00328
00329
00330
00331
00332 sortArrays(ExportData_->exportImageIDs_, ExportData_->exportGIDs_, ExportData_->exportLIDs_);
00333
00334
00335
00336 ExportData_->distributor_.createFromSends(ExportData_->numExportIDs_, ExportData_->exportImageIDs_, true, ExportData_->numRemoteIDs_);
00337
00338
00339
00340
00341
00342 Teuchos::RCP< Teuchos::Comm<Ordinal> > comm = ExportData_->platform_->createOrdinalComm();
00343 comm->doPostsAndWaits(ExportData_->distributor_, ExportData_->exportGIDs_, one, ExportData_->remoteGIDs_);
00344
00345
00346
00347 for(Ordinal i = zero; i < ExportData_->numRemoteIDs_; i++) {
00348 ExportData_->remoteLIDs_.push_back(target.getLID(ExportData_->remoteGIDs_[i]));
00349 }
00350 }
00351
00352 }
00353
00354 #endif // TPETRA_EXPORT_HPP