1
2 #include <petscsys.h>
3
4 /*@C
5 PetscStartMatlab - starts up MATLAB with a MATLAB script
6
7 Logically Collective, but only processor zero in the communicator does anything
8
9 Input Parameters:
10 + comm - MPI communicator
11 . machine - optional machine to run MATLAB on
12 - script - name of script (without the .m)
13
14 Output Parameter:
15 . fp - a file pointer returned from PetscPOpen()
16
17 Level: intermediate
18
19 Notes:
20 This overwrites your matlab/startup.m file
21
22 The script must be in your MATLAB path or current directory
23
24 Assumes that all machines share a common file system
25
26 .seealso: PetscPOpen(), PetscPClose()
27 @*/
PetscStartMatlab(MPI_Comm comm,const char machine[],const char script[],FILE ** fp)28 PetscErrorCode PetscStartMatlab(MPI_Comm comm,const char machine[],const char script[],FILE **fp)
29 {
30 PetscErrorCode ierr;
31 FILE *fd;
32 char command[512];
33 #if defined(PETSC_HAVE_UCBPS) && defined(PETSC_HAVE_POPEN)
34 char buf[1024],*found;
35 PetscMPIInt rank;
36 #endif
37
38 PetscFunctionBegin;
39 #if defined(PETSC_HAVE_UCBPS) && defined(PETSC_HAVE_POPEN)
40 /* check if MATLAB is not already running */
41 ierr = PetscPOpen(comm,machine,"/usr/ucb/ps -ugxww | grep matlab | grep -v grep","r",&fd);CHKERRQ(ierr);
42 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
43 if (!rank) found = fgets(buf,1024,fd);
44 ierr = MPI_Bcast(&found,1,MPI_CHAR,0,comm);CHKERRQ(ierr);
45 ierr = PetscPClose(comm,fd);CHKERRQ(ierr);
46 if (found) PetscFunctionReturn(0);
47 #endif
48
49 if (script) {
50 /* the remote machine won't know about current directory, so add it to MATLAB path */
51 /* the extra \" are to protect possible () in the script command from the shell */
52 sprintf(command,"echo \"delete ${HOMEDIRECTORY}/matlab/startup.m ; path(path,'${WORKINGDIRECTORY}'); %s \" > ${HOMEDIRECTORY}/matlab/startup.m",script);
53 #if defined(PETSC_HAVE_POPEN)
54 ierr = PetscPOpen(comm,machine,command,"r",&fd);CHKERRQ(ierr);
55 ierr = PetscPClose(comm,fd);CHKERRQ(ierr);
56 #endif
57 }
58 #if defined(PETSC_HAVE_POPEN)
59 ierr = PetscPOpen(comm,machine,"xterm -display ${DISPLAY} -e matlab -nosplash","r",fp);CHKERRQ(ierr);
60 #endif
61 PetscFunctionReturn(0);
62 }
63
64