xref: /petsc/src/sys/classes/viewer/impls/mathematica/mathematica.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
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   Input Parameter:
420298fd71SBarry Smith   path - The dynamic library path, or NULL
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith   Level: developer
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith .keywords: Petsc, initialize, package
475c6c1daeSBarry Smith .seealso: PetscSysInitializePackage(), PetscInitialize()
485c6c1daeSBarry Smith @*/
495c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaInitializePackage(const char path[])
505c6c1daeSBarry Smith {
515c6c1daeSBarry Smith   PetscError ierr;
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith   PetscFunctionBegin;
545c6c1daeSBarry Smith   if (PetscViewerMathematicaPackageInitialized) PetscFunctionReturn(0);
555c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
56a297a907SKarl Rupp 
575c6c1daeSBarry Smith   mathematicaEnv = (void*) MLInitialize(0);
58a297a907SKarl Rupp 
595c6c1daeSBarry Smith   ierr = PetscRegisterFinalize(PetscViewerMathematicaFinalizePackage);CHKERRQ(ierr);
605c6c1daeSBarry Smith   PetscFunctionReturn(0);
615c6c1daeSBarry Smith }
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith #undef __FUNCT__
655c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerInitializeMathematicaWorld_Private"
665c6c1daeSBarry Smith PetscErrorCode PetscViewerInitializeMathematicaWorld_Private()
675c6c1daeSBarry Smith {
685c6c1daeSBarry Smith   PetscErrorCode ierr;
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith   PetscFunctionBegin;
715c6c1daeSBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) PetscFunctionReturn(0);
720298fd71SBarry Smith   ierr = PetscViewerMathematicaOpen(PETSC_COMM_WORLD, PETSC_DECIDE, NULL, NULL, &PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE);CHKERRQ(ierr);
735c6c1daeSBarry Smith   PetscFunctionReturn(0);
745c6c1daeSBarry Smith }
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith #undef __FUNCT__
775c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_Mathematica"
785c6c1daeSBarry Smith static PetscErrorCode PetscViewerDestroy_Mathematica(PetscViewer viewer)
795c6c1daeSBarry Smith {
805c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
815c6c1daeSBarry Smith   PetscErrorCode          ierr;
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith   PetscFunctionBegin;
845c6c1daeSBarry Smith   MLClose(vmath->link);
855c6c1daeSBarry Smith   ierr = PetscFree(vmath->linkname);CHKERRQ(ierr);
865c6c1daeSBarry Smith   ierr = PetscFree(vmath->linkhost);CHKERRQ(ierr);
875c6c1daeSBarry Smith   ierr = PetscFree(vmath);CHKERRQ(ierr);
885c6c1daeSBarry Smith   PetscFunctionReturn(0);
895c6c1daeSBarry Smith }
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith #undef __FUNCT__
925c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroyMathematica_Private"
935c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroyMathematica_Private(void)
945c6c1daeSBarry Smith {
955c6c1daeSBarry Smith   PetscErrorCode ierr;
965c6c1daeSBarry Smith 
975c6c1daeSBarry Smith   PetscFunctionBegin;
985c6c1daeSBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) {
995c6c1daeSBarry Smith     ierr = PetscViewerDestroy(PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE);CHKERRQ(ierr);
1005c6c1daeSBarry Smith   }
1015c6c1daeSBarry Smith   PetscFunctionReturn(0);
1025c6c1daeSBarry Smith }
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith #undef __FUNCT__
1055c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetupConnection_Private"
1065c6c1daeSBarry Smith PetscErrorCode PetscViewerMathematicaSetupConnection_Private(PetscViewer v)
1075c6c1daeSBarry Smith {
1085c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
109519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
1105c6c1daeSBarry Smith   int                     argc = 6;
1115c6c1daeSBarry Smith   char                    *argv[6];
1125c6c1daeSBarry Smith #else
1135c6c1daeSBarry Smith   int                     argc = 5;
1145c6c1daeSBarry Smith   char                    *argv[5];
1155c6c1daeSBarry Smith #endif
1165c6c1daeSBarry Smith   char                    hostname[256];
1175c6c1daeSBarry Smith   long                    lerr;
1185c6c1daeSBarry Smith   PetscErrorCode          ierr;
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith   PetscFunctionBegin;
1215c6c1daeSBarry Smith   /* Link name */
1225c6c1daeSBarry Smith   argv[0] = "-linkname";
123a297a907SKarl Rupp   if (!vmath->linkname) argv[1] = "math -mathlink";
124a297a907SKarl Rupp   else                  argv[1] = vmath->linkname;
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith   /* Link host */
1275c6c1daeSBarry Smith   argv[2] = "-linkhost";
1285c6c1daeSBarry Smith   if (!vmath->linkhost) {
1295c6c1daeSBarry Smith     ierr    = PetscGetHostName(hostname, 255);CHKERRQ(ierr);
1305c6c1daeSBarry Smith     argv[3] = hostname;
131a297a907SKarl Rupp   } else argv[3] = vmath->linkhost;
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   /* Link mode */
134519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
1355c6c1daeSBarry Smith   argv[4] = "-linkmode";
1365c6c1daeSBarry Smith   switch (vmath->linkmode) {
1375c6c1daeSBarry Smith   case MATHEMATICA_LINK_CREATE:
1385c6c1daeSBarry Smith     argv[5] = "Create";
1395c6c1daeSBarry Smith     break;
1405c6c1daeSBarry Smith   case MATHEMATICA_LINK_CONNECT:
1415c6c1daeSBarry Smith     argv[5] = "Connect";
1425c6c1daeSBarry Smith     break;
1435c6c1daeSBarry Smith   case MATHEMATICA_LINK_LAUNCH:
1445c6c1daeSBarry Smith     argv[5] = "Launch";
1455c6c1daeSBarry Smith     break;
1465c6c1daeSBarry Smith   }
1475c6c1daeSBarry Smith #else
1485c6c1daeSBarry Smith   switch (vmath->linkmode) {
1495c6c1daeSBarry Smith   case MATHEMATICA_LINK_CREATE:
1505c6c1daeSBarry Smith     argv[4] = "-linkcreate";
1515c6c1daeSBarry Smith     break;
1525c6c1daeSBarry Smith   case MATHEMATICA_LINK_CONNECT:
1535c6c1daeSBarry Smith     argv[4] = "-linkconnect";
1545c6c1daeSBarry Smith     break;
1555c6c1daeSBarry Smith   case MATHEMATICA_LINK_LAUNCH:
1565c6c1daeSBarry Smith     argv[4] = "-linklaunch";
1575c6c1daeSBarry Smith     break;
1585c6c1daeSBarry Smith   }
1595c6c1daeSBarry Smith #endif
1605c6c1daeSBarry Smith   vmath->link = MLOpenInEnv(mathematicaEnv, argc, argv, &lerr);
1615c6c1daeSBarry Smith #endif
1625c6c1daeSBarry Smith   PetscFunctionReturn(0);
1635c6c1daeSBarry Smith }
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith EXTERN_C_BEGIN
1665c6c1daeSBarry Smith #undef __FUNCT__
1675c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_Mathematica"
1685c6c1daeSBarry Smith PetscErrorCode  PetscViewerCreate_Mathematica(PetscViewer v)
1695c6c1daeSBarry Smith {
1705c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath;
1715c6c1daeSBarry Smith   PetscErrorCode          ierr;
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith   PetscFunctionBegin;
174519f805aSKarl Rupp #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
1750298fd71SBarry Smith   ierr = PetscViewerMathematicaInitializePackage(NULL);CHKERRQ(ierr);
1765c6c1daeSBarry Smith #endif
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith   ierr            = PetscNewLog(v,PetscViewer_Mathematica, &vmath);CHKERRQ(ierr);
1795c6c1daeSBarry Smith   v->data         = (void*) vmath;
1805c6c1daeSBarry Smith   v->ops->destroy = PetscViewerDestroy_Mathematica;
1815c6c1daeSBarry Smith   v->ops->flush   = 0;
1825c6c1daeSBarry Smith   ierr            = PetscStrallocpy(PETSC_VIEWER_MATHEMATICA, &((PetscObject)v)->type_name);CHKERRQ(ierr);
1835c6c1daeSBarry Smith 
1840298fd71SBarry Smith   vmath->linkname     = NULL;
1850298fd71SBarry Smith   vmath->linkhost     = NULL;
1865c6c1daeSBarry Smith   vmath->linkmode     = MATHEMATICA_LINK_CONNECT;
1875c6c1daeSBarry Smith   vmath->graphicsType = GRAPHICS_MOTIF;
1885c6c1daeSBarry Smith   vmath->plotType     = MATHEMATICA_TRIANGULATION_PLOT;
1890298fd71SBarry Smith   vmath->objName      = NULL;
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetFromOptions(v);CHKERRQ(ierr);
1925c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetupConnection_Private(v);CHKERRQ(ierr);
1935c6c1daeSBarry Smith   PetscFunctionReturn(0);
1945c6c1daeSBarry Smith }
1955c6c1daeSBarry Smith EXTERN_C_END
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith #undef __FUNCT__
1985c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaParseLinkMode_Private"
1990adebc6cSBarry Smith PetscErrorCode PetscViewerMathematicaParseLinkMode_Private(char *modename, LinkMode *mode)
2000adebc6cSBarry Smith {
2015c6c1daeSBarry Smith   PetscBool      isCreate, isConnect, isLaunch;
2025c6c1daeSBarry Smith   PetscErrorCode ierr;
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith   PetscFunctionBegin;
2055c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Create",  &isCreate);CHKERRQ(ierr);
2065c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Connect", &isConnect);CHKERRQ(ierr);
2075c6c1daeSBarry Smith   ierr = PetscStrcasecmp(modename, "Launch",  &isLaunch);CHKERRQ(ierr);
208a297a907SKarl Rupp   if (isCreate)       *mode = MATHEMATICA_LINK_CREATE;
209a297a907SKarl Rupp   else if (isConnect) *mode = MATHEMATICA_LINK_CONNECT;
210a297a907SKarl Rupp   else if (isLaunch)  *mode = MATHEMATICA_LINK_LAUNCH;
211a297a907SKarl Rupp   else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid Mathematica link mode: %s", modename);
2125c6c1daeSBarry Smith   PetscFunctionReturn(0);
2135c6c1daeSBarry Smith }
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith #undef __FUNCT__
2165c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetFromOptions"
2175c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSetFromOptions(PetscViewer v)
2185c6c1daeSBarry Smith {
2195c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
2205c6c1daeSBarry Smith   char                    linkname[256];
2215c6c1daeSBarry Smith   char                    modename[256];
2225c6c1daeSBarry Smith   char                    hostname[256];
2235c6c1daeSBarry Smith   char                    type[256];
2245c6c1daeSBarry Smith   PetscInt                numPorts;
2255c6c1daeSBarry Smith   PetscInt                *ports;
2265c6c1daeSBarry Smith   PetscInt                numHosts;
2275c6c1daeSBarry Smith   int                     h;
2285c6c1daeSBarry Smith   char                    **hosts;
2295c6c1daeSBarry Smith   PetscMPIInt             size, rank;
2305c6c1daeSBarry Smith   PetscBool               opt;
2315c6c1daeSBarry Smith   PetscErrorCode          ierr;
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith   PetscFunctionBegin;
234*ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)v), &size);CHKERRQ(ierr);
235*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)v), &rank);CHKERRQ(ierr);
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith   /* Get link name */
2385c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_linkname", linkname, 256, &opt);CHKERRQ(ierr);
2395c6c1daeSBarry Smith   if (opt) {
2405c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkName(v, linkname);CHKERRQ(ierr);
2415c6c1daeSBarry Smith   }
2425c6c1daeSBarry Smith   /* Get link port */
2435c6c1daeSBarry Smith   numPorts = size;
2445c6c1daeSBarry Smith   ierr     = PetscMalloc(size*sizeof(int), &ports);CHKERRQ(ierr);
2455c6c1daeSBarry Smith   ierr     = PetscOptionsGetIntArray("viewer_", "-math_linkport", ports, &numPorts, &opt);CHKERRQ(ierr);
2465c6c1daeSBarry Smith   if (opt) {
247a297a907SKarl Rupp     if (numPorts > rank) snprintf(linkname, 255, "%6d", ports[rank]);
248a297a907SKarl Rupp     else                 snprintf(linkname, 255, "%6d", ports[0]);
2495c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkName(v, linkname);CHKERRQ(ierr);
2505c6c1daeSBarry Smith   }
2515c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
2525c6c1daeSBarry Smith   /* Get link host */
2535c6c1daeSBarry Smith   numHosts = size;
2545c6c1daeSBarry Smith   ierr     = PetscMalloc(size*sizeof(char*), &hosts);CHKERRQ(ierr);
2555c6c1daeSBarry Smith   ierr     = PetscOptionsGetStringArray("viewer_", "-math_linkhost", hosts, &numHosts, &opt);CHKERRQ(ierr);
2565c6c1daeSBarry Smith   if (opt) {
2575c6c1daeSBarry Smith     if (numHosts > rank) {
2585c6c1daeSBarry Smith       ierr = PetscStrncpy(hostname, hosts[rank], 255);CHKERRQ(ierr);
2595c6c1daeSBarry Smith     } else {
2605c6c1daeSBarry Smith       ierr = PetscStrncpy(hostname, hosts[0], 255);CHKERRQ(ierr);
2615c6c1daeSBarry Smith     }
2625c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkHost(v, hostname);CHKERRQ(ierr);
2635c6c1daeSBarry Smith   }
2645c6c1daeSBarry Smith   for (h = 0; h < numHosts; h++) {
2655c6c1daeSBarry Smith     ierr = PetscFree(hosts[h]);CHKERRQ(ierr);
2665c6c1daeSBarry Smith   }
2675c6c1daeSBarry Smith   ierr = PetscFree(hosts);CHKERRQ(ierr);
2685c6c1daeSBarry Smith   /* Get link mode */
2695c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_linkmode", modename, 256, &opt);CHKERRQ(ierr);
2705c6c1daeSBarry Smith   if (opt) {
2715c6c1daeSBarry Smith     LinkMode mode;
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith     ierr = PetscViewerMathematicaParseLinkMode_Private(modename, &mode);CHKERRQ(ierr);
2745c6c1daeSBarry Smith     ierr = PetscViewerMathematicaSetLinkMode(v, mode);CHKERRQ(ierr);
2755c6c1daeSBarry Smith   }
2765c6c1daeSBarry Smith   /* Get graphics type */
2775c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_graphics", type, 256, &opt);CHKERRQ(ierr);
2785c6c1daeSBarry Smith   if (opt) {
2795c6c1daeSBarry Smith     PetscBool isMotif, isPS, isPSFile;
2805c6c1daeSBarry Smith 
2815c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Motif",  &isMotif);CHKERRQ(ierr);
2825c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "PS",     &isPS);CHKERRQ(ierr);
2835c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "PSFile", &isPSFile);CHKERRQ(ierr);
284a297a907SKarl Rupp     if (isMotif)       vmath->graphicsType = GRAPHICS_MOTIF;
285a297a907SKarl Rupp     else if (isPS)     vmath->graphicsType = GRAPHICS_PS_STDOUT;
286a297a907SKarl Rupp     else if (isPSFile) vmath->graphicsType = GRAPHICS_PS_FILE;
2875c6c1daeSBarry Smith   }
2885c6c1daeSBarry Smith   /* Get plot type */
2895c6c1daeSBarry Smith   ierr = PetscOptionsGetString("viewer_", "-math_type", type, 256, &opt);CHKERRQ(ierr);
2905c6c1daeSBarry Smith   if (opt) {
2915c6c1daeSBarry Smith     PetscBool isTri, isVecTri, isVec, isSurface;
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Triangulation",       &isTri);CHKERRQ(ierr);
2945c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "VectorTriangulation", &isVecTri);CHKERRQ(ierr);
2955c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Vector",              &isVec);CHKERRQ(ierr);
2965c6c1daeSBarry Smith     ierr = PetscStrcasecmp(type, "Surface",             &isSurface);CHKERRQ(ierr);
297a297a907SKarl Rupp     if (isTri)          vmath->plotType = MATHEMATICA_TRIANGULATION_PLOT;
298a297a907SKarl Rupp     else if (isVecTri)  vmath->plotType = MATHEMATICA_VECTOR_TRIANGULATION_PLOT;
299a297a907SKarl Rupp     else if (isVec)     vmath->plotType = MATHEMATICA_VECTOR_PLOT;
300a297a907SKarl Rupp     else if (isSurface) vmath->plotType = MATHEMATICA_SURFACE_PLOT;
3015c6c1daeSBarry Smith   }
3025c6c1daeSBarry Smith   PetscFunctionReturn(0);
3035c6c1daeSBarry Smith }
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith #undef __FUNCT__
3065c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetLinkName"
3070adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkName(PetscViewer v, const char *name)
3080adebc6cSBarry Smith {
3095c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3105c6c1daeSBarry Smith   PetscErrorCode          ierr;
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith   PetscFunctionBegin;
3135c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
3145c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
3155c6c1daeSBarry Smith   ierr = PetscStrallocpy(name, &vmath->linkname);CHKERRQ(ierr);
3165c6c1daeSBarry Smith   PetscFunctionReturn(0);
3175c6c1daeSBarry Smith }
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith #undef __FUNCT__
3205c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaLinkPort"
3210adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkPort(PetscViewer v, int port)
3220adebc6cSBarry Smith {
3235c6c1daeSBarry Smith   char           name[16];
3245c6c1daeSBarry Smith   PetscErrorCode ierr;
3255c6c1daeSBarry Smith 
3265c6c1daeSBarry Smith   PetscFunctionBegin;
3275c6c1daeSBarry Smith   snprintf(name, 16, "%6d", port);
3285c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkName(v, name);CHKERRQ(ierr);
3295c6c1daeSBarry Smith   PetscFunctionReturn(0);
3305c6c1daeSBarry Smith }
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith #undef __FUNCT__
3335c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetLinkHost"
3340adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkHost(PetscViewer v, const char *host)
3350adebc6cSBarry Smith {
3365c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3375c6c1daeSBarry Smith   PetscErrorCode          ierr;
3385c6c1daeSBarry Smith 
3395c6c1daeSBarry Smith   PetscFunctionBegin;
3405c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
3415c6c1daeSBarry Smith   PetscValidCharPointer(host,2);
3425c6c1daeSBarry Smith   ierr = PetscStrallocpy(host, &vmath->linkhost);CHKERRQ(ierr);
3435c6c1daeSBarry Smith   PetscFunctionReturn(0);
3445c6c1daeSBarry Smith }
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith #undef __FUNCT__
3475c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetLinkHost"
3480adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaSetLinkMode(PetscViewer v, LinkMode mode)
3490adebc6cSBarry Smith {
3505c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) v->data;
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith   PetscFunctionBegin;
3535c6c1daeSBarry Smith   vmath->linkmode = mode;
3545c6c1daeSBarry Smith   PetscFunctionReturn(0);
3555c6c1daeSBarry Smith }
3565c6c1daeSBarry Smith 
3575c6c1daeSBarry Smith /*----------------------------------------- Public Functions --------------------------------------------------------*/
3585c6c1daeSBarry Smith #undef __FUNCT__
3595c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaOpen"
3605c6c1daeSBarry Smith /*@C
3615c6c1daeSBarry Smith   PetscViewerMathematicaOpen - Communicates with Mathemtica using MathLink.
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith   Collective on comm
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith   Input Parameters:
3665c6c1daeSBarry Smith + comm    - The MPI communicator
3675c6c1daeSBarry Smith . port    - [optional] The port to connect on, or PETSC_DECIDE
3680298fd71SBarry Smith . machine - [optional] The machine to run Mathematica on, or NULL
3690298fd71SBarry Smith - mode    - [optional] The connection mode, or NULL
3705c6c1daeSBarry Smith 
3715c6c1daeSBarry Smith   Output Parameter:
3725c6c1daeSBarry Smith . viewer  - The Mathematica viewer
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith   Level: intermediate
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith   Notes:
3775c6c1daeSBarry Smith   Most users should employ the following commands to access the
3785c6c1daeSBarry Smith   Mathematica viewers
3795c6c1daeSBarry Smith $
3805c6c1daeSBarry Smith $    PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
3815c6c1daeSBarry Smith $    MatView(Mat matrix, PetscViewer viewer)
3825c6c1daeSBarry Smith $
3835c6c1daeSBarry Smith $                or
3845c6c1daeSBarry Smith $
3855c6c1daeSBarry Smith $    PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
3865c6c1daeSBarry Smith $    VecView(Vec vector, PetscViewer viewer)
3875c6c1daeSBarry Smith 
3885c6c1daeSBarry Smith    Options Database Keys:
3895c6c1daeSBarry Smith $    -viewer_math_linkhost <machine> - The host machine for the kernel
3905c6c1daeSBarry Smith $    -viewer_math_linkname <name>    - The full link name for the connection
3915c6c1daeSBarry Smith $    -viewer_math_linkport <port>    - The port for the connection
3925c6c1daeSBarry Smith $    -viewer_math_mode <mode>        - The mode, e.g. Launch, Connect
3935c6c1daeSBarry Smith $    -viewer_math_type <type>        - The plot type, e.g. Triangulation, Vector
3945c6c1daeSBarry Smith $    -viewer_math_graphics <output>  - The output type, e.g. Motif, PS, PSFile
3955c6c1daeSBarry Smith 
3965c6c1daeSBarry Smith .keywords: PetscViewer, Mathematica, open
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith .seealso: MatView(), VecView()
3995c6c1daeSBarry Smith @*/
4005c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaOpen(MPI_Comm comm, int port, const char machine[], const char mode[], PetscViewer *v)
4015c6c1daeSBarry Smith {
4025c6c1daeSBarry Smith   PetscErrorCode ierr;
4035c6c1daeSBarry Smith 
4045c6c1daeSBarry Smith   PetscFunctionBegin;
4055c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm, v);CHKERRQ(ierr);
4065c6c1daeSBarry Smith #if 0
4075c6c1daeSBarry Smith   LinkMode linkmode;
4085c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkPort(*v, port);CHKERRQ(ierr);
4095c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkHost(*v, machine);CHKERRQ(ierr);
4105c6c1daeSBarry Smith   ierr = PetscViewerMathematicaParseLinkMode_Private(mode, &linkmode);CHKERRQ(ierr);
4115c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSetLinkMode(*v, linkmode);CHKERRQ(ierr);
4125c6c1daeSBarry Smith #endif
4135c6c1daeSBarry Smith   ierr = PetscViewerSetType(*v, PETSC_VIEWER_MATHEMATICA);CHKERRQ(ierr);
4145c6c1daeSBarry Smith   PetscFunctionReturn(0);
4155c6c1daeSBarry Smith }
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith #undef __FUNCT__
4185c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaGetLink"
4195c6c1daeSBarry Smith /*@C
4205c6c1daeSBarry Smith   PetscViewerMathematicaGetLink - Returns the link to Mathematica
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith   Input Parameters:
4235c6c1daeSBarry Smith . viewer - The Mathematica viewer
4245c6c1daeSBarry Smith . link   - The link to Mathematica
4255c6c1daeSBarry Smith 
4265c6c1daeSBarry Smith   Level: intermediate
4275c6c1daeSBarry Smith 
4285c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, link
4295c6c1daeSBarry Smith .seealso PetscViewerMathematicaOpen()
4305c6c1daeSBarry Smith @*/
4315c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaGetLink(PetscViewer viewer, MLINK *link)
4325c6c1daeSBarry Smith {
4335c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith   PetscFunctionBegin;
4365c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4375c6c1daeSBarry Smith   *link = vmath->link;
4385c6c1daeSBarry Smith   PetscFunctionReturn(0);
4395c6c1daeSBarry Smith }
4405c6c1daeSBarry Smith 
4415c6c1daeSBarry Smith #undef __FUNCT__
4425c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSkipPackets"
4435c6c1daeSBarry Smith /*@C
4445c6c1daeSBarry Smith   PetscViewerMathematicaSkipPackets - Discard packets sent by Mathematica until a certain packet type is received
4455c6c1daeSBarry Smith 
4465c6c1daeSBarry Smith   Input Parameters:
4475c6c1daeSBarry Smith . viewer - The Mathematica viewer
4485c6c1daeSBarry Smith . type   - The packet type to search for, e.g RETURNPKT
4495c6c1daeSBarry Smith 
4505c6c1daeSBarry Smith   Level: advanced
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, packets
4535c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaGetVector()
4545c6c1daeSBarry Smith @*/
4555c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSkipPackets(PetscViewer viewer, int type)
4565c6c1daeSBarry Smith {
4575c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4585c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
4595c6c1daeSBarry Smith   int                     pkt;                 /* The packet type */
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith   PetscFunctionBegin;
462a297a907SKarl Rupp   while ((pkt = MLNextPacket(link)) && (pkt != type)) MLNewPacket(link);
4635c6c1daeSBarry Smith   if (!pkt) {
4645c6c1daeSBarry Smith     MLClearError(link);
4655c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB, (char*) MLErrorMessage(link));
4665c6c1daeSBarry Smith   }
4675c6c1daeSBarry Smith   PetscFunctionReturn(0);
4685c6c1daeSBarry Smith }
4695c6c1daeSBarry Smith 
4705c6c1daeSBarry Smith #undef __FUNCT__
4715c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaGetName"
4725c6c1daeSBarry Smith /*@C
4735c6c1daeSBarry Smith   PetscViewerMathematicaGetName - Retrieve the default name for objects communicated to Mathematica
4745c6c1daeSBarry Smith 
4755c6c1daeSBarry Smith   Input Parameter:
4765c6c1daeSBarry Smith . viewer - The Mathematica viewer
4775c6c1daeSBarry Smith 
4785c6c1daeSBarry Smith   Output Parameter:
4795c6c1daeSBarry Smith . name   - The name for new objects created in Mathematica
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith   Level: intermediate
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
4845c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaClearName()
4855c6c1daeSBarry Smith @*/
4865c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaGetName(PetscViewer viewer, const char **name)
4875c6c1daeSBarry Smith {
4885c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith   PetscFunctionBegin;
4915c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
4925c6c1daeSBarry Smith   PetscValidPointer(name,2);
4935c6c1daeSBarry Smith   *name = vmath->objName;
4945c6c1daeSBarry Smith   PetscFunctionReturn(0);
4955c6c1daeSBarry Smith }
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith #undef __FUNCT__
4985c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaSetName"
4995c6c1daeSBarry Smith /*@C
5005c6c1daeSBarry Smith   PetscViewerMathematicaSetName - Override the default name for objects communicated to Mathematica
5015c6c1daeSBarry Smith 
5025c6c1daeSBarry Smith   Input Parameters:
5035c6c1daeSBarry Smith . viewer - The Mathematica viewer
5045c6c1daeSBarry Smith . name   - The name for new objects created in Mathematica
5055c6c1daeSBarry Smith 
5065c6c1daeSBarry Smith   Level: intermediate
5075c6c1daeSBarry Smith 
5085c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
5095c6c1daeSBarry Smith .seealso PetscViewerMathematicaSetName(), PetscViewerMathematicaClearName()
5105c6c1daeSBarry Smith @*/
5115c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaSetName(PetscViewer viewer, const char name[])
5125c6c1daeSBarry Smith {
5135c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5145c6c1daeSBarry Smith 
5155c6c1daeSBarry Smith   PetscFunctionBegin;
5165c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5175c6c1daeSBarry Smith   PetscValidPointer(name,2);
5185c6c1daeSBarry Smith   vmath->objName = name;
5195c6c1daeSBarry Smith   PetscFunctionReturn(0);
5205c6c1daeSBarry Smith }
5215c6c1daeSBarry Smith 
5225c6c1daeSBarry Smith #undef __FUNCT__
5235c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaClearName"
5245c6c1daeSBarry Smith /*@C
5255c6c1daeSBarry Smith   PetscViewerMathematicaClearName - Use the default name for objects communicated to Mathematica
5265c6c1daeSBarry Smith 
5275c6c1daeSBarry Smith   Input Parameter:
5285c6c1daeSBarry Smith . viewer - The Mathematica viewer
5295c6c1daeSBarry Smith 
5305c6c1daeSBarry Smith   Level: intermediate
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, name
5335c6c1daeSBarry Smith .seealso PetscViewerMathematicaGetName(), PetscViewerMathematicaSetName()
5345c6c1daeSBarry Smith @*/
5355c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaClearName(PetscViewer viewer)
5365c6c1daeSBarry Smith {
5375c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5385c6c1daeSBarry Smith 
5395c6c1daeSBarry Smith   PetscFunctionBegin;
5405c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5410298fd71SBarry Smith   vmath->objName = NULL;
5425c6c1daeSBarry Smith   PetscFunctionReturn(0);
5435c6c1daeSBarry Smith }
5445c6c1daeSBarry Smith 
5455c6c1daeSBarry Smith #undef __FUNCT__
5465c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaGetVector"
5475c6c1daeSBarry Smith /*@C
5485c6c1daeSBarry Smith   PetscViewerMathematicaGetVector - Retrieve a vector from Mathematica
5495c6c1daeSBarry Smith 
5505c6c1daeSBarry Smith   Input Parameter:
5515c6c1daeSBarry Smith . viewer - The Mathematica viewer
5525c6c1daeSBarry Smith 
5535c6c1daeSBarry Smith   Output Parameter:
5545c6c1daeSBarry Smith . v      - The vector
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith   Level: intermediate
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, vector
5595c6c1daeSBarry Smith .seealso VecView(), PetscViewerMathematicaPutVector()
5605c6c1daeSBarry Smith @*/
5610adebc6cSBarry Smith PetscErrorCode  PetscViewerMathematicaGetVector(PetscViewer viewer, Vec v)
5620adebc6cSBarry Smith {
5635c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
5645c6c1daeSBarry Smith   MLINK                   link;   /* The link to Mathematica */
5655c6c1daeSBarry Smith   char                    *name;
5665c6c1daeSBarry Smith   PetscScalar             *mArray,*array;
5675c6c1daeSBarry Smith   long                    mSize;
5685c6c1daeSBarry Smith   int                     n;
5695c6c1daeSBarry Smith   PetscErrorCode          ierr;
5705c6c1daeSBarry Smith 
5715c6c1daeSBarry Smith   PetscFunctionBegin;
5725c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID,1);
5735c6c1daeSBarry Smith   PetscValidHeaderSpecific(v,      VEC_CLASSID,2);
5745c6c1daeSBarry Smith 
5755c6c1daeSBarry Smith   /* Determine the object name */
576a297a907SKarl Rupp   if (!vmath->objName) name = "vec";
577a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
5785c6c1daeSBarry Smith 
5795c6c1daeSBarry Smith   link = vmath->link;
5805c6c1daeSBarry Smith   ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr);
5815c6c1daeSBarry Smith   ierr = VecGetArray(v, &array);CHKERRQ(ierr);
5825c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5835c6c1daeSBarry Smith   MLPutSymbol(link, name);
5845c6c1daeSBarry Smith   MLEndPacket(link);
5855c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
5865c6c1daeSBarry Smith   MLGetRealList(link, &mArray, &mSize);
5875c6c1daeSBarry Smith   if (n != mSize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Incompatible vector sizes %d %d",n,mSize);
5885c6c1daeSBarry Smith   ierr = PetscMemcpy(array, mArray, mSize * sizeof(double));CHKERRQ(ierr);
5895c6c1daeSBarry Smith   MLDisownRealList(link, mArray, mSize);
5905c6c1daeSBarry Smith   ierr = VecRestoreArray(v, &array);CHKERRQ(ierr);
5915c6c1daeSBarry Smith   PetscFunctionReturn(0);
5925c6c1daeSBarry Smith }
5935c6c1daeSBarry Smith 
5945c6c1daeSBarry Smith #undef __FUNCT__
5955c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerMathematicaPutVector"
5965c6c1daeSBarry Smith /*@C
5975c6c1daeSBarry Smith   PetscViewerMathematicaPutVector - Send a vector to Mathematica
5985c6c1daeSBarry Smith 
5995c6c1daeSBarry Smith   Input Parameters:
6005c6c1daeSBarry Smith + viewer - The Mathematica viewer
6015c6c1daeSBarry Smith - v      - The vector
6025c6c1daeSBarry Smith 
6035c6c1daeSBarry Smith   Level: intermediate
6045c6c1daeSBarry Smith 
6055c6c1daeSBarry Smith .keywords PetscViewer, Mathematica, vector
6065c6c1daeSBarry Smith .seealso VecView(), PetscViewerMathematicaGetVector()
6075c6c1daeSBarry Smith @*/
6085c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutVector(PetscViewer viewer, Vec v)
6095c6c1daeSBarry Smith {
6105c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6115c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6125c6c1daeSBarry Smith   char                    *name;
6135c6c1daeSBarry Smith   PetscScalar             *array;
6145c6c1daeSBarry Smith   int                     n;
6155c6c1daeSBarry Smith   PetscErrorCode          ierr;
6165c6c1daeSBarry Smith 
6175c6c1daeSBarry Smith   PetscFunctionBegin;
6185c6c1daeSBarry Smith   /* Determine the object name */
619a297a907SKarl Rupp   if (!vmath->objName) name = "vec";
620a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
621a297a907SKarl Rupp 
6225c6c1daeSBarry Smith   ierr = VecGetLocalSize(v, &n);CHKERRQ(ierr);
6235c6c1daeSBarry Smith   ierr = VecGetArray(v, &array);CHKERRQ(ierr);
6245c6c1daeSBarry Smith 
6255c6c1daeSBarry Smith   /* Send the Vector object */
6265c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6275c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6285c6c1daeSBarry Smith   MLPutSymbol(link, name);
6295c6c1daeSBarry Smith   MLPutRealList(link, array, n);
6305c6c1daeSBarry Smith   MLEndPacket(link);
6315c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6325c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6335c6c1daeSBarry Smith   /* Skip ReturnPacket */
6345c6c1daeSBarry Smith   MLNewPacket(link);
6355c6c1daeSBarry Smith 
6365c6c1daeSBarry Smith   ierr = VecRestoreArray(v, &array);CHKERRQ(ierr);
6375c6c1daeSBarry Smith   PetscFunctionReturn(0);
6385c6c1daeSBarry Smith }
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutMatrix(PetscViewer viewer, int m, int n, PetscReal *a)
6415c6c1daeSBarry Smith {
6425c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6435c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6445c6c1daeSBarry Smith   char                    *name;
6455c6c1daeSBarry Smith   PetscErrorCode          ierr;
6465c6c1daeSBarry Smith 
6475c6c1daeSBarry Smith   PetscFunctionBegin;
6485c6c1daeSBarry Smith   /* Determine the object name */
649a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
650a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
6515c6c1daeSBarry Smith 
6525c6c1daeSBarry Smith   /* Send the dense matrix object */
6535c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6545c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6555c6c1daeSBarry Smith   MLPutSymbol(link, name);
6565c6c1daeSBarry Smith   MLPutFunction(link, "Transpose", 1);
6575c6c1daeSBarry Smith   MLPutFunction(link, "Partition", 2);
6585c6c1daeSBarry Smith   MLPutRealList(link, a, m*n);
6595c6c1daeSBarry Smith   MLPutInteger(link, m);
6605c6c1daeSBarry Smith   MLEndPacket(link);
6615c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6625c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6635c6c1daeSBarry Smith   /* Skip ReturnPacket */
6645c6c1daeSBarry Smith   MLNewPacket(link);
6655c6c1daeSBarry Smith   PetscFunctionReturn(0);
6665c6c1daeSBarry Smith }
6675c6c1daeSBarry Smith 
6685c6c1daeSBarry Smith PetscErrorCode  PetscViewerMathematicaPutCSRMatrix(PetscViewer viewer, int m, int n, int *i, int *j, PetscReal *a)
6695c6c1daeSBarry Smith {
6705c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica*) viewer->data;
6715c6c1daeSBarry Smith   MLINK                   link   = vmath->link; /* The link to Mathematica */
6725c6c1daeSBarry Smith   const char              *symbol;
6735c6c1daeSBarry Smith   char                    *name;
6745c6c1daeSBarry Smith   PetscBool               match;
6755c6c1daeSBarry Smith   PetscErrorCode          ierr;
6765c6c1daeSBarry Smith 
6775c6c1daeSBarry Smith   PetscFunctionBegin;
6785c6c1daeSBarry Smith   /* Determine the object name */
679a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
680a297a907SKarl Rupp   else                 name = (char*) vmath->objName;
6815c6c1daeSBarry Smith 
6825c6c1daeSBarry Smith   /* Make sure Mathematica recognizes sparse matrices */
6835c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6845c6c1daeSBarry Smith   MLPutFunction(link, "Needs", 1);
6855c6c1daeSBarry Smith   MLPutString(link, "LinearAlgebra`CSRMatrix`");
6865c6c1daeSBarry Smith   MLEndPacket(link);
6875c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
6885c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
6895c6c1daeSBarry Smith   /* Skip ReturnPacket */
6905c6c1daeSBarry Smith   MLNewPacket(link);
6915c6c1daeSBarry Smith 
6925c6c1daeSBarry Smith   /* Send the CSRMatrix object */
6935c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
6945c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
6955c6c1daeSBarry Smith   MLPutSymbol(link, name);
6965c6c1daeSBarry Smith   MLPutFunction(link, "CSRMatrix", 5);
6975c6c1daeSBarry Smith   MLPutInteger(link, m);
6985c6c1daeSBarry Smith   MLPutInteger(link, n);
6995c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
7005c6c1daeSBarry Smith   MLPutIntegerList(link, i, m+1);
7015c6c1daeSBarry Smith   MLPutInteger(link, 1);
7025c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
7035c6c1daeSBarry Smith   MLPutIntegerList(link, j, i[m]);
7045c6c1daeSBarry Smith   MLPutInteger(link, 1);
7055c6c1daeSBarry Smith   MLPutRealList(link, a, i[m]);
7065c6c1daeSBarry Smith   MLEndPacket(link);
7075c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
7085c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
7095c6c1daeSBarry Smith   /* Skip ReturnPacket */
7105c6c1daeSBarry Smith   MLNewPacket(link);
7115c6c1daeSBarry Smith 
7125c6c1daeSBarry Smith   /* Check that matrix is valid */
7135c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
7145c6c1daeSBarry Smith   MLPutFunction(link, "ValidQ", 1);
7155c6c1daeSBarry Smith   MLPutSymbol(link, name);
7165c6c1daeSBarry Smith   MLEndPacket(link);
7175c6c1daeSBarry Smith   ierr = PetscViewerMathematicaSkipPackets(viewer, RETURNPKT);CHKERRQ(ierr);
7185c6c1daeSBarry Smith   MLGetSymbol(link, &symbol);
7195c6c1daeSBarry Smith   ierr = PetscStrcmp("True", (char*) symbol, &match);CHKERRQ(ierr);
7205c6c1daeSBarry Smith   if (!match) {
7215c6c1daeSBarry Smith     MLDisownSymbol(link, symbol);
7225c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB, "Invalid CSR matrix in Mathematica");
7235c6c1daeSBarry Smith   }
7245c6c1daeSBarry Smith   MLDisownSymbol(link, symbol);
7255c6c1daeSBarry Smith   /* Skip ReturnPacket */
7265c6c1daeSBarry Smith   MLNewPacket(link);
7275c6c1daeSBarry Smith   PetscFunctionReturn(0);
7285c6c1daeSBarry Smith }
7295c6c1daeSBarry Smith 
730