xref: /petsc/src/sys/classes/viewer/impls/mathematica/runtime.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
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