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