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