xref: /petsc/src/sys/classes/viewer/impls/mathematica/mathematica.c (revision 95c0884e6f7665b705eebf88174e89dc920c2fc0)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>   /* "petscsys.h" */
3af0996ceSBarry Smith #include <petsc/private/pcimpl.h>
45c6c1daeSBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
55c6c1daeSBarry Smith #include <mathematica.h>
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith #if defined(PETSC_HAVE__SNPRINTF) && !defined(PETSC_HAVE_SNPRINTF)
85c6c1daeSBarry Smith #define snprintf _snprintf
95c6c1daeSBarry Smith #endif
105c6c1daeSBarry Smith 
110298fd71SBarry Smith PetscViewer PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE = NULL;
120298fd71SBarry Smith static void *mathematicaEnv                        = NULL;
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith static PetscBool PetscViewerMathematicaPackageInitialized = PETSC_FALSE;
155c6c1daeSBarry Smith /*@C
165c6c1daeSBarry Smith   PetscViewerMathematicaFinalizePackage - This function destroys everything in the Petsc interface to Mathematica. It is
175c6c1daeSBarry Smith   called from PetscFinalize().
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith   Level: developer
205c6c1daeSBarry Smith 
215c6c1daeSBarry Smith .keywords: Petsc, destroy, package, mathematica
225c6c1daeSBarry Smith .seealso: PetscFinalize()
235c6c1daeSBarry Smith @*/
245c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaFinalizePackage(void)
255c6c1daeSBarry Smith {
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith   if (mathematicaEnv) MLDeinitialize((MLEnvironment) mathematicaEnv);
285c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
295c6c1daeSBarry Smith   PetscFunctionReturn(0);
305c6c1daeSBarry Smith }
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith /*@C
335c6c1daeSBarry Smith   PetscViewerMathematicaInitializePackage - This function initializes everything in the Petsc interface to Mathematica. It is
345c6c1daeSBarry Smith   called from PetscDLLibraryRegister() when using dynamic libraries, and on the call to PetscInitialize()
355c6c1daeSBarry Smith   when using static libraries.
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith   Level: developer
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith .keywords: Petsc, initialize, package
405c6c1daeSBarry Smith .seealso: PetscSysInitializePackage(), PetscInitialize()
415c6c1daeSBarry Smith @*/
42607a6623SBarry Smith PetscErrorCode  PetscViewerMathematicaInitializePackage(void)
435c6c1daeSBarry Smith {
445c6c1daeSBarry Smith   PetscError ierr;
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith   PetscFunctionBegin;
475c6c1daeSBarry Smith   if (PetscViewerMathematicaPackageInitialized) PetscFunctionReturn(0);
485c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
49a297a907SKarl Rupp 
505c6c1daeSBarry Smith   mathematicaEnv = (void*) MLInitialize(0);
51a297a907SKarl Rupp 
525c6c1daeSBarry Smith   ierr = PetscRegisterFinalize(PetscViewerMathematicaFinalizePackage);CHKERRQ(ierr);
535c6c1daeSBarry Smith   PetscFunctionReturn(0);
545c6c1daeSBarry Smith }
555c6c1daeSBarry Smith 
565c6c1daeSBarry Smith 
575c6c1daeSBarry Smith PetscErrorCode PetscViewerInitializeMathematicaWorld_Private()
585c6c1daeSBarry Smith {
595c6c1daeSBarry Smith   PetscErrorCode ierr;
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   PetscFunctionBegin;
625c6c1daeSBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) PetscFunctionReturn(0);
630298fd71SBarry Smith   ierr = PetscViewerMathematicaOpen(PETSC_COMM_WORLD, PETSC_DECIDE, NULL, NULL, &PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE);CHKERRQ(ierr);
645c6c1daeSBarry Smith   PetscFunctionReturn(0);
655c6c1daeSBarry Smith }
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_Mathematica(PetscViewer viewer)
685c6c1daeSBarry Smith {
695c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
705c6c1daeSBarry Smith   PetscErrorCode          ierr;
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith   PetscFunctionBegin;
735c6c1daeSBarry Smith   MLClose(vmath->link);
745c6c1daeSBarry Smith   ierr = PetscFree(vmath->linkname);CHKERRQ(ierr);
755c6c1daeSBarry Smith   ierr = PetscFree(vmath->linkhost);CHKERRQ(ierr);
765c6c1daeSBarry Smith   ierr = PetscFree(vmath);CHKERRQ(ierr);
775c6c1daeSBarry Smith   PetscFunctionReturn(0);
785c6c1daeSBarry Smith }
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroyMathematica_Private(void)
815c6c1daeSBarry Smith {
825c6c1daeSBarry Smith   PetscErrorCode ierr;
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith   PetscFunctionBegin;
855c6c1daeSBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) {
865c6c1daeSBarry Smith     ierr = PetscViewerDestroy(PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE);CHKERRQ(ierr);
875c6c1daeSBarry Smith   }
885c6c1daeSBarry Smith   PetscFunctionReturn(0);
895c6c1daeSBarry Smith }
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith PetscErrorCode PetscViewerMathematicaSetupConnection_Private(PetscViewer v)
925c6c1daeSBarry Smith {
935c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
94519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
955c6c1daeSBarry Smith   int                     argc = 6;
965c6c1daeSBarry Smith   char                    *argv[6];
975c6c1daeSBarry Smith #else
985c6c1daeSBarry Smith   int                     argc = 5;
995c6c1daeSBarry Smith   char                    *argv[5];
1005c6c1daeSBarry Smith #endif
1015c6c1daeSBarry Smith   char                    hostname[256];
1025c6c1daeSBarry Smith   long                    lerr;
1035c6c1daeSBarry Smith   PetscErrorCode          ierr;
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith   PetscFunctionBegin;
1065c6c1daeSBarry Smith   /* Link name */
1075c6c1daeSBarry Smith   argv[0] = "-linkname";
108a297a907SKarl Rupp   if (!vmath->linkname) argv[1] = "math -mathlink";
109a297a907SKarl Rupp   else                  argv[1] = vmath->linkname;
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith   /* Link host */
1125c6c1daeSBarry Smith   argv[2] = "-linkhost";
1135c6c1daeSBarry Smith   if (!vmath->linkhost) {
1145c6c1daeSBarry Smith     ierr    = PetscGetHostName(hostname, 255);CHKERRQ(ierr);
1155c6c1daeSBarry Smith     argv[3] = hostname;
116a297a907SKarl Rupp   } else argv[3] = vmath->linkhost;
1175c6c1daeSBarry Smith 
1185c6c1daeSBarry Smith   /* Link mode */
119519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
1205c6c1daeSBarry Smith   argv[4] = "-linkmode";
1215c6c1daeSBarry Smith   switch (vmath->linkmode) {
1225c6c1daeSBarry Smith   case MATHEMATICA_LINK_CREATE:
1235c6c1daeSBarry Smith     argv[5] = "Create";
1245c6c1daeSBarry Smith     break;
1255c6c1daeSBarry Smith   case MATHEMATICA_LINK_CONNECT:
1265c6c1daeSBarry Smith     argv[5] = "Connect";
1275c6c1daeSBarry Smith     break;
1285c6c1daeSBarry Smith   case MATHEMATICA_LINK_LAUNCH:
1295c6c1daeSBarry Smith     argv[5] = "Launch";
1305c6c1daeSBarry Smith     break;
1315c6c1daeSBarry Smith   }
1325c6c1daeSBarry Smith #else
1335c6c1daeSBarry Smith   switch (vmath->linkmode) {
1345c6c1daeSBarry Smith   case MATHEMATICA_LINK_CREATE:
1355c6c1daeSBarry Smith     argv[4] = "-linkcreate";
1365c6c1daeSBarry Smith     break;
1375c6c1daeSBarry Smith   case MATHEMATICA_LINK_CONNECT:
1385c6c1daeSBarry Smith     argv[4] = "-linkconnect";
1395c6c1daeSBarry Smith     break;
1405c6c1daeSBarry Smith   case MATHEMATICA_LINK_LAUNCH:
1415c6c1daeSBarry Smith     argv[4] = "-linklaunch";
1425c6c1daeSBarry Smith     break;
1435c6c1daeSBarry Smith   }
1445c6c1daeSBarry Smith #endif
1455c6c1daeSBarry Smith   vmath->link = MLOpenInEnv(mathematicaEnv, argc, argv, &lerr);
1465c6c1daeSBarry Smith #endif
1475c6c1daeSBarry Smith   PetscFunctionReturn(0);
1485c6c1daeSBarry Smith }
1495c6c1daeSBarry Smith 
1508cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_Mathematica(PetscViewer v)
1515c6c1daeSBarry Smith {
1525c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath;
1535c6c1daeSBarry Smith   PetscErrorCode          ierr;
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   PetscFunctionBegin;
156607a6623SBarry Smith   ierr = PetscViewerMathematicaInitializePackage();CHKERRQ(ierr);
1575c6c1daeSBarry Smith 
158b00a9115SJed Brown   ierr            = PetscNewLog(v,&vmath);CHKERRQ(ierr);
1595c6c1daeSBarry Smith   v->data         = (void*) vmath;
1605c6c1daeSBarry Smith   v->ops->destroy = PetscViewerDestroy_Mathematica;
1615c6c1daeSBarry Smith   v->ops->flush   = 0;
1625c6c1daeSBarry Smith   ierr            = PetscStrallocpy(PETSC_VIEWER_MATHEMATICA, &((PetscObject)v)->type_name);CHKERRQ(ierr);
1635c6c1daeSBarry Smith 
1640298fd71SBarry Smith   vmath->linkname     = NULL;
1650298fd71SBarry Smith   vmath->linkhost     = NULL;
1665c6c1daeSBarry Smith   vmath->linkmode     = MATHEMATICA_LINK_CONNECT;
1675c6c1daeSBarry Smith   vmath->graphicsType = GRAPHICS_MOTIF;
1685c6c1daeSBarry Smith   vmath->plotType     = MATHEMATICA_TRIANGULATION_PLOT;
1690298fd71SBarry Smith   vmath->objName      = NULL;
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetFromOptions(v);CHKERRQ(ierr);
1725c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetupConnection_Private(v);CHKERRQ(ierr);
1735c6c1daeSBarry Smith   PetscFunctionReturn(0);
1745c6c1daeSBarry Smith }
1755c6c1daeSBarry Smith 
176*95c0884eSLisandro Dalcin static PetscErrorCode PetscViewerMathematicaParseLinkMode(char *modename, LinkMode *mode)
1770adebc6cSBarry Smith {
1785c6c1daeSBarry Smith   PetscBool      isCreate, isConnect, isLaunch;
1795c6c1daeSBarry Smith   PetscErrorCode ierr;
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   PetscFunctionBegin;
1825c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Create",  &isCreate);CHKERRQ(ierr);
1835c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Connect", &isConnect);CHKERRQ(ierr);
1845c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Launch",  &isLaunch);CHKERRQ(ierr);
185a297a907SKarl Rupp   if (isCreate)       *mode = MATHEMATICA_LINK_CREATE;
186a297a907SKarl Rupp   else if (isConnect) *mode = MATHEMATICA_LINK_CONNECT;
187a297a907SKarl Rupp   else if (isLaunch)  *mode = MATHEMATICA_LINK_LAUNCH;
188a297a907SKarl Rupp   else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid Mathematica link mode: %s", modename);
1895c6c1daeSBarry Smith   PetscFunctionReturn(0);
1905c6c1daeSBarry Smith }
1915c6c1daeSBarry Smith 
1925c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSetFromOptions(PetscViewer v)
1935c6c1daeSBarry Smith {
1945c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
1955c6c1daeSBarry Smith   char                    linkname[256];
1965c6c1daeSBarry Smith   char                    modename[256];
1975c6c1daeSBarry Smith   char                    hostname[256];
1985c6c1daeSBarry Smith   char                    type[256];
1995c6c1daeSBarry Smith   PetscInt                numPorts;
2005c6c1daeSBarry Smith   PetscInt                *ports;
2015c6c1daeSBarry Smith   PetscInt                numHosts;
2025c6c1daeSBarry Smith   int                     h;
2035c6c1daeSBarry Smith   char                    **hosts;
2045c6c1daeSBarry Smith   PetscMPIInt             size, rank;
2055c6c1daeSBarry Smith   PetscBool               opt;
2065c6c1daeSBarry Smith   PetscErrorCode          ierr;
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith   PetscFunctionBegin;
209ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)v), &size);CHKERRQ(ierr);
210ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)v), &rank);CHKERRQ(ierr);
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith   /* Get link name */
2135c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_linkname", linkname, 256, &opt);CHKERRQ(ierr);
2145c6c1daeSBarry Smith   if (opt) {
2155c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkName(v, linkname);CHKERRQ(ierr);
2165c6c1daeSBarry Smith   }
2175c6c1daeSBarry Smith   /* Get link port */
2185c6c1daeSBarry Smith   numPorts = size;
219785e854fSJed Brown   ierr     = PetscMalloc1(size, &ports);CHKERRQ(ierr);
2205c6c1daeSBarry Smith   ierr     = PetscOptionsGetIntArray("viewer_", "-math_linkport", ports, &numPorts, &opt);CHKERRQ(ierr);
2215c6c1daeSBarry Smith   if (opt) {
222a297a907SKarl Rupp     if (numPorts > rank) snprintf(linkname, 255, "%6d", ports[rank]);
223a297a907SKarl Rupp     else                 snprintf(linkname, 255, "%6d", ports[0]);
2245c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkName(v, linkname);CHKERRQ(ierr);
2255c6c1daeSBarry Smith   }
2265c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
2275c6c1daeSBarry Smith   /* Get link host */
2285c6c1daeSBarry Smith   numHosts = size;
229785e854fSJed Brown   ierr     = PetscMalloc1(size, &hosts);CHKERRQ(ierr);
2305c6c1daeSBarry Smith   ierr     = PetscOptionsGetStringArray("viewer_", "-math_linkhost", hosts, &numHosts, &opt);CHKERRQ(ierr);
2315c6c1daeSBarry Smith   if (opt) {
2325c6c1daeSBarry Smith     if (numHosts > rank) {
2335c6c1daeSBarry Smith       ierr = PetscStrncpy(hostname, hosts[rank], 255);CHKERRQ(ierr);
2345c6c1daeSBarry Smith     } else {
2355c6c1daeSBarry Smith       ierr = PetscStrncpy(hostname, hosts[0], 255);CHKERRQ(ierr);
2365c6c1daeSBarry Smith     }
2375c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkHost(v, hostname);CHKERRQ(ierr);
2385c6c1daeSBarry Smith   }
2395c6c1daeSBarry Smith   for (h = 0; h < numHosts; h++) {
2405c6c1daeSBarry Smith     ierr = PetscFree(hosts[h]);CHKERRQ(ierr);
2415c6c1daeSBarry Smith   }
2425c6c1daeSBarry Smith   ierr = PetscFree(hosts);CHKERRQ(ierr);
2435c6c1daeSBarry Smith   /* Get link mode */
2445c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_linkmode", modename, 256, &opt);CHKERRQ(ierr);
2455c6c1daeSBarry Smith   if (opt) {
2465c6c1daeSBarry Smith     LinkMode mode;
2475c6c1daeSBarry Smith 
248*95c0884eSLisandro Dalcin     ierr = PetscViewerMathematicaParseLinkMode(modename, &mode);CHKERRQ(ierr);
2495c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkMode(v, mode);CHKERRQ(ierr);
2505c6c1daeSBarry Smith   }
2515c6c1daeSBarry Smith   /* Get graphics type */
2525c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_graphics", type, 256, &opt);CHKERRQ(ierr);
2535c6c1daeSBarry Smith   if (opt) {
2545c6c1daeSBarry Smith     PetscBool isMotif, isPS, isPSFile;
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Motif",  &isMotif);CHKERRQ(ierr);
2575c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "PS",     &isPS);CHKERRQ(ierr);
2585c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "PSFile", &isPSFile);CHKERRQ(ierr);
259a297a907SKarl Rupp     if (isMotif)       vmath->graphicsType = GRAPHICS_MOTIF;
260a297a907SKarl Rupp     else if (isPS)     vmath->graphicsType = GRAPHICS_PS_STDOUT;
261a297a907SKarl Rupp     else if (isPSFile) vmath->graphicsType = GRAPHICS_PS_FILE;
2625c6c1daeSBarry Smith   }
2635c6c1daeSBarry Smith   /* Get plot type */
2645c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_type", type, 256, &opt);CHKERRQ(ierr);
2655c6c1daeSBarry Smith   if (opt) {
2665c6c1daeSBarry Smith     PetscBool isTri, isVecTri, isVec, isSurface;
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Triangulation",       &isTri);CHKERRQ(ierr);
2695c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "VectorTriangulation", &isVecTri);CHKERRQ(ierr);
2705c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Vector",              &isVec);CHKERRQ(ierr);
2715c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Surface",             &isSurface);CHKERRQ(ierr);
272a297a907SKarl Rupp     if (isTri)          vmath->plotType = MATHEMATICA_TRIANGULATION_PLOT;
273a297a907SKarl Rupp     else if (isVecTri)  vmath->plotType = MATHEMATICA_VECTOR_TRIANGULATION_PLOT;
274a297a907SKarl Rupp     else if (isVec)     vmath->plotType = MATHEMATICA_VECTOR_PLOT;
275a297a907SKarl Rupp     else if (isSurface) vmath->plotType = MATHEMATICA_SURFACE_PLOT;
2765c6c1daeSBarry Smith   }
2775c6c1daeSBarry Smith   PetscFunctionReturn(0);
2785c6c1daeSBarry Smith }
2795c6c1daeSBarry Smith 
2800adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkName(PetscViewer v, const char *name)
2810adebc6cSBarry Smith {
2825c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
2835c6c1daeSBarry Smith   PetscErrorCode          ierr;
2845c6c1daeSBarry Smith 
2855c6c1daeSBarry Smith   PetscFunctionBegin;
2865c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
2875c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
2885c6c1daeSBarry Smith   ierr = PetscStrallocpy(name, &vmath->linkname);CHKERRQ(ierr);
2895c6c1daeSBarry Smith   PetscFunctionReturn(0);
2905c6c1daeSBarry Smith }
2915c6c1daeSBarry Smith 
2920adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkPort(PetscViewer v, int port)
2930adebc6cSBarry Smith {
2945c6c1daeSBarry Smith   char           name[16];
2955c6c1daeSBarry Smith   PetscErrorCode ierr;
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith   PetscFunctionBegin;
2985c6c1daeSBarry Smith   snprintf(name, 16, "%6d", port);
2995c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkName(v, name);CHKERRQ(ierr);
3005c6c1daeSBarry Smith   PetscFunctionReturn(0);
3015c6c1daeSBarry Smith }
3025c6c1daeSBarry Smith 
3030adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkHost(PetscViewer v, const char *host)
3040adebc6cSBarry Smith {
3055c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3065c6c1daeSBarry Smith   PetscErrorCode          ierr;
3075c6c1daeSBarry Smith 
3085c6c1daeSBarry Smith   PetscFunctionBegin;
3095c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
3105c6c1daeSBarry Smith   PetscValidCharPointer(host,2);
3115c6c1daeSBarry Smith   ierr = PetscStrallocpy(host, &vmath->linkhost);CHKERRQ(ierr);
3125c6c1daeSBarry Smith   PetscFunctionReturn(0);
3135c6c1daeSBarry Smith }
3145c6c1daeSBarry Smith 
3150adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkMode(PetscViewer v, LinkMode mode)
3160adebc6cSBarry Smith {
3175c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith   PetscFunctionBegin;
3205c6c1daeSBarry Smith   vmath->linkmode = mode;
3215c6c1daeSBarry Smith   PetscFunctionReturn(0);
3225c6c1daeSBarry Smith }
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith /*----------------------------------------- Public Functions --------------------------------------------------------*/
3255c6c1daeSBarry Smith /*@C
3265c6c1daeSBarry Smith   PetscViewerMathematicaOpen - Communicates with Mathemtica using MathLink.
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith   Collective on comm
3295c6c1daeSBarry Smith 
3305c6c1daeSBarry Smith   Input Parameters:
3315c6c1daeSBarry Smith + comm    - The MPI communicator
3325c6c1daeSBarry Smith . port    - [optional] The port to connect on, or PETSC_DECIDE
3330298fd71SBarry Smith . machine - [optional] The machine to run Mathematica on, or NULL
3340298fd71SBarry Smith - mode    - [optional] The connection mode, or NULL
3355c6c1daeSBarry Smith 
3365c6c1daeSBarry Smith   Output Parameter:
3375c6c1daeSBarry Smith . viewer  - The Mathematica viewer
3385c6c1daeSBarry Smith 
3395c6c1daeSBarry Smith   Level: intermediate
3405c6c1daeSBarry Smith 
3415c6c1daeSBarry Smith   Notes:
3425c6c1daeSBarry Smith   Most users should employ the following commands to access the
3435c6c1daeSBarry Smith   Mathematica viewers
3445c6c1daeSBarry Smith $
3455c6c1daeSBarry Smith $    PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
3465c6c1daeSBarry Smith $    MatView(Mat matrix, PetscViewer viewer)
3475c6c1daeSBarry Smith $
3485c6c1daeSBarry Smith $                or
3495c6c1daeSBarry Smith $
3505c6c1daeSBarry Smith $    PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
3515c6c1daeSBarry Smith $    VecView(Vec vector, PetscViewer viewer)
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith    Options Database Keys:
354e1bc860dSBarry Smith +    -viewer_math_linkhost <machine> - The host machine for the kernel
355e1bc860dSBarry Smith .    -viewer_math_linkname <name>    - The full link name for the connection
356e1bc860dSBarry Smith .    -viewer_math_linkport <port>    - The port for the connection
357e1bc860dSBarry Smith .    -viewer_math_mode <mode>        - The mode, e.g. Launch, Connect
358e1bc860dSBarry Smith .    -viewer_math_type <type>        - The plot type, e.g. Triangulation, Vector
359e1bc860dSBarry Smith -    -viewer_math_graphics <output>  - The output type, e.g. Motif, PS, PSFile
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith .keywords: PetscViewer, Mathematica, open
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith .seealso: MatView(), VecView()
3645c6c1daeSBarry Smith @*/
3655c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaOpen(MPI_Comm comm, int port, const char machine[], const char mode[], PetscViewer *v)
3665c6c1daeSBarry Smith {
3675c6c1daeSBarry Smith   PetscErrorCode ierr;
3685c6c1daeSBarry Smith 
3695c6c1daeSBarry Smith   PetscFunctionBegin;
3705c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm, v);CHKERRQ(ierr);
3715c6c1daeSBarry Smith #if 0
3725c6c1daeSBarry Smith   LinkMode linkmode;
3735c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkPort(*v, port);CHKERRQ(ierr);
3745c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkHost(*v, machine);CHKERRQ(ierr);
375*95c0884eSLisandro Dalcin   ierr = PetscViewerMathematicaParseLinkMode(mode, &linkmode);CHKERRQ(ierr);
3765c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkMode(*v, linkmode);CHKERRQ(ierr);
3775c6c1daeSBarry Smith #endif
3785c6c1daeSBarry Smith   ierr = PetscViewerSetType(*v, PETSC_VIEWER_MATHEMATICA);CHKERRQ(ierr);
3795c6c1daeSBarry Smith   PetscFunctionReturn(0);
3805c6c1daeSBarry Smith }
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith /*@C
3835c6c1daeSBarry Smith   PetscViewerMathematicaGetLink - Returns the link to Mathematica
3845c6c1daeSBarry Smith 
3855c6c1daeSBarry Smith   Input Parameters:
3865c6c1daeSBarry Smith . viewer - The Mathematica viewer
3875c6c1daeSBarry Smith . link   - The link to Mathematica
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith   Level: intermediate
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, link
3925c6c1daeSBarry Smith .seealso PetscViewerMathematicaOpen()
3935c6c1daeSBarry Smith @*/
3945c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaGetLink(PetscViewer viewer, MLINK *link)
3955c6c1daeSBarry Smith {
3965c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith   PetscFunctionBegin;
3995c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4005c6c1daeSBarry Smith   *link = vmath->link;
4015c6c1daeSBarry Smith   PetscFunctionReturn(0);
4025c6c1daeSBarry Smith }
4035c6c1daeSBarry Smith 
4045c6c1daeSBarry Smith /*@C
4055c6c1daeSBarry Smith   PetscViewerMathematicaSkipPackets - Discard packets sent by Mathematica until a certain packet type is received
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith   Input Parameters:
4085c6c1daeSBarry Smith . viewer - The Mathematica viewer
4095c6c1daeSBarry Smith . type   - The packet type to search for, e.g RETURNPKT
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith   Level: advanced
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, packets
4145c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaGetVector()
4155c6c1daeSBarry Smith @*/
4165c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSkipPackets(PetscViewer viewer, int type)
4175c6c1daeSBarry Smith {
4185c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4195c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
4205c6c1daeSBarry Smith   int                     pkt;                 /* The packet type */
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith   PetscFunctionBegin;
423a297a907SKarl Rupp   while ((pkt = MLNextPacket(link)) && (pkt != type)) MLNewPacket(link);
4245c6c1daeSBarry Smith   if (!pkt) {
4255c6c1daeSBarry Smith     MLClearError(link);
4265c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB, (char*) MLErrorMessage(link));
4275c6c1daeSBarry Smith   }
4285c6c1daeSBarry Smith   PetscFunctionReturn(0);
4295c6c1daeSBarry Smith }
4305c6c1daeSBarry Smith 
4315c6c1daeSBarry Smith /*@C
4325c6c1daeSBarry Smith   PetscViewerMathematicaGetName - Retrieve the default name for objects communicated to Mathematica
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith   Input Parameter:
4355c6c1daeSBarry Smith . viewer - The Mathematica viewer
4365c6c1daeSBarry Smith 
4375c6c1daeSBarry Smith   Output Parameter:
4385c6c1daeSBarry Smith . name   - The name for new objects created in Mathematica
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith   Level: intermediate
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
4435c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaClearName()
4445c6c1daeSBarry Smith @*/
4455c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaGetName(PetscViewer viewer, const char **name)
4465c6c1daeSBarry Smith {
4475c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith   PetscFunctionBegin;
4505c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4515c6c1daeSBarry Smith   PetscValidPointer(name,2);
4525c6c1daeSBarry Smith   *name = vmath->objName;
4535c6c1daeSBarry Smith   PetscFunctionReturn(0);
4545c6c1daeSBarry Smith }
4555c6c1daeSBarry Smith 
4565c6c1daeSBarry Smith /*@C
4575c6c1daeSBarry Smith   PetscViewerMathematicaSetName - Override the default name for objects communicated to Mathematica
4585c6c1daeSBarry Smith 
4595c6c1daeSBarry Smith   Input Parameters:
4605c6c1daeSBarry Smith . viewer - The Mathematica viewer
4615c6c1daeSBarry Smith . name   - The name for new objects created in Mathematica
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith   Level: intermediate
4645c6c1daeSBarry Smith 
4655c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
4665c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaClearName()
4675c6c1daeSBarry Smith @*/
4685c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSetName(PetscViewer viewer, const char name[])
4695c6c1daeSBarry Smith {
4705c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith   PetscFunctionBegin;
4735c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4745c6c1daeSBarry Smith   PetscValidPointer(name,2);
4755c6c1daeSBarry Smith   vmath->objName = name;
4765c6c1daeSBarry Smith   PetscFunctionReturn(0);
4775c6c1daeSBarry Smith }
4785c6c1daeSBarry Smith 
4795c6c1daeSBarry Smith /*@C
4805c6c1daeSBarry Smith   PetscViewerMathematicaClearName - Use the default name for objects communicated to Mathematica
4815c6c1daeSBarry Smith 
4825c6c1daeSBarry Smith   Input Parameter:
4835c6c1daeSBarry Smith . viewer - The Mathematica viewer
4845c6c1daeSBarry Smith 
4855c6c1daeSBarry Smith   Level: intermediate
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
4885c6c1daeSBarry Smith .seealso PetscViewerMathematicaGetName(), PetscViewerMathematicaSetName()
4895c6c1daeSBarry Smith @*/
4905c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaClearName(PetscViewer viewer)
4915c6c1daeSBarry Smith {
4925c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4935c6c1daeSBarry Smith 
4945c6c1daeSBarry Smith   PetscFunctionBegin;
4955c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4960298fd71SBarry Smith   vmath->objName = NULL;
4975c6c1daeSBarry Smith   PetscFunctionReturn(0);
4985c6c1daeSBarry Smith }
4995c6c1daeSBarry Smith 
5005c6c1daeSBarry Smith /*@C
5015c6c1daeSBarry Smith   PetscViewerMathematicaGetVector - Retrieve a vector from Mathematica
5025c6c1daeSBarry Smith 
5035c6c1daeSBarry Smith   Input Parameter:
5045c6c1daeSBarry Smith . viewer - The Mathematica viewer
5055c6c1daeSBarry Smith 
5065c6c1daeSBarry Smith   Output Parameter:
5075c6c1daeSBarry Smith . v      - The vector
5085c6c1daeSBarry Smith 
5095c6c1daeSBarry Smith   Level: intermediate
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, vector
5125c6c1daeSBarry Smith .seealso VecView(), PetscViewerMathematicaPutVector()
5135c6c1daeSBarry Smith @*/
5140adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaGetVector(PetscViewer viewer, Vec v)
5150adebc6cSBarry Smith {
5165c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5175c6c1daeSBarry Smith   MLINK                   link;   /* The link to Mathematica */
5185c6c1daeSBarry Smith   char                    *name;
5195c6c1daeSBarry Smith   PetscScalar             *mArray,*array;
5205c6c1daeSBarry Smith   long                    mSize;
5215c6c1daeSBarry Smith   int                     n;
5225c6c1daeSBarry Smith   PetscErrorCode          ierr;
5235c6c1daeSBarry Smith 
5245c6c1daeSBarry Smith   PetscFunctionBegin;
5255c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5265c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,      VEC_CLASSID,2);
5275c6c1daeSBarry Smith 
5285c6c1daeSBarry Smith   /* Determine the object name */
529a297a907SKarl Rupp   if (!vmath->objName) name = "vec";
530a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith   link = vmath->link;
5335c6c1daeSBarry Smith   ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr);
5345c6c1daeSBarry Smith   ierr = VecGetArray(v, &array);CHKERRQ(ierr);
5355c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5365c6c1daeSBarry Smith   MLPutSymbol(link, name);
5375c6c1daeSBarry Smith   MLEndPacket(link);
5385c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
5395c6c1daeSBarry Smith   MLGetRealList(link, &mArray, &mSize);
5405c6c1daeSBarry Smith   if (n != mSize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Incompatible vector sizes %d %d",n,mSize);
5415c6c1daeSBarry Smith   ierr = PetscMemcpy(array, mArray, mSize * sizeof(double));CHKERRQ(ierr);
5425c6c1daeSBarry Smith   MLDisownRealList(link, mArray, mSize);
5435c6c1daeSBarry Smith   ierr = VecRestoreArray(v, &array);CHKERRQ(ierr);
5445c6c1daeSBarry Smith   PetscFunctionReturn(0);
5455c6c1daeSBarry Smith }
5465c6c1daeSBarry Smith 
5475c6c1daeSBarry Smith /*@C
5485c6c1daeSBarry Smith   PetscViewerMathematicaPutVector - Send a vector to Mathematica
5495c6c1daeSBarry Smith 
5505c6c1daeSBarry Smith   Input Parameters:
5515c6c1daeSBarry Smith + viewer - The Mathematica viewer
5525c6c1daeSBarry Smith - v      - The vector
5535c6c1daeSBarry Smith 
5545c6c1daeSBarry Smith   Level: intermediate
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, vector
5575c6c1daeSBarry Smith .seealso VecView(), PetscViewerMathematicaGetVector()
5585c6c1daeSBarry Smith @*/
5595c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutVector(PetscViewer viewer, Vec v)
5605c6c1daeSBarry Smith {
5615c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5625c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
5635c6c1daeSBarry Smith   char                    *name;
5645c6c1daeSBarry Smith   PetscScalar             *array;
5655c6c1daeSBarry Smith   int                     n;
5665c6c1daeSBarry Smith   PetscErrorCode          ierr;
5675c6c1daeSBarry Smith 
5685c6c1daeSBarry Smith   PetscFunctionBegin;
5695c6c1daeSBarry Smith   /* Determine the object name */
570a297a907SKarl Rupp   if (!vmath->objName) name = "vec";
571a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
572a297a907SKarl Rupp 
5735c6c1daeSBarry Smith   ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr);
5745c6c1daeSBarry Smith   ierr = VecGetArray(v, &array);CHKERRQ(ierr);
5755c6c1daeSBarry Smith 
5765c6c1daeSBarry Smith   /* Send the Vector object */
5775c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5785c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
5795c6c1daeSBarry Smith   MLPutSymbol(link, name);
5805c6c1daeSBarry Smith   MLPutRealList(link, array, n);
5815c6c1daeSBarry Smith   MLEndPacket(link);
5825c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
5835c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
5845c6c1daeSBarry Smith   /* Skip ReturnPacket */
5855c6c1daeSBarry Smith   MLNewPacket(link);
5865c6c1daeSBarry Smith 
5875c6c1daeSBarry Smith   ierr = VecRestoreArray(v, &array);CHKERRQ(ierr);
5885c6c1daeSBarry Smith   PetscFunctionReturn(0);
5895c6c1daeSBarry Smith }
5905c6c1daeSBarry Smith 
5915c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutMatrix(PetscViewer viewer, int m, int n, PetscReal *a)
5925c6c1daeSBarry Smith {
5935c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5945c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
5955c6c1daeSBarry Smith   char                    *name;
5965c6c1daeSBarry Smith   PetscErrorCode          ierr;
5975c6c1daeSBarry Smith 
5985c6c1daeSBarry Smith   PetscFunctionBegin;
5995c6c1daeSBarry Smith   /* Determine the object name */
600a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
601a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
6025c6c1daeSBarry Smith 
6035c6c1daeSBarry Smith   /* Send the dense matrix object */
6045c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6055c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6065c6c1daeSBarry Smith   MLPutSymbol(link, name);
6075c6c1daeSBarry Smith   MLPutFunction(link, "Transpose", 1);
6085c6c1daeSBarry Smith   MLPutFunction(link, "Partition", 2);
6095c6c1daeSBarry Smith   MLPutRealList(link, a, m*n);
6105c6c1daeSBarry Smith   MLPutInteger(link, m);
6115c6c1daeSBarry Smith   MLEndPacket(link);
6125c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6135c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6145c6c1daeSBarry Smith   /* Skip ReturnPacket */
6155c6c1daeSBarry Smith   MLNewPacket(link);
6165c6c1daeSBarry Smith   PetscFunctionReturn(0);
6175c6c1daeSBarry Smith }
6185c6c1daeSBarry Smith 
6195c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutCSRMatrix(PetscViewer viewer, int m, int n, int *i, int *j, PetscReal *a)
6205c6c1daeSBarry Smith {
6215c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6225c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6235c6c1daeSBarry Smith   const char              *symbol;
6245c6c1daeSBarry Smith   char                    *name;
6255c6c1daeSBarry Smith   PetscBool               match;
6265c6c1daeSBarry Smith   PetscErrorCode          ierr;
6275c6c1daeSBarry Smith 
6285c6c1daeSBarry Smith   PetscFunctionBegin;
6295c6c1daeSBarry Smith   /* Determine the object name */
630a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
631a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
6325c6c1daeSBarry Smith 
6335c6c1daeSBarry Smith   /* Make sure Mathematica recognizes sparse matrices */
6345c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6355c6c1daeSBarry Smith   MLPutFunction(link, "Needs", 1);
6365c6c1daeSBarry Smith   MLPutString(link, "LinearAlgebra`CSRMatrix`");
6375c6c1daeSBarry Smith   MLEndPacket(link);
6385c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6395c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6405c6c1daeSBarry Smith   /* Skip ReturnPacket */
6415c6c1daeSBarry Smith   MLNewPacket(link);
6425c6c1daeSBarry Smith 
6435c6c1daeSBarry Smith   /* Send the CSRMatrix object */
6445c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6455c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6465c6c1daeSBarry Smith   MLPutSymbol(link, name);
6475c6c1daeSBarry Smith   MLPutFunction(link, "CSRMatrix", 5);
6485c6c1daeSBarry Smith   MLPutInteger(link, m);
6495c6c1daeSBarry Smith   MLPutInteger(link, n);
6505c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
6515c6c1daeSBarry Smith   MLPutIntegerList(link, i, m+1);
6525c6c1daeSBarry Smith   MLPutInteger(link, 1);
6535c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
6545c6c1daeSBarry Smith   MLPutIntegerList(link, j, i[m]);
6555c6c1daeSBarry Smith   MLPutInteger(link, 1);
6565c6c1daeSBarry Smith   MLPutRealList(link, a, i[m]);
6575c6c1daeSBarry Smith   MLEndPacket(link);
6585c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6595c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6605c6c1daeSBarry Smith   /* Skip ReturnPacket */
6615c6c1daeSBarry Smith   MLNewPacket(link);
6625c6c1daeSBarry Smith 
6635c6c1daeSBarry Smith   /* Check that matrix is valid */
6645c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6655c6c1daeSBarry Smith   MLPutFunction(link, "ValidQ", 1);
6665c6c1daeSBarry Smith   MLPutSymbol(link, name);
6675c6c1daeSBarry Smith   MLEndPacket(link);
6685c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6695c6c1daeSBarry Smith   MLGetSymbol(link, &symbol);
6705c6c1daeSBarry Smith   ierr = PetscStrcmp("True", (char*) symbol, &match);CHKERRQ(ierr);
6715c6c1daeSBarry Smith   if (!match) {
6725c6c1daeSBarry Smith     MLDisownSymbol(link, symbol);
6735c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB, "Invalid CSR matrix in Mathematica");
6745c6c1daeSBarry Smith   }
6755c6c1daeSBarry Smith   MLDisownSymbol(link, symbol);
6765c6c1daeSBarry Smith   /* Skip ReturnPacket */
6775c6c1daeSBarry Smith   MLNewPacket(link);
6785c6c1daeSBarry Smith   PetscFunctionReturn(0);
6795c6c1daeSBarry Smith }
6805c6c1daeSBarry Smith 
681