MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_MatlabUtils.cpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // MueLu: A package for multigrid based preconditioning
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact
39 // Jonathan Hu (jhu@sandia.gov)
40 // Andrey Prokopenko (aprokop@sandia.gov)
41 // Ray Tuminaro (rstumin@sandia.gov)
42 //
43 // ***********************************************************************
44 //
45 // @HEADER
47 
48 #if !defined(HAVE_MUELU_MATLAB) || !defined(HAVE_MUELU_EPETRA)
49 #error "Muemex types require MATLAB, Epetra and Tpetra."
50 #else
51 
52 /* Stuff for MATLAB R2006b vs. previous versions */
53 #if (defined(MX_API_VER) && MX_API_VER >= 0x07030000)
54 #else
55 typedef int mwIndex;
56 #endif
57 
58 using namespace std;
59 using namespace Teuchos;
60 
61 namespace MueLu {
62 
63 /* Explicit instantiation of MuemexData variants */
64 template class MuemexData<RCP<Xpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
65 template class MuemexData<RCP<Xpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
66 template class MuemexData<RCP<Xpetra::Matrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
67 template class MuemexData<RCP<Xpetra::Matrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
68 template class MuemexData<RCP<MAggregates> >;
69 template class MuemexData<RCP<MAmalInfo> >;
70 template class MuemexData<int>;
71 template class MuemexData<bool>;
72 template class MuemexData<complex_t>;
73 template class MuemexData<string>;
74 template class MuemexData<double>;
75 template class MuemexData<RCP<Tpetra::CrsMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
76 template class MuemexData<RCP<Tpetra::CrsMatrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
77 template class MuemexData<RCP<Epetra_MultiVector> >;
78 template class MuemexData<RCP<Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
79 template class MuemexData<RCP<Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
80 template class MuemexData<RCP<Xpetra::Vector<mm_LocalOrd, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >;
81 
82 // Flag set to true if MATLAB's CSC matrix index type is not int (usually false)
83 bool rewrap_ints = sizeof(int) != sizeof(mwIndex);
84 
85 int* mwIndex_to_int(int N, mwIndex* mwi_array) {
86  // int* rv = (int*) malloc(N * sizeof(int));
87  int* rv = new int[N]; // not really better but may avoid confusion for valgrind
88  for (int i = 0; i < N; i++)
89  rv[i] = (int)mwi_array[i];
90  return rv;
91 }
92 
93 /* ******************************* */
94 /* Specializations */
95 /* ******************************* */
96 
97 template <>
98 mxArray* createMatlabSparse<double>(int numRows, int numCols, int nnz) {
99  return mxCreateSparse(numRows, numCols, nnz, mxREAL);
100 }
101 
102 template <>
103 mxArray* createMatlabSparse<complex_t>(int numRows, int numCols, int nnz) {
104  return mxCreateSparse(numRows, numCols, nnz, mxCOMPLEX);
105 }
106 
107 template <>
108 void fillMatlabArray<double>(double* array, const mxArray* mxa, int n) {
109  memcpy(mxGetPr(mxa), array, n * sizeof(double));
110 }
111 
112 template <>
113 void fillMatlabArray<complex_t>(complex_t* array, const mxArray* mxa, int n) {
114  double* pr = mxGetPr(mxa);
115  double* pi = mxGetPi(mxa);
116  for (int i = 0; i < n; i++) {
117  pr[i] = std::real<double>(array[i]);
118  pi[i] = std::imag<double>(array[i]);
119  }
120 }
121 
122 /******************************/
123 /* Callback Functions */
124 /******************************/
125 
126 void callMatlabNoArgs(std::string function) {
127  int result = mexEvalString(function.c_str());
128  if (result != 0)
129  mexPrintf("An error occurred while running a MATLAB command.");
130 }
131 
132 std::vector<RCP<MuemexArg> > callMatlab(std::string function, int numOutputs, std::vector<RCP<MuemexArg> > args) {
133  using Teuchos::rcp_static_cast;
134  mxArray** matlabArgs = new mxArray*[args.size()];
135  mxArray** matlabOutput = new mxArray*[numOutputs];
136  std::vector<RCP<MuemexArg> > output;
137 
138  for (int i = 0; i < int(args.size()); i++) {
139  try {
140  switch (args[i]->type) {
141  case BOOL:
142  matlabArgs[i] = rcp_static_cast<MuemexData<bool>, MuemexArg>(args[i])->convertToMatlab();
143  break;
144  case INT:
145  matlabArgs[i] = rcp_static_cast<MuemexData<int>, MuemexArg>(args[i])->convertToMatlab();
146  break;
147  case DOUBLE:
148  matlabArgs[i] = rcp_static_cast<MuemexData<double>, MuemexArg>(args[i])->convertToMatlab();
149  break;
150  case STRING:
151  matlabArgs[i] = rcp_static_cast<MuemexData<std::string>, MuemexArg>(args[i])->convertToMatlab();
152  break;
153  case COMPLEX:
154  matlabArgs[i] = rcp_static_cast<MuemexData<complex_t>, MuemexArg>(args[i])->convertToMatlab();
155  break;
156  case XPETRA_MAP:
157  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Xpetra_map> >, MuemexArg>(args[i])->convertToMatlab();
158  break;
160  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Xpetra_ordinal_vector> >, MuemexArg>(args[i])->convertToMatlab();
161  break;
163  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Tpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >, MuemexArg>(args[i])->convertToMatlab();
164  break;
166  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Tpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >, MuemexArg>(args[i])->convertToMatlab();
167  break;
169  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Tpetra::CrsMatrix<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >, MuemexArg>(args[i])->convertToMatlab();
170  break;
172  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Tpetra::CrsMatrix<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >, MuemexArg>(args[i])->convertToMatlab();
173  break;
175  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Xpetra_Matrix_double> >, MuemexArg>(args[i])->convertToMatlab();
176  break;
178  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Xpetra_Matrix_complex> >, MuemexArg>(args[i])->convertToMatlab();
179  break;
181  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Xpetra_MultiVector_double> >, MuemexArg>(args[i])->convertToMatlab();
182  break;
184  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Xpetra_MultiVector_complex> >, MuemexArg>(args[i])->convertToMatlab();
185  break;
186  case EPETRA_CRSMATRIX:
187  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Epetra_CrsMatrix> >, MuemexArg>(args[i])->convertToMatlab();
188  break;
189  case EPETRA_MULTIVECTOR:
190  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<Epetra_MultiVector> >, MuemexArg>(args[i])->convertToMatlab();
191  break;
192  case AGGREGATES:
193  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<MAggregates> >, MuemexArg>(args[i])->convertToMatlab();
194  break;
195  case AMALGAMATION_INFO:
196  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<MAmalInfo> >, MuemexArg>(args[i])->convertToMatlab();
197  break;
198  case GRAPH:
199  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<MGraph> >, MuemexArg>(args[i])->convertToMatlab();
200 #ifdef HAVE_MUELU_INTREPID2
201  case FIELDCONTAINER_ORDINAL:
202  matlabArgs[i] = rcp_static_cast<MuemexData<RCP<FieldContainer_ordinal> >, MuemexArg>(args[i])->convertToMatlab();
203  break;
204 #endif
205  }
206  } catch (std::exception& e) {
207  mexPrintf("An error occurred while converting arg #%d to MATLAB:\n", i);
208  std::cout << e.what() << std::endl;
209  mexPrintf("Passing 0 instead.\n");
210  matlabArgs[i] = mxCreateDoubleScalar(0);
211  }
212  }
213  // now matlabArgs is populated with MATLAB data types
214  int result = mexCallMATLAB(numOutputs, matlabOutput, args.size(), matlabArgs, function.c_str());
215  if (result != 0)
216  mexPrintf("Matlab encountered an error while running command through muemexCallbacks.\n");
217  // now, if all went well, matlabOutput contains all the output to return to user
218  for (int i = 0; i < numOutputs; i++) {
219  try {
220  output.push_back(convertMatlabVar(matlabOutput[i]));
221  } catch (std::exception& e) {
222  mexPrintf("An error occurred while converting output #%d from MATLAB:\n", i);
223  std::cout << e.what() << std::endl;
224  }
225  }
226  delete[] matlabOutput;
227  delete[] matlabArgs;
228  return output;
229 }
230 
231 /******************************/
232 /* More utility functions */
233 /******************************/
234 
235 template <>
236 mxArray* createMatlabMultiVector<double>(int numRows, int numCols) {
237  return mxCreateDoubleMatrix(numRows, numCols, mxREAL);
238 }
239 
240 template <>
241 mxArray* createMatlabMultiVector<complex_t>(int numRows, int numCols) {
242  return mxCreateDoubleMatrix(numRows, numCols, mxCOMPLEX);
243 }
244 
245 mxArray* saveAmalInfo(RCP<MAmalInfo>& amalInfo) {
246  throw runtime_error("AmalgamationInfo not supported in MueMex yet.");
247  return mxCreateDoubleScalar(0);
248 }
249 
250 bool isValidMatlabAggregates(const mxArray* mxa) {
251  bool isValidAggregates = true;
252  if (!mxIsStruct(mxa))
253  return false;
254  int numFields = mxGetNumberOfFields(mxa); // check that struct has correct # of fields
255  if (numFields != 5)
256  isValidAggregates = false;
257  if (isValidAggregates) {
258  const char* mem1 = mxGetFieldNameByNumber(mxa, 0);
259  if (mem1 == NULL || strcmp(mem1, "nVertices") != 0)
260  isValidAggregates = false;
261  const char* mem2 = mxGetFieldNameByNumber(mxa, 1);
262  if (mem2 == NULL || strcmp(mem2, "nAggregates") != 0)
263  isValidAggregates = false;
264  const char* mem3 = mxGetFieldNameByNumber(mxa, 2);
265  if (mem3 == NULL || strcmp(mem3, "vertexToAggID") != 0)
266  isValidAggregates = false;
267  const char* mem4 = mxGetFieldNameByNumber(mxa, 3);
268  if (mem3 == NULL || strcmp(mem4, "rootNodes") != 0)
269  isValidAggregates = false;
270  const char* mem5 = mxGetFieldNameByNumber(mxa, 4);
271  if (mem4 == NULL || strcmp(mem5, "aggSizes") != 0)
272  isValidAggregates = false;
273  }
274  return isValidAggregates;
275 }
276 
277 bool isValidMatlabGraph(const mxArray* mxa) {
278  bool isValidGraph = true;
279  if (!mxIsStruct(mxa))
280  return false;
281  int numFields = mxGetNumberOfFields(mxa); // check that struct has correct # of fields
282  if (numFields != 2)
283  isValidGraph = false;
284  if (isValidGraph) {
285  const char* mem1 = mxGetFieldNameByNumber(mxa, 0);
286  if (mem1 == NULL || strcmp(mem1, "edges") != 0)
287  isValidGraph = false;
288  const char* mem2 = mxGetFieldNameByNumber(mxa, 1);
289  if (mem2 == NULL || strcmp(mem2, "boundaryNodes") != 0)
290  isValidGraph = false;
291  }
292  return isValidGraph;
293 }
294 
295 std::vector<std::string> tokenizeList(const std::string& params) {
296  using namespace std;
297  vector<string> rlist;
298  const char* delims = ",";
299  char* copy = (char*)malloc(params.length() + 1);
300  strcpy(copy, params.c_str());
301  char* mark = (char*)strtok(copy, delims);
302  while (mark != NULL) {
303  // Remove leading and trailing whitespace in token
304  char* tail = mark + strlen(mark) - 1;
305  while (*mark == ' ')
306  mark++;
307  while (*tail == ' ' && tail > mark)
308  tail--;
309  tail++;
310  *tail = 0;
311  string tok(mark); // copies the characters to string object
312  rlist.push_back(tok);
313  mark = strtok(NULL, delims);
314  }
315  free(copy);
316  return rlist;
317 }
318 
320  using namespace Teuchos;
321  RCP<ParameterList> validParamList = rcp(new ParameterList());
322  validParamList->set<RCP<const FactoryBase> >("A", Teuchos::null, "Factory for the matrix A.");
323  validParamList->set<RCP<const FactoryBase> >("P", Teuchos::null, "Factory for the prolongator.");
324  validParamList->set<RCP<const FactoryBase> >("R", Teuchos::null, "Factory for the restrictor.");
325  validParamList->set<RCP<const FactoryBase> >("Ptent", Teuchos::null, "Factory for the tentative (unsmoothed) prolongator.");
326  validParamList->set<RCP<const FactoryBase> >("Coordinates", Teuchos::null, "Factory for the node coordinates.");
327  validParamList->set<RCP<const FactoryBase> >("Nullspace", Teuchos::null, "Factory for the nullspace.");
328  validParamList->set<RCP<const FactoryBase> >("Aggregates", Teuchos::null, "Factory for the aggregates.");
329  validParamList->set<RCP<const FactoryBase> >("UnamalgamationInfo", Teuchos::null, "Factory for amalgamation.");
330 #ifdef HAVE_MUELU_INTREPID2
331  validParamList->set<RCP<const FactoryBase> >("pcoarsen: element to node map", Teuchos::null, "Generating factory of the element to node map");
332 #endif
333  return validParamList;
334 }
335 
337  switch (mxGetClassID(mxa)) {
338  case mxCHAR_CLASS:
339  // string
340  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<std::string>(mxa)));
341  break;
342  case mxLOGICAL_CLASS:
343  // boolean
344  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<bool>(mxa)));
345  break;
346  case mxINT32_CLASS:
347  if (mxGetM(mxa) == 1 && mxGetN(mxa) == 1)
348  // individual integer
349  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<int>(mxa)));
350  else if (mxGetM(mxa) != 1 || mxGetN(mxa) != 1)
351  // ordinal vector
352  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<Xpetra_ordinal_vector> >(mxa)));
353  else
354  throw std::runtime_error("Error: Don't know what to do with integer array.\n");
355  break;
356  case mxDOUBLE_CLASS:
357  if (mxGetM(mxa) == 1 && mxGetN(mxa) == 1) {
358  if (mxIsComplex(mxa))
359  // single double (scalar, real)
360  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<complex_t>(mxa)));
361  else
362  // single complex scalar
363  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<double>(mxa)));
364  } else if (mxIsSparse(mxa)) // use a CRS matrix
365  {
366  // Default to Tpetra matrix for this
367  if (mxIsComplex(mxa))
368  // complex matrix
369  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<Xpetra_Matrix_complex> >(mxa)));
370  else
371  // real-valued matrix
372  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<Xpetra_Matrix_double> >(mxa)));
373  } else {
374  // Default to Xpetra multivector for this case
375  if (mxIsComplex(mxa))
376  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<Xpetra::MultiVector<complex_t, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >(mxa)));
377  else
378  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<Xpetra::MultiVector<double, mm_LocalOrd, mm_GlobalOrd, mm_node_t> > >(mxa)));
379  }
380  break;
381  case mxSTRUCT_CLASS: {
382  // the only thing that should get here currently is an Aggregates struct or Graph struct
383  // verify that it has the correct fields with the correct types
384  // also assume that aggregates data will not be stored in an array of more than 1 element.
385  if (isValidMatlabAggregates(mxa)) {
386  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<MAggregates> >(mxa)));
387  } else if (isValidMatlabGraph(mxa)) {
388  return rcp_implicit_cast<MuemexArg>(rcp(new MuemexData<RCP<MGraph> >(mxa)));
389  } else {
390  throw runtime_error("Invalid aggregates or graph struct passed in from MATLAB.");
391  return Teuchos::null;
392  }
393  break;
394  }
395  default:
396  throw std::runtime_error("MATLAB returned an unsupported type as a function output.\n");
397  return Teuchos::null;
398  }
399 }
400 
401 /******************************/
402 /* Explicit Instantiations */
403 /******************************/
404 
405 template bool loadDataFromMatlab<bool>(const mxArray* mxa);
406 template int loadDataFromMatlab<int>(const mxArray* mxa);
407 template double loadDataFromMatlab<double>(const mxArray* mxa);
408 template complex_t loadDataFromMatlab<complex_t>(const mxArray* mxa);
409 template string loadDataFromMatlab<string>(const mxArray* mxa);
410 template RCP<Xpetra_ordinal_vector> loadDataFromMatlab<RCP<Xpetra_ordinal_vector> >(const mxArray* mxa);
411 template RCP<Tpetra_MultiVector_double> loadDataFromMatlab<RCP<Tpetra_MultiVector_double> >(const mxArray* mxa);
412 template RCP<Tpetra_MultiVector_complex> loadDataFromMatlab<RCP<Tpetra_MultiVector_complex> >(const mxArray* mxa);
413 template RCP<Tpetra_CrsMatrix_double> loadDataFromMatlab<RCP<Tpetra_CrsMatrix_double> >(const mxArray* mxa);
414 template RCP<Tpetra_CrsMatrix_complex> loadDataFromMatlab<RCP<Tpetra_CrsMatrix_complex> >(const mxArray* mxa);
415 template RCP<Xpetra_Matrix_double> loadDataFromMatlab<RCP<Xpetra_Matrix_double> >(const mxArray* mxa);
416 template RCP<Xpetra_Matrix_complex> loadDataFromMatlab<RCP<Xpetra_Matrix_complex> >(const mxArray* mxa);
417 template RCP<Xpetra_MultiVector_double> loadDataFromMatlab<RCP<Xpetra_MultiVector_double> >(const mxArray* mxa);
418 template RCP<Xpetra_MultiVector_complex> loadDataFromMatlab<RCP<Xpetra_MultiVector_complex> >(const mxArray* mxa);
419 template RCP<Epetra_CrsMatrix> loadDataFromMatlab<RCP<Epetra_CrsMatrix> >(const mxArray* mxa);
420 template RCP<Epetra_MultiVector> loadDataFromMatlab<RCP<Epetra_MultiVector> >(const mxArray* mxa);
421 template RCP<MAggregates> loadDataFromMatlab<RCP<MAggregates> >(const mxArray* mxa);
422 template RCP<MAmalInfo> loadDataFromMatlab<RCP<MAmalInfo> >(const mxArray* mxa);
423 
424 template mxArray* saveDataToMatlab(bool& data);
425 template mxArray* saveDataToMatlab(int& data);
426 template mxArray* saveDataToMatlab(double& data);
427 template mxArray* saveDataToMatlab(complex_t& data);
428 template mxArray* saveDataToMatlab(string& data);
429 template mxArray* saveDataToMatlab(RCP<Xpetra_ordinal_vector>& data);
430 template mxArray* saveDataToMatlab(RCP<Tpetra_MultiVector_double>& data);
431 template mxArray* saveDataToMatlab(RCP<Tpetra_MultiVector_complex>& data);
432 template mxArray* saveDataToMatlab(RCP<Tpetra_CrsMatrix_double>& data);
433 template mxArray* saveDataToMatlab(RCP<Tpetra_CrsMatrix_complex>& data);
434 template mxArray* saveDataToMatlab(RCP<Xpetra_Matrix_double>& data);
435 template mxArray* saveDataToMatlab(RCP<Xpetra_Matrix_complex>& data);
436 template mxArray* saveDataToMatlab(RCP<Xpetra_MultiVector_double>& data);
437 template mxArray* saveDataToMatlab(RCP<Xpetra_MultiVector_complex>& data);
438 template mxArray* saveDataToMatlab(RCP<Epetra_CrsMatrix>& data);
439 template mxArray* saveDataToMatlab(RCP<Epetra_MultiVector>& data);
440 template mxArray* saveDataToMatlab(RCP<MAggregates>& data);
441 template mxArray* saveDataToMatlab(RCP<MAmalInfo>& data);
442 
443 template vector<RCP<MuemexArg> > processNeeds<double>(const Factory* factory, string& needsParam, Level& lvl);
444 template vector<RCP<MuemexArg> > processNeeds<complex_t>(const Factory* factory, string& needsParam, Level& lvl);
445 template void processProvides<double>(vector<RCP<MuemexArg> >& mexOutput, const Factory* factory, string& providesParam, Level& lvl);
446 template void processProvides<complex_t>(vector<RCP<MuemexArg> >& mexOutput, const Factory* factory, string& providesParam, Level& lvl);
447 
448 } // namespace MueLu
449 #endif // HAVE_MUELU_MATLAB
bool isValidMatlabAggregates(const mxArray *mxa)
template mxArray * saveDataToMatlab(bool &data)
std::vector< std::string > tokenizeList(const std::string &params)
mxArray * createMatlabSparse< complex_t >(int numRows, int numCols, int nnz)
bool rewrap_ints
template vector< RCP< MuemexArg > > processNeeds< complex_t >(const Factory *factory, string &needsParam, Level &lvl)
template void processProvides< complex_t >(vector< RCP< MuemexArg > > &mexOutput, const Factory *factory, string &providesParam, Level &lvl)
mxArray * saveAmalInfo(RCP< MAmalInfo > &amalInfo)
std::vector< RCP< MuemexArg > > callMatlab(std::string function, int numOutputs, std::vector< RCP< MuemexArg > > args)
template vector< RCP< MuemexArg > > processNeeds< double >(const Factory *factory, string &needsParam, Level &lvl)
void fillMatlabArray< double >(double *array, const mxArray *mxa, int n)
bool isValidMatlabGraph(const mxArray *mxa)
template string loadDataFromMatlab< string >(const mxArray *mxa)
Teuchos::RCP< Teuchos::ParameterList > getInputParamList()
template void processProvides< double >(vector< RCP< MuemexArg > > &mexOutput, const Factory *factory, string &providesParam, Level &lvl)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void fillMatlabArray< complex_t >(complex_t *array, const mxArray *mxa, int n)
mxArray * createMatlabSparse< double >(int numRows, int numCols, int nnz)
int * mwIndex_to_int(int N, mwIndex *mwi_array)
template complex_t loadDataFromMatlab< complex_t >(const mxArray *mxa)
template int loadDataFromMatlab< int >(const mxArray *mxa)
template bool loadDataFromMatlab< bool >(const mxArray *mxa)
mxArray * createMatlabMultiVector< complex_t >(int numRows, int numCols)
void callMatlabNoArgs(std::string function)
std::complex< double > complex_t
mxArray * createMatlabMultiVector< double >(int numRows, int numCols)
template double loadDataFromMatlab< double >(const mxArray *mxa)
int mwIndex
Teuchos::RCP< MuemexArg > convertMatlabVar(const mxArray *mxa)