15#ifndef ADAPTERFORTESTS
16#define ADAPTERFORTESTS
30#ifdef HAVE_ZOLTAN2_PAMGEN
34#include <Teuchos_DefaultComm.hpp>
35#include <Teuchos_XMLObject.hpp>
36#include <Teuchos_FileInputSource.hpp>
38#include <Tpetra_MultiVector.hpp>
39#include <Tpetra_CrsMatrix.hpp>
46using Teuchos::ArrayRCP;
47using Teuchos::ArrayView;
52using Teuchos::rcp_const_cast;
53using Teuchos::ParameterList;
84 const RCP<
const Comm<int> > &comm);
117 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
129 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
141 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
153 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
165 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
177 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
187 template <
typename T>
188 void InitializeVectorData(
const RCP<T> &data,
189 std::vector<const zscalar_t *> &coords,
190 std::vector<int> & strides,
198 const ParameterList &pList,
199 const RCP<
const Comm<int> > &comm)
201 if(!pList.isParameter(
"input adapter"))
203 std::cerr <<
"Input adapter unspecified" << std::endl;
208 std::string input_adapter_name = pList.get<
string>(
"input adapter");
210 if(input_adapter_name ==
"BasicIdentifier")
211 adaptersSet.
main = getBasicIdentiferAdapterForInput(uinput, pList, comm);
212 else if(input_adapter_name ==
"XpetraMultiVector")
213 adaptersSet.
main = getXpetraMVAdapterForInput(uinput, pList, comm);
214 else if(input_adapter_name ==
"XpetraCrsGraph")
215 adaptersSet = getXpetraCrsGraphAdapterForInput(uinput,pList, comm);
216 else if(input_adapter_name ==
"XpetraCrsMatrix")
217 adaptersSet = getXpetraCrsMatrixAdapterForInput(uinput,pList, comm);
218 else if(input_adapter_name ==
"BasicVector")
219 adaptersSet.
main = getBasicVectorAdapterForInput(uinput,pList, comm);
220 else if(input_adapter_name ==
"PamgenMesh")
221 adaptersSet.
main = getPamgenMeshAdapterForInput(uinput,pList, comm);
224 throw std::logic_error(
"AdapterFactory failed to create adapter!");
241 const ParameterList &pList,
242 const RCP<
const Comm<int> > &comm)
246 if(!pList.isParameter(
"data type"))
248 std::cerr <<
"Input data type unspecified" << std::endl;
252 string input_type = pList.get<
string>(
"data type");
256 std::cerr <<
"Input type: " + input_type +
" unavailable or misspelled."
261 std::vector<const zscalar_t *>
weights;
262 std::vector<int> weightStrides;
263 const zgno_t *globalIds = NULL;
264 size_t localCount = 0;
272 size_t cols = vtx_weights->getNumVectors();
273 for (
size_t i = 0; i< cols; i++) {
274 weights.push_back(vtx_weights->getData(i).getRawPtr());
275 weightStrides.push_back((
int)vtx_weights->getStride());
279 if(input_type ==
"coordinates")
282 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
283 localCount = data->getLocalLength();
285 else if(input_type ==
"tpetra_vector")
288 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
289 localCount = data->getLocalLength();
291 else if(input_type ==
"tpetra_multivector")
293 int nvec = pList.get<
int>(
"vector_dimension");
295 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
296 localCount = data->getLocalLength();
298 else if(input_type ==
"tpetra_crs_graph")
301 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
302 localCount = data->getLocalNumCols();
304 else if(input_type ==
"tpetra_crs_matrix")
307 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
308 localCount = data->getLocalNumCols();
310 else if(input_type ==
"xpetra_vector")
313 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
314 localCount = data->getLocalLength();
316 else if(input_type ==
"xpetra_multivector")
318 int nvec = pList.get<
int>(
"vector_dimension");
320 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
321 localCount = data->getLocalLength();
323 else if(input_type ==
"xpetra_crs_graph")
326 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
327 localCount = data->getLocalNumCols();
329 else if(input_type ==
"xpetra_crs_matrix")
332 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
333 localCount = data->getLocalNumCols();
346 const ParameterList &pList,
347 const RCP<
const Comm<int> > &comm)
351 if(!pList.isParameter(
"data type"))
353 std::cerr <<
"Input data type unspecified" << std::endl;
357 string input_type = pList.get<
string>(
"data type");
360 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled."
365 std::vector<const zscalar_t *>
weights;
366 std::vector<int> weightStrides;
373 size_t weightsPerRow = vtx_weights->getNumVectors();
374 for (
size_t i = 0; i< weightsPerRow; i++) {
375 weights.push_back(vtx_weights->getData(i).getRawPtr());
376 weightStrides.push_back(1);
381 if(input_type ==
"coordinates")
384 RCP<const tMVector_t> const_data = rcp_const_cast<const tMVector_t>(data);
392 else if(input_type ==
"tpetra_multivector")
394 int nvec = pList.get<
int>(
"vector_dimension");
396 RCP<const tMVector_t> const_data = rcp_const_cast<const tMVector_t>(data);
403 else if(input_type ==
"xpetra_multivector")
405 int nvec = pList.get<
int>(
"vector_dimension");
407 RCP<const xMVector_t> const_data = rcp_const_cast<const xMVector_t>(data);
417 std::cerr <<
"Input data chosen not compatible with xpetra multi-vector adapter." << std::endl;
425 const ParameterList &pList,
426 const RCP<
const Comm<int> > &comm)
431 if(!pList.isParameter(
"data type"))
433 std::cerr <<
"Input data type unspecified" << std::endl;
437 string input_type = pList.get<
string>(
"data type");
440 std::cerr <<
"Input type: " + input_type +
", unavailable or misspelled."
445 std::vector<const zscalar_t *> vtx_weights;
446 std::vector<const zscalar_t *> edge_weights;
447 std::vector<int> vtx_weightStride;
448 std::vector<int> edge_weightStride;
453 RCP<tMVector_t> vtx_weights_tmp = uinput->
getUIWeights();
455 size_t weightsPerRow = vtx_weights_tmp->getNumVectors();
456 for (
size_t i = 0; i< weightsPerRow; i++) {
457 vtx_weights.push_back(vtx_weights_tmp->getData(i).getRawPtr());
458 vtx_weightStride.push_back(1);
467 size_t weightsPerRow = edge_weights_tmp->getNumVectors();
468 for (
size_t i = 0; i< weightsPerRow; i++) {
469 edge_weights.push_back(edge_weights_tmp->getData(i).getRawPtr());
470 edge_weightStride.push_back(1);
477 Teuchos::ParameterList pCopy(pList);
478 pCopy = pCopy.set<std::string>(
"data type",
"coordinates");
481 #define SET_COORDS_INPUT_1(adapterClass) \
482 auto * ca = dynamic_cast<adapterClass*>(adapters.coordinate.adapter); \
483 if(!ca) {throw std::logic_error( "Coordinate adapter case failed!" );} \
484 ia->setCoordinateInput(ca);
486 if(input_type ==
"tpetra_crs_graph")
489 RCP<const tcrsGraph_t> const_data = rcp_const_cast<const tcrsGraph_t>(data);
491 xCG_tCG_t * ia =
new xCG_tCG_t(const_data,(
int)vtx_weights.size(),(
int)edge_weights.size());
495 if(!vtx_weights.empty()) {
496 for(
int i = 0; i < (int)vtx_weights.size(); i++)
500 if(!edge_weights.empty()) {
501 for(
int i = 0; i < (int)edge_weights.size(); i++)
506 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
510 else if(input_type ==
"xpetra_crs_graph")
513 RCP<const xcrsGraph_t> const_data = rcp_const_cast<const xcrsGraph_t>(data);
515 xCG_xCG_t * ia =
new xCG_xCG_t(const_data, (
int)vtx_weights.size(), (
int)edge_weights.size());
518 if(!vtx_weights.empty())
520 for(
int i = 0; i < (int)vtx_weights.size(); i++)
524 if(!edge_weights.empty())
526 for(
int i = 0; i < (int)edge_weights.size(); i++)
531 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
537 std::cerr <<
"Input data chosen not compatible with "
538 <<
"XpetraCrsGraph adapter." << std::endl;
548 const ParameterList &pList,
549 const RCP<
const Comm<int> > &comm)
553 if(!pList.isParameter(
"data type"))
555 std::cerr <<
"Input data type unspecified" << std::endl;
559 string input_type = pList.get<
string>(
"data type");
562 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled."
567 std::vector<const zscalar_t *>
weights;
568 std::vector<int> strides;
573 if(comm->getRank() == 0) std::cout <<
"Have weights...." << std::endl;
577 int weightsPerRow = (int)vtx_weights->getNumVectors();
578 for (
int i = 0; i< weightsPerRow; i++)
580 weights.push_back(vtx_weights->getData(i).getRawPtr());
581 strides.push_back(1);
589 Teuchos::ParameterList pCopy(pList);
590 pCopy = pCopy.set<std::string>(
"data type",
"coordinates");
593 #define SET_COORDS_INPUT_2(adapterClass) \
594 auto * ca = dynamic_cast<adapterClass*>(adapters.coordinate.adapter); \
595 if(!ca) {throw std::logic_error( "Coordinate adapter case failed!" );} \
596 ia->setCoordinateInput(ca);
599 if(input_type ==
"tpetra_crs_matrix")
601 if(comm->getRank() == 0) std::cout <<
"Make tpetra crs matrix adapter...." << std::endl;
605 RCP<const tcrsMatrix_t> const_data = rcp_const_cast<const tcrsMatrix_t>(data);
615 for(
int i = 0; i < (int)
weights.size(); i++)
620 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
624 else if(input_type ==
"xpetra_crs_matrix")
627 RCP<const xcrsMatrix_t> const_data = rcp_const_cast<const xcrsMatrix_t>(data);
637 for(
int i = 0; i < (int)
weights.size(); i++)
642 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
649 std::cerr <<
"Input data chosen not compatible with "
650 <<
"XpetraCrsMatrix adapter." << std::endl;
659 const ParameterList &pList,
660 const RCP<
const Comm<int> > &comm)
665 if(!pList.isParameter(
"data type"))
667 std::cerr <<
"Input data type unspecified" << std::endl;
671 string input_type = pList.get<
string>(
"data type");
674 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled."
679 std::vector<const zscalar_t *>
weights;
680 std::vector<int> weightStrides;
690 size_t cols = vtx_weights->getNumVectors();
691 for (
size_t i = 0; i< cols; i++) {
692 weights.push_back(vtx_weights->getData(i).getRawPtr());
693 weightStrides.push_back(1);
699 if(pList.isParameter(
"stride"))
700 stride = pList.get<
int>(
"stride");
704 if(input_type ==
"coordinates")
707 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
708 localCount =
static_cast<zlno_t>(data->getLocalLength());
711 std::vector<const zscalar_t *> coords;
712 std::vector<int> entry_strides;
713 InitializeVectorData(data,coords,entry_strides,stride);
718 size_t dim = coords.size();
719 size_t push_null = 3-dim;
720 for (
size_t i = 0; i < push_null; i ++) coords.push_back(NULL);
726 stride, stride, stride);
727 }
else if (
weights.size() == 1) {
728 size_t dim = coords.size();
729 size_t push_null = 3-dim;
730 for (
size_t i = 0; i < push_null; i ++) coords.push_back(NULL);
736 stride, stride, stride,
744 coords, entry_strides,
748 else if(input_type ==
"tpetra_vector")
751 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
752 localCount =
static_cast<zlno_t>(data->getLocalLength());
755 std::vector<const zscalar_t *> coords;
756 std::vector<int> entry_strides;
757 InitializeVectorData(data,coords,entry_strides,stride);
762 coords[0], entry_strides[0]);
765 coords[0], entry_strides[0],
773 else if(input_type ==
"tpetra_multivector")
775 int nvec = pList.get<
int>(
"vector_dimension");
778 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
779 localCount =
static_cast<zlno_t>(data->getLocalLength());
782 std::vector<const zscalar_t *> coords;
783 std::vector<int> entry_strides;
784 InitializeVectorData(data,coords,entry_strides,stride);
787 coords, entry_strides,
791 else if(input_type ==
"xpetra_vector")
794 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
795 localCount =
static_cast<zlno_t>(data->getLocalLength());
798 std::vector<const zscalar_t *> coords;
799 std::vector<int> entry_strides;
800 InitializeVectorData(data,coords,entry_strides,stride);
805 coords[0], entry_strides[0]);
808 coords[0], entry_strides[0],
815 else if(input_type ==
"xpetra_multivector")
817 int nvec = pList.get<
int>(
"vector_dimension");
819 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
820 localCount =
static_cast<zlno_t>(data->getLocalLength());
823 std::vector<const zscalar_t *> coords;
824 std::vector<int> entry_strides;
825 InitializeVectorData(data,coords,entry_strides,stride);
826 if(comm->getRank() == 0) std::cout <<
"size of entry strides: " << entry_strides.size() << std::endl;
827 if(comm->getRank() == 0) std::cout <<
"size of coords: " << coords.size() << std::endl;
831 coords, entry_strides,
839void AdapterFactory::InitializeVectorData(
const RCP<T> &data,
840 std::vector<const zscalar_t *> &coords,
841 std::vector<int> & strides,
845 size_t localCount = data->getLocalLength();
846 size_t nvecs = data->getNumVectors();
847 size_t vecsize = data->getNumVectors() * data->getLocalLength();
851 ArrayRCP<zscalar_t> *petravectors =
new ArrayRCP<zscalar_t>[nvecs];
854 for (
size_t i = 0; i < nvecs; i++)
855 petravectors[i] = data->getDataNonConst(i);
871 if(stride == 1 || stride != (
int)nvecs)
873 for (
size_t i = 0; i < nvecs; i++) {
874 for (
size_t j = 0; j < localCount; j++) {
875 coordarr[idx++] = petravectors[i][j];
880 for (
size_t j = 0; j < localCount; j++) {
881 for (
size_t i = 0; i < nvecs; i++) {
882 coordarr[idx++] = petravectors[i][j];
895 coords = std::vector<const zscalar_t *>(nvecs);
896 strides = std::vector<int>(nvecs);
898 for (
size_t i = 0; i < nvecs; i++) {
900 coords[i] = &coordarr[i*localCount];
902 coords[i] = &coordarr[i];
920 delete [] petravectors;
926 const ParameterList &pList,
927 const RCP<
const Comm<int> > &comm)
931#ifdef HAVE_ZOLTAN2_PAMGEN
944 std::cerr <<
"Pamgen mesh is unavailable for PamgenMeshAdapter!"
950 throw std::runtime_error(
"Pamgen input requested but Trilinos is not "
951 "built with Pamgen");
#define SET_COORDS_INPUT_1(adapterClass)
#define SET_COORDS_INPUT_2(adapterClass)
Defines the BasicIdentifierAdapter class.
Defines the BasicVectorAdapter class.
Defines the EvaluatePartition class.
Defines the PamgenMeshAdapter class.
Defines Parameter related enumerators, declares functions.
Defines the PartitioningProblem class.
Tpetra::Map ::local_ordinal_type zlno_t
Tpetra::Map ::global_ordinal_type zgno_t
#define Z2_TEST_UPCAST_COORDS(adptr, TEMPLATE_ACTION)
Defines XpetraCrsGraphAdapter class.
Defines the XpetraCrsMatrixAdapter class.
Defines the XpetraMultiVectorAdapter.
Zoltan2::BaseAdapterRoot * getCoordinateAdapter() const
Zoltan2::BaseAdapterRoot * getMainAdapter() const
AdapterFactory(UserInputForTests *uinput, const ParameterList &pList, const RCP< const Comm< int > > &comm)
A class method for constructing an input adapter defind in a parameter list.
EAdapterType getCoordinateAdapterType() const
EAdapterType getMainAdapterType() const
BaseAdapter defines methods required by all Adapters.
Provides access for Zoltan2 to Xpetra::CrsGraph data.
void setVertexWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to vertex weights.
void setEdgeWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to edge weights.
Provides access for Zoltan2 to Xpetra::CrsMatrix data.
void setWeights(const scalar_t *weightVal, int stride, int idx=0)
Specify a weight for each entity of the primaryEntityType.
Zoltan2::XpetraCrsMatrixAdapter< tcrsMatrix_t, tMVector_t > xCM_tCM_t
Zoltan2::XpetraMultiVectorAdapter< tMVector_t > xMV_tMV_t
Zoltan2::XpetraCrsMatrixAdapter< xcrsMatrix_t, tMVector_t > xCM_xCM_t
Zoltan2::BasicVectorAdapter< userTypes_t > pamgen_adapter_t
Zoltan2::XpetraMultiVectorAdapter< xMVector_t > xMV_xMV_t
Zoltan2::XpetraCrsGraphAdapter< tcrsGraph_t, tMVector_t > xCG_tCG_t
@ AT_basic_vector_adapter
Zoltan2::BasicVectorAdapter< tMVector_t > basic_vector_adapter
Zoltan2::XpetraCrsGraphAdapter< xcrsGraph_t, tMVector_t > xCG_xCG_t
Zoltan2::BasicIdentifierAdapter< userTypes_t > basic_id_t
AdapterWithTemplateName coordinate
AdapterWithTemplateName main
Zoltan2::BaseAdapterRoot * adapter