xref: /petsc/src/sys/classes/viewer/impls/mathematica/mathematica.c (revision e1bc860ddbea9b853e6420502bcb87a48130a5fa)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h>   /* "petscsys.h" */
35c6c1daeSBarry 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 #undef __FUNCT__
165c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaFinalizePackage"
175c6c1daeSBarry Smith /*@C
185c6c1daeSBarry Smith   PetscViewerMathematicaFinalizePackage - This function destroys everything in the Petsc interface to Mathematica. It is
195c6c1daeSBarry Smith   called from PetscFinalize().
205c6c1daeSBarry Smith 
215c6c1daeSBarry Smith   Level: developer
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith .keywords: Petsc, destroy, package, mathematica
245c6c1daeSBarry Smith .seealso: PetscFinalize()
255c6c1daeSBarry Smith @*/
265c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaFinalizePackage(void)
275c6c1daeSBarry Smith {
285c6c1daeSBarry Smith   PetscFunctionBegin;
295c6c1daeSBarry Smith   if (mathematicaEnv) MLDeinitialize((MLEnvironment) mathematicaEnv);
305c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
315c6c1daeSBarry Smith   PetscFunctionReturn(0);
325c6c1daeSBarry Smith }
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith #undef __FUNCT__
355c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaInitializePackage"
365c6c1daeSBarry Smith /*@C
375c6c1daeSBarry Smith   PetscViewerMathematicaInitializePackage - This function initializes everything in the Petsc interface to Mathematica. It is
385c6c1daeSBarry Smith   called from PetscDLLibraryRegister() when using dynamic libraries, and on the call to PetscInitialize()
395c6c1daeSBarry Smith   when using static libraries.
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith   Level: developer
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith .keywords: Petsc, initialize, package
445c6c1daeSBarry Smith .seealso: PetscSysInitializePackage(), PetscInitialize()
455c6c1daeSBarry Smith @*/
46607a6623SBarry Smith PetscErrorCode  PetscViewerMathematicaInitializePackage(void)
475c6c1daeSBarry Smith {
485c6c1daeSBarry Smith   PetscError ierr;
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith   PetscFunctionBegin;
515c6c1daeSBarry Smith   if (PetscViewerMathematicaPackageInitialized) PetscFunctionReturn(0);
525c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
53a297a907SKarl Rupp 
545c6c1daeSBarry Smith   mathematicaEnv = (void*) MLInitialize(0);
55a297a907SKarl Rupp 
565c6c1daeSBarry Smith   ierr = PetscRegisterFinalize(PetscViewerMathematicaFinalizePackage);CHKERRQ(ierr);
575c6c1daeSBarry Smith   PetscFunctionReturn(0);
585c6c1daeSBarry Smith }
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith #undef __FUNCT__
625c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerInitializeMathematicaWorld_Private"
635c6c1daeSBarry Smith PetscErrorCode PetscViewerInitializeMathematicaWorld_Private()
645c6c1daeSBarry Smith {
655c6c1daeSBarry Smith   PetscErrorCode ierr;
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith   PetscFunctionBegin;
685c6c1daeSBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) PetscFunctionReturn(0);
690298fd71SBarry Smith   ierr = PetscViewerMathematicaOpen(PETSC_COMM_WORLD, PETSC_DECIDE, NULL, NULL, &PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE);CHKERRQ(ierr);
705c6c1daeSBarry Smith   PetscFunctionReturn(0);
715c6c1daeSBarry Smith }
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith #undef __FUNCT__
745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_Mathematica"
755c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_Mathematica(PetscViewer viewer)
765c6c1daeSBarry Smith {
775c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
785c6c1daeSBarry Smith   PetscErrorCode          ierr;
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith   PetscFunctionBegin;
815c6c1daeSBarry Smith   MLClose(vmath->link);
825c6c1daeSBarry Smith   ierr = PetscFree(vmath->linkname);CHKERRQ(ierr);
835c6c1daeSBarry Smith   ierr = PetscFree(vmath->linkhost);CHKERRQ(ierr);
845c6c1daeSBarry Smith   ierr = PetscFree(vmath);CHKERRQ(ierr);
855c6c1daeSBarry Smith   PetscFunctionReturn(0);
865c6c1daeSBarry Smith }
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith #undef __FUNCT__
895c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroyMathematica_Private"
905c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroyMathematica_Private(void)
915c6c1daeSBarry Smith {
925c6c1daeSBarry Smith   PetscErrorCode ierr;
935c6c1daeSBarry Smith 
945c6c1daeSBarry Smith   PetscFunctionBegin;
955c6c1daeSBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) {
965c6c1daeSBarry Smith     ierr = PetscViewerDestroy(PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE);CHKERRQ(ierr);
975c6c1daeSBarry Smith   }
985c6c1daeSBarry Smith   PetscFunctionReturn(0);
995c6c1daeSBarry Smith }
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith #undef __FUNCT__
1025c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetupConnection_Private"
1035c6c1daeSBarry Smith PetscErrorCode PetscViewerMathematicaSetupConnection_Private(PetscViewer v)
1045c6c1daeSBarry Smith {
1055c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
106519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
1075c6c1daeSBarry Smith   int                     argc = 6;
1085c6c1daeSBarry Smith   char                    *argv[6];
1095c6c1daeSBarry Smith #else
1105c6c1daeSBarry Smith   int                     argc = 5;
1115c6c1daeSBarry Smith   char                    *argv[5];
1125c6c1daeSBarry Smith #endif
1135c6c1daeSBarry Smith   char                    hostname[256];
1145c6c1daeSBarry Smith   long                    lerr;
1155c6c1daeSBarry Smith   PetscErrorCode          ierr;
1165c6c1daeSBarry Smith 
1175c6c1daeSBarry Smith   PetscFunctionBegin;
1185c6c1daeSBarry Smith   /* Link name */
1195c6c1daeSBarry Smith   argv[0] = "-linkname";
120a297a907SKarl Rupp   if (!vmath->linkname) argv[1] = "math -mathlink";
121a297a907SKarl Rupp   else                  argv[1] = vmath->linkname;
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith   /* Link host */
1245c6c1daeSBarry Smith   argv[2] = "-linkhost";
1255c6c1daeSBarry Smith   if (!vmath->linkhost) {
1265c6c1daeSBarry Smith     ierr    = PetscGetHostName(hostname, 255);CHKERRQ(ierr);
1275c6c1daeSBarry Smith     argv[3] = hostname;
128a297a907SKarl Rupp   } else argv[3] = vmath->linkhost;
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith   /* Link mode */
131519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
1325c6c1daeSBarry Smith   argv[4] = "-linkmode";
1335c6c1daeSBarry Smith   switch (vmath->linkmode) {
1345c6c1daeSBarry Smith   case MATHEMATICA_LINK_CREATE:
1355c6c1daeSBarry Smith     argv[5] = "Create";
1365c6c1daeSBarry Smith     break;
1375c6c1daeSBarry Smith   case MATHEMATICA_LINK_CONNECT:
1385c6c1daeSBarry Smith     argv[5] = "Connect";
1395c6c1daeSBarry Smith     break;
1405c6c1daeSBarry Smith   case MATHEMATICA_LINK_LAUNCH:
1415c6c1daeSBarry Smith     argv[5] = "Launch";
1425c6c1daeSBarry Smith     break;
1435c6c1daeSBarry Smith   }
1445c6c1daeSBarry Smith #else
1455c6c1daeSBarry Smith   switch (vmath->linkmode) {
1465c6c1daeSBarry Smith   case MATHEMATICA_LINK_CREATE:
1475c6c1daeSBarry Smith     argv[4] = "-linkcreate";
1485c6c1daeSBarry Smith     break;
1495c6c1daeSBarry Smith   case MATHEMATICA_LINK_CONNECT:
1505c6c1daeSBarry Smith     argv[4] = "-linkconnect";
1515c6c1daeSBarry Smith     break;
1525c6c1daeSBarry Smith   case MATHEMATICA_LINK_LAUNCH:
1535c6c1daeSBarry Smith     argv[4] = "-linklaunch";
1545c6c1daeSBarry Smith     break;
1555c6c1daeSBarry Smith   }
1565c6c1daeSBarry Smith #endif
1575c6c1daeSBarry Smith   vmath->link = MLOpenInEnv(mathematicaEnv, argc, argv, &lerr);
1585c6c1daeSBarry Smith #endif
1595c6c1daeSBarry Smith   PetscFunctionReturn(0);
1605c6c1daeSBarry Smith }
1615c6c1daeSBarry Smith 
1625c6c1daeSBarry Smith #undef __FUNCT__
1635c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_Mathematica"
1648cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_Mathematica(PetscViewer v)
1655c6c1daeSBarry Smith {
1665c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath;
1675c6c1daeSBarry Smith   PetscErrorCode          ierr;
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith   PetscFunctionBegin;
170607a6623SBarry Smith   ierr = PetscViewerMathematicaInitializePackage();CHKERRQ(ierr);
1715c6c1daeSBarry Smith 
172b00a9115SJed Brown   ierr            = PetscNewLog(v,&vmath);CHKERRQ(ierr);
1735c6c1daeSBarry Smith   v->data         = (void*) vmath;
1745c6c1daeSBarry Smith   v->ops->destroy = PetscViewerDestroy_Mathematica;
1755c6c1daeSBarry Smith   v->ops->flush   = 0;
1765c6c1daeSBarry Smith   ierr            = PetscStrallocpy(PETSC_VIEWER_MATHEMATICA, &((PetscObject)v)->type_name);CHKERRQ(ierr);
1775c6c1daeSBarry Smith 
1780298fd71SBarry Smith   vmath->linkname     = NULL;
1790298fd71SBarry Smith   vmath->linkhost     = NULL;
1805c6c1daeSBarry Smith   vmath->linkmode     = MATHEMATICA_LINK_CONNECT;
1815c6c1daeSBarry Smith   vmath->graphicsType = GRAPHICS_MOTIF;
1825c6c1daeSBarry Smith   vmath->plotType     = MATHEMATICA_TRIANGULATION_PLOT;
1830298fd71SBarry Smith   vmath->objName      = NULL;
1845c6c1daeSBarry Smith 
1855c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetFromOptions(v);CHKERRQ(ierr);
1865c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetupConnection_Private(v);CHKERRQ(ierr);
1875c6c1daeSBarry Smith   PetscFunctionReturn(0);
1885c6c1daeSBarry Smith }
1895c6c1daeSBarry Smith 
1905c6c1daeSBarry Smith #undef __FUNCT__
1915c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaParseLinkMode_Private"
1920adebc6cSBarry Smith PetscErrorCode PetscViewerMathematicaParseLinkMode_Private(char *modename, LinkMode *mode)
1930adebc6cSBarry Smith {
1945c6c1daeSBarry Smith   PetscBool      isCreate, isConnect, isLaunch;
1955c6c1daeSBarry Smith   PetscErrorCode ierr;
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith   PetscFunctionBegin;
1985c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Create",  &isCreate);CHKERRQ(ierr);
1995c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Connect", &isConnect);CHKERRQ(ierr);
2005c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Launch",  &isLaunch);CHKERRQ(ierr);
201a297a907SKarl Rupp   if (isCreate)       *mode = MATHEMATICA_LINK_CREATE;
202a297a907SKarl Rupp   else if (isConnect) *mode = MATHEMATICA_LINK_CONNECT;
203a297a907SKarl Rupp   else if (isLaunch)  *mode = MATHEMATICA_LINK_LAUNCH;
204a297a907SKarl Rupp   else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid Mathematica link mode: %s", modename);
2055c6c1daeSBarry Smith   PetscFunctionReturn(0);
2065c6c1daeSBarry Smith }
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith #undef __FUNCT__
2095c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetFromOptions"
2105c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSetFromOptions(PetscViewer v)
2115c6c1daeSBarry Smith {
2125c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
2135c6c1daeSBarry Smith   char                    linkname[256];
2145c6c1daeSBarry Smith   char                    modename[256];
2155c6c1daeSBarry Smith   char                    hostname[256];
2165c6c1daeSBarry Smith   char                    type[256];
2175c6c1daeSBarry Smith   PetscInt                numPorts;
2185c6c1daeSBarry Smith   PetscInt                *ports;
2195c6c1daeSBarry Smith   PetscInt                numHosts;
2205c6c1daeSBarry Smith   int                     h;
2215c6c1daeSBarry Smith   char                    **hosts;
2225c6c1daeSBarry Smith   PetscMPIInt             size, rank;
2235c6c1daeSBarry Smith   PetscBool               opt;
2245c6c1daeSBarry Smith   PetscErrorCode          ierr;
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith   PetscFunctionBegin;
227ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)v), &size);CHKERRQ(ierr);
228ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)v), &rank);CHKERRQ(ierr);
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith   /* Get link name */
2315c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_linkname", linkname, 256, &opt);CHKERRQ(ierr);
2325c6c1daeSBarry Smith   if (opt) {
2335c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkName(v, linkname);CHKERRQ(ierr);
2345c6c1daeSBarry Smith   }
2355c6c1daeSBarry Smith   /* Get link port */
2365c6c1daeSBarry Smith   numPorts = size;
237785e854fSJed Brown   ierr     = PetscMalloc1(size, &ports);CHKERRQ(ierr);
2385c6c1daeSBarry Smith   ierr     = PetscOptionsGetIntArray("viewer_", "-math_linkport", ports, &numPorts, &opt);CHKERRQ(ierr);
2395c6c1daeSBarry Smith   if (opt) {
240a297a907SKarl Rupp     if (numPorts > rank) snprintf(linkname, 255, "%6d", ports[rank]);
241a297a907SKarl Rupp     else                 snprintf(linkname, 255, "%6d", ports[0]);
2425c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkName(v, linkname);CHKERRQ(ierr);
2435c6c1daeSBarry Smith   }
2445c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
2455c6c1daeSBarry Smith   /* Get link host */
2465c6c1daeSBarry Smith   numHosts = size;
247785e854fSJed Brown   ierr     = PetscMalloc1(size, &hosts);CHKERRQ(ierr);
2485c6c1daeSBarry Smith   ierr     = PetscOptionsGetStringArray("viewer_", "-math_linkhost", hosts, &numHosts, &opt);CHKERRQ(ierr);
2495c6c1daeSBarry Smith   if (opt) {
2505c6c1daeSBarry Smith     if (numHosts > rank) {
2515c6c1daeSBarry Smith       ierr = PetscStrncpy(hostname, hosts[rank], 255);CHKERRQ(ierr);
2525c6c1daeSBarry Smith     } else {
2535c6c1daeSBarry Smith       ierr = PetscStrncpy(hostname, hosts[0], 255);CHKERRQ(ierr);
2545c6c1daeSBarry Smith     }
2555c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkHost(v, hostname);CHKERRQ(ierr);
2565c6c1daeSBarry Smith   }
2575c6c1daeSBarry Smith   for (h = 0; h < numHosts; h++) {
2585c6c1daeSBarry Smith     ierr = PetscFree(hosts[h]);CHKERRQ(ierr);
2595c6c1daeSBarry Smith   }
2605c6c1daeSBarry Smith   ierr = PetscFree(hosts);CHKERRQ(ierr);
2615c6c1daeSBarry Smith   /* Get link mode */
2625c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_linkmode", modename, 256, &opt);CHKERRQ(ierr);
2635c6c1daeSBarry Smith   if (opt) {
2645c6c1daeSBarry Smith     LinkMode mode;
2655c6c1daeSBarry Smith 
2665c6c1daeSBarry Smith     ierr = PetscViewerMathematicaParseLinkMode_Private(modename, &mode);CHKERRQ(ierr);
2675c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkMode(v, mode);CHKERRQ(ierr);
2685c6c1daeSBarry Smith   }
2695c6c1daeSBarry Smith   /* Get graphics type */
2705c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_graphics", type, 256, &opt);CHKERRQ(ierr);
2715c6c1daeSBarry Smith   if (opt) {
2725c6c1daeSBarry Smith     PetscBool isMotif, isPS, isPSFile;
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Motif",  &isMotif);CHKERRQ(ierr);
2755c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "PS",     &isPS);CHKERRQ(ierr);
2765c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "PSFile", &isPSFile);CHKERRQ(ierr);
277a297a907SKarl Rupp     if (isMotif)       vmath->graphicsType = GRAPHICS_MOTIF;
278a297a907SKarl Rupp     else if (isPS)     vmath->graphicsType = GRAPHICS_PS_STDOUT;
279a297a907SKarl Rupp     else if (isPSFile) vmath->graphicsType = GRAPHICS_PS_FILE;
2805c6c1daeSBarry Smith   }
2815c6c1daeSBarry Smith   /* Get plot type */
2825c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_type", type, 256, &opt);CHKERRQ(ierr);
2835c6c1daeSBarry Smith   if (opt) {
2845c6c1daeSBarry Smith     PetscBool isTri, isVecTri, isVec, isSurface;
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Triangulation",       &isTri);CHKERRQ(ierr);
2875c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "VectorTriangulation", &isVecTri);CHKERRQ(ierr);
2885c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Vector",              &isVec);CHKERRQ(ierr);
2895c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Surface",             &isSurface);CHKERRQ(ierr);
290a297a907SKarl Rupp     if (isTri)          vmath->plotType = MATHEMATICA_TRIANGULATION_PLOT;
291a297a907SKarl Rupp     else if (isVecTri)  vmath->plotType = MATHEMATICA_VECTOR_TRIANGULATION_PLOT;
292a297a907SKarl Rupp     else if (isVec)     vmath->plotType = MATHEMATICA_VECTOR_PLOT;
293a297a907SKarl Rupp     else if (isSurface) vmath->plotType = MATHEMATICA_SURFACE_PLOT;
2945c6c1daeSBarry Smith   }
2955c6c1daeSBarry Smith   PetscFunctionReturn(0);
2965c6c1daeSBarry Smith }
2975c6c1daeSBarry Smith 
2985c6c1daeSBarry Smith #undef __FUNCT__
2995c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetLinkName"
3000adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkName(PetscViewer v, const char *name)
3010adebc6cSBarry Smith {
3025c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3035c6c1daeSBarry Smith   PetscErrorCode          ierr;
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith   PetscFunctionBegin;
3065c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
3075c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
3085c6c1daeSBarry Smith   ierr = PetscStrallocpy(name, &vmath->linkname);CHKERRQ(ierr);
3095c6c1daeSBarry Smith   PetscFunctionReturn(0);
3105c6c1daeSBarry Smith }
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith #undef __FUNCT__
3135c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaLinkPort"
3140adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkPort(PetscViewer v, int port)
3150adebc6cSBarry Smith {
3165c6c1daeSBarry Smith   char           name[16];
3175c6c1daeSBarry Smith   PetscErrorCode ierr;
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith   PetscFunctionBegin;
3205c6c1daeSBarry Smith   snprintf(name, 16, "%6d", port);
3215c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkName(v, name);CHKERRQ(ierr);
3225c6c1daeSBarry Smith   PetscFunctionReturn(0);
3235c6c1daeSBarry Smith }
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith #undef __FUNCT__
3265c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetLinkHost"
3270adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkHost(PetscViewer v, const char *host)
3280adebc6cSBarry Smith {
3295c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3305c6c1daeSBarry Smith   PetscErrorCode          ierr;
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith   PetscFunctionBegin;
3335c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
3345c6c1daeSBarry Smith   PetscValidCharPointer(host,2);
3355c6c1daeSBarry Smith   ierr = PetscStrallocpy(host, &vmath->linkhost);CHKERRQ(ierr);
3365c6c1daeSBarry Smith   PetscFunctionReturn(0);
3375c6c1daeSBarry Smith }
3385c6c1daeSBarry Smith 
3395c6c1daeSBarry Smith #undef __FUNCT__
3405c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetLinkHost"
3410adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkMode(PetscViewer v, LinkMode mode)
3420adebc6cSBarry Smith {
3435c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith   PetscFunctionBegin;
3465c6c1daeSBarry Smith   vmath->linkmode = mode;
3475c6c1daeSBarry Smith   PetscFunctionReturn(0);
3485c6c1daeSBarry Smith }
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith /*----------------------------------------- Public Functions --------------------------------------------------------*/
3515c6c1daeSBarry Smith #undef __FUNCT__
3525c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaOpen"
3535c6c1daeSBarry Smith /*@C
3545c6c1daeSBarry Smith   PetscViewerMathematicaOpen - Communicates with Mathemtica using MathLink.
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith   Collective on comm
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith   Input Parameters:
3595c6c1daeSBarry Smith + comm    - The MPI communicator
3605c6c1daeSBarry Smith . port    - [optional] The port to connect on, or PETSC_DECIDE
3610298fd71SBarry Smith . machine - [optional] The machine to run Mathematica on, or NULL
3620298fd71SBarry Smith - mode    - [optional] The connection mode, or NULL
3635c6c1daeSBarry Smith 
3645c6c1daeSBarry Smith   Output Parameter:
3655c6c1daeSBarry Smith . viewer  - The Mathematica viewer
3665c6c1daeSBarry Smith 
3675c6c1daeSBarry Smith   Level: intermediate
3685c6c1daeSBarry Smith 
3695c6c1daeSBarry Smith   Notes:
3705c6c1daeSBarry Smith   Most users should employ the following commands to access the
3715c6c1daeSBarry Smith   Mathematica viewers
3725c6c1daeSBarry Smith $
3735c6c1daeSBarry Smith $    PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
3745c6c1daeSBarry Smith $    MatView(Mat matrix, PetscViewer viewer)
3755c6c1daeSBarry Smith $
3765c6c1daeSBarry Smith $                or
3775c6c1daeSBarry Smith $
3785c6c1daeSBarry Smith $    PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
3795c6c1daeSBarry Smith $    VecView(Vec vector, PetscViewer viewer)
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith    Options Database Keys:
382*e1bc860dSBarry Smith +    -viewer_math_linkhost <machine> - The host machine for the kernel
383*e1bc860dSBarry Smith .    -viewer_math_linkname <name>    - The full link name for the connection
384*e1bc860dSBarry Smith .    -viewer_math_linkport <port>    - The port for the connection
385*e1bc860dSBarry Smith .    -viewer_math_mode <mode>        - The mode, e.g. Launch, Connect
386*e1bc860dSBarry Smith .    -viewer_math_type <type>        - The plot type, e.g. Triangulation, Vector
387*e1bc860dSBarry Smith -    -viewer_math_graphics <output>  - The output type, e.g. Motif, PS, PSFile
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith .keywords: PetscViewer, Mathematica, open
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith .seealso: MatView(), VecView()
3925c6c1daeSBarry Smith @*/
3935c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaOpen(MPI_Comm comm, int port, const char machine[], const char mode[], PetscViewer *v)
3945c6c1daeSBarry Smith {
3955c6c1daeSBarry Smith   PetscErrorCode ierr;
3965c6c1daeSBarry Smith 
3975c6c1daeSBarry Smith   PetscFunctionBegin;
3985c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm, v);CHKERRQ(ierr);
3995c6c1daeSBarry Smith #if 0
4005c6c1daeSBarry Smith   LinkMode linkmode;
4015c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkPort(*v, port);CHKERRQ(ierr);
4025c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkHost(*v, machine);CHKERRQ(ierr);
4035c6c1daeSBarry Smith   ierr = PetscViewerMathematicaParseLinkMode_Private(mode, &linkmode);CHKERRQ(ierr);
4045c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkMode(*v, linkmode);CHKERRQ(ierr);
4055c6c1daeSBarry Smith #endif
4065c6c1daeSBarry Smith   ierr = PetscViewerSetType(*v, PETSC_VIEWER_MATHEMATICA);CHKERRQ(ierr);
4075c6c1daeSBarry Smith   PetscFunctionReturn(0);
4085c6c1daeSBarry Smith }
4095c6c1daeSBarry Smith 
4105c6c1daeSBarry Smith #undef __FUNCT__
4115c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaGetLink"
4125c6c1daeSBarry Smith /*@C
4135c6c1daeSBarry Smith   PetscViewerMathematicaGetLink - Returns the link to Mathematica
4145c6c1daeSBarry Smith 
4155c6c1daeSBarry Smith   Input Parameters:
4165c6c1daeSBarry Smith . viewer - The Mathematica viewer
4175c6c1daeSBarry Smith . link   - The link to Mathematica
4185c6c1daeSBarry Smith 
4195c6c1daeSBarry Smith   Level: intermediate
4205c6c1daeSBarry Smith 
4215c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, link
4225c6c1daeSBarry Smith .seealso PetscViewerMathematicaOpen()
4235c6c1daeSBarry Smith @*/
4245c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaGetLink(PetscViewer viewer, MLINK *link)
4255c6c1daeSBarry Smith {
4265c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4275c6c1daeSBarry Smith 
4285c6c1daeSBarry Smith   PetscFunctionBegin;
4295c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4305c6c1daeSBarry Smith   *link = vmath->link;
4315c6c1daeSBarry Smith   PetscFunctionReturn(0);
4325c6c1daeSBarry Smith }
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith #undef __FUNCT__
4355c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSkipPackets"
4365c6c1daeSBarry Smith /*@C
4375c6c1daeSBarry Smith   PetscViewerMathematicaSkipPackets - Discard packets sent by Mathematica until a certain packet type is received
4385c6c1daeSBarry Smith 
4395c6c1daeSBarry Smith   Input Parameters:
4405c6c1daeSBarry Smith . viewer - The Mathematica viewer
4415c6c1daeSBarry Smith . type   - The packet type to search for, e.g RETURNPKT
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith   Level: advanced
4445c6c1daeSBarry Smith 
4455c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, packets
4465c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaGetVector()
4475c6c1daeSBarry Smith @*/
4485c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSkipPackets(PetscViewer viewer, int type)
4495c6c1daeSBarry Smith {
4505c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4515c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
4525c6c1daeSBarry Smith   int                     pkt;                 /* The packet type */
4535c6c1daeSBarry Smith 
4545c6c1daeSBarry Smith   PetscFunctionBegin;
455a297a907SKarl Rupp   while ((pkt = MLNextPacket(link)) && (pkt != type)) MLNewPacket(link);
4565c6c1daeSBarry Smith   if (!pkt) {
4575c6c1daeSBarry Smith     MLClearError(link);
4585c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB, (char*) MLErrorMessage(link));
4595c6c1daeSBarry Smith   }
4605c6c1daeSBarry Smith   PetscFunctionReturn(0);
4615c6c1daeSBarry Smith }
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith #undef __FUNCT__
4645c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaGetName"
4655c6c1daeSBarry Smith /*@C
4665c6c1daeSBarry Smith   PetscViewerMathematicaGetName - Retrieve the default name for objects communicated to Mathematica
4675c6c1daeSBarry Smith 
4685c6c1daeSBarry Smith   Input Parameter:
4695c6c1daeSBarry Smith . viewer - The Mathematica viewer
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith   Output Parameter:
4725c6c1daeSBarry Smith . name   - The name for new objects created in Mathematica
4735c6c1daeSBarry Smith 
4745c6c1daeSBarry Smith   Level: intermediate
4755c6c1daeSBarry Smith 
4765c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
4775c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaClearName()
4785c6c1daeSBarry Smith @*/
4795c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaGetName(PetscViewer viewer, const char **name)
4805c6c1daeSBarry Smith {
4815c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith   PetscFunctionBegin;
4845c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4855c6c1daeSBarry Smith   PetscValidPointer(name,2);
4865c6c1daeSBarry Smith   *name = vmath->objName;
4875c6c1daeSBarry Smith   PetscFunctionReturn(0);
4885c6c1daeSBarry Smith }
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith #undef __FUNCT__
4915c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetName"
4925c6c1daeSBarry Smith /*@C
4935c6c1daeSBarry Smith   PetscViewerMathematicaSetName - Override the default name for objects communicated to Mathematica
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith   Input Parameters:
4965c6c1daeSBarry Smith . viewer - The Mathematica viewer
4975c6c1daeSBarry Smith . name   - The name for new objects created in Mathematica
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith   Level: intermediate
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
5025c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaClearName()
5035c6c1daeSBarry Smith @*/
5045c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSetName(PetscViewer viewer, const char name[])
5055c6c1daeSBarry Smith {
5065c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5075c6c1daeSBarry Smith 
5085c6c1daeSBarry Smith   PetscFunctionBegin;
5095c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5105c6c1daeSBarry Smith   PetscValidPointer(name,2);
5115c6c1daeSBarry Smith   vmath->objName = name;
5125c6c1daeSBarry Smith   PetscFunctionReturn(0);
5135c6c1daeSBarry Smith }
5145c6c1daeSBarry Smith 
5155c6c1daeSBarry Smith #undef __FUNCT__
5165c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaClearName"
5175c6c1daeSBarry Smith /*@C
5185c6c1daeSBarry Smith   PetscViewerMathematicaClearName - Use the default name for objects communicated to Mathematica
5195c6c1daeSBarry Smith 
5205c6c1daeSBarry Smith   Input Parameter:
5215c6c1daeSBarry Smith . viewer - The Mathematica viewer
5225c6c1daeSBarry Smith 
5235c6c1daeSBarry Smith   Level: intermediate
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
5265c6c1daeSBarry Smith .seealso PetscViewerMathematicaGetName(), PetscViewerMathematicaSetName()
5275c6c1daeSBarry Smith @*/
5285c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaClearName(PetscViewer viewer)
5295c6c1daeSBarry Smith {
5305c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith   PetscFunctionBegin;
5335c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5340298fd71SBarry Smith   vmath->objName = NULL;
5355c6c1daeSBarry Smith   PetscFunctionReturn(0);
5365c6c1daeSBarry Smith }
5375c6c1daeSBarry Smith 
5385c6c1daeSBarry Smith #undef __FUNCT__
5395c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaGetVector"
5405c6c1daeSBarry Smith /*@C
5415c6c1daeSBarry Smith   PetscViewerMathematicaGetVector - Retrieve a vector from Mathematica
5425c6c1daeSBarry Smith 
5435c6c1daeSBarry Smith   Input Parameter:
5445c6c1daeSBarry Smith . viewer - The Mathematica viewer
5455c6c1daeSBarry Smith 
5465c6c1daeSBarry Smith   Output Parameter:
5475c6c1daeSBarry Smith . v      - The vector
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith   Level: intermediate
5505c6c1daeSBarry Smith 
5515c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, vector
5525c6c1daeSBarry Smith .seealso VecView(), PetscViewerMathematicaPutVector()
5535c6c1daeSBarry Smith @*/
5540adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaGetVector(PetscViewer viewer, Vec v)
5550adebc6cSBarry Smith {
5565c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5575c6c1daeSBarry Smith   MLINK                   link;   /* The link to Mathematica */
5585c6c1daeSBarry Smith   char                    *name;
5595c6c1daeSBarry Smith   PetscScalar             *mArray,*array;
5605c6c1daeSBarry Smith   long                    mSize;
5615c6c1daeSBarry Smith   int                     n;
5625c6c1daeSBarry Smith   PetscErrorCode          ierr;
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith   PetscFunctionBegin;
5655c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5665c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,      VEC_CLASSID,2);
5675c6c1daeSBarry Smith 
5685c6c1daeSBarry Smith   /* Determine the object name */
569a297a907SKarl Rupp   if (!vmath->objName) name = "vec";
570a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
5715c6c1daeSBarry Smith 
5725c6c1daeSBarry Smith   link = vmath->link;
5735c6c1daeSBarry Smith   ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr);
5745c6c1daeSBarry Smith   ierr = VecGetArray(v, &array);CHKERRQ(ierr);
5755c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5765c6c1daeSBarry Smith   MLPutSymbol(link, name);
5775c6c1daeSBarry Smith   MLEndPacket(link);
5785c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
5795c6c1daeSBarry Smith   MLGetRealList(link, &mArray, &mSize);
5805c6c1daeSBarry Smith   if (n != mSize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Incompatible vector sizes %d %d",n,mSize);
5815c6c1daeSBarry Smith   ierr = PetscMemcpy(array, mArray, mSize * sizeof(double));CHKERRQ(ierr);
5825c6c1daeSBarry Smith   MLDisownRealList(link, mArray, mSize);
5835c6c1daeSBarry Smith   ierr = VecRestoreArray(v, &array);CHKERRQ(ierr);
5845c6c1daeSBarry Smith   PetscFunctionReturn(0);
5855c6c1daeSBarry Smith }
5865c6c1daeSBarry Smith 
5875c6c1daeSBarry Smith #undef __FUNCT__
5885c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaPutVector"
5895c6c1daeSBarry Smith /*@C
5905c6c1daeSBarry Smith   PetscViewerMathematicaPutVector - Send a vector to Mathematica
5915c6c1daeSBarry Smith 
5925c6c1daeSBarry Smith   Input Parameters:
5935c6c1daeSBarry Smith + viewer - The Mathematica viewer
5945c6c1daeSBarry Smith - v      - The vector
5955c6c1daeSBarry Smith 
5965c6c1daeSBarry Smith   Level: intermediate
5975c6c1daeSBarry Smith 
5985c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, vector
5995c6c1daeSBarry Smith .seealso VecView(), PetscViewerMathematicaGetVector()
6005c6c1daeSBarry Smith @*/
6015c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutVector(PetscViewer viewer, Vec v)
6025c6c1daeSBarry Smith {
6035c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6045c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6055c6c1daeSBarry Smith   char                    *name;
6065c6c1daeSBarry Smith   PetscScalar             *array;
6075c6c1daeSBarry Smith   int                     n;
6085c6c1daeSBarry Smith   PetscErrorCode          ierr;
6095c6c1daeSBarry Smith 
6105c6c1daeSBarry Smith   PetscFunctionBegin;
6115c6c1daeSBarry Smith   /* Determine the object name */
612a297a907SKarl Rupp   if (!vmath->objName) name = "vec";
613a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
614a297a907SKarl Rupp 
6155c6c1daeSBarry Smith   ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr);
6165c6c1daeSBarry Smith   ierr = VecGetArray(v, &array);CHKERRQ(ierr);
6175c6c1daeSBarry Smith 
6185c6c1daeSBarry Smith   /* Send the Vector object */
6195c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6205c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6215c6c1daeSBarry Smith   MLPutSymbol(link, name);
6225c6c1daeSBarry Smith   MLPutRealList(link, array, n);
6235c6c1daeSBarry Smith   MLEndPacket(link);
6245c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6255c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6265c6c1daeSBarry Smith   /* Skip ReturnPacket */
6275c6c1daeSBarry Smith   MLNewPacket(link);
6285c6c1daeSBarry Smith 
6295c6c1daeSBarry Smith   ierr = VecRestoreArray(v, &array);CHKERRQ(ierr);
6305c6c1daeSBarry Smith   PetscFunctionReturn(0);
6315c6c1daeSBarry Smith }
6325c6c1daeSBarry Smith 
6335c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutMatrix(PetscViewer viewer, int m, int n, PetscReal *a)
6345c6c1daeSBarry Smith {
6355c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6365c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6375c6c1daeSBarry Smith   char                    *name;
6385c6c1daeSBarry Smith   PetscErrorCode          ierr;
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith   PetscFunctionBegin;
6415c6c1daeSBarry Smith   /* Determine the object name */
642a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
643a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
6445c6c1daeSBarry Smith 
6455c6c1daeSBarry Smith   /* Send the dense matrix object */
6465c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6475c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6485c6c1daeSBarry Smith   MLPutSymbol(link, name);
6495c6c1daeSBarry Smith   MLPutFunction(link, "Transpose", 1);
6505c6c1daeSBarry Smith   MLPutFunction(link, "Partition", 2);
6515c6c1daeSBarry Smith   MLPutRealList(link, a, m*n);
6525c6c1daeSBarry Smith   MLPutInteger(link, m);
6535c6c1daeSBarry Smith   MLEndPacket(link);
6545c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6555c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6565c6c1daeSBarry Smith   /* Skip ReturnPacket */
6575c6c1daeSBarry Smith   MLNewPacket(link);
6585c6c1daeSBarry Smith   PetscFunctionReturn(0);
6595c6c1daeSBarry Smith }
6605c6c1daeSBarry Smith 
6615c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutCSRMatrix(PetscViewer viewer, int m, int n, int *i, int *j, PetscReal *a)
6625c6c1daeSBarry Smith {
6635c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6645c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6655c6c1daeSBarry Smith   const char              *symbol;
6665c6c1daeSBarry Smith   char                    *name;
6675c6c1daeSBarry Smith   PetscBool               match;
6685c6c1daeSBarry Smith   PetscErrorCode          ierr;
6695c6c1daeSBarry Smith 
6705c6c1daeSBarry Smith   PetscFunctionBegin;
6715c6c1daeSBarry Smith   /* Determine the object name */
672a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
673a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
6745c6c1daeSBarry Smith 
6755c6c1daeSBarry Smith   /* Make sure Mathematica recognizes sparse matrices */
6765c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6775c6c1daeSBarry Smith   MLPutFunction(link, "Needs", 1);
6785c6c1daeSBarry Smith   MLPutString(link, "LinearAlgebra`CSRMatrix`");
6795c6c1daeSBarry Smith   MLEndPacket(link);
6805c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6815c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6825c6c1daeSBarry Smith   /* Skip ReturnPacket */
6835c6c1daeSBarry Smith   MLNewPacket(link);
6845c6c1daeSBarry Smith 
6855c6c1daeSBarry Smith   /* Send the CSRMatrix object */
6865c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6875c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6885c6c1daeSBarry Smith   MLPutSymbol(link, name);
6895c6c1daeSBarry Smith   MLPutFunction(link, "CSRMatrix", 5);
6905c6c1daeSBarry Smith   MLPutInteger(link, m);
6915c6c1daeSBarry Smith   MLPutInteger(link, n);
6925c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
6935c6c1daeSBarry Smith   MLPutIntegerList(link, i, m+1);
6945c6c1daeSBarry Smith   MLPutInteger(link, 1);
6955c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
6965c6c1daeSBarry Smith   MLPutIntegerList(link, j, i[m]);
6975c6c1daeSBarry Smith   MLPutInteger(link, 1);
6985c6c1daeSBarry Smith   MLPutRealList(link, a, i[m]);
6995c6c1daeSBarry Smith   MLEndPacket(link);
7005c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
7015c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
7025c6c1daeSBarry Smith   /* Skip ReturnPacket */
7035c6c1daeSBarry Smith   MLNewPacket(link);
7045c6c1daeSBarry Smith 
7055c6c1daeSBarry Smith   /* Check that matrix is valid */
7065c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
7075c6c1daeSBarry Smith   MLPutFunction(link, "ValidQ", 1);
7085c6c1daeSBarry Smith   MLPutSymbol(link, name);
7095c6c1daeSBarry Smith   MLEndPacket(link);
7105c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
7115c6c1daeSBarry Smith   MLGetSymbol(link, &symbol);
7125c6c1daeSBarry Smith   ierr = PetscStrcmp("True", (char*) symbol, &match);CHKERRQ(ierr);
7135c6c1daeSBarry Smith   if (!match) {
7145c6c1daeSBarry Smith     MLDisownSymbol(link, symbol);
7155c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB, "Invalid CSR matrix in Mathematica");
7165c6c1daeSBarry Smith   }
7175c6c1daeSBarry Smith   MLDisownSymbol(link, symbol);
7185c6c1daeSBarry Smith   /* Skip ReturnPacket */
7195c6c1daeSBarry Smith   MLNewPacket(link);
7205c6c1daeSBarry Smith   PetscFunctionReturn(0);
7215c6c1daeSBarry Smith }
7225c6c1daeSBarry Smith 
723