1*5c6c1daeSBarry Smith static const char help[] = "Tests PETSc -- Mathematica connection\n"; 2*5c6c1daeSBarry Smith #include <petscksp.h> 3*5c6c1daeSBarry Smith #include <mathlink.h> 4*5c6c1daeSBarry Smith 5*5c6c1daeSBarry Smith typedef enum {MATHEMATICA_LINK_CREATE, MATHEMATICA_LINK_CONNECT, MATHEMATICA_LINK_LAUNCH} LinkMode; 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith #undef __FUNCT__ 8*5c6c1daeSBarry Smith #define __FUNCT__ "setupConnection" 9*5c6c1daeSBarry Smith static int setupConnection(MLENV *env, MLINK *link, const char *linkhost, LinkMode linkmode) { 10*5c6c1daeSBarry Smith int argc = 5; 11*5c6c1daeSBarry Smith char *argv[5]; 12*5c6c1daeSBarry Smith char hostname[256]; 13*5c6c1daeSBarry Smith long lerr; 14*5c6c1daeSBarry Smith int ierr; 15*5c6c1daeSBarry Smith 16*5c6c1daeSBarry Smith PetscFunctionBegin; 17*5c6c1daeSBarry Smith /* Link name */ 18*5c6c1daeSBarry Smith argv[0] = "-linkname"; 19*5c6c1daeSBarry Smith argv[1] = "8001"; 20*5c6c1daeSBarry Smith /* Link host */ 21*5c6c1daeSBarry Smith argv[2] = "-linkhost"; 22*5c6c1daeSBarry Smith if (!linkhost) { 23*5c6c1daeSBarry Smith ierr = PetscGetHostName(hostname, 255); CHKERRQ(ierr); 24*5c6c1daeSBarry Smith argv[3] = hostname; 25*5c6c1daeSBarry Smith } else { 26*5c6c1daeSBarry Smith argv[3] = (char *) linkhost; 27*5c6c1daeSBarry Smith } 28*5c6c1daeSBarry Smith /* Link mode */ 29*5c6c1daeSBarry Smith switch(linkmode) { 30*5c6c1daeSBarry Smith case MATHEMATICA_LINK_CREATE: 31*5c6c1daeSBarry Smith argv[4] = "-linkcreate"; 32*5c6c1daeSBarry Smith break; 33*5c6c1daeSBarry Smith case MATHEMATICA_LINK_CONNECT: 34*5c6c1daeSBarry Smith argv[4] = "-linkconnect"; 35*5c6c1daeSBarry Smith break; 36*5c6c1daeSBarry Smith case MATHEMATICA_LINK_LAUNCH: 37*5c6c1daeSBarry Smith argv[4] = "-linklaunch"; 38*5c6c1daeSBarry Smith break; 39*5c6c1daeSBarry Smith } 40*5c6c1daeSBarry Smith 41*5c6c1daeSBarry Smith *env = MLInitialize(0); 42*5c6c1daeSBarry Smith for (lerr = 0; lerr < argc; lerr++) { 43*5c6c1daeSBarry Smith printf("argv[%ld] = %s\n", lerr, argv[lerr]); 44*5c6c1daeSBarry Smith } 45*5c6c1daeSBarry Smith *link = MLOpenInEnv(*env, argc, argv, &lerr); 46*5c6c1daeSBarry Smith printf("lerr = %ld\n", lerr); 47*5c6c1daeSBarry Smith PetscFunctionReturn(0); 48*5c6c1daeSBarry Smith } 49*5c6c1daeSBarry Smith 50*5c6c1daeSBarry Smith #undef __FUNCT__ 51*5c6c1daeSBarry Smith #define __FUNCT__ "printIndent" 52*5c6c1daeSBarry Smith static int printIndent(int indent) { 53*5c6c1daeSBarry Smith int i; 54*5c6c1daeSBarry Smith 55*5c6c1daeSBarry Smith PetscFunctionBegin; 56*5c6c1daeSBarry Smith for (i = 0; i < indent; i++) printf(" "); 57*5c6c1daeSBarry Smith PetscFunctionReturn(0); 58*5c6c1daeSBarry Smith } 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith #undef __FUNCT__ 61*5c6c1daeSBarry Smith #define __FUNCT__ "processPacket" 62*5c6c1daeSBarry Smith static int processPacket(MLINK link, int indent) { 63*5c6c1daeSBarry Smith static int isHead = 0; 64*5c6c1daeSBarry Smith int tokenType = MLGetNext(link); 65*5c6c1daeSBarry Smith int ierr; 66*5c6c1daeSBarry Smith 67*5c6c1daeSBarry Smith PetscFunctionBegin; 68*5c6c1daeSBarry Smith ierr = printIndent(indent); CHKERRQ(ierr); 69*5c6c1daeSBarry Smith switch(tokenType) { 70*5c6c1daeSBarry Smith case MLTKFUNC: 71*5c6c1daeSBarry Smith { 72*5c6c1daeSBarry Smith long numArguments; 73*5c6c1daeSBarry Smith int arg; 74*5c6c1daeSBarry Smith 75*5c6c1daeSBarry Smith printf("Function:\n"); 76*5c6c1daeSBarry Smith MLGetArgCount(link, &numArguments); 77*5c6c1daeSBarry Smith /* Process head */ 78*5c6c1daeSBarry Smith printf(" Head:\n"); 79*5c6c1daeSBarry Smith isHead = 1; 80*5c6c1daeSBarry Smith ierr = processPacket(link, indent+4); 81*5c6c1daeSBarry Smith if (ierr) PetscFunctionReturn(ierr); 82*5c6c1daeSBarry Smith isHead = 0; 83*5c6c1daeSBarry Smith /* Process arguments */ 84*5c6c1daeSBarry Smith printf(" Arguments:\n"); 85*5c6c1daeSBarry Smith for (arg = 0; arg < numArguments; arg++) { 86*5c6c1daeSBarry Smith ierr = processPacket(link, indent+4); CHKERRQ(ierr); 87*5c6c1daeSBarry Smith } 88*5c6c1daeSBarry Smith } 89*5c6c1daeSBarry Smith break; 90*5c6c1daeSBarry Smith case MLTKSYM: 91*5c6c1daeSBarry Smith { 92*5c6c1daeSBarry Smith const char *symbol; 93*5c6c1daeSBarry Smith 94*5c6c1daeSBarry Smith MLGetSymbol(link, &symbol); 95*5c6c1daeSBarry Smith printf("Symbol: %s\n", symbol); 96*5c6c1daeSBarry Smith if (isHead && !strcmp(symbol, "Shutdown")) { 97*5c6c1daeSBarry Smith MLDisownSymbol(link, symbol); 98*5c6c1daeSBarry Smith PetscFunctionReturn(2); 99*5c6c1daeSBarry Smith } 100*5c6c1daeSBarry Smith MLDisownSymbol(link, symbol); 101*5c6c1daeSBarry Smith } 102*5c6c1daeSBarry Smith break; 103*5c6c1daeSBarry Smith case MLTKINT: 104*5c6c1daeSBarry Smith { 105*5c6c1daeSBarry Smith int i; 106*5c6c1daeSBarry Smith 107*5c6c1daeSBarry Smith MLGetInteger(link, &i); 108*5c6c1daeSBarry Smith printf("Integer: %d\n", i); 109*5c6c1daeSBarry Smith } 110*5c6c1daeSBarry Smith break; 111*5c6c1daeSBarry Smith case MLTKREAL: 112*5c6c1daeSBarry Smith { 113*5c6c1daeSBarry Smith double r; 114*5c6c1daeSBarry Smith 115*5c6c1daeSBarry Smith MLGetReal(link, &r); 116*5c6c1daeSBarry Smith printf("Real: %g\n", r); 117*5c6c1daeSBarry Smith } 118*5c6c1daeSBarry Smith break; 119*5c6c1daeSBarry Smith case MLTKSTR: 120*5c6c1daeSBarry Smith { 121*5c6c1daeSBarry Smith const char *string; 122*5c6c1daeSBarry Smith 123*5c6c1daeSBarry Smith MLGetString(link, &string); 124*5c6c1daeSBarry Smith printf("String: %s\n", string); 125*5c6c1daeSBarry Smith MLDisownString(link, string); 126*5c6c1daeSBarry Smith } 127*5c6c1daeSBarry Smith break; 128*5c6c1daeSBarry Smith default: 129*5c6c1daeSBarry Smith printf("Unknown code %d\n", tokenType); 130*5c6c1daeSBarry Smith MLClearError(link); 131*5c6c1daeSBarry Smith fprintf(stderr, "ERROR: %s\n", (char *) MLErrorMessage(link)); 132*5c6c1daeSBarry Smith PetscFunctionReturn(1); 133*5c6c1daeSBarry Smith } 134*5c6c1daeSBarry Smith PetscFunctionReturn(0); 135*5c6c1daeSBarry Smith } 136*5c6c1daeSBarry Smith 137*5c6c1daeSBarry Smith #undef __FUNCT__ 138*5c6c1daeSBarry Smith #define __FUNCT__ "processPackets" 139*5c6c1daeSBarry Smith static int processPackets(MLINK link) { 140*5c6c1daeSBarry Smith int packetType; 141*5c6c1daeSBarry Smith int loop = 1; 142*5c6c1daeSBarry Smith int errors = 0; 143*5c6c1daeSBarry Smith int ierr; 144*5c6c1daeSBarry Smith 145*5c6c1daeSBarry Smith PetscFunctionBegin; 146*5c6c1daeSBarry Smith while(loop) { 147*5c6c1daeSBarry Smith while((packetType = MLNextPacket(link)) && (packetType != RETURNPKT)) { 148*5c6c1daeSBarry Smith switch(packetType) { 149*5c6c1daeSBarry Smith case BEGINDLGPKT: 150*5c6c1daeSBarry Smith printf("Begin dialog packet\n"); 151*5c6c1daeSBarry Smith break; 152*5c6c1daeSBarry Smith case CALLPKT: 153*5c6c1daeSBarry Smith printf("Call packet\n"); 154*5c6c1daeSBarry Smith break; 155*5c6c1daeSBarry Smith case DISPLAYPKT: 156*5c6c1daeSBarry Smith printf("Display packet\n"); 157*5c6c1daeSBarry Smith break; 158*5c6c1daeSBarry Smith case DISPLAYENDPKT: 159*5c6c1daeSBarry Smith printf("Display end packet\n"); 160*5c6c1daeSBarry Smith break; 161*5c6c1daeSBarry Smith case ENDDLGPKT: 162*5c6c1daeSBarry Smith printf("End dialog packet\n"); 163*5c6c1daeSBarry Smith break; 164*5c6c1daeSBarry Smith case ENTERTEXTPKT: 165*5c6c1daeSBarry Smith printf("Enter text packet\n"); 166*5c6c1daeSBarry Smith break; 167*5c6c1daeSBarry Smith case ENTEREXPRPKT: 168*5c6c1daeSBarry Smith printf("Enter expression packet\n"); 169*5c6c1daeSBarry Smith break; 170*5c6c1daeSBarry Smith case EVALUATEPKT: 171*5c6c1daeSBarry Smith printf("Evaluate packet\n"); 172*5c6c1daeSBarry Smith break; 173*5c6c1daeSBarry Smith case INPUTPKT: 174*5c6c1daeSBarry Smith printf("Input packet\n"); 175*5c6c1daeSBarry Smith break; 176*5c6c1daeSBarry Smith case INPUTNAMEPKT: 177*5c6c1daeSBarry Smith printf("Input name packet\n"); 178*5c6c1daeSBarry Smith break; 179*5c6c1daeSBarry Smith case INPUTSTRPKT: 180*5c6c1daeSBarry Smith printf("Input string packet\n"); 181*5c6c1daeSBarry Smith break; 182*5c6c1daeSBarry Smith case MENUPKT: 183*5c6c1daeSBarry Smith printf("Menu packet\n"); 184*5c6c1daeSBarry Smith break; 185*5c6c1daeSBarry Smith case MESSAGEPKT: 186*5c6c1daeSBarry Smith printf("Message packet\n"); 187*5c6c1daeSBarry Smith break; 188*5c6c1daeSBarry Smith case OUTPUTNAMEPKT: 189*5c6c1daeSBarry Smith printf("Output name packet\n"); 190*5c6c1daeSBarry Smith break; 191*5c6c1daeSBarry Smith case RESUMEPKT: 192*5c6c1daeSBarry Smith printf("Resume packet\n"); 193*5c6c1daeSBarry Smith break; 194*5c6c1daeSBarry Smith case RETURNTEXTPKT: 195*5c6c1daeSBarry Smith printf("Return text packet\n"); 196*5c6c1daeSBarry Smith break; 197*5c6c1daeSBarry Smith case RETURNEXPRPKT: 198*5c6c1daeSBarry Smith printf("Return expression packet\n"); 199*5c6c1daeSBarry Smith break; 200*5c6c1daeSBarry Smith case SUSPENDPKT: 201*5c6c1daeSBarry Smith printf("Suspend packet\n"); 202*5c6c1daeSBarry Smith break; 203*5c6c1daeSBarry Smith case SYNTAXPKT: 204*5c6c1daeSBarry Smith printf("Syntax packet\n"); 205*5c6c1daeSBarry Smith break; 206*5c6c1daeSBarry Smith case TEXTPKT: 207*5c6c1daeSBarry Smith printf("Text packet\n"); 208*5c6c1daeSBarry Smith break; 209*5c6c1daeSBarry Smith } 210*5c6c1daeSBarry Smith MLNewPacket(link); 211*5c6c1daeSBarry Smith } 212*5c6c1daeSBarry Smith 213*5c6c1daeSBarry Smith /* Got a Return packet */ 214*5c6c1daeSBarry Smith if (!packetType) { 215*5c6c1daeSBarry Smith MLClearError(link); 216*5c6c1daeSBarry Smith printf("ERROR: %s\n", (char *) MLErrorMessage(link)); 217*5c6c1daeSBarry Smith errors++; 218*5c6c1daeSBarry Smith } else if (packetType == RETURNPKT) { 219*5c6c1daeSBarry Smith ierr = processPacket(link, 0); 220*5c6c1daeSBarry Smith if (ierr == 1) CHKERRQ(ierr); 221*5c6c1daeSBarry Smith if (ierr == 2) loop = 0; 222*5c6c1daeSBarry Smith } else { 223*5c6c1daeSBarry Smith fprintf(stderr, "Invalid packet type %d\n", packetType); 224*5c6c1daeSBarry Smith loop = 0; 225*5c6c1daeSBarry Smith } 226*5c6c1daeSBarry Smith if (errors > 10) loop = 0; 227*5c6c1daeSBarry Smith } 228*5c6c1daeSBarry Smith PetscFunctionReturn(0); 229*5c6c1daeSBarry Smith } 230*5c6c1daeSBarry Smith 231*5c6c1daeSBarry Smith #undef __FUNCT__ 232*5c6c1daeSBarry Smith #define __FUNCT__ "cleanupConnection" 233*5c6c1daeSBarry Smith static int cleanupConnection(MLENV env, MLINK link) { 234*5c6c1daeSBarry Smith PetscFunctionBegin; 235*5c6c1daeSBarry Smith MLClose(link); 236*5c6c1daeSBarry Smith MLDeinitialize(env); 237*5c6c1daeSBarry Smith PetscFunctionReturn(0); 238*5c6c1daeSBarry Smith } 239*5c6c1daeSBarry Smith 240*5c6c1daeSBarry Smith #undef __FUNCT__ 241*5c6c1daeSBarry Smith #define __FUNCT__ "main" 242*5c6c1daeSBarry Smith int main(int argc, char *argv[]) { 243*5c6c1daeSBarry Smith MLENV env; 244*5c6c1daeSBarry Smith MLINK link; 245*5c6c1daeSBarry Smith int ierr; 246*5c6c1daeSBarry Smith 247*5c6c1daeSBarry Smith ierr = PetscInitialize(&argc, &argv, PETSC_NULL, help); CHKERRABORT(PETSC_COMM_WORLD, ierr); 248*5c6c1daeSBarry Smith ierr = setupConnection(&env, &link, "192.168.119.1", MATHEMATICA_LINK_CONNECT); CHKERRABORT(PETSC_COMM_WORLD, ierr); 249*5c6c1daeSBarry Smith ierr = processPackets(link); CHKERRABORT(PETSC_COMM_WORLD, ierr); 250*5c6c1daeSBarry Smith ierr = cleanupConnection(env, link); CHKERRABORT(PETSC_COMM_WORLD, ierr); 251*5c6c1daeSBarry Smith ierr = PetscFinalize(); CHKERRABORT(PETSC_COMM_WORLD, ierr); 252*5c6c1daeSBarry Smith return(0); 253*5c6c1daeSBarry Smith } 254