Actual source code: launch.c
1: /*
2: Usage: A = launch(programname,number processors);
3: Modified Sept 28, 2003 RFK: updated obsolete mx functions.
4: */
6: #include <stdio.h>
7: #include <errno.h>
10: #include src/sys/src/viewer/impls/socket/socket.h
11: #include "mex.h"
12: #define PETSC_MEX_ERROR(a) {fprintf(stdout,"LAUNCH: %s \n",a); return ;}
13: /*-----------------------------------------------------------------*/
14: /* */
15: /*-----------------------------------------------------------------*/
18: void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
19: {
20: int np,child;
21: char program[PETSC_MAX_PATH_LEN],executable[PETSC_MAX_PATH_LEN];
23: if (nlhs == 1) {
24: plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
25: *mxGetPr(plhs[0]) = 1;
26: }
28: /* check output parameters */
29: if (nlhs > 1) PETSC_MEX_ERROR("Open requires at most one output argument.");
30: if (!nrhs) PETSC_MEX_ERROR("Open requires at least one input argument.");
31: if (!mxIsChar(prhs[0])) PETSC_MEX_ERROR("First arg must be string.");
33: if (nrhs == 1) np = 1;
34: else np = (int)*mxGetPr(prhs[1]);
36: /* attempt a fork */
37: child = fork();
38: if (child < 0) {
39: PETSC_MEX_ERROR("Unable to fork.");
40: } else if (!child) { /* I am child, start up MPI program */
41: mxGetString(prhs[0],program,1000);
42: sprintf(executable,"mpirun -np %d %s",np,program);
43: printf("About to execute %s\n",executable);
44: system(executable);
45: printf("Completed subprocess\n");
46: fflush(stdout);
47: exit(0);
48: }
49:
51:
52: if (nlhs == 1) {
53: *mxGetPr(plhs[0]) = 0;
54: }
55: return;
56: }
58:
59: