47 #ifndef MUELU_MATLABUTILS_DEF_HPP 48 #define MUELU_MATLABUTILS_DEF_HPP 52 #if !defined(HAVE_MUELU_MATLAB) || !defined(HAVE_MUELU_EPETRA) || !defined(HAVE_MUELU_TPETRA) 53 #error "Muemex types require MATLAB, Epetra and Tpetra." 128 #ifdef HAVE_MUELU_INTREPID2 130 template<>
MuemexType getMuemexType<RCP<FieldContainer_ordinal>>() {
return FIELDCONTAINER_ORDINAL;}
142 template<> mxArray*
saveDataToMatlab(RCP<Xpetra_MultiVector_complex>& data);
153 mxClassID probIDtype = mxGetClassID(mxa);
155 if(probIDtype == mxINT32_CLASS)
157 rv = *((
int*) mxGetData(mxa));
159 else if(probIDtype == mxLOGICAL_CLASS)
161 rv = (int) *((
bool*) mxGetData(mxa));
163 else if(probIDtype == mxDOUBLE_CLASS)
165 rv = (int) *((
double*) mxGetData(mxa));
167 else if(probIDtype == mxUINT32_CLASS)
169 rv = (int) *((
unsigned int*) mxGetData(mxa));
174 throw std::runtime_error(
"Error: Unrecognized numerical type.");
182 return *((
bool*) mxGetData(mxa));
188 return *((
double*) mxGetPr(mxa));
194 double realpart = real<double>(*((
double*) mxGetPr(mxa)));
195 double imagpart = imag<double>(*((
double*) mxGetPi(mxa)));
203 if (mxGetClassID(mxa) != mxCHAR_CLASS)
205 throw runtime_error(
"Can't construct string from anything but a char array.");
207 rv = string(mxArrayToString(mxa));
212 RCP<Xpetra_map> loadDataFromMatlab<RCP<Xpetra_map>>(
const mxArray* mxa)
214 RCP<const Teuchos::Comm<int> > comm = rcp(
new Teuchos::SerialComm<int>());
215 int nr = mxGetM(mxa);
216 int nc = mxGetN(mxa);
218 throw std::runtime_error(
"A Xpetra::Map representation from MATLAB must be a single row vector.");
219 double* pr = mxGetPr(mxa);
222 std::vector<mm_GlobalOrd> localGIDs(numGlobalIndices);
223 for(
int i = 0; i < int(numGlobalIndices); i++) {
224 localGIDs[i] = Teuchos::as<mm_GlobalOrd>(pr[i]);
227 const Teuchos::ArrayView<const mm_GlobalOrd> localGIDs_view(&localGIDs[0],localGIDs.size());
228 RCP<Xpetra_map> map =
229 Xpetra::MapFactory<mm_LocalOrd, mm_GlobalOrd, mm_node_t>::Build(
231 Teuchos::OrdinalTraits<mm_GlobalOrd>::invalid(),
236 throw runtime_error(
"Failed to create Xpetra::Map.");
241 RCP<Xpetra_ordinal_vector> loadDataFromMatlab<RCP<Xpetra_ordinal_vector>>(
const mxArray* mxa)
243 RCP<const Teuchos::Comm<int> > comm = rcp(
new Teuchos::SerialComm<int>());
244 if(mxGetN(mxa) != 1 && mxGetM(mxa) != 1)
245 throw std::runtime_error(
"An OrdinalVector from MATLAB must be a single row or column vector.");
246 mm_GlobalOrd numGlobalIndices = mxGetM(mxa) * mxGetN(mxa);
247 RCP<Xpetra::Map<mm_LocalOrd, mm_GlobalOrd, mm_node_t>> map = Xpetra::MapFactory<mm_LocalOrd, mm_GlobalOrd, mm_node_t>::Build(Xpetra::UseTpetra, numGlobalIndices, 0, comm);
248 if(mxGetClassID(mxa) != mxINT32_CLASS)
249 throw std::runtime_error(
"Can only construct LOVector with int32 data.");
250 int* array = (
int*) mxGetData(mxa);
252 throw runtime_error(
"Failed to create map for Xpetra ordinal vector.");
253 RCP<Xpetra_ordinal_vector> loVec = Xpetra::VectorFactory<mm_LocalOrd, mm_LocalOrd, mm_GlobalOrd, mm_node_t>::Build(map,
false);
255 throw runtime_error(
"Failed to create ordinal vector with Xpetra::VectorFactory.");
256 for(
int i = 0; i < int(numGlobalIndices); i++)
258 loVec->replaceGlobalValue(i, 0, array[i]);
264 RCP<Tpetra_MultiVector_double> loadDataFromMatlab<RCP<Tpetra_MultiVector_double>>(
const mxArray* mxa)
266 RCP<Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> mv;
269 int nr = mxGetM(mxa);
270 int nc = mxGetN(mxa);
271 double* pr = mxGetPr(mxa);
272 RCP<const Teuchos::Comm<int>> comm = Tpetra::DefaultPlatform::getDefaultPlatform().getComm();
276 Teuchos::ArrayView<const double> arrView(pr, nr * nc);
277 mv = rcp(
new Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(map, arrView,
size_t(nr),
size_t(nc)));
279 catch(std::exception& e)
281 mexPrintf(
"Error constructing Tpetra MultiVector.\n");
282 std::cout << e.what() << std::endl;
288 RCP<Tpetra_MultiVector_complex> loadDataFromMatlab<RCP<Tpetra_MultiVector_complex>>(
const mxArray* mxa)
290 RCP<Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> mv;
293 int nr = mxGetM(mxa);
294 int nc = mxGetN(mxa);
295 double* pr = mxGetPr(mxa);
296 double* pi = mxGetPi(mxa);
297 RCP<const Teuchos::Comm<int>> comm = Tpetra::DefaultPlatform::getDefaultPlatform().getComm();
302 for(
int n = 0; n < nc; n++)
304 for(
int m = 0; m < nr; m++)
306 myArr[n * nr + m] =
complex_t(pr[n * nr + m], pi[n * nr + m]);
309 Teuchos::ArrayView<complex_t> arrView(myArr, nr * nc);
310 mv = rcp(
new Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(map, arrView, nr, nc));
312 catch(std::exception& e)
314 mexPrintf(
"Error constructing Tpetra MultiVector.\n");
315 std::cout << e.what() << std::endl;
321 RCP<Tpetra_CrsMatrix_double> loadDataFromMatlab<RCP<Tpetra_CrsMatrix_double>>(
const mxArray* mxa)
323 bool success =
false;
324 RCP<Tpetra_CrsMatrix_double> A;
331 RCP<const Teuchos::Comm<int>> comm = rcp(
new Teuchos::SerialComm<int>());
333 const Tpetra::global_size_t numGlobalIndices = mxGetM(mxa);
335 RCP<const muemex_map_type> rowMap = rcp(
new muemex_map_type(numGlobalIndices, indexBase, comm));
336 RCP<const muemex_map_type> domainMap = rcp(
new muemex_map_type(mxGetN(mxa), indexBase, comm));
337 A = Tpetra::createCrsMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(rowMap);
338 double* valueArray = mxGetPr(mxa);
339 int nc = mxGetN(mxa);
348 rowind = (
int*) mxGetIr(mxa);
349 colptr = (
int*) mxGetJc(mxa);
351 for(
int i = 0; i < nc; i++)
353 for(
int j = colptr[i]; j < colptr[i + 1]; j++)
356 Teuchos::ArrayView<mm_GlobalOrd> cols = Teuchos::ArrayView<mm_GlobalOrd>(&i, 1);
358 Teuchos::ArrayView<double> vals = Teuchos::ArrayView<double>(&valueArray[j], 1);
359 A->insertGlobalValues(rowind[j], cols, vals);
362 A->fillComplete(domainMap, rowMap);
365 delete[] rowind; rowind = NULL;
366 delete[] colptr; colptr = NULL;
370 catch(std::exception& e)
374 if(rowind!=NULL)
delete[] rowind;
375 if(colptr!=NULL)
delete[] colptr;
379 mexPrintf(
"Error while constructing Tpetra matrix:\n");
380 std::cout << e.what() << std::endl;
383 mexErrMsgTxt(
"An error occurred while setting up a Tpetra matrix.\n");
388 RCP<Tpetra_CrsMatrix_complex> loadDataFromMatlab<RCP<Tpetra_CrsMatrix_complex>>(
const mxArray* mxa)
390 RCP<Tpetra_CrsMatrix_complex> A;
394 RCP<const Teuchos::Comm<int>> comm = Tpetra::DefaultPlatform::getDefaultPlatform().getComm();
395 const Tpetra::global_size_t numGlobalIndices = mxGetM(mxa);
397 RCP<const muemex_map_type> rowMap = rcp(
new muemex_map_type(numGlobalIndices, indexBase, comm));
398 RCP<const muemex_map_type> domainMap = rcp(
new muemex_map_type(mxGetN(mxa), indexBase, comm));
399 A = Tpetra::createCrsMatrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(rowMap);
400 double* realArray = mxGetPr(mxa);
401 double* imagArray = mxGetPi(mxa);
404 int nc = mxGetN(mxa);
413 rowind = (
int*) mxGetIr(mxa);
414 colptr = (
int*) mxGetJc(mxa);
416 for(
int i = 0; i < nc; i++)
418 for(
int j = colptr[i]; j < colptr[i + 1]; j++)
422 complex_t value = std::complex<double>(realArray[j], imagArray[j]);
423 Teuchos::ArrayView<mm_GlobalOrd> cols = Teuchos::ArrayView<mm_GlobalOrd>(&i, 1);
424 Teuchos::ArrayView<complex_t> vals = Teuchos::ArrayView<complex_t>(&value, 1);
425 A->insertGlobalValues(rowind[j], cols, vals);
428 A->fillComplete(domainMap, rowMap);
435 catch(std::exception& e)
437 mexPrintf(
"Error while constructing tpetra matrix:\n");
438 std::cout << e.what() << std::endl;
444 RCP<Xpetra::Matrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> loadDataFromMatlab<RCP<Xpetra::Matrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(
const mxArray* mxa)
446 RCP<Tpetra::CrsMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> tmat = loadDataFromMatlab<RCP<Tpetra::CrsMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(mxa);
447 return MueLu::TpetraCrs_To_XpetraMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(tmat);
451 RCP<Xpetra::Matrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> loadDataFromMatlab<RCP<Xpetra::Matrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(
const mxArray* mxa)
453 RCP<Tpetra::CrsMatrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> tmat = loadDataFromMatlab<RCP<Tpetra::CrsMatrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(mxa);
454 return MueLu::TpetraCrs_To_XpetraMatrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(tmat);
458 RCP<Xpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> loadDataFromMatlab<RCP<Xpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(
const mxArray* mxa)
460 RCP<Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> tpetraMV = loadDataFromMatlab<RCP<Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(mxa);
461 return MueLu::TpetraMultiVector_To_XpetraMultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(tpetraMV);
465 RCP<Xpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> loadDataFromMatlab<RCP<Xpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(
const mxArray* mxa)
467 RCP<Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> tpetraMV = loadDataFromMatlab<RCP<Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>>(mxa);
468 return MueLu::TpetraMultiVector_To_XpetraMultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(tpetraMV);
472 RCP<Epetra_CrsMatrix> loadDataFromMatlab<RCP<Epetra_CrsMatrix>>(
const mxArray* mxa)
474 RCP<Epetra_CrsMatrix> matrix;
479 double* vals = mxGetPr(mxa);
480 int nr = mxGetM(mxa);
481 int nc = mxGetN(mxa);
489 rowind = (
int*) mxGetIr(mxa);
490 colptr = (
int*) mxGetJc(mxa);
492 Epetra_SerialComm Comm;
493 Epetra_Map RangeMap(nr, 0, Comm);
494 Epetra_Map DomainMap(nc, 0, Comm);
495 matrix = rcp(
new Epetra_CrsMatrix(Epetra_DataAccess::Copy, RangeMap, DomainMap, 0));
497 for(
int i = 0; i < nc; i++)
499 for(
int j = colptr[i]; j < colptr[i + 1]; j++)
502 matrix->InsertGlobalValues(rowind[j], 1, &vals[j], &i);
505 matrix->FillComplete(DomainMap, RangeMap);
512 catch(std::exception& e)
514 mexPrintf(
"An error occurred while setting up an Epetra matrix:\n");
515 std::cout << e.what() << std::endl;
521 RCP<Epetra_MultiVector> loadDataFromMatlab<RCP<Epetra_MultiVector>>(
const mxArray* mxa)
523 int nr = mxGetM(mxa);
524 int nc = mxGetN(mxa);
525 Epetra_SerialComm Comm;
526 Epetra_BlockMap map(nr * nc, 1, 0, Comm);
527 return rcp(
new Epetra_MultiVector(Epetra_DataAccess::Copy, map, mxGetPr(mxa), nr, nc));
531 RCP<MAggregates> loadDataFromMatlab<RCP<MAggregates>>(
const mxArray* mxa)
533 if(mxGetNumberOfElements(mxa) != 1)
534 throw runtime_error(
"Aggregates must be individual structs in MATLAB.");
536 throw runtime_error(
"Trying to pull aggregates from non-struct MATLAB object.");
539 const int correctNumFields = 5;
540 if(mxGetNumberOfFields(mxa) != correctNumFields)
541 throw runtime_error(
"Aggregates structure has wrong number of fields.");
543 int nVert = *(
int*) mxGetData(mxGetField(mxa, 0,
"nVertices"));
544 int nAgg = *(
int*) mxGetData(mxGetField(mxa, 0,
"nAggregates"));
547 RCP<const Teuchos::Comm<int>> comm = Teuchos::DefaultComm<int>::getComm();
548 int myRank = comm->getRank();
549 Xpetra::UnderlyingLib lib = Xpetra::UseTpetra;
550 RCP<Xpetra::Map<mm_LocalOrd, mm_GlobalOrd, mm_node_t>> map = Xpetra::MapFactory<mm_LocalOrd, mm_GlobalOrd, mm_node_t>::Build(lib, nVert, 0, comm);
552 agg->SetNumAggregates(nAgg);
555 ArrayRCP<mm_LocalOrd> vertex2AggId = agg->GetVertex2AggId()->getDataNonConst(0);
556 ArrayRCP<mm_LocalOrd> procWinner = agg->GetProcWinner()->getDataNonConst(0);
560 mxArray* vertToAggID_in = mxGetField(mxa, 0,
"vertexToAggID");
561 int* vertToAggID_inArray = (
int*) mxGetData(vertToAggID_in);
562 mxArray* rootNodes_in = mxGetField(mxa, 0,
"rootNodes");
563 int* rootNodes_inArray = (
int*) mxGetData(rootNodes_in);
564 for(
int i = 0; i < nVert; i++)
566 vertex2AggId[i] = vertToAggID_inArray[i];
567 procWinner[i] = myRank;
568 agg->SetIsRoot(i,
false);
570 for(
int i = 0; i < nAgg; i++)
572 agg->SetIsRoot(rootNodes_inArray[i],
true);
575 agg->ComputeAggregateSizes(
true,
true);
576 agg->AggregatesCrossProcessors(
false);
581 RCP<MAmalInfo> loadDataFromMatlab<RCP<MAmalInfo>>(
const mxArray* mxa)
584 throw runtime_error(
"AmalgamationInfo not supported in Muemex yet.");
589 RCP<MGraph> loadDataFromMatlab<RCP<MGraph>>(
const mxArray* mxa)
592 mxArray* edges = mxGetField(mxa, 0,
"edges");
593 mxArray* boundaryNodes = mxGetField(mxa, 0,
"boundaryNodes");
595 throw runtime_error(
"Graph structure in MATLAB must have a field called 'edges' (logical sparse matrix)");
596 if(boundaryNodes == NULL)
597 throw runtime_error(
"Graph structure in MATLAB must have a field called 'boundaryNodes' (int32 array containing list of boundary nodes)");
598 int* boundaryList = (
int*) mxGetData(boundaryNodes);
599 if(!mxIsSparse(edges) || mxGetClassID(edges) != mxLOGICAL_CLASS)
600 throw runtime_error(
"Graph edges must be stored as a logical sparse matrix.");
602 mwIndex* matlabColPtrs = mxGetJc(edges);
603 mwIndex* matlabRowIndices = mxGetIr(edges);
609 Teuchos::Array<int> entriesPerRow(nRows);
610 int nnz = matlabColPtrs[mxGetN(edges)];
611 for(
int i = 0; i < nnz; i++)
612 entriesPerRow[matlabRowIndices[i]]++;
615 Teuchos::Array<int> rows(nRows+1);
617 for(
int i = 0; i < nRows; i++)
618 rows[i+1] = rows[i] + entriesPerRow[i];
619 Teuchos::Array<int> cols(nnz);
620 Teuchos::Array<int> insertionsPerRow(nRows,0);
621 int ncols = mxGetN(edges);
622 for (
int colNum=0; colNum<ncols; ++colNum) {
623 int ci = matlabColPtrs[colNum];
624 for (
int j=ci; j<Teuchos::as<int>(matlabColPtrs[colNum+1]); ++j) {
625 int rowNum = matlabRowIndices[j];
626 cols[ rows[rowNum] + insertionsPerRow[rowNum] ] = colNum;
627 insertionsPerRow[rowNum]++;
632 for(
int i = 0; i < nRows; i++) {
633 if(maxNzPerRow < entriesPerRow[i])
634 maxNzPerRow = entriesPerRow[i];
637 RCP<const Teuchos::Comm<mm_GlobalOrd>> comm = rcp(
new Teuchos::SerialComm<mm_GlobalOrd>());
638 typedef Xpetra::TpetraMap<mm_LocalOrd, mm_GlobalOrd, mm_node_t> MMap;
639 RCP<MMap> map = rcp(
new MMap(nRows, 0, comm));
640 typedef Xpetra::TpetraCrsGraph<mm_LocalOrd, mm_GlobalOrd, mm_node_t> TpetraGraph;
641 RCP<TpetraGraph> tgraph = rcp(
new TpetraGraph(map, (
size_t) maxNzPerRow));
643 for(
int i = 0; i < nRows; ++i) {
644 tgraph->insertGlobalIndices((
mm_GlobalOrd) i, cols(rows[i],entriesPerRow[i]));
646 tgraph->fillComplete(map, map);
649 int numBoundaryNodes = mxGetNumberOfElements(boundaryNodes);
650 bool* boundaryFlags =
new bool[nRows];
651 for(
int i = 0; i < nRows; i++)
653 boundaryFlags[i] =
false;
655 for(
int i = 0; i < numBoundaryNodes; i++)
657 boundaryFlags[boundaryList[i]] =
true;
659 ArrayRCP<bool> boundaryNodesInput(boundaryFlags, 0, nRows,
true);
660 mgraph->SetBoundaryNodeMap(boundaryNodesInput);
665 #ifdef HAVE_MUELU_INTREPID2 667 RCP<FieldContainer_ordinal> loadDataFromMatlab<RCP<FieldContainer_ordinal>>(
const mxArray* mxa)
669 if(mxGetClassID(mxa) != mxINT32_CLASS)
670 throw runtime_error(
"FieldContainer must have integer storage entries");
672 int *data = (
int *) mxGetData(mxa);
673 int nr = mxGetM(mxa);
674 int nc = mxGetN(mxa);
676 #ifdef HAVE_MUELU_INTREPID2_REFACTOR 677 RCP<FieldContainer_ordinal> fc = rcp(
new FieldContainer_ordinal(
"FC from Matlab",nr,nc));
679 RCP<FieldContainer_ordinal> fc = rcp(
new FieldContainer_ordinal(nr,nc));
681 for(
int col = 0; col < nc; col++)
683 for(
int row = 0; row < nr; row++)
685 (*fc)(row,col) = data[col * nr + row];
699 mwSize dims[] = {1, 1};
700 mxArray* mxa = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
701 *((
int*) mxGetData(mxa)) = data;
708 mwSize dims[] = {1, 1};
709 mxArray* mxa = mxCreateLogicalArray(2, dims);
710 *((
bool*) mxGetData(mxa)) = data;
717 return mxCreateDoubleScalar(data);
723 mwSize dims[] = {1, 1};
724 mxArray* mxa = mxCreateNumericArray(2, dims, mxDOUBLE_CLASS, mxCOMPLEX);
725 *((
double*) mxGetPr(mxa)) = real<double>(data);
726 *((
double*) mxGetPi(mxa)) = imag<double>(data);
733 return mxCreateString(data.c_str());
740 int nc = data->getGlobalNumElements();
743 double* array = (
double*) malloc(
sizeof(
double) * nr * nc);
744 for(
int col = 0; col < nc; col++)
747 array[col] = Teuchos::as<double>(gid);
757 mwSize len = data->getGlobalLength();
759 mwSize dimensions[] = {len, 1};
760 mxArray* rv = mxCreateNumericArray(2, dimensions, mxINT32_CLASS, mxREAL);
761 int* dataPtr = (
int*) mxGetData(rv);
762 ArrayRCP<const mm_LocalOrd> arr = data->getData(0);
763 for(
int i = 0; i < int(data->getGlobalLength()); i++)
771 mxArray*
saveDataToMatlab(RCP<Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>& data)
778 mxArray*
saveDataToMatlab(RCP<Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>& data)
801 typedef double Scalar;
802 int nr = data->getGlobalNumRows();
803 int nc = data->getGlobalNumCols();
804 int nnz = data->getGlobalNumEntries();
806 if(nnz==-1) nnz=data->getNodeNumEntries();
807 #ifdef VERBOSE_OUTPUT 808 RCP<Teuchos::FancyOStream> fancyStream = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
809 mat->describe(*fancyStream, Teuchos::VERB_EXTREME);
811 mxArray* mxa = createMatlabSparse<Scalar>(nr, nc, nnz);
814 for(
int i = 0; i < nc + 1; i++)
819 size_t maxEntriesPerRow = data->getGlobalMaxNumRowEntries();
820 if(maxEntriesPerRow == Teuchos::OrdinalTraits<size_t>::invalid() || maxEntriesPerRow == 0) maxEntriesPerRow = data->getNodeMaxNumRowEntries();
822 int* rowProgress =
new int[nc];
824 Scalar* sparseVals =
new Scalar[nnz];
826 if(data->isLocallyIndexed())
828 Scalar* rowValArray =
new Scalar[maxEntriesPerRow];
829 Teuchos::ArrayView<Scalar> rowVals(rowValArray, maxEntriesPerRow);
831 Teuchos::ArrayView<mm_LocalOrd> rowIndices(rowIndicesArray, maxEntriesPerRow);
834 data->getLocalRowCopy(m, rowIndices, rowVals, numEntries);
835 for(
mm_LocalOrd entry = 0; entry < int(numEntries); entry++)
837 jc[rowIndices[entry] + 1]++;
842 int entriesAccum = 0;
843 for(
int n = 0; n <= nc; n++)
845 int temp = entriesAccum;
846 entriesAccum += jc[n];
850 for(
int i = 0; i < nc; i++)
857 data->getLocalRowCopy(m, rowIndices, rowVals, numEntries);
862 sparseVals[jc[col] + rowProgress[col]] = rowVals[i];
863 ir[jc[col] + rowProgress[col]] = m;
867 delete[] rowIndicesArray;
871 Teuchos::ArrayView<const mm_GlobalOrd> rowIndices;
872 Teuchos::ArrayView<const Scalar> rowVals;
875 data->getGlobalRowView(m, rowIndices, rowVals);
878 jc[rowIndices[n] + 1]++;
884 for(
int i = 0; i < nc; i++)
888 int entriesAccum = 0;
889 for(
int n = 0; n <= nc; n++)
891 int temp = entriesAccum;
892 entriesAccum += jc[n];
898 data->getGlobalRowView(m, rowIndices, rowVals);
902 sparseVals[jc[col] + rowProgress[col]] = rowVals[i];
903 ir[jc[col] + rowProgress[col]] = m;
909 fillMatlabArray<Scalar>(sparseVals, mxa, nnz);
911 delete[] rowProgress;
919 int nr = data->getGlobalNumRows();
920 int nc = data->getGlobalNumCols();
921 int nnz = data->getGlobalNumEntries();
922 #ifdef VERBOSE_OUTPUT 923 RCP<Teuchos::FancyOStream> fancyStream = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
924 mat->describe(*fancyStream, Teuchos::VERB_EXTREME);
926 mxArray* mxa = createMatlabSparse<Scalar>(nr, nc, nnz);
929 for(
int i = 0; i < nc + 1; i++)
933 size_t maxEntriesPerRow = data->getGlobalMaxNumRowEntries();
934 int* rowProgress =
new int[nc];
936 Scalar* sparseVals =
new Scalar[nnz];
938 if(data->isLocallyIndexed())
940 Scalar* rowValArray =
new Scalar[maxEntriesPerRow];
941 Teuchos::ArrayView<Scalar> rowVals(rowValArray, maxEntriesPerRow);
943 Teuchos::ArrayView<mm_LocalOrd> rowIndices(rowIndicesArray, maxEntriesPerRow);
946 data->getLocalRowCopy(m, rowIndices, rowVals, numEntries);
947 for(
mm_LocalOrd entry = 0; entry < int(numEntries); entry++)
949 jc[rowIndices[entry] + 1]++;
953 int entriesAccum = 0;
954 for(
int n = 0; n <= nc; n++)
956 int temp = entriesAccum;
957 entriesAccum += jc[n];
961 for(
int i = 0; i < nc; i++)
968 data->getLocalRowCopy(m, rowIndices, rowVals, numEntries);
973 sparseVals[jc[col] + rowProgress[col]] = rowVals[i];
974 ir[jc[col] + rowProgress[col]] = m;
978 delete[] rowIndicesArray;
982 Teuchos::ArrayView<const mm_GlobalOrd> rowIndices;
983 Teuchos::ArrayView<const Scalar> rowVals;
986 data->getGlobalRowView(m, rowIndices, rowVals);
989 jc[rowIndices[n] + 1]++;
995 for(
int i = 0; i < nc; i++)
999 int entriesAccum = 0;
1000 for(
int n = 0; n <= nc; n++)
1002 int temp = entriesAccum;
1003 entriesAccum += jc[n];
1009 data->getGlobalRowView(m, rowIndices, rowVals);
1010 for(
mm_LocalOrd i = 0; i < rowIndices.size(); i++)
1013 sparseVals[jc[col] + rowProgress[col]] = rowVals[i];
1014 ir[jc[col] + rowProgress[col]] = m;
1020 fillMatlabArray<Scalar>(sparseVals, mxa, nnz);
1021 delete[] sparseVals;
1022 delete[] rowProgress;
1050 mxArray*
saveDataToMatlab(RCP<Xpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>& data)
1053 int nr = data->getGlobalLength();
1054 int nc = data->getNumVectors();
1056 double* array = (
double*) malloc(
sizeof(
double) * nr * nc);
1057 for(
int col = 0; col < nc; col++)
1059 Teuchos::ArrayRCP<const double> colData = data->getData(col);
1060 for(
int row = 0; row < nr; row++)
1062 array[col * nr + row] = colData[row];
1071 mxArray*
saveDataToMatlab(RCP<Xpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t>>& data)
1074 int nr = data->getGlobalLength();
1075 int nc = data->getNumVectors();
1078 for(
int col = 0; col < nc; col++)
1080 Teuchos::ArrayRCP<const complex_t> colData = data->getData(col);
1081 for(
int row = 0; row < nr; row++)
1083 array[col * nr + row] = colData[row];
1094 RCP<Xpetra_Matrix_double> xmat = EpetraCrs_To_XpetraMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t>(data);
1101 mxArray* output = mxCreateDoubleMatrix(data->GlobalLength(), data->NumVectors(), mxREAL);
1102 double* dataPtr = mxGetPr(output);
1103 data->ExtractCopy(dataPtr, data->GlobalLength());
1111 int numNodes = data->GetVertex2AggId()->getData(0).size();
1112 int numAggs = data->GetNumAggregates();
1114 mwSize singleton[] = {1, 1};
1115 dataIn[0] = mxCreateNumericArray(2, singleton, mxINT32_CLASS, mxREAL);
1116 *((
int*) mxGetData(dataIn[0])) = numNodes;
1117 dataIn[1] = mxCreateNumericArray(2, singleton, mxINT32_CLASS, mxREAL);
1118 *((
int*) mxGetData(dataIn[1])) = numAggs;
1119 mwSize nodeArrayDims[] = {(mwSize) numNodes, 1};
1120 dataIn[2] = mxCreateNumericArray(2, nodeArrayDims, mxINT32_CLASS, mxREAL);
1121 int* vtaid = (
int*) mxGetData(dataIn[2]);
1122 ArrayRCP<const mm_LocalOrd> vertexToAggID = data->GetVertex2AggId()->getData(0);
1123 for(
int i = 0; i < numNodes; i++)
1125 vtaid[i] = vertexToAggID[i];
1127 mwSize aggArrayDims[] = {(mwSize) numAggs, 1};
1128 dataIn[3] = mxCreateNumericArray(2, aggArrayDims, mxINT32_CLASS, mxREAL);
1131 for(
int i = 0; i < numNodes; i++)
1136 bool reassignRoots =
false;
1137 if(totalRoots != numAggs)
1139 cout << endl <<
"Warning: Number of root nodes and number of aggregates do not match." << endl;
1140 cout <<
"Will reassign root nodes when writing aggregates to matlab." << endl << endl;
1141 reassignRoots =
true;
1143 int* rn = (
int*) mxGetData(dataIn[3]);
1148 int lastFoundNode = 0;
1149 for(
int i = 0; i < numAggs; i++)
1152 for(
int j = lastFoundNode; j < lastFoundNode + numNodes; j++)
1154 int index = j % numNodes;
1155 if(vertexToAggID[index] == i)
1158 lastFoundNode = index;
1161 TEUCHOS_TEST_FOR_EXCEPTION(rn[i] == -1, runtime_error,
"Invalid aggregates: Couldn't find any node in aggregate #" << i <<
".");
1167 for(
int j = 0; j < numNodes; j++)
1172 throw runtime_error(
"Cannot store invalid aggregates in MATLAB - more root nodes than aggregates.");
1178 throw runtime_error(
"Cannot store invalid aggregates in MATLAB - fewer root nodes than aggregates.");
1181 dataIn[4] = mxCreateNumericArray(1, aggArrayDims, mxINT32_CLASS, mxREAL);
1182 int* as = (
int*) mxGetData(dataIn[4]);
1183 ArrayRCP<mm_LocalOrd> aggSizes = data->ComputeAggregateSizes();
1184 for(
int i = 0; i < numAggs; i++)
1186 as[i] = aggSizes[i];
1188 mxArray* matlabAggs[1];
1189 int result = mexCallMATLAB(1, matlabAggs, 5, dataIn,
"constructAggregates");
1191 throw runtime_error(
"Matlab encountered an error while constructing aggregates struct.");
1192 return matlabAggs[0];
1198 throw runtime_error(
"AmalgamationInfo not supported in MueMex yet.");
1199 return mxCreateDoubleScalar(0);
1205 int numEntries = (int) data->GetGlobalNumEdges();
1206 int numRows = (int) data->GetDomainMap()->getGlobalNumElements();
1207 mxArray* mat = mxCreateSparseLogicalMatrix(numRows, numRows, numEntries);
1208 mxLogical* outData = (mxLogical*) mxGetData(mat);
1209 mwIndex* rowInds = mxGetIr(mat);
1210 mwIndex* colPtrs = mxGetJc(mat);
1213 int* entriesPerRow =
new int[numRows];
1214 int* entriesPerCol =
new int[numRows];
1215 for(
int i = 0; i < numRows; i++)
1217 entriesPerRow[i] = 0;
1218 entriesPerCol[i] = 0;
1220 for(
int i = 0; i < numRows; i++)
1222 ArrayView<const mm_LocalOrd> neighbors = data->getNeighborVertices(i);
1223 memcpy(iter, neighbors.getRawPtr(),
sizeof(
mm_LocalOrd) * neighbors.size());
1224 entriesPerRow[i] = neighbors.size();
1225 for(
int j = 0; j < neighbors.size(); j++)
1227 entriesPerCol[neighbors[j]]++;
1229 iter += neighbors.size();
1232 mxLogical** valuesByColumn =
new mxLogical*[numRows];
1233 int* numEnteredPerCol =
new int[numRows];
1235 for(
int i = 0; i < numRows; i++)
1237 rowIndsByColumn[i] = &rowInds[accum];
1239 valuesByColumn[i] = &outData[accum];
1240 accum += entriesPerCol[i];
1241 if(accum > numEntries)
1242 throw runtime_error(
"potato");
1244 for(
int i = 0; i < numRows; i++)
1246 numEnteredPerCol[i] = 0;
1250 for(
int row = 0; row < numRows; row++)
1252 for(
int entryInRow = 0; entryInRow < entriesPerRow[row]; entryInRow++)
1254 int col = dataCopy[accum];
1256 rowIndsByColumn[col][numEnteredPerCol[col]] = row;
1257 valuesByColumn[col][numEnteredPerCol[col]] = (mxLogical) 1;
1258 numEnteredPerCol[col]++;
1262 for(
int col = 0; col < numRows; col++)
1264 colPtrs[col] = accum;
1265 accum += entriesPerCol[col];
1267 colPtrs[numRows] = accum;
1268 delete[] numEnteredPerCol;
1269 delete[] rowIndsByColumn;
1270 delete[] valuesByColumn;
1272 delete[] entriesPerRow;
1273 delete[] entriesPerCol;
1275 const ArrayRCP<const bool> boundaryFlags = data->GetBoundaryNodeMap();
1276 int numBoundaryNodes = 0;
1277 for(
int i = 0; i < boundaryFlags.size(); i++)
1279 if(boundaryFlags[i])
1282 cout <<
"Graph has " << numBoundaryNodes <<
" Dirichlet boundary nodes." << endl;
1283 mwSize dims[] = {(mwSize) numBoundaryNodes, 1};
1284 mxArray* boundaryList = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
1285 int* dest = (
int*) mxGetData(boundaryList);
1286 int* destIter = dest;
1287 for(
int i = 0; i < boundaryFlags.size(); i++)
1289 if(boundaryFlags[i])
1295 mxArray* constructArgs[] = {mat, boundaryList};
1297 mexCallMATLAB(1, out, 2, constructArgs,
"constructGraph");
1301 #ifdef HAVE_MUELU_INTREPID2 1305 int rank = data->rank();
1308 throw std::runtime_error(
"Error: Only rank two FieldContainers are supported.");
1310 int nr = data->dimension(0);
1311 int nc = data->dimension(1);
1313 mwSize dims[]={(mwSize)nr,(mwSize)nc};
1314 mxArray* mxa = mxCreateNumericArray(2,dims, mxINT32_CLASS, mxREAL);
1315 int *array = (
int*) mxGetData(mxa);
1317 for(
int col = 0; col < nc; col++)
1319 for(
int row = 0; row < nr; row++)
1321 array[col * nr + row] = (*data)(row,col);
1329 template<
typename T>
1332 data = loadDataFromMatlab<T>(mxa);
1335 template<
typename T>
1338 return saveDataToMatlab<T>(
data);
1341 template<
typename T>
1347 template<
typename T>
1350 template<
typename T>
1356 template<
typename T>
1359 this->data = newData;
1366 template<
typename T>
1373 template<
typename T>
1378 return lvl.
Get<T>(name);
1380 catch(std::exception& e)
1382 throw std::runtime_error(
"Requested custom variable " + name +
" is not in the level.");
1387 template<
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
1390 using namespace std;
1392 typedef RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> Matrix_t;
1393 typedef RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> MultiVector_t;
1394 typedef RCP<Aggregates<LocalOrdinal, GlobalOrdinal, Node>> Aggregates_t;
1395 typedef RCP<AmalgamationInfo<LocalOrdinal, GlobalOrdinal, Node>> AmalgamationInfo_t;
1396 typedef RCP<MGraph> Graph_t;
1398 vector<RCP<MuemexArg>> args;
1399 for(
size_t i = 0; i < needsList.size(); i++)
1401 if(needsList[i] ==
"A" || needsList[i] ==
"P" || needsList[i] ==
"R" || needsList[i]==
"Ptent")
1403 Matrix_t mydata = lvl.
Get<Matrix_t>(needsList[i], factory->
GetFactory(needsList[i]).get());
1406 else if(needsList[i] ==
"Nullspace" || needsList[i] ==
"Coordinates")
1408 MultiVector_t mydata = lvl.
Get<MultiVector_t>(needsList[i], factory->
GetFactory(needsList[i]).get());
1411 else if(needsList[i] ==
"Aggregates")
1413 Aggregates_t mydata = lvl.
Get<Aggregates_t>(needsList[i], factory->
GetFactory(needsList[i]).get());
1416 else if(needsList[i] ==
"UnAmalgamationInfo")
1418 AmalgamationInfo_t mydata = lvl.
Get<AmalgamationInfo_t>(needsList[i], factory->
GetFactory(needsList[i]).get());
1421 else if(needsList[i] ==
"Level")
1426 else if(needsList[i] ==
"Graph")
1428 Graph_t mydata = lvl.
Get<Graph_t>(needsList[i], factory->
GetFactory(needsList[i]).get());
1433 vector<string> words;
1434 string badNameMsg =
"Custom Muemex variables in \"Needs\" list require a type and a name, e.g. \"double myVal\". \n Leading and trailing spaces are OK. \n Don't know how to handle \"" + needsList[i] +
"\".\n";
1436 char* buf = (
char*) malloc(needsList[i].size() + 1);
1437 strcpy(buf, needsList[i].c_str());
1438 for(
char* iter = buf; *iter !=
' '; iter++)
1443 throw runtime_error(badNameMsg);
1445 *iter = (char)
tolower(*iter);
1447 const char* wordDelim =
" ";
1448 char* mark = strtok(buf, wordDelim);
1451 string wordStr(mark);
1452 words.push_back(wordStr);
1453 mark = strtok(NULL, wordDelim);
1455 if(words.size() != 2)
1458 throw runtime_error(badNameMsg);
1460 char* typeStr = (
char*) words[0].c_str();
1461 if(strstr(typeStr,
"ordinalvector"))
1463 typedef RCP<Xpetra::Vector<mm_LocalOrd, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> LOVector_t;
1464 LOVector_t mydata = getLevelVariable<LOVector_t>(needsList[i], lvl);
1467 else if(strstr(typeStr,
"map"))
1469 typedef RCP<Xpetra::Map<mm_LocalOrd, mm_GlobalOrd, mm_node_t>> Map_t;
1470 Map_t mydata = getLevelVariable<Map_t>(needsList[i], lvl);
1473 else if(strstr(typeStr,
"scalar"))
1475 Scalar mydata = getLevelVariable<Scalar>(needsList[i], lvl);
1478 else if(strstr(typeStr,
"double"))
1480 double mydata = getLevelVariable<double>(needsList[i], lvl);
1483 else if(strstr(typeStr,
"complex"))
1485 complex_t mydata = getLevelVariable<complex_t>(needsList[i], lvl);
1488 else if(strstr(typeStr,
"matrix"))
1490 Matrix_t mydata = getLevelVariable<Matrix_t>(needsList[i], lvl);
1493 else if(strstr(typeStr,
"multivector"))
1495 MultiVector_t mydata = getLevelVariable<MultiVector_t>(needsList[i], lvl);
1498 else if(strstr(typeStr,
"int"))
1500 int mydata = getLevelVariable<int>(needsList[i], lvl);
1503 else if(strstr(typeStr,
"string"))
1505 string mydata = getLevelVariable<string>(needsList[i], lvl);
1511 throw std::runtime_error(words[0] +
" is not a known variable type.");
1519 template<
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
typename Node>
1522 using namespace std;
1524 typedef RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> Matrix_t;
1525 typedef RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> MultiVector_t;
1526 typedef RCP<Aggregates<LocalOrdinal, GlobalOrdinal, Node>> Aggregates_t;
1527 typedef RCP<AmalgamationInfo<LocalOrdinal, GlobalOrdinal, Node>> AmalgamationInfo_t;
1528 typedef RCP<MGraph> Graph_t;
1530 for(
size_t i = 0; i < size_t(provides.size()); i++)
1532 if(provides[i] ==
"A" || provides[i] ==
"P" || provides[i] ==
"R" || provides[i]==
"Ptent")
1534 RCP<MuemexData<Matrix_t>> mydata = Teuchos::rcp_static_cast<
MuemexData<Matrix_t>>(mexOutput[i]);
1535 lvl.
Set(provides[i], mydata->getData(), factory);
1537 else if(provides[i] ==
"Nullspace" || provides[i] ==
"Coordinates")
1540 lvl.
Set(provides[i], mydata->getData(), factory);
1542 else if(provides[i] ==
"Aggregates")
1545 lvl.
Set(provides[i], mydata->getData(), factory);
1547 else if(provides[i] ==
"UnAmalgamationInfo")
1550 lvl.
Set(provides[i], mydata->getData(), factory);
1552 else if(provides[i] ==
"Graph")
1554 RCP<MuemexData<Graph_t>> mydata = Teuchos::rcp_static_cast<
MuemexData<Graph_t>>(mexOutput[i]);
1555 lvl.
Set(provides[i], mydata->getData(), factory);
1559 vector<string> words;
1560 string badNameMsg =
"Custom Muemex variables in \"Provides\" list require a type and a name, e.g. \"double myVal\". \n Leading and trailing spaces are OK. \n Don't know how to handle \"" + provides[i] +
"\".\n";
1562 char* buf = (
char*) malloc(provides[i].size() + 1);
1563 strcpy(buf, provides[i].c_str());
1564 for(
char* iter = buf; *iter !=
' '; iter++)
1569 throw runtime_error(badNameMsg);
1571 *iter = (char)
tolower(*iter);
1573 const char* wordDelim =
" ";
1574 char* mark = strtok(buf, wordDelim);
1577 string wordStr(mark);
1578 words.push_back(wordStr);
1579 mark = strtok(NULL, wordDelim);
1581 if(words.size() != 2)
1584 throw runtime_error(badNameMsg);
1586 const char* typeStr = words[0].c_str();
1587 if(strstr(typeStr,
"ordinalvector"))
1589 typedef RCP<Xpetra::Vector<mm_LocalOrd, mm_LocalOrd, mm_GlobalOrd, mm_node_t>> LOVector_t;
1591 addLevelVariable<LOVector_t>(mydata->getData(), words[1], lvl, factory);
1593 else if(strstr(typeStr,
"map"))
1595 typedef RCP<Xpetra::Map<mm_LocalOrd, mm_GlobalOrd, mm_node_t>> Map_t;
1596 RCP<MuemexData<Map_t>> mydata = Teuchos::rcp_static_cast<
MuemexData<Map_t>>(mexOutput[i]);
1597 addLevelVariable<Map_t>(mydata->getData(), words[1], lvl, factory);
1599 else if(strstr(typeStr,
"scalar"))
1601 RCP<MuemexData<Scalar>> mydata = Teuchos::rcp_static_cast<
MuemexData<Scalar>>(mexOutput[i]);
1602 addLevelVariable<Scalar>(mydata->getData(), words[1], lvl, factory);
1604 else if(strstr(typeStr,
"double"))
1606 RCP<MuemexData<double>> mydata = Teuchos::rcp_static_cast<
MuemexData<double>>(mexOutput[i]);
1607 addLevelVariable<double>(mydata->getData(), words[1], lvl, factory);
1609 else if(strstr(typeStr,
"complex"))
1612 addLevelVariable<complex_t>(mydata->getData(), words[1], lvl, factory);
1614 else if(strstr(typeStr,
"matrix"))
1616 RCP<MuemexData<Matrix_t>> mydata = Teuchos::rcp_static_cast<
MuemexData<Matrix_t>>(mexOutput[i]);
1617 addLevelVariable<Matrix_t>(mydata->getData(), words[1], lvl, factory);
1619 else if(strstr(typeStr,
"multivector"))
1622 addLevelVariable<MultiVector_t>(mydata->getData(), words[1], lvl, factory);
1624 else if(strstr(typeStr,
"int"))
1626 RCP<MuemexData<int>> mydata = Teuchos::rcp_static_cast<
MuemexData<int>>(mexOutput[i]);
1627 addLevelVariable<int>(mydata->getData(), words[1], lvl, factory);
1629 else if(strstr(typeStr,
"bool"))
1631 RCP<MuemexData<bool> > mydata = Teuchos::rcp_static_cast<
MuemexData<bool> >(mexOutput[i]);
1632 addLevelVariable<bool>(mydata->getData(), words[1], lvl, factory);
1634 else if(strstr(typeStr,
"string"))
1636 RCP<MuemexData<string>> mydata = Teuchos::rcp_static_cast<
MuemexData<string>>(mexOutput[i]);
1637 addLevelVariable<string>(mydata->getData(), words[1], lvl, factory);
1642 throw std::runtime_error(words[0] +
" is not a known variable type.");
1653 throw std::runtime_error(
"Muemex does not support long long for global indices");
1658 throw std::runtime_error(
"Muemex does not support long long for global indices");
1663 throw std::runtime_error(
"Muemex does not support long long for global indices");
1668 throw std::runtime_error(
"Muemex does not support long long for global indices");
1673 #endif //HAVE_MUELU_MATLAB error handler 1674 #endif //MUELU_MATLABUTILS_DEF_HPP guard
mxArray * convertToMatlab()
std::vector< Teuchos::RCP< MuemexArg > > processNeeds< double, mm_LocalOrd, long long, mm_node_t >(const Factory *factory, std::string &needsParam, Level &lvl)
std::vector< std::string > tokenizeList(const std::string ¶ms)
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level->Get< RCP<Matrix> >("A", factory) if factory == NULL => use default factory.
mxArray * createMatlabSparse< complex_t >(int numRows, int numCols, int nnz)
mxArray * saveDataToMatlab(RCP< MGraph > &data)
MuemexType getMuemexType< string >()
MueLu representation of a compressed row storage graph.
void processProvides< complex_t, mm_LocalOrd, long long, mm_node_t >(std::vector< Teuchos::RCP< MuemexArg >> &mexOutput, const Factory *factory, std::string &providesParam, Level &lvl)
User data are always kept. This flag is set automatically when Level::Set("data", data) is used...
std::string tolower(const std::string &str)
Namespace for MueLu classes and methods.
void fillMatlabArray< double >(double *array, const mxArray *mxa, int n)
template string loadDataFromMatlab< string >(const mxArray *mxa)
MuemexType getMuemexType(const T &data)
std::vector< Teuchos::RCP< MuemexArg > > processNeeds(const Factory *factory, std::string &needsParam, Level &lvl)
void addLevelVariable(const T &data, std::string &name, Level &lvl, const FactoryBase *fact=NoFactory::get())
int GetLevelID() const
Return level number.
void fillMatlabArray< complex_t >(complex_t *array, const mxArray *mxa, int n)
void processProvides< double, mm_LocalOrd, long long, mm_node_t >(std::vector< Teuchos::RCP< MuemexArg >> &mexOutput, const Factory *factory, std::string &providesParam, Level &lvl)
mxArray * createMatlabSparse< double >(int numRows, int numCols, int nnz)
int * mwIndex_to_int(int N, mwIndex *mwi_array)
Class that holds all level-specific information.
template complex_t loadDataFromMatlab< complex_t >(const mxArray *mxa)
template int loadDataFromMatlab< int >(const mxArray *mxa)
template bool loadDataFromMatlab< bool >(const mxArray *mxa)
const T & getLevelVariable(std::string &name, Level &lvl)
MuemexType getMuemexType< int >()
mxArray * createMatlabMultiVector< complex_t >(int numRows, int numCols)
std::vector< Teuchos::RCP< MuemexArg > > processNeeds< complex_t, mm_LocalOrd, long long, mm_node_t >(const Factory *factory, std::string &needsParam, Level &lvl)
MuemexType getMuemexType(const RCP< MGraph > &data)
void AddKeepFlag(const std::string &ename, const FactoryBase *factory=NoFactory::get(), KeepType keep=MueLu::Keep)
MuemexType getMuemexType< bool >()
void Set(const std::string &ename, const T &entry, const FactoryBase *factory=NoFactory::get())
RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > TpetraMultiVector_To_XpetraMultiVector(const Teuchos::RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &Vtpetra)
std::complex< double > complex_t
mxArray * createMatlabMultiVector< double >(int numRows, int numCols)
template double loadDataFromMatlab< double >(const mxArray *mxa)
MueLu::Aggregates< mm_LocalOrd, mm_GlobalOrd, mm_node_t > MAggregates
MuemexType getMuemexType< double >()
Tpetra::Map muemex_map_type
void processProvides(std::vector< Teuchos::RCP< MuemexArg >> &mexOutput, const Factory *factory, std::string &providesParam, Level &lvl)
RCP< Xpetra::Matrix< SC, LO, GO, NO > > TpetraCrs_To_XpetraMatrix(const Teuchos::RCP< Tpetra::CrsMatrix< SC, LO, GO, NO > > &Atpetra)
const RCP< const FactoryBase > GetFactory(const std::string &varName) const
Default implementation of FactoryAcceptor::GetFactory()
MuemexType getMuemexType< complex_t >()