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);
89 return adaptersSet.main.adapter;
93 return adaptersSet.main.adapterType;
97 return adaptersSet.coordinate.adapter;
101 return adaptersSet.coordinate.adapterType;
106 std::vector<void*> ownedCoordArrays;
118 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
130 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
142 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
154 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
166 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
178 const ParameterList &pList,
const RCP<
const Comm<int> > &comm);
188 template <
typename T>
189 void InitializeVectorData(
const RCP<T> &data,
190 std::vector<const zscalar_t *> &coords,
191 std::vector<int> & strides,
199 const ParameterList &pList,
200 const RCP<
const Comm<int> > &comm)
202 if(!pList.isParameter(
"input adapter"))
204 std::cerr <<
"Input adapter unspecified" << std::endl;
209 std::string input_adapter_name = pList.get<
string>(
"input adapter");
211 if(input_adapter_name ==
"BasicIdentifier")
212 adaptersSet.main = getBasicIdentiferAdapterForInput(uinput, pList, comm);
213 else if(input_adapter_name ==
"XpetraMultiVector")
214 adaptersSet.main = getXpetraMVAdapterForInput(uinput, pList, comm);
215 else if(input_adapter_name ==
"XpetraCrsGraph")
216 adaptersSet = getXpetraCrsGraphAdapterForInput(uinput,pList, comm);
217 else if(input_adapter_name ==
"XpetraCrsMatrix")
218 adaptersSet = getXpetraCrsMatrixAdapterForInput(uinput,pList, comm);
219 else if(input_adapter_name ==
"BasicVector")
220 adaptersSet.main = getBasicVectorAdapterForInput(uinput,pList, comm);
221 else if(input_adapter_name ==
"PamgenMesh")
222 adaptersSet.main = getPamgenMeshAdapterForInput(uinput,pList, comm);
224 if(adaptersSet.main.adapter ==
nullptr) {
225 throw std::logic_error(
"AdapterFactory failed to create adapter!");
230 if( adaptersSet.main.adapter ) {
231 delete adaptersSet.main.adapter;
234 if( adaptersSet.coordinate.adapter ) {
235 delete adaptersSet.coordinate.adapter;
237 for (
void* ptr : ownedCoordArrays) {
245 const ParameterList &pList,
246 const RCP<
const Comm<int> > &comm)
250 if(!pList.isParameter(
"data type"))
252 std::cerr <<
"Input data type unspecified" << std::endl;
256 string input_type = pList.get<
string>(
"data type");
260 std::cerr <<
"Input type: " + input_type +
" unavailable or misspelled."
265 std::vector<const zscalar_t *>
weights;
266 std::vector<int> weightStrides;
267 const zgno_t *globalIds = NULL;
268 size_t localCount = 0;
276 size_t cols = vtx_weights->getNumVectors();
277 for (
size_t i = 0; i< cols; i++) {
278 weights.push_back(vtx_weights->getData(i).getRawPtr());
279 weightStrides.push_back((
int)vtx_weights->getStride());
283 if(input_type ==
"coordinates")
286 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
287 localCount = data->getLocalLength();
289 else if(input_type ==
"tpetra_vector")
292 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
293 localCount = data->getLocalLength();
295 else if(input_type ==
"tpetra_multivector")
297 int nvec = pList.get<
int>(
"vector_dimension");
299 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
300 localCount = data->getLocalLength();
302 else if(input_type ==
"tpetra_crs_graph")
305 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
306 localCount = data->getLocalNumCols();
308 else if(input_type ==
"tpetra_crs_matrix")
311 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
312 localCount = data->getLocalNumCols();
314 else if(input_type ==
"xpetra_vector")
317 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
318 localCount = data->getLocalLength();
320 else if(input_type ==
"xpetra_multivector")
322 int nvec = pList.get<
int>(
"vector_dimension");
324 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
325 localCount = data->getLocalLength();
327 else if(input_type ==
"xpetra_crs_graph")
330 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
331 localCount = data->getLocalNumCols();
333 else if(input_type ==
"xpetra_crs_matrix")
336 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
337 localCount = data->getLocalNumCols();
350 const ParameterList &pList,
351 const RCP<
const Comm<int> > &comm)
353 AdapterWithTemplateName result;
355 if(!pList.isParameter(
"data type"))
357 std::cerr <<
"Input data type unspecified" << std::endl;
361 string input_type = pList.get<
string>(
"data type");
364 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled."
369 std::vector<const zscalar_t *>
weights;
370 std::vector<int> weightStrides;
377 size_t weightsPerRow = vtx_weights->getNumVectors();
378 for (
size_t i = 0; i< weightsPerRow; i++) {
379 weights.push_back(vtx_weights->getData(i).getRawPtr());
380 weightStrides.push_back(1);
385 if(input_type ==
"coordinates")
388 RCP<const tMVector_t> const_data = rcp_const_cast<const tMVector_t>(data);
396 else if(input_type ==
"tpetra_multivector")
398 int nvec = pList.get<
int>(
"vector_dimension");
400 RCP<const tMVector_t> const_data = rcp_const_cast<const tMVector_t>(data);
407 else if(input_type ==
"xpetra_multivector")
409 int nvec = pList.get<
int>(
"vector_dimension");
411 RCP<const xMVector_t> const_data = rcp_const_cast<const xMVector_t>(data);
421 std::cerr <<
"Input data chosen not compatible with xpetra multi-vector adapter." << std::endl;
429 const ParameterList &pList,
430 const RCP<
const Comm<int> > &comm)
433 AdapterWithOptionalCoordinateAdapter adapters;
435 if(!pList.isParameter(
"data type"))
437 std::cerr <<
"Input data type unspecified" << std::endl;
441 string input_type = pList.get<
string>(
"data type");
444 std::cerr <<
"Input type: " + input_type +
", unavailable or misspelled."
449 std::vector<const zscalar_t *> vtx_weights;
450 std::vector<const zscalar_t *> edge_weights;
451 std::vector<int> vtx_weightStride;
452 std::vector<int> edge_weightStride;
457 RCP<tMVector_t> vtx_weights_tmp = uinput->
getUIWeights();
459 size_t weightsPerRow = vtx_weights_tmp->getNumVectors();
460 for (
size_t i = 0; i< weightsPerRow; i++) {
461 vtx_weights.push_back(vtx_weights_tmp->getData(i).getRawPtr());
462 vtx_weightStride.push_back(1);
471 size_t weightsPerRow = edge_weights_tmp->getNumVectors();
472 for (
size_t i = 0; i< weightsPerRow; i++) {
473 edge_weights.push_back(edge_weights_tmp->getData(i).getRawPtr());
474 edge_weightStride.push_back(1);
481 Teuchos::ParameterList pCopy(pList);
482 pCopy = pCopy.set<std::string>(
"data type",
"coordinates");
485 #define SET_COORDS_INPUT_1(adapterClass) \
486 auto * ca = dynamic_cast<adapterClass*>(adapters.coordinate.adapter); \
487 if(!ca) {throw std::logic_error( "Coordinate adapter case failed!" );} \
488 ia->setCoordinateInput(ca);
490 if(input_type ==
"tpetra_crs_graph")
493 RCP<const tcrsGraph_t> const_data = rcp_const_cast<const tcrsGraph_t>(data);
495 xCG_tCG_t * ia =
new xCG_tCG_t(const_data,(
int)vtx_weights.size(),(
int)edge_weights.size());
499 if(!vtx_weights.empty()) {
500 for(
int i = 0; i < (int)vtx_weights.size(); i++)
504 if(!edge_weights.empty()) {
505 for(
int i = 0; i < (int)edge_weights.size(); i++)
510 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
514 else if(input_type ==
"xpetra_crs_graph")
517 RCP<const xcrsGraph_t> const_data = rcp_const_cast<const xcrsGraph_t>(data);
519 xCG_xCG_t * ia =
new xCG_xCG_t(const_data, (
int)vtx_weights.size(), (
int)edge_weights.size());
522 if(!vtx_weights.empty())
524 for(
int i = 0; i < (int)vtx_weights.size(); i++)
528 if(!edge_weights.empty())
530 for(
int i = 0; i < (int)edge_weights.size(); i++)
535 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
541 std::cerr <<
"Input data chosen not compatible with "
542 <<
"XpetraCrsGraph adapter." << std::endl;
552 const ParameterList &pList,
553 const RCP<
const Comm<int> > &comm)
555 AdapterWithOptionalCoordinateAdapter adapters;
557 if(!pList.isParameter(
"data type"))
559 std::cerr <<
"Input data type unspecified" << std::endl;
563 string input_type = pList.get<
string>(
"data type");
566 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled."
571 std::vector<const zscalar_t *>
weights;
572 std::vector<int> strides;
577 if(comm->getRank() == 0) std::cout <<
"Have weights...." << std::endl;
581 int weightsPerRow = (int)vtx_weights->getNumVectors();
582 for (
int i = 0; i< weightsPerRow; i++)
584 weights.push_back(vtx_weights->getData(i).getRawPtr());
585 strides.push_back(1);
593 Teuchos::ParameterList pCopy(pList);
594 pCopy = pCopy.set<std::string>(
"data type",
"coordinates");
597 #define SET_COORDS_INPUT_2(adapterClass) \
598 auto * ca = dynamic_cast<adapterClass*>(adapters.coordinate.adapter); \
599 if(!ca) {throw std::logic_error( "Coordinate adapter case failed!" );} \
600 ia->setCoordinateInput(ca);
603 if(input_type ==
"tpetra_crs_matrix")
605 if(comm->getRank() == 0) std::cout <<
"Make tpetra crs matrix adapter...." << std::endl;
609 RCP<const tcrsMatrix_t> const_data = rcp_const_cast<const tcrsMatrix_t>(data);
619 for(
int i = 0; i < (int)
weights.size(); i++)
624 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
628 else if(input_type ==
"xpetra_crs_matrix")
631 RCP<const xcrsMatrix_t> const_data = rcp_const_cast<const xcrsMatrix_t>(data);
641 for(
int i = 0; i < (int)
weights.size(); i++)
646 adapters.
coordinate = getXpetraMVAdapterForInput(uinput, pCopy, comm);
653 std::cerr <<
"Input data chosen not compatible with "
654 <<
"XpetraCrsMatrix adapter." << std::endl;
663 const ParameterList &pList,
664 const RCP<
const Comm<int> > &comm)
667 AdapterWithTemplateName result;
669 if(!pList.isParameter(
"data type"))
671 std::cerr <<
"Input data type unspecified" << std::endl;
675 string input_type = pList.get<
string>(
"data type");
678 std::cerr <<
"Input type:" + input_type +
", unavailable or misspelled."
683 std::vector<const zscalar_t *>
weights;
684 std::vector<int> weightStrides;
694 size_t cols = vtx_weights->getNumVectors();
695 for (
size_t i = 0; i< cols; i++) {
696 weights.push_back(vtx_weights->getData(i).getRawPtr());
697 weightStrides.push_back(1);
703 if(pList.isParameter(
"stride"))
704 stride = pList.get<
int>(
"stride");
708 if(input_type ==
"coordinates")
711 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
712 localCount =
static_cast<zlno_t>(data->getLocalLength());
715 std::vector<const zscalar_t *> coords;
716 std::vector<int> entry_strides;
717 InitializeVectorData(data,coords,entry_strides,stride);
722 size_t dim = coords.size();
723 size_t push_null = 3-dim;
724 for (
size_t i = 0; i < push_null; i ++) coords.push_back(NULL);
730 stride, stride, stride);
731 }
else if (
weights.size() == 1) {
732 size_t dim = coords.size();
733 size_t push_null = 3-dim;
734 for (
size_t i = 0; i < push_null; i ++) coords.push_back(NULL);
740 stride, stride, stride,
748 coords, entry_strides,
752 else if(input_type ==
"tpetra_vector")
755 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
756 localCount =
static_cast<zlno_t>(data->getLocalLength());
759 std::vector<const zscalar_t *> coords;
760 std::vector<int> entry_strides;
761 InitializeVectorData(data,coords,entry_strides,stride);
766 coords[0], entry_strides[0]);
769 coords[0], entry_strides[0],
777 else if(input_type ==
"tpetra_multivector")
779 int nvec = pList.get<
int>(
"vector_dimension");
782 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
783 localCount =
static_cast<zlno_t>(data->getLocalLength());
786 std::vector<const zscalar_t *> coords;
787 std::vector<int> entry_strides;
788 InitializeVectorData(data,coords,entry_strides,stride);
791 coords, entry_strides,
795 else if(input_type ==
"xpetra_vector")
798 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
799 localCount =
static_cast<zlno_t>(data->getLocalLength());
802 std::vector<const zscalar_t *> coords;
803 std::vector<int> entry_strides;
804 InitializeVectorData(data,coords,entry_strides,stride);
809 coords[0], entry_strides[0]);
812 coords[0], entry_strides[0],
819 else if(input_type ==
"xpetra_multivector")
821 int nvec = pList.get<
int>(
"vector_dimension");
823 globalIds = (
zgno_t *)data->getMap()->getLocalElementList().getRawPtr();
824 localCount =
static_cast<zlno_t>(data->getLocalLength());
827 std::vector<const zscalar_t *> coords;
828 std::vector<int> entry_strides;
829 InitializeVectorData(data,coords,entry_strides,stride);
830 if(comm->getRank() == 0) std::cout <<
"size of entry strides: " << entry_strides.size() << std::endl;
831 if(comm->getRank() == 0) std::cout <<
"size of coords: " << coords.size() << std::endl;
835 coords, entry_strides,
843void AdapterFactory::InitializeVectorData(
const RCP<T> &data,
844 std::vector<const zscalar_t *> &coords,
845 std::vector<int> & strides,
849 size_t localCount = data->getLocalLength();
850 size_t nvecs = data->getNumVectors();
851 size_t vecsize = data->getNumVectors() * data->getLocalLength();
855 ArrayRCP<zscalar_t> *petravectors =
new ArrayRCP<zscalar_t>[nvecs];
858 for (
size_t i = 0; i < nvecs; i++)
859 petravectors[i] = data->getDataNonConst(i);
874 ownedCoordArrays.push_back(coordarr);
876 if(stride == 1 || stride != (
int)nvecs)
878 for (
size_t i = 0; i < nvecs; i++) {
879 for (
size_t j = 0; j < localCount; j++) {
880 coordarr[idx++] = petravectors[i][j];
885 for (
size_t j = 0; j < localCount; j++) {
886 for (
size_t i = 0; i < nvecs; i++) {
887 coordarr[idx++] = petravectors[i][j];
900 coords = std::vector<const zscalar_t *>(nvecs);
901 strides = std::vector<int>(nvecs);
903 for (
size_t i = 0; i < nvecs; i++) {
905 coords[i] = &coordarr[i*localCount];
907 coords[i] = &coordarr[i];
926 delete [] petravectors;
932 const ParameterList &pList,
933 const RCP<
const Comm<int> > &comm)
935 AdapterWithTemplateName result;
937#ifdef HAVE_ZOLTAN2_PAMGEN
950 std::cerr <<
"Pamgen mesh is unavailable for PamgenMeshAdapter!"
956 throw std::runtime_error(
"Pamgen input requested but Trilinos is not "
957 "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.
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.
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