51 #ifndef ADAPTERFORTESTS 52 #define ADAPTERFORTESTS 67 #include <Teuchos_DefaultComm.hpp> 68 #include <Teuchos_XMLObject.hpp> 69 #include <Teuchos_FileInputSource.hpp> 71 #include <Tpetra_MultiVector.hpp> 72 #include <Tpetra_CrsMatrix.hpp> 80 using Teuchos::ArrayRCP;
81 using Teuchos::ArrayView;
86 using Teuchos::rcp_const_cast;
87 using Teuchos::ParameterList;
122 static base_adapter_t* getAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
133 static base_adapter_t*
134 getBasicIdentiferAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
144 static base_adapter_t*
145 getXpetraMVAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
155 static base_adapter_t*
156 getXpetraCrsGraphAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
166 static base_adapter_t*
167 getXpetraCrsMatrixAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
177 static base_adapter_t*
178 getBasicVectorAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
188 static base_adapter_t*
189 getPamgenMeshAdapterForInput(
UserInputForTests *uinput,
const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
200 template <
typename T>
201 static void InitializeVectorData(
const RCP<T> &data,
202 vector<const zscalar_t *> &coords,
203 vector<int> & strides,
206 #ifdef HAVE_EPETRA_DATA_TYPES 215 template <
typename T>
216 static void InitializeEpetraVectorData(
const RCP<T> &data,
217 vector<const zscalar_t *> &coords,
218 vector<int> & strides,
225 const ParameterList &pList,
226 const RCP<
const Comm<int> > &comm)
230 if(!pList.isParameter(
"input adapter"))
232 std::cerr <<
"Input adapter unspecified" << std::endl;
237 string adapter_name = pList.get<
string>(
"input adapter");
238 if(adapter_name ==
"BasicIdentifier")
239 ia = AdapterForTests::getBasicIdentiferAdapterForInput(uinput, pList, comm);
240 else if(adapter_name ==
"XpetraMultiVector")
241 ia = AdapterForTests::getXpetraMVAdapterForInput(uinput, pList, comm);
242 else if(adapter_name ==
"XpetraCrsGraph")
243 ia = getXpetraCrsGraphAdapterForInput(uinput,pList, comm);
244 else if(adapter_name ==
"XpetraCrsMatrix")
245 ia = getXpetraCrsMatrixAdapterForInput(uinput,pList, comm);
246 else if(adapter_name ==
"BasicVector")
247 ia = getBasicVectorAdapterForInput(uinput,pList, comm);
248 else if(adapter_name ==
"PamgenMesh")
249 ia = getPamgenMeshAdapterForInput(uinput,pList, comm);
251 std::cerr <<
"Input adapter type: " + adapter_name +
", is unavailable, or misspelled." << std::endl;
258 const ParameterList &pList,
259 const RCP<
const Comm<int> > &comm)
262 if(!pList.isParameter(
"data type"))
264 std::cerr <<
"Input data type unspecified" << std::endl;
268 string input_type = pList.get<
string>(
"data type");
272 std::cerr <<
"Input type:" + input_type +
", is unavailable or misspelled." << std::endl;
276 vector<const zscalar_t *> weights;
277 std::vector<int> weightStrides;
279 size_t localCount = 0;
287 size_t cols = vtx_weights->getNumVectors();
288 for (
size_t i = 0; i< cols; i++) {
289 weights.push_back(vtx_weights->getData(i).getRawPtr());
290 weightStrides.push_back((
int)vtx_weights->getStride());
294 if(input_type ==
"coordinates")
297 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
298 localCount = data->getLocalLength();
300 else if(input_type ==
"tpetra_vector")
303 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
304 localCount = data->getLocalLength();
306 else if(input_type ==
"tpetra_multivector")
308 int nvec = pList.get<
int>(
"vector_dimension");
310 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
311 localCount = data->getLocalLength();
313 else if(input_type ==
"tpetra_crs_graph")
316 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
317 localCount = data->getNodeNumCols();
319 else if(input_type ==
"tpetra_crs_matrix")
322 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
323 localCount = data->getNodeNumCols();
325 else if(input_type ==
"xpetra_vector")
328 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
329 localCount = data->getLocalLength();
331 else if(input_type ==
"xpetra_multivector")
333 int nvec = pList.get<
int>(
"vector_dimension");
335 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
336 localCount = data->getLocalLength();
338 else if(input_type ==
"xpetra_crs_graph")
341 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
342 localCount = data->getNodeNumCols();
344 else if(input_type ==
"xpetra_crs_matrix")
347 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
348 localCount = data->getNodeNumCols();
350 #ifdef HAVE_EPETRA_DATA_TYPES 351 else if(input_type ==
"epetra_vector")
354 globalIds = (
zgno_t *)data->Map().MyGlobalElements();
355 localCount = data->MyLength();
357 else if(input_type ==
"epetra_multivector")
359 int nvec = pList.get<
int>(
"vector_dimension");
361 globalIds = (
zgno_t *)data->Map().MyGlobalElements();
362 localCount = data->MyLength();
364 else if(input_type ==
"epetra_crs_graph")
367 globalIds = (
zgno_t *)data->Map().MyGlobalElements();
368 localCount = data->NumMyCols();
370 else if(input_type ==
"epetra_crs_matrix")
373 globalIds = (
zgno_t *)data->Map().MyGlobalElements();
374 localCount = data->NumMyCols();
378 if(localCount == 0)
return nullptr;
384 const ParameterList &pList,
385 const RCP<
const Comm<int> > &comm)
389 if(!pList.isParameter(
"data type"))
391 std::cerr <<
"Input data type unspecified" << std::endl;
395 string input_type = pList.get<
string>(
"data type");
398 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled." << std::endl;
402 vector<const zscalar_t *> weights;
403 std::vector<int> weightStrides;
410 size_t weightsPerRow = vtx_weights->getNumVectors();
411 for (
size_t i = 0; i< weightsPerRow; i++) {
412 weights.push_back(vtx_weights->getData(i).getRawPtr());
413 weightStrides.push_back(1);
418 if(input_type ==
"coordinates")
421 RCP<const tMVector_t> const_data = rcp_const_cast<
const tMVector_t>(data);
427 else if(input_type ==
"tpetra_multivector")
429 int nvec = pList.get<
int>(
"vector_dimension");
431 RCP<const tMVector_t> const_data = rcp_const_cast<
const tMVector_t>(data);
437 else if(input_type ==
"xpetra_multivector")
439 int nvec = pList.get<
int>(
"vector_dimension");
441 RCP<const xMVector_t> const_data = rcp_const_cast<
const xMVector_t>(data);
448 #ifdef HAVE_EPETRA_DATA_TYPES 450 else if(input_type ==
"epetra_multivector")
452 int nvec = pList.get<
int>(
"vector_dimension");
454 RCP<const Epetra_MultiVector> const_data = rcp_const_cast<
const Epetra_MultiVector>(data);
457 adapter = reinterpret_cast<AdapterForTests::base_adapter_t *>(
465 if(adapter ==
nullptr)
466 std::cerr <<
"Input data chosen not compatible with xpetra multi-vector adapter." << std::endl;
473 const ParameterList &pList,
474 const RCP<
const Comm<int> > &comm)
479 if(!pList.isParameter(
"data type"))
481 std::cerr <<
"Input data type unspecified" << std::endl;
485 string input_type = pList.get<
string>(
"data type");
488 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled." << std::endl;
492 vector<const zscalar_t *> vtx_weights;
493 vector<const zscalar_t *> edge_weights;
494 vector<int> vtx_weightStride;
495 vector<int> edge_weightStride;
500 RCP<tMVector_t> vtx_weights_tmp = uinput->
getUIWeights();
502 size_t weightsPerRow = vtx_weights_tmp->getNumVectors();
503 for (
size_t i = 0; i< weightsPerRow; i++) {
504 vtx_weights.push_back(vtx_weights_tmp->getData(i).getRawPtr());
505 vtx_weightStride.push_back(1);
514 size_t weightsPerRow = edge_weights_tmp->getNumVectors();
515 for (
size_t i = 0; i< weightsPerRow; i++) {
516 edge_weights.push_back(edge_weights_tmp->getData(i).getRawPtr());
517 edge_weightStride.push_back(1);
523 if(input_type ==
"tpetra_crs_graph")
528 RCP<const tcrsGraph_t> const_data = rcp_const_cast<
const tcrsGraph_t>(data);
529 problem_t *ia =
new problem_t(const_data,(
int)vtx_weights.size(),(int)edge_weights.size());
531 if(!vtx_weights.empty())
533 for(
int i = 0; i < (int)vtx_weights.size(); i++)
534 ia->setVertexWeights(vtx_weights[i],vtx_weightStride[i],i);
537 if(!edge_weights.empty())
539 for(
int i = 0; i < (int)edge_weights.size(); i++)
540 ia->setEdgeWeights(edge_weights[i],edge_weightStride[i],i);
545 else if(input_type ==
"xpetra_crs_graph")
550 RCP<const xcrsGraph_t> const_data = rcp_const_cast<
const xcrsGraph_t>(data);
551 problem_t *ia =
new problem_t(const_data, (
int)vtx_weights.size(), (int)edge_weights.size());
553 if(!vtx_weights.empty())
555 for(
int i = 0; i < (int)vtx_weights.size(); i++)
556 ia->setVertexWeights(vtx_weights[i],vtx_weightStride[i],i);
559 if(!edge_weights.empty())
561 for(
int i = 0; i < (int)edge_weights.size(); i++)
562 ia->setEdgeWeights(edge_weights[i],edge_weightStride[i],i);
567 #ifdef HAVE_EPETRA_DATA_TYPES 569 else if(input_type ==
"epetra_crs_graph")
574 RCP<const Epetra_CrsGraph> const_data = rcp_const_cast<
const Epetra_CrsGraph>(data);
575 problem_t *ia =
new problem_t(const_data,(
int)vtx_weights.size(),(int)edge_weights.size());
577 if(!vtx_weights.empty())
579 for(
int i = 0; i < (int)vtx_weights.size(); i++)
580 ia->setVertexWeights(vtx_weights[i],vtx_weightStride[i],i);
583 if(!edge_weights.empty())
585 for(
int i = 0; i < (int)edge_weights.size(); i++)
586 ia->setEdgeWeights(edge_weights[i],edge_weightStride[i],i);
594 if(adapter ==
nullptr)
596 std::cerr <<
"Input data chosen not compatible with " 597 <<
"XpetraCrsGraph adapter." << std::endl;
603 Teuchos::ParameterList pCopy(pList);
604 pCopy = pCopy.set<std::string>(
"data type",
"coordinates");
607 ca = getXpetraMVAdapterForInput(uinput,pCopy, comm);
611 std::cerr <<
"Failed to create coordinate vector adapter for " 612 <<
"XpetraCrsMatrix adapter." << std::endl;
625 const ParameterList &pList,
626 const RCP<
const Comm<int> > &comm)
630 if(!pList.isParameter(
"data type"))
632 std::cerr <<
"Input data type unspecified" << std::endl;
636 string input_type = pList.get<
string>(
"data type");
639 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled." << std::endl;
643 vector<const zscalar_t *> weights;
649 if(comm->getRank() == 0) cout <<
"Have weights...." << endl;
653 int weightsPerRow = (int)vtx_weights->getNumVectors();
654 for (
int i = 0; i< weightsPerRow; i++)
656 weights.push_back(vtx_weights->getData(i).getRawPtr());
657 strides.push_back(1);
663 if(input_type ==
"tpetra_crs_matrix")
665 if(comm->getRank() == 0) cout <<
"Make tpetra crs matrix adapter...." << endl;
669 RCP<const tcrsMatrix_t> const_data = rcp_const_cast<
const tcrsMatrix_t>(data);
677 for(
int i = 0; i < (int)weights.size(); i++)
685 else if(input_type ==
"xpetra_crs_matrix")
691 RCP<const xcrsMatrix_t> const_data = rcp_const_cast<
const xcrsMatrix_t>(data);
694 problem_t *ia =
new problem_t(const_data, (
int)weights.size());
699 for(
int i = 0; i < (int)weights.size(); i++)
700 ia->setWeights(weights[i],strides[i],i);
706 #ifdef HAVE_EPETRA_DATA_TYPES 708 else if(input_type ==
"epetra_crs_matrix")
713 RCP<const Epetra_CrsMatrix> const_data = rcp_const_cast<
const Epetra_CrsMatrix>(data);
716 problem_t *ia =
new problem_t(const_data, (
int)weights.size());
721 for(
int i = 0; i < (int)weights.size(); i++)
722 ia->setWeights(weights[i],strides[i],i);
729 if(adapter ==
nullptr)
731 std::cerr <<
"Input data chosen not compatible with " 732 <<
"XpetraCrsMatrix adapter." << std::endl;
739 Teuchos::ParameterList pCopy(pList);
740 pCopy = pCopy.set<std::string>(
"data type",
"coordinates");
743 ca = getXpetraMVAdapterForInput(uinput,pCopy,comm);
746 std::cerr <<
"Failed to create coordinate vector adapter for " 747 <<
"XpetraCrsMatrix adapter." << std::endl;
760 const ParameterList &pList,
761 const RCP<
const Comm<int> > &comm)
766 if(!pList.isParameter(
"data type"))
768 std::cerr <<
"Input data type unspecified" << std::endl;
772 string input_type = pList.get<
string>(
"data type");
775 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled." << std::endl;
779 vector<const zscalar_t *> weights;
780 std::vector<int> weightStrides;
790 size_t cols = vtx_weights->getNumVectors();
791 for (
size_t i = 0; i< cols; i++) {
792 weights.push_back(vtx_weights->getData(i).getRawPtr());
793 weightStrides.push_back(1);
799 if(pList.isParameter(
"stride"))
800 stride = pList.get<
int>(
"stride");
802 if(input_type ==
"coordinates")
805 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
806 localCount =
static_cast<zlno_t>(data->getLocalLength());
809 vector<const zscalar_t *> coords;
810 vector<int> entry_strides;
811 AdapterForTests::InitializeVectorData(data,coords,entry_strides,stride);
813 size_t dim = coords.size();
814 size_t push_null = 3-dim;
815 for (
size_t i = 0; i < push_null; i ++)
816 coords.push_back(NULL);
822 coords[0],coords[1],coords[2],
823 stride, stride, stride);
827 coords[0],coords[1],coords[2],
828 stride, stride, stride,
835 else if(input_type ==
"tpetra_vector")
838 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
839 localCount =
static_cast<zlno_t>(data->getLocalLength());
842 vector<const zscalar_t *> coords;
843 vector<int> entry_strides;
844 AdapterForTests::InitializeVectorData(data,coords,entry_strides,stride);
849 coords[0], entry_strides[0]);
852 coords[0], entry_strides[0],
860 else if(input_type ==
"tpetra_multivector")
862 int nvec = pList.get<
int>(
"vector_dimension");
865 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
866 localCount =
static_cast<zlno_t>(data->getLocalLength());
869 vector<const zscalar_t *> coords;
870 vector<int> entry_strides;
871 AdapterForTests::InitializeVectorData(data,coords,entry_strides,stride);
874 coords, entry_strides,
875 weights,weightStrides);
878 else if(input_type ==
"xpetra_vector")
881 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
882 localCount =
static_cast<zlno_t>(data->getLocalLength());
885 vector<const zscalar_t *> coords;
886 vector<int> entry_strides;
887 AdapterForTests::InitializeVectorData(data,coords,entry_strides,stride);
892 coords[0], entry_strides[0]);
895 coords[0], entry_strides[0],
902 else if(input_type ==
"xpetra_multivector")
904 int nvec = pList.get<
int>(
"vector_dimension");
906 globalIds = (
zgno_t *)data->getMap()->getNodeElementList().getRawPtr();
907 localCount =
static_cast<zlno_t>(data->getLocalLength());
910 vector<const zscalar_t *> coords;
911 vector<int> entry_strides;
912 AdapterForTests::InitializeVectorData(data,coords,entry_strides,stride);
913 if(comm->getRank() == 0) cout <<
"size of entry strides: " << entry_strides.size() << endl;
914 if(comm->getRank() == 0) cout <<
"size of coords: " << coords.size() << endl;
918 coords, entry_strides,
919 weights,weightStrides);
922 #ifdef HAVE_EPETRA_DATA_TYPES 923 else if(input_type ==
"epetra_vector")
926 globalIds = (
zgno_t *)data->Map().MyGlobalElements();
927 localCount =
static_cast<zlno_t>(data->MyLength());
930 vector<const zscalar_t *> coords;
931 vector<int> entry_strides;
932 AdapterForTests::InitializeEpetraVectorData(data,coords,entry_strides,stride);
937 coords[0], entry_strides[0]);
940 coords[0], entry_strides[0],
949 else if(input_type ==
"epetra_multivector")
951 int nvec = pList.get<
int>(
"vector_dimension");
953 globalIds = (
zgno_t *)data->Map().MyGlobalElements();
954 localCount = data->MyLength();
956 vector<const zscalar_t *> coords;
957 vector<int> entry_strides;
958 AdapterForTests::InitializeEpetraVectorData(data,coords,entry_strides,stride);
962 coords, entry_strides,
963 weights,weightStrides);
970 if(ia !=
nullptr)
delete ia;
977 template <
typename T>
978 void AdapterForTests::InitializeVectorData(
const RCP<T> &data,
979 vector<const zscalar_t *> &coords,
980 vector<int> & strides,
984 size_t localCount = data->getLocalLength();
985 size_t nvecs = data->getNumVectors();
986 size_t vecsize = data->getNumVectors() * data->getLocalLength();
990 ArrayRCP<zscalar_t> *petravectors =
991 new ArrayRCP<zscalar_t>[nvecs];
994 for (
size_t i = 0; i < nvecs; i++)
995 petravectors[i] = data->getDataNonConst(i);
1011 if(stride == 1 || stride != (
int)nvecs)
1013 for (
size_t i = 0; i < nvecs; i++) {
1014 for (
size_t j = 0; j < localCount; j++) {
1015 coordarr[idx++] = petravectors[i][j];
1020 for (
size_t j = 0; j < localCount; j++) {
1021 for (
size_t i = 0; i < nvecs; i++) {
1022 coordarr[idx++] = petravectors[i][j];
1035 coords = std::vector<const zscalar_t *>(nvecs);
1036 strides = std::vector<int>(nvecs);
1038 for (
size_t i = 0; i < nvecs; i++) {
1040 coords[i] = &coordarr[i*localCount];
1042 coords[i] = &coordarr[i];
1044 strides[i] = stride;
1060 delete [] petravectors;
1063 #ifdef HAVE_EPETRA_DATA_TYPES 1065 template <
typename T>
1066 void AdapterForTests::InitializeEpetraVectorData(
const RCP<T> &data,
1067 vector<const zscalar_t *> &coords,
1068 vector<int> & strides,
1070 size_t localCount = data->MyLength();
1071 size_t nvecs = data->NumVectors();
1072 size_t vecsize = nvecs * localCount;
1077 vector<zscalar_t *> epetravectors(nvecs);
1080 data->ExtractView(&arr);
1082 for(
size_t k = 0; k < nvecs; k++)
1084 epetravectors[k] = arr[k];
1090 if(stride == 1 || stride != (
int)nvecs)
1092 for (
size_t i = 0; i < nvecs; i++) {
1093 for (
size_t j = 0; j < localCount; j++) {
1094 coordarr[idx++] = epetravectors[i][j];
1099 for (
size_t j = 0; j < localCount; j++) {
1100 for (
size_t i = 0; i < nvecs; i++) {
1101 coordarr[idx++] = epetravectors[i][j];
1113 coords = std::vector<const zscalar_t *>(nvecs);
1114 strides = std::vector<int>(nvecs);
1116 for (
size_t i = 0; i < nvecs; i++) {
1118 coords[i] = &coordarr[i*localCount];
1120 coords[i] = &coordarr[i];
1122 strides[i] = stride;
1143 const ParameterList &pList,
1144 const RCP<
const Comm<int> > &comm)
1158 std::cerr <<
"Pamgen mesh is unavailable for PamgenMeshAdapter!" << std::endl;
InputTraits< User >::scalar_t scalar_t
Zoltan2::PamgenMeshAdapter< tMVector_t > pamgen_adapter_t
UserInputForTests::tMVector_t tMVector_t
Zoltan2::XpetraMultiVectorAdapter< tMVector_t > xpetra_mv_adapter
Zoltan2::XpetraCrsGraphAdapter< tcrsGraph_t, tMVector_t > xcrsGraph_adapter
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
Defines Parameter related enumerators, declares functions.
Provides access for Zoltan2 to Xpetra::CrsMatrix data.
UserInputForTests::xMVector_t xMVector_t
A simple class that can be the User template argument for an InputAdapter.
UserInputForTests::tcrsGraph_t tcrsGraph_t
Provides access for Zoltan2 to Xpetra::CrsGraph data.
Defines the PamgenMeshAdapter class.
UserInputForTests::tcrsMatrix_t tcrsMatrix_t
Zoltan2::XpetraCrsMatrixAdapter< tcrsMatrix_t, tMVector_t > xcrsMatrix_adapter
UserInputForTests::xcrsGraph_t xcrsGraph_t
Zoltan2::BasicIdentifierAdapter< userTypes_t > basic_id_t
Defines the XpetraMultiVectorAdapter.
Zoltan2::BasicVectorAdapter< tMVector_t > basic_vector_adapter
Defines XpetraCrsGraphAdapter class.
This class represents a collection of global Identifiers and their associated weights, if any.
Defines the XpetraCrsMatrixAdapter class.
Defines the PartitioningSolutionQuality class.
UserInputForTests::xVector_t xVector_t
BasicVectorAdapter represents a vector (plus optional weights) supplied by the user as pointers to st...
An adapter for Xpetra::MultiVector.
UserInputForTests::xcrsMatrix_t xcrsMatrix_t
Defines the BasicIdentifierAdapter class.
BaseAdapter defines methods required by all Adapters.
void setWeights(const scalar_t *weightVal, int stride, int idx=0)
Specify a weight for each entity of the primaryEntityType.
static base_adapter_t * getAdapterForInput(UserInputForTests *uinput, const ParameterList &pList, const RCP< const Comm< int > > &comm)
A class method for constructing an input adapter defind in a parameter list.
Defines the PartitioningProblem class.
Zoltan2::BasicUserTypes< zscalar_t, zlno_t, zgno_t > userTypes_t
Defines the BasicVectorAdapter class.
This class represents a mesh.
UserInputForTests::tVector_t tVector_t