xref: /petsc/src/sys/classes/viewer/impls/mathematica/mathematica.c (revision 03047865b8d8757cf1cf9cda45785c1537b01dc1)
1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /* "petscsys.h" */
25c6c1daeSBarry Smith #include <mathematica.h>
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith #if defined(PETSC_HAVE__SNPRINTF) && !defined(PETSC_HAVE_SNPRINTF)
55c6c1daeSBarry Smith   #define snprintf _snprintf
65c6c1daeSBarry Smith #endif
75c6c1daeSBarry Smith 
80298fd71SBarry Smith PetscViewer  PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE = NULL;
90298fd71SBarry Smith static void *mathematicaEnv                         = NULL;
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith static PetscBool PetscViewerMathematicaPackageInitialized = PETSC_FALSE;
125c6c1daeSBarry Smith /*@C
13*f0b74427SPierre Jolivet   PetscViewerMathematicaFinalizePackage - This function destroys everything in the PETSc interface to Mathematica. It is
145c6c1daeSBarry Smith   called from PetscFinalize().
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith   Level: developer
175c6c1daeSBarry Smith 
18db781477SPatrick Sanan .seealso: `PetscFinalize()`
195c6c1daeSBarry Smith @*/
PetscViewerMathematicaFinalizePackage(void)20d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaFinalizePackage(void)
21d71ae5a4SJacob Faibussowitsch {
225c6c1daeSBarry Smith   PetscFunctionBegin;
235c6c1daeSBarry Smith   if (mathematicaEnv) MLDeinitialize((MLEnvironment)mathematicaEnv);
245c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
265c6c1daeSBarry Smith }
275c6c1daeSBarry Smith 
285c6c1daeSBarry Smith /*@C
29*f0b74427SPierre Jolivet   PetscViewerMathematicaInitializePackage - This function initializes everything in the PETSc interface to Mathematica. It is
30811af0c4SBarry Smith   called from `PetscViewerInitializePackage()`.
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith   Level: developer
335c6c1daeSBarry Smith 
34db781477SPatrick Sanan .seealso: `PetscSysInitializePackage()`, `PetscInitialize()`
355c6c1daeSBarry Smith @*/
PetscViewerMathematicaInitializePackage(void)36d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaInitializePackage(void)
37d71ae5a4SJacob Faibussowitsch {
385c6c1daeSBarry Smith   PetscError ierr;
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith   PetscFunctionBegin;
413ba16761SJacob Faibussowitsch   if (PetscViewerMathematicaPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
425c6c1daeSBarry Smith   PetscViewerMathematicaPackageInitialized = PETSC_TRUE;
43a297a907SKarl Rupp 
445c6c1daeSBarry Smith   mathematicaEnv = (void *)MLInitialize(0);
45a297a907SKarl Rupp 
469566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscViewerMathematicaFinalizePackage));
473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
485c6c1daeSBarry Smith }
495c6c1daeSBarry Smith 
PetscViewerInitializeMathematicaWorld_Private()5066976f2fSJacob Faibussowitsch static PetscErrorCode PetscViewerInitializeMathematicaWorld_Private()
51d71ae5a4SJacob Faibussowitsch {
525c6c1daeSBarry Smith   PetscFunctionBegin;
533ba16761SJacob Faibussowitsch   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) PetscFunctionReturn(PETSC_SUCCESS);
549566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaOpen(PETSC_COMM_WORLD, PETSC_DECIDE, NULL, NULL, &PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE));
553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
565c6c1daeSBarry Smith }
575c6c1daeSBarry Smith 
PetscViewerDestroy_Mathematica(PetscViewer viewer)58d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Mathematica(PetscViewer viewer)
59d71ae5a4SJacob Faibussowitsch {
605c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith   PetscFunctionBegin;
635c6c1daeSBarry Smith   MLClose(vmath->link);
649566063dSJacob Faibussowitsch   PetscCall(PetscFree(vmath->linkname));
659566063dSJacob Faibussowitsch   PetscCall(PetscFree(vmath->linkhost));
669566063dSJacob Faibussowitsch   PetscCall(PetscFree(vmath));
673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
685c6c1daeSBarry Smith }
695c6c1daeSBarry Smith 
PetscViewerDestroyMathematica_Private(void)7066976f2fSJacob Faibussowitsch static PetscErrorCode PetscViewerDestroyMathematica_Private(void)
71d71ae5a4SJacob Faibussowitsch {
725c6c1daeSBarry Smith   PetscFunctionBegin;
731baa6e33SBarry Smith   if (PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE) PetscCall(PetscViewerDestroy(PETSC_VIEWER_MATHEMATICA_WORLD_PRIVATE));
743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
PetscViewerMathematicaSetupConnection_Private(PetscViewer v)7766976f2fSJacob Faibussowitsch static PetscErrorCode PetscViewerMathematicaSetupConnection_Private(PetscViewer v)
78d71ae5a4SJacob Faibussowitsch {
795c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)v->data;
80519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
815c6c1daeSBarry Smith   int   argc = 6;
825c6c1daeSBarry Smith   char *argv[6];
835c6c1daeSBarry Smith #else
845c6c1daeSBarry Smith   int   argc = 5;
855c6c1daeSBarry Smith   char *argv[5];
865c6c1daeSBarry Smith #endif
875c6c1daeSBarry Smith   char hostname[256];
885c6c1daeSBarry Smith   long lerr;
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith   PetscFunctionBegin;
915c6c1daeSBarry Smith   /* Link name */
925c6c1daeSBarry Smith   argv[0] = "-linkname";
93a297a907SKarl Rupp   if (!vmath->linkname) argv[1] = "math -mathlink";
94a297a907SKarl Rupp   else argv[1] = vmath->linkname;
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith   /* Link host */
975c6c1daeSBarry Smith   argv[2] = "-linkhost";
985c6c1daeSBarry Smith   if (!vmath->linkhost) {
999566063dSJacob Faibussowitsch     PetscCall(PetscGetHostName(hostname, sizeof(hostname)));
1005c6c1daeSBarry Smith     argv[3] = hostname;
101a297a907SKarl Rupp   } else argv[3] = vmath->linkhost;
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith   /* Link mode */
104519f805aSKarl Rupp #if defined(MATHEMATICA_3_0)
1055c6c1daeSBarry Smith   argv[4] = "-linkmode";
1065c6c1daeSBarry Smith   switch (vmath->linkmode) {
107d71ae5a4SJacob Faibussowitsch   case MATHEMATICA_LINK_CREATE:
108d71ae5a4SJacob Faibussowitsch     argv[5] = "Create";
109d71ae5a4SJacob Faibussowitsch     break;
110d71ae5a4SJacob Faibussowitsch   case MATHEMATICA_LINK_CONNECT:
111d71ae5a4SJacob Faibussowitsch     argv[5] = "Connect";
112d71ae5a4SJacob Faibussowitsch     break;
113d71ae5a4SJacob Faibussowitsch   case MATHEMATICA_LINK_LAUNCH:
114d71ae5a4SJacob Faibussowitsch     argv[5] = "Launch";
115d71ae5a4SJacob Faibussowitsch     break;
1165c6c1daeSBarry Smith   }
1175c6c1daeSBarry Smith #else
1185c6c1daeSBarry Smith   switch (vmath->linkmode) {
119d71ae5a4SJacob Faibussowitsch   case MATHEMATICA_LINK_CREATE:
120d71ae5a4SJacob Faibussowitsch     argv[4] = "-linkcreate";
121d71ae5a4SJacob Faibussowitsch     break;
122d71ae5a4SJacob Faibussowitsch   case MATHEMATICA_LINK_CONNECT:
123d71ae5a4SJacob Faibussowitsch     argv[4] = "-linkconnect";
124d71ae5a4SJacob Faibussowitsch     break;
125d71ae5a4SJacob Faibussowitsch   case MATHEMATICA_LINK_LAUNCH:
126d71ae5a4SJacob Faibussowitsch     argv[4] = "-linklaunch";
127d71ae5a4SJacob Faibussowitsch     break;
1285c6c1daeSBarry Smith   }
1295c6c1daeSBarry Smith #endif
1305c6c1daeSBarry Smith   vmath->link = MLOpenInEnv(mathematicaEnv, argc, argv, &lerr);
1315c6c1daeSBarry Smith #endif
1323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1335c6c1daeSBarry Smith }
1345c6c1daeSBarry Smith 
PetscViewerCreate_Mathematica(PetscViewer v)135d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Mathematica(PetscViewer v)
136d71ae5a4SJacob Faibussowitsch {
1375c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath;
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith   PetscFunctionBegin;
1409566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaInitializePackage());
1415c6c1daeSBarry Smith 
1424dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&vmath));
1435c6c1daeSBarry Smith   v->data         = (void *)vmath;
1445c6c1daeSBarry Smith   v->ops->destroy = PetscViewerDestroy_Mathematica;
1455c6c1daeSBarry Smith   v->ops->flush   = 0;
1469566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PETSC_VIEWER_MATHEMATICA, &((PetscObject)v)->type_name));
1475c6c1daeSBarry Smith 
1480298fd71SBarry Smith   vmath->linkname     = NULL;
1490298fd71SBarry Smith   vmath->linkhost     = NULL;
1505c6c1daeSBarry Smith   vmath->linkmode     = MATHEMATICA_LINK_CONNECT;
1515c6c1daeSBarry Smith   vmath->graphicsType = GRAPHICS_MOTIF;
1525c6c1daeSBarry Smith   vmath->plotType     = MATHEMATICA_TRIANGULATION_PLOT;
1530298fd71SBarry Smith   vmath->objName      = NULL;
1545c6c1daeSBarry Smith 
1559566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSetFromOptions(v));
1569566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSetupConnection_Private(v));
1573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1585c6c1daeSBarry Smith }
1595c6c1daeSBarry Smith 
PetscViewerMathematicaParseLinkMode(char * modename,LinkMode * mode)160d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerMathematicaParseLinkMode(char *modename, LinkMode *mode)
161d71ae5a4SJacob Faibussowitsch {
1625c6c1daeSBarry Smith   PetscBool isCreate, isConnect, isLaunch;
1635c6c1daeSBarry Smith 
1645c6c1daeSBarry Smith   PetscFunctionBegin;
1659566063dSJacob Faibussowitsch   PetscCall(PetscStrcasecmp(modename, "Create", &isCreate));
1669566063dSJacob Faibussowitsch   PetscCall(PetscStrcasecmp(modename, "Connect", &isConnect));
1679566063dSJacob Faibussowitsch   PetscCall(PetscStrcasecmp(modename, "Launch", &isLaunch));
168a297a907SKarl Rupp   if (isCreate) *mode = MATHEMATICA_LINK_CREATE;
169a297a907SKarl Rupp   else if (isConnect) *mode = MATHEMATICA_LINK_CONNECT;
170a297a907SKarl Rupp   else if (isLaunch) *mode = MATHEMATICA_LINK_LAUNCH;
17198921bdaSJacob Faibussowitsch   else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid Mathematica link mode: %s", modename);
1723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1735c6c1daeSBarry Smith }
1745c6c1daeSBarry Smith 
PetscViewerMathematicaSetFromOptions(PetscViewer v)175d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetFromOptions(PetscViewer v)
176d71ae5a4SJacob Faibussowitsch {
1775c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)v->data;
1785c6c1daeSBarry Smith   char                     linkname[256];
1795c6c1daeSBarry Smith   char                     modename[256];
1805c6c1daeSBarry Smith   char                     hostname[256];
1815c6c1daeSBarry Smith   char                     type[256];
1825c6c1daeSBarry Smith   PetscInt                 numPorts;
1835c6c1daeSBarry Smith   PetscInt                *ports;
1845c6c1daeSBarry Smith   PetscInt                 numHosts;
1855c6c1daeSBarry Smith   int                      h;
1865c6c1daeSBarry Smith   char                   **hosts;
1875c6c1daeSBarry Smith   PetscMPIInt              size, rank;
1885c6c1daeSBarry Smith   PetscBool                opt;
1895c6c1daeSBarry Smith 
1905c6c1daeSBarry Smith   PetscFunctionBegin;
1919566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)v), &size));
1929566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)v), &rank));
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith   /* Get link name */
1959566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString("viewer_", "-math_linkname", linkname, sizeof(linkname), &opt));
1961baa6e33SBarry Smith   if (opt) PetscCall(PetscViewerMathematicaSetLinkName(v, linkname));
1975c6c1daeSBarry Smith   /* Get link port */
1985c6c1daeSBarry Smith   numPorts = size;
1999566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(size, &ports));
2009566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetIntArray("viewer_", "-math_linkport", ports, &numPorts, &opt));
2015c6c1daeSBarry Smith   if (opt) {
202589a23caSBarry Smith     if (numPorts > rank) snprintf(linkname, sizeof(linkname), "%6d", ports[rank]);
203589a23caSBarry Smith     else snprintf(linkname, sizeof(linkname), "%6d", ports[0]);
2049566063dSJacob Faibussowitsch     PetscCall(PetscViewerMathematicaSetLinkName(v, linkname));
2055c6c1daeSBarry Smith   }
2069566063dSJacob Faibussowitsch   PetscCall(PetscFree(ports));
2075c6c1daeSBarry Smith   /* Get link host */
2085c6c1daeSBarry Smith   numHosts = size;
2099566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(size, &hosts));
2109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetStringArray("viewer_", "-math_linkhost", hosts, &numHosts, &opt));
2115c6c1daeSBarry Smith   if (opt) {
2125c6c1daeSBarry Smith     if (numHosts > rank) {
2139566063dSJacob Faibussowitsch       PetscCall(PetscStrncpy(hostname, hosts[rank], sizeof(hostname)));
2145c6c1daeSBarry Smith     } else {
2159566063dSJacob Faibussowitsch       PetscCall(PetscStrncpy(hostname, hosts[0], sizeof(hostname)));
2165c6c1daeSBarry Smith     }
2179566063dSJacob Faibussowitsch     PetscCall(PetscViewerMathematicaSetLinkHost(v, hostname));
2185c6c1daeSBarry Smith   }
21948a46eb9SPierre Jolivet   for (h = 0; h < numHosts; h++) PetscCall(PetscFree(hosts[h]));
2209566063dSJacob Faibussowitsch   PetscCall(PetscFree(hosts));
2215c6c1daeSBarry Smith   /* Get link mode */
2229566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString("viewer_", "-math_linkmode", modename, sizeof(modename), &opt));
2235c6c1daeSBarry Smith   if (opt) {
2245c6c1daeSBarry Smith     LinkMode mode;
2255c6c1daeSBarry Smith 
2269566063dSJacob Faibussowitsch     PetscCall(PetscViewerMathematicaParseLinkMode(modename, &mode));
2279566063dSJacob Faibussowitsch     PetscCall(PetscViewerMathematicaSetLinkMode(v, mode));
2285c6c1daeSBarry Smith   }
2295c6c1daeSBarry Smith   /* Get graphics type */
2309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString("viewer_", "-math_graphics", type, sizeof(type), &opt));
2315c6c1daeSBarry Smith   if (opt) {
2325c6c1daeSBarry Smith     PetscBool isMotif, isPS, isPSFile;
2335c6c1daeSBarry Smith 
2349566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "Motif", &isMotif));
2359566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "PS", &isPS));
2369566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "PSFile", &isPSFile));
237a297a907SKarl Rupp     if (isMotif) vmath->graphicsType = GRAPHICS_MOTIF;
238a297a907SKarl Rupp     else if (isPS) vmath->graphicsType = GRAPHICS_PS_STDOUT;
239a297a907SKarl Rupp     else if (isPSFile) vmath->graphicsType = GRAPHICS_PS_FILE;
2405c6c1daeSBarry Smith   }
2415c6c1daeSBarry Smith   /* Get plot type */
2429566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString("viewer_", "-math_type", type, sizeof(type), &opt));
2435c6c1daeSBarry Smith   if (opt) {
2445c6c1daeSBarry Smith     PetscBool isTri, isVecTri, isVec, isSurface;
2455c6c1daeSBarry Smith 
2469566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "Triangulation", &isTri));
2479566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "VectorTriangulation", &isVecTri));
2489566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "Vector", &isVec));
2499566063dSJacob Faibussowitsch     PetscCall(PetscStrcasecmp(type, "Surface", &isSurface));
250a297a907SKarl Rupp     if (isTri) vmath->plotType = MATHEMATICA_TRIANGULATION_PLOT;
251a297a907SKarl Rupp     else if (isVecTri) vmath->plotType = MATHEMATICA_VECTOR_TRIANGULATION_PLOT;
252a297a907SKarl Rupp     else if (isVec) vmath->plotType = MATHEMATICA_VECTOR_PLOT;
253a297a907SKarl Rupp     else if (isSurface) vmath->plotType = MATHEMATICA_SURFACE_PLOT;
2545c6c1daeSBarry Smith   }
2553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2565c6c1daeSBarry Smith }
2575c6c1daeSBarry Smith 
PetscViewerMathematicaSetLinkName(PetscViewer v,const char * name)258d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetLinkName(PetscViewer v, const char *name)
259d71ae5a4SJacob Faibussowitsch {
2605c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)v->data;
2615c6c1daeSBarry Smith 
2625c6c1daeSBarry Smith   PetscFunctionBegin;
2635c6c1daeSBarry Smith   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2644f572ea9SToby Isaac   PetscAssertPointer(name, 2);
2659566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &vmath->linkname));
2663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2675c6c1daeSBarry Smith }
2685c6c1daeSBarry Smith 
PetscViewerMathematicaSetLinkPort(PetscViewer v,int port)269d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetLinkPort(PetscViewer v, int port)
270d71ae5a4SJacob Faibussowitsch {
2715c6c1daeSBarry Smith   char name[16];
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith   PetscFunctionBegin;
2745c6c1daeSBarry Smith   snprintf(name, 16, "%6d", port);
2759566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSetLinkName(v, name));
2763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2775c6c1daeSBarry Smith }
2785c6c1daeSBarry Smith 
PetscViewerMathematicaSetLinkHost(PetscViewer v,const char * host)279d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetLinkHost(PetscViewer v, const char *host)
280d71ae5a4SJacob Faibussowitsch {
2815c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)v->data;
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith   PetscFunctionBegin;
2845c6c1daeSBarry Smith   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2854f572ea9SToby Isaac   PetscAssertPointer(host, 2);
2869566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(host, &vmath->linkhost));
2873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2885c6c1daeSBarry Smith }
2895c6c1daeSBarry Smith 
PetscViewerMathematicaSetLinkMode(PetscViewer v,LinkMode mode)290d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetLinkMode(PetscViewer v, LinkMode mode)
291d71ae5a4SJacob Faibussowitsch {
2925c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)v->data;
2935c6c1daeSBarry Smith 
2945c6c1daeSBarry Smith   PetscFunctionBegin;
2955c6c1daeSBarry Smith   vmath->linkmode = mode;
2963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2975c6c1daeSBarry Smith }
2985c6c1daeSBarry Smith 
299cc4c1da9SBarry Smith /*@
3005c6c1daeSBarry Smith   PetscViewerMathematicaOpen - Communicates with Mathemtica using MathLink.
3015c6c1daeSBarry Smith 
302d083f849SBarry Smith   Collective
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith   Input Parameters:
3055c6c1daeSBarry Smith + comm    - The MPI communicator
3065c6c1daeSBarry Smith . port    - [optional] The port to connect on, or PETSC_DECIDE
3070298fd71SBarry Smith . machine - [optional] The machine to run Mathematica on, or NULL
3080298fd71SBarry Smith - mode    - [optional] The connection mode, or NULL
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith   Output Parameter:
311aec76313SJacob Faibussowitsch . v - The Mathematica viewer
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith   Options Database Keys:
314e1bc860dSBarry Smith + -viewer_math_linkhost <machine> - The host machine for the kernel
315e1bc860dSBarry Smith . -viewer_math_linkname <name>    - The full link name for the connection
316e1bc860dSBarry Smith . -viewer_math_linkport <port>    - The port for the connection
317e1bc860dSBarry Smith . -viewer_math_mode <mode>        - The mode, e.g. Launch, Connect
318e1bc860dSBarry Smith . -viewer_math_type <type>        - The plot type, e.g. Triangulation, Vector
319e1bc860dSBarry Smith - -viewer_math_graphics <output>  - The output type, e.g. Motif, PS, PSFile
3205c6c1daeSBarry Smith 
321811af0c4SBarry Smith   Level: intermediate
322811af0c4SBarry Smith 
323811af0c4SBarry Smith   Note:
324811af0c4SBarry Smith   Most users should employ the following commands to access the
325811af0c4SBarry Smith   Mathematica viewers
326811af0c4SBarry Smith .vb
327811af0c4SBarry Smith     PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
328811af0c4SBarry Smith     MatView(Mat matrix, PetscViewer viewer)
329811af0c4SBarry Smith 
330811af0c4SBarry Smith                 or
331811af0c4SBarry Smith 
332811af0c4SBarry Smith     PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer)
333811af0c4SBarry Smith     VecView(Vec vector, PetscViewer viewer)
334811af0c4SBarry Smith .ve
335811af0c4SBarry Smith 
336811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `MatView()`, `VecView()`
3375c6c1daeSBarry Smith @*/
PetscViewerMathematicaOpen(MPI_Comm comm,int port,const char machine[],const char mode[],PetscViewer * v)338d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaOpen(MPI_Comm comm, int port, const char machine[], const char mode[], PetscViewer *v)
339d71ae5a4SJacob Faibussowitsch {
3405c6c1daeSBarry Smith   PetscFunctionBegin;
3419566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, v));
3425c6c1daeSBarry Smith #if 0
3435c6c1daeSBarry Smith   LinkMode linkmode;
3449566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSetLinkPort(*v, port));
3459566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSetLinkHost(*v, machine));
3469566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaParseLinkMode(mode, &linkmode));
3479566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSetLinkMode(*v, linkmode));
3485c6c1daeSBarry Smith #endif
3499566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*v, PETSC_VIEWER_MATHEMATICA));
3503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3515c6c1daeSBarry Smith }
3525c6c1daeSBarry Smith 
35366976f2fSJacob Faibussowitsch /*
354811af0c4SBarry Smith   PetscViewerMathematicaGetLink - Returns the link to Mathematica from a `PETSCVIEWERMATHEMATICA`
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith   Input Parameters:
357a2b725a8SWilliam Gropp + viewer - The Mathematica viewer
358a2b725a8SWilliam Gropp - link   - The link to Mathematica
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith   Level: intermediate
3615c6c1daeSBarry Smith 
362811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaOpen()`
36366976f2fSJacob Faibussowitsch */
PetscViewerMathematicaGetLink(PetscViewer viewer,MLINK * link)36466976f2fSJacob Faibussowitsch static PetscErrorCode PetscViewerMathematicaGetLink(PetscViewer viewer, MLINK *link)
365d71ae5a4SJacob Faibussowitsch {
3665c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith   PetscFunctionBegin;
3695c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
3705c6c1daeSBarry Smith   *link = vmath->link;
3713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3725c6c1daeSBarry Smith }
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith /*@C
3755c6c1daeSBarry Smith   PetscViewerMathematicaSkipPackets - Discard packets sent by Mathematica until a certain packet type is received
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith   Input Parameters:
378a2b725a8SWilliam Gropp + viewer - The Mathematica viewer
379a2b725a8SWilliam Gropp - type   - The packet type to search for, e.g RETURNPKT
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith   Level: advanced
3825c6c1daeSBarry Smith 
383811af0c4SBarry Smith .seealso: `PetscViewerMathematicaSetName()`, `PetscViewerMathematicaGetVector()`
3845c6c1daeSBarry Smith @*/
PetscViewerMathematicaSkipPackets(PetscViewer viewer,int type)385d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSkipPackets(PetscViewer viewer, int type)
386d71ae5a4SJacob Faibussowitsch {
3875c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
3885c6c1daeSBarry Smith   MLINK                    link  = vmath->link; /* The link to Mathematica */
3895c6c1daeSBarry Smith   int                      pkt;                 /* The packet type */
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith   PetscFunctionBegin;
392a297a907SKarl Rupp   while ((pkt = MLNextPacket(link)) && (pkt != type)) MLNewPacket(link);
3935c6c1daeSBarry Smith   if (!pkt) {
3945c6c1daeSBarry Smith     MLClearError(link);
3955c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, (char *)MLErrorMessage(link));
3965c6c1daeSBarry Smith   }
3973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3985c6c1daeSBarry Smith }
3995c6c1daeSBarry Smith 
4005c6c1daeSBarry Smith /*@C
401811af0c4SBarry Smith   PetscViewerMathematicaGetName - Retrieve the default name for objects communicated to Mathematica via `PETSCVIEWERMATHEMATICA`
4025c6c1daeSBarry Smith 
4035c6c1daeSBarry Smith   Input Parameter:
4045c6c1daeSBarry Smith . viewer - The Mathematica viewer
4055c6c1daeSBarry Smith 
4065c6c1daeSBarry Smith   Output Parameter:
4075c6c1daeSBarry Smith . name - The name for new objects created in Mathematica
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith   Level: intermediate
4105c6c1daeSBarry Smith 
411811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaSetName()`, `PetscViewerMathematicaClearName()`
4125c6c1daeSBarry Smith @*/
PetscViewerMathematicaGetName(PetscViewer viewer,const char ** name)413d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaGetName(PetscViewer viewer, const char **name)
414d71ae5a4SJacob Faibussowitsch {
4155c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith   PetscFunctionBegin;
4185c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4194f572ea9SToby Isaac   PetscAssertPointer(name, 2);
4205c6c1daeSBarry Smith   *name = vmath->objName;
4213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4225c6c1daeSBarry Smith }
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith /*@C
425811af0c4SBarry Smith   PetscViewerMathematicaSetName - Override the default name for objects communicated to Mathematica via `PETSCVIEWERMATHEMATICA`
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith   Input Parameters:
428a2b725a8SWilliam Gropp + viewer - The Mathematica viewer
429a2b725a8SWilliam Gropp - name   - The name for new objects created in Mathematica
4305c6c1daeSBarry Smith 
4315c6c1daeSBarry Smith   Level: intermediate
4325c6c1daeSBarry Smith 
43342747ad1SJacob Faibussowitsch .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaClearName()`
4345c6c1daeSBarry Smith @*/
PetscViewerMathematicaSetName(PetscViewer viewer,const char name[])435d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetName(PetscViewer viewer, const char name[])
436d71ae5a4SJacob Faibussowitsch {
4375c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
4385c6c1daeSBarry Smith 
4395c6c1daeSBarry Smith   PetscFunctionBegin;
4405c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4414f572ea9SToby Isaac   PetscAssertPointer(name, 2);
4425c6c1daeSBarry Smith   vmath->objName = name;
4433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4445c6c1daeSBarry Smith }
4455c6c1daeSBarry Smith 
446811af0c4SBarry Smith /*@
4475c6c1daeSBarry Smith   PetscViewerMathematicaClearName - Use the default name for objects communicated to Mathematica
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith   Input Parameter:
4505c6c1daeSBarry Smith . viewer - The Mathematica viewer
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith   Level: intermediate
4535c6c1daeSBarry Smith 
454811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaGetName()`, `PetscViewerMathematicaSetName()`
4555c6c1daeSBarry Smith @*/
PetscViewerMathematicaClearName(PetscViewer viewer)456d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaClearName(PetscViewer viewer)
457d71ae5a4SJacob Faibussowitsch {
4585c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith   PetscFunctionBegin;
4615c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4620298fd71SBarry Smith   vmath->objName = NULL;
4633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4645c6c1daeSBarry Smith }
4655c6c1daeSBarry Smith 
PetscViewerMathematicaPutMatrix(PetscViewer viewer,int m,int n,PetscReal * a)466d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer viewer, int m, int n, PetscReal *a)
467d71ae5a4SJacob Faibussowitsch {
4685c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
4695c6c1daeSBarry Smith   MLINK                    link  = vmath->link; /* The link to Mathematica */
4705c6c1daeSBarry Smith   char                    *name;
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith   PetscFunctionBegin;
4735c6c1daeSBarry Smith   /* Determine the object name */
474a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
475a297a907SKarl Rupp   else name = (char *)vmath->objName;
4765c6c1daeSBarry Smith 
4775c6c1daeSBarry Smith   /* Send the dense matrix object */
4785c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
4795c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
4805c6c1daeSBarry Smith   MLPutSymbol(link, name);
4815c6c1daeSBarry Smith   MLPutFunction(link, "Transpose", 1);
4825c6c1daeSBarry Smith   MLPutFunction(link, "Partition", 2);
4835c6c1daeSBarry Smith   MLPutRealList(link, a, m * n);
4845c6c1daeSBarry Smith   MLPutInteger(link, m);
4855c6c1daeSBarry Smith   MLEndPacket(link);
4865c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
4879566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT));
4885c6c1daeSBarry Smith   /* Skip ReturnPacket */
4895c6c1daeSBarry Smith   MLNewPacket(link);
4903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4915c6c1daeSBarry Smith }
4925c6c1daeSBarry Smith 
PetscViewerMathematicaPutCSRMatrix(PetscViewer viewer,int m,int n,int * i,int * j,PetscReal * a)493d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer viewer, int m, int n, int *i, int *j, PetscReal *a)
494d71ae5a4SJacob Faibussowitsch {
4955c6c1daeSBarry Smith   PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data;
4965c6c1daeSBarry Smith   MLINK                    link  = vmath->link; /* The link to Mathematica */
4975c6c1daeSBarry Smith   const char              *symbol;
4985c6c1daeSBarry Smith   char                    *name;
4995c6c1daeSBarry Smith   PetscBool                match;
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith   PetscFunctionBegin;
5025c6c1daeSBarry Smith   /* Determine the object name */
503a297a907SKarl Rupp   if (!vmath->objName) name = "mat";
504a297a907SKarl Rupp   else name = (char *)vmath->objName;
5055c6c1daeSBarry Smith 
5065c6c1daeSBarry Smith   /* Make sure Mathematica recognizes sparse matrices */
5075c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5085c6c1daeSBarry Smith   MLPutFunction(link, "Needs", 1);
5095c6c1daeSBarry Smith   MLPutString(link, "LinearAlgebra`CSRMatrix`");
5105c6c1daeSBarry Smith   MLEndPacket(link);
5115c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
5129566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT));
5135c6c1daeSBarry Smith   /* Skip ReturnPacket */
5145c6c1daeSBarry Smith   MLNewPacket(link);
5155c6c1daeSBarry Smith 
5165c6c1daeSBarry Smith   /* Send the CSRMatrix object */
5175c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5185c6c1daeSBarry Smith   MLPutFunction(link, "Set", 2);
5195c6c1daeSBarry Smith   MLPutSymbol(link, name);
5205c6c1daeSBarry Smith   MLPutFunction(link, "CSRMatrix", 5);
5215c6c1daeSBarry Smith   MLPutInteger(link, m);
5225c6c1daeSBarry Smith   MLPutInteger(link, n);
5235c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
5245c6c1daeSBarry Smith   MLPutIntegerList(link, i, m + 1);
5255c6c1daeSBarry Smith   MLPutInteger(link, 1);
5265c6c1daeSBarry Smith   MLPutFunction(link, "Plus", 2);
5275c6c1daeSBarry Smith   MLPutIntegerList(link, j, i[m]);
5285c6c1daeSBarry Smith   MLPutInteger(link, 1);
5295c6c1daeSBarry Smith   MLPutRealList(link, a, i[m]);
5305c6c1daeSBarry Smith   MLEndPacket(link);
5315c6c1daeSBarry Smith   /* Skip packets until ReturnPacket */
5329566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT));
5335c6c1daeSBarry Smith   /* Skip ReturnPacket */
5345c6c1daeSBarry Smith   MLNewPacket(link);
5355c6c1daeSBarry Smith 
5365c6c1daeSBarry Smith   /* Check that matrix is valid */
5375c6c1daeSBarry Smith   MLPutFunction(link, "EvaluatePacket", 1);
5385c6c1daeSBarry Smith   MLPutFunction(link, "ValidQ", 1);
5395c6c1daeSBarry Smith   MLPutSymbol(link, name);
5405c6c1daeSBarry Smith   MLEndPacket(link);
5419566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT));
5425c6c1daeSBarry Smith   MLGetSymbol(link, &symbol);
5439566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp("True", (char *)symbol, &match));
5445c6c1daeSBarry Smith   if (!match) {
5455c6c1daeSBarry Smith     MLDisownSymbol(link, symbol);
5465c6c1daeSBarry Smith     SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid CSR matrix in Mathematica");
5475c6c1daeSBarry Smith   }
5485c6c1daeSBarry Smith   MLDisownSymbol(link, symbol);
5495c6c1daeSBarry Smith   /* Skip ReturnPacket */
5505c6c1daeSBarry Smith   MLNewPacket(link);
5513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5525c6c1daeSBarry Smith }
553