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 @*/ 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 @*/ 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 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 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 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 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 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 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 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 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 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 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 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 2995c6c1daeSBarry Smith /*----------------------------------------- Public Functions --------------------------------------------------------*/ 300cc4c1da9SBarry Smith /*@ 3015c6c1daeSBarry Smith PetscViewerMathematicaOpen - Communicates with Mathemtica using MathLink. 3025c6c1daeSBarry Smith 303d083f849SBarry Smith Collective 3045c6c1daeSBarry Smith 3055c6c1daeSBarry Smith Input Parameters: 3065c6c1daeSBarry Smith + comm - The MPI communicator 3075c6c1daeSBarry Smith . port - [optional] The port to connect on, or PETSC_DECIDE 3080298fd71SBarry Smith . machine - [optional] The machine to run Mathematica on, or NULL 3090298fd71SBarry Smith - mode - [optional] The connection mode, or NULL 3105c6c1daeSBarry Smith 3115c6c1daeSBarry Smith Output Parameter: 312aec76313SJacob Faibussowitsch . v - The Mathematica viewer 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith Options Database Keys: 315e1bc860dSBarry Smith + -viewer_math_linkhost <machine> - The host machine for the kernel 316e1bc860dSBarry Smith . -viewer_math_linkname <name> - The full link name for the connection 317e1bc860dSBarry Smith . -viewer_math_linkport <port> - The port for the connection 318e1bc860dSBarry Smith . -viewer_math_mode <mode> - The mode, e.g. Launch, Connect 319e1bc860dSBarry Smith . -viewer_math_type <type> - The plot type, e.g. Triangulation, Vector 320e1bc860dSBarry Smith - -viewer_math_graphics <output> - The output type, e.g. Motif, PS, PSFile 3215c6c1daeSBarry Smith 322811af0c4SBarry Smith Level: intermediate 323811af0c4SBarry Smith 324811af0c4SBarry Smith Note: 325811af0c4SBarry Smith Most users should employ the following commands to access the 326811af0c4SBarry Smith Mathematica viewers 327811af0c4SBarry Smith .vb 328811af0c4SBarry Smith PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer) 329811af0c4SBarry Smith MatView(Mat matrix, PetscViewer viewer) 330811af0c4SBarry Smith 331811af0c4SBarry Smith or 332811af0c4SBarry Smith 333811af0c4SBarry Smith PetscViewerMathematicaOpen(MPI_Comm comm, int port, char *machine, char *mode, PetscViewer &viewer) 334811af0c4SBarry Smith VecView(Vec vector, PetscViewer viewer) 335811af0c4SBarry Smith .ve 336811af0c4SBarry Smith 337811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `MatView()`, `VecView()` 3385c6c1daeSBarry Smith @*/ 339d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaOpen(MPI_Comm comm, int port, const char machine[], const char mode[], PetscViewer *v) 340d71ae5a4SJacob Faibussowitsch { 3415c6c1daeSBarry Smith PetscFunctionBegin; 3429566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, v)); 3435c6c1daeSBarry Smith #if 0 3445c6c1daeSBarry Smith LinkMode linkmode; 3459566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSetLinkPort(*v, port)); 3469566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSetLinkHost(*v, machine)); 3479566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaParseLinkMode(mode, &linkmode)); 3489566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSetLinkMode(*v, linkmode)); 3495c6c1daeSBarry Smith #endif 3509566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*v, PETSC_VIEWER_MATHEMATICA)); 3513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3525c6c1daeSBarry Smith } 3535c6c1daeSBarry Smith 35466976f2fSJacob Faibussowitsch /* 355811af0c4SBarry Smith PetscViewerMathematicaGetLink - Returns the link to Mathematica from a `PETSCVIEWERMATHEMATICA` 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Input Parameters: 358a2b725a8SWilliam Gropp + viewer - The Mathematica viewer 359a2b725a8SWilliam Gropp - link - The link to Mathematica 3605c6c1daeSBarry Smith 3615c6c1daeSBarry Smith Level: intermediate 3625c6c1daeSBarry Smith 363811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaOpen()` 36466976f2fSJacob Faibussowitsch */ 36566976f2fSJacob Faibussowitsch static PetscErrorCode PetscViewerMathematicaGetLink(PetscViewer viewer, MLINK *link) 366d71ae5a4SJacob Faibussowitsch { 3675c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 3685c6c1daeSBarry Smith 3695c6c1daeSBarry Smith PetscFunctionBegin; 3705c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 3715c6c1daeSBarry Smith *link = vmath->link; 3723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3735c6c1daeSBarry Smith } 3745c6c1daeSBarry Smith 3755c6c1daeSBarry Smith /*@C 3765c6c1daeSBarry Smith PetscViewerMathematicaSkipPackets - Discard packets sent by Mathematica until a certain packet type is received 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith Input Parameters: 379a2b725a8SWilliam Gropp + viewer - The Mathematica viewer 380a2b725a8SWilliam Gropp - type - The packet type to search for, e.g RETURNPKT 3815c6c1daeSBarry Smith 3825c6c1daeSBarry Smith Level: advanced 3835c6c1daeSBarry Smith 384811af0c4SBarry Smith .seealso: `PetscViewerMathematicaSetName()`, `PetscViewerMathematicaGetVector()` 3855c6c1daeSBarry Smith @*/ 386d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSkipPackets(PetscViewer viewer, int type) 387d71ae5a4SJacob Faibussowitsch { 3885c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 3895c6c1daeSBarry Smith MLINK link = vmath->link; /* The link to Mathematica */ 3905c6c1daeSBarry Smith int pkt; /* The packet type */ 3915c6c1daeSBarry Smith 3925c6c1daeSBarry Smith PetscFunctionBegin; 393a297a907SKarl Rupp while ((pkt = MLNextPacket(link)) && (pkt != type)) MLNewPacket(link); 3945c6c1daeSBarry Smith if (!pkt) { 3955c6c1daeSBarry Smith MLClearError(link); 3965c6c1daeSBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, (char *)MLErrorMessage(link)); 3975c6c1daeSBarry Smith } 3983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3995c6c1daeSBarry Smith } 4005c6c1daeSBarry Smith 4015c6c1daeSBarry Smith /*@C 402811af0c4SBarry Smith PetscViewerMathematicaGetName - Retrieve the default name for objects communicated to Mathematica via `PETSCVIEWERMATHEMATICA` 4035c6c1daeSBarry Smith 4045c6c1daeSBarry Smith Input Parameter: 4055c6c1daeSBarry Smith . viewer - The Mathematica viewer 4065c6c1daeSBarry Smith 4075c6c1daeSBarry Smith Output Parameter: 4085c6c1daeSBarry Smith . name - The name for new objects created in Mathematica 4095c6c1daeSBarry Smith 4105c6c1daeSBarry Smith Level: intermediate 4115c6c1daeSBarry Smith 412811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaSetName()`, `PetscViewerMathematicaClearName()` 4135c6c1daeSBarry Smith @*/ 414d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaGetName(PetscViewer viewer, const char **name) 415d71ae5a4SJacob Faibussowitsch { 4165c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 4175c6c1daeSBarry Smith 4185c6c1daeSBarry Smith PetscFunctionBegin; 4195c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4204f572ea9SToby Isaac PetscAssertPointer(name, 2); 4215c6c1daeSBarry Smith *name = vmath->objName; 4223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4235c6c1daeSBarry Smith } 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith /*@C 426811af0c4SBarry Smith PetscViewerMathematicaSetName - Override the default name for objects communicated to Mathematica via `PETSCVIEWERMATHEMATICA` 4275c6c1daeSBarry Smith 4285c6c1daeSBarry Smith Input Parameters: 429a2b725a8SWilliam Gropp + viewer - The Mathematica viewer 430a2b725a8SWilliam Gropp - name - The name for new objects created in Mathematica 4315c6c1daeSBarry Smith 4325c6c1daeSBarry Smith Level: intermediate 4335c6c1daeSBarry Smith 43442747ad1SJacob Faibussowitsch .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaClearName()` 4355c6c1daeSBarry Smith @*/ 436d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaSetName(PetscViewer viewer, const char name[]) 437d71ae5a4SJacob Faibussowitsch { 4385c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 4395c6c1daeSBarry Smith 4405c6c1daeSBarry Smith PetscFunctionBegin; 4415c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4424f572ea9SToby Isaac PetscAssertPointer(name, 2); 4435c6c1daeSBarry Smith vmath->objName = name; 4443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4455c6c1daeSBarry Smith } 4465c6c1daeSBarry Smith 447811af0c4SBarry Smith /*@ 4485c6c1daeSBarry Smith PetscViewerMathematicaClearName - Use the default name for objects communicated to Mathematica 4495c6c1daeSBarry Smith 4505c6c1daeSBarry Smith Input Parameter: 4515c6c1daeSBarry Smith . viewer - The Mathematica viewer 4525c6c1daeSBarry Smith 4535c6c1daeSBarry Smith Level: intermediate 4545c6c1daeSBarry Smith 455811af0c4SBarry Smith .seealso: `PETSCVIEWERMATHEMATICA`, `PetscViewerMathematicaGetName()`, `PetscViewerMathematicaSetName()` 4565c6c1daeSBarry Smith @*/ 457d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaClearName(PetscViewer viewer) 458d71ae5a4SJacob Faibussowitsch { 4595c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 4605c6c1daeSBarry Smith 4615c6c1daeSBarry Smith PetscFunctionBegin; 4625c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4630298fd71SBarry Smith vmath->objName = NULL; 4643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4655c6c1daeSBarry Smith } 4665c6c1daeSBarry Smith 467d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaPutMatrix(PetscViewer viewer, int m, int n, PetscReal *a) 468d71ae5a4SJacob Faibussowitsch { 4695c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 4705c6c1daeSBarry Smith MLINK link = vmath->link; /* The link to Mathematica */ 4715c6c1daeSBarry Smith char *name; 4725c6c1daeSBarry Smith 4735c6c1daeSBarry Smith PetscFunctionBegin; 4745c6c1daeSBarry Smith /* Determine the object name */ 475a297a907SKarl Rupp if (!vmath->objName) name = "mat"; 476a297a907SKarl Rupp else name = (char *)vmath->objName; 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith /* Send the dense matrix object */ 4795c6c1daeSBarry Smith MLPutFunction(link, "EvaluatePacket", 1); 4805c6c1daeSBarry Smith MLPutFunction(link, "Set", 2); 4815c6c1daeSBarry Smith MLPutSymbol(link, name); 4825c6c1daeSBarry Smith MLPutFunction(link, "Transpose", 1); 4835c6c1daeSBarry Smith MLPutFunction(link, "Partition", 2); 4845c6c1daeSBarry Smith MLPutRealList(link, a, m * n); 4855c6c1daeSBarry Smith MLPutInteger(link, m); 4865c6c1daeSBarry Smith MLEndPacket(link); 4875c6c1daeSBarry Smith /* Skip packets until ReturnPacket */ 4889566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT)); 4895c6c1daeSBarry Smith /* Skip ReturnPacket */ 4905c6c1daeSBarry Smith MLNewPacket(link); 4913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4925c6c1daeSBarry Smith } 4935c6c1daeSBarry Smith 494d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerMathematicaPutCSRMatrix(PetscViewer viewer, int m, int n, int *i, int *j, PetscReal *a) 495d71ae5a4SJacob Faibussowitsch { 4965c6c1daeSBarry Smith PetscViewer_Mathematica *vmath = (PetscViewer_Mathematica *)viewer->data; 4975c6c1daeSBarry Smith MLINK link = vmath->link; /* The link to Mathematica */ 4985c6c1daeSBarry Smith const char *symbol; 4995c6c1daeSBarry Smith char *name; 5005c6c1daeSBarry Smith PetscBool match; 5015c6c1daeSBarry Smith 5025c6c1daeSBarry Smith PetscFunctionBegin; 5035c6c1daeSBarry Smith /* Determine the object name */ 504a297a907SKarl Rupp if (!vmath->objName) name = "mat"; 505a297a907SKarl Rupp else name = (char *)vmath->objName; 5065c6c1daeSBarry Smith 5075c6c1daeSBarry Smith /* Make sure Mathematica recognizes sparse matrices */ 5085c6c1daeSBarry Smith MLPutFunction(link, "EvaluatePacket", 1); 5095c6c1daeSBarry Smith MLPutFunction(link, "Needs", 1); 5105c6c1daeSBarry Smith MLPutString(link, "LinearAlgebra`CSRMatrix`"); 5115c6c1daeSBarry Smith MLEndPacket(link); 5125c6c1daeSBarry Smith /* Skip packets until ReturnPacket */ 5139566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT)); 5145c6c1daeSBarry Smith /* Skip ReturnPacket */ 5155c6c1daeSBarry Smith MLNewPacket(link); 5165c6c1daeSBarry Smith 5175c6c1daeSBarry Smith /* Send the CSRMatrix object */ 5185c6c1daeSBarry Smith MLPutFunction(link, "EvaluatePacket", 1); 5195c6c1daeSBarry Smith MLPutFunction(link, "Set", 2); 5205c6c1daeSBarry Smith MLPutSymbol(link, name); 5215c6c1daeSBarry Smith MLPutFunction(link, "CSRMatrix", 5); 5225c6c1daeSBarry Smith MLPutInteger(link, m); 5235c6c1daeSBarry Smith MLPutInteger(link, n); 5245c6c1daeSBarry Smith MLPutFunction(link, "Plus", 2); 5255c6c1daeSBarry Smith MLPutIntegerList(link, i, m + 1); 5265c6c1daeSBarry Smith MLPutInteger(link, 1); 5275c6c1daeSBarry Smith MLPutFunction(link, "Plus", 2); 5285c6c1daeSBarry Smith MLPutIntegerList(link, j, i[m]); 5295c6c1daeSBarry Smith MLPutInteger(link, 1); 5305c6c1daeSBarry Smith MLPutRealList(link, a, i[m]); 5315c6c1daeSBarry Smith MLEndPacket(link); 5325c6c1daeSBarry Smith /* Skip packets until ReturnPacket */ 5339566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT)); 5345c6c1daeSBarry Smith /* Skip ReturnPacket */ 5355c6c1daeSBarry Smith MLNewPacket(link); 5365c6c1daeSBarry Smith 5375c6c1daeSBarry Smith /* Check that matrix is valid */ 5385c6c1daeSBarry Smith MLPutFunction(link, "EvaluatePacket", 1); 5395c6c1daeSBarry Smith MLPutFunction(link, "ValidQ", 1); 5405c6c1daeSBarry Smith MLPutSymbol(link, name); 5415c6c1daeSBarry Smith MLEndPacket(link); 5429566063dSJacob Faibussowitsch PetscCall(PetscViewerMathematicaSkipPackets(viewer, RETURNPKT)); 5435c6c1daeSBarry Smith MLGetSymbol(link, &symbol); 5449566063dSJacob Faibussowitsch PetscCall(PetscStrcmp("True", (char *)symbol, &match)); 5455c6c1daeSBarry Smith if (!match) { 5465c6c1daeSBarry Smith MLDisownSymbol(link, symbol); 5475c6c1daeSBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid CSR matrix in Mathematica"); 5485c6c1daeSBarry Smith } 5495c6c1daeSBarry Smith MLDisownSymbol(link, symbol); 5505c6c1daeSBarry Smith /* Skip ReturnPacket */ 5515c6c1daeSBarry Smith MLNewPacket(link); 5523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5535c6c1daeSBarry Smith } 554