xref: /petsc/src/sys/classes/matlabengine/matlab.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <engine.h>   /* Matlab include file */
3*5c6c1daeSBarry Smith #include <petscsys.h>
4*5c6c1daeSBarry Smith #include <stdarg.h>
5*5c6c1daeSBarry Smith 
6*5c6c1daeSBarry Smith struct  _p_PetscMatlabEngine {
7*5c6c1daeSBarry Smith   PETSCHEADER(int);
8*5c6c1daeSBarry Smith   Engine   *ep;
9*5c6c1daeSBarry Smith   char     buffer[1024];
10*5c6c1daeSBarry Smith };
11*5c6c1daeSBarry Smith 
12*5c6c1daeSBarry Smith PetscClassId MATLABENGINE_CLASSID = -1;
13*5c6c1daeSBarry Smith 
14*5c6c1daeSBarry Smith #undef __FUNCT__
15*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineCreate"
16*5c6c1daeSBarry Smith /*@C
17*5c6c1daeSBarry Smith     PetscMatlabEngineCreate - Creates a MATLAB engine object
18*5c6c1daeSBarry Smith 
19*5c6c1daeSBarry Smith     Not Collective
20*5c6c1daeSBarry Smith 
21*5c6c1daeSBarry Smith     Input Parameters:
22*5c6c1daeSBarry Smith +   comm - a separate MATLAB engine is started for each process in the communicator
23*5c6c1daeSBarry Smith -   machine - name of machine where MATLAB engine is to be run (usually PETSC_NULL)
24*5c6c1daeSBarry Smith 
25*5c6c1daeSBarry Smith     Output Parameter:
26*5c6c1daeSBarry Smith .   mengine - the resulting object
27*5c6c1daeSBarry Smith 
28*5c6c1daeSBarry Smith    Options Database:
29*5c6c1daeSBarry Smith .    -matlab_engine_graphics - allow the MATLAB engine to display graphics
30*5c6c1daeSBarry Smith 
31*5c6c1daeSBarry Smith    Level: advanced
32*5c6c1daeSBarry Smith 
33*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
34*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
35*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
36*5c6c1daeSBarry Smith @*/
37*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineCreate(MPI_Comm comm,const char machine[],PetscMatlabEngine *mengine)
38*5c6c1daeSBarry Smith {
39*5c6c1daeSBarry Smith   PetscErrorCode    ierr;
40*5c6c1daeSBarry Smith   PetscMPIInt       rank,size;
41*5c6c1daeSBarry Smith   char              buffer[256];
42*5c6c1daeSBarry Smith   PetscMatlabEngine e;
43*5c6c1daeSBarry Smith   PetscBool         flg = PETSC_FALSE;
44*5c6c1daeSBarry Smith 
45*5c6c1daeSBarry Smith   PetscFunctionBegin;
46*5c6c1daeSBarry Smith   if (MATLABENGINE_CLASSID == -1) {
47*5c6c1daeSBarry Smith     ierr = PetscClassIdRegister("MATLAB Engine",&MATLABENGINE_CLASSID);CHKERRQ(ierr);
48*5c6c1daeSBarry Smith   }
49*5c6c1daeSBarry Smith   ierr = PetscOptionsGetBool(PETSC_NULL,"-matlab_engine_graphics",&flg,PETSC_NULL);CHKERRQ(ierr);
50*5c6c1daeSBarry Smith 
51*5c6c1daeSBarry Smith   ierr = PetscHeaderCreate(e,_p_PetscMatlabEngine,int,MATLABENGINE_CLASSID,0,"MatlabEngine","MATLAB Engine","Sys",comm,PetscMatlabEngineDestroy,0);CHKERRQ(ierr);
52*5c6c1daeSBarry Smith 
53*5c6c1daeSBarry Smith   if (!machine) machine = "\0";
54*5c6c1daeSBarry Smith   ierr = PetscStrcpy(buffer,PETSC_MATLAB_COMMAND);CHKERRQ(ierr);
55*5c6c1daeSBarry Smith   if (!flg) {
56*5c6c1daeSBarry Smith     ierr = PetscStrcat(buffer," -nodisplay ");CHKERRQ(ierr);
57*5c6c1daeSBarry Smith   }
58*5c6c1daeSBarry Smith   ierr = PetscStrcat(buffer," -nojvm ");CHKERRQ(ierr);
59*5c6c1daeSBarry Smith   ierr = PetscInfo2(0,"Starting MATLAB engine on %s with command %s\n",machine,buffer);CHKERRQ(ierr);
60*5c6c1daeSBarry Smith   e->ep = engOpen(buffer);
61*5c6c1daeSBarry Smith   if (!e->ep) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to start MATLAB engine on %s\n",machine);
62*5c6c1daeSBarry Smith   engOutputBuffer(e->ep,e->buffer,1024);
63*5c6c1daeSBarry Smith 
64*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
65*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
66*5c6c1daeSBarry Smith   sprintf(buffer,"MPI_Comm_rank = %d; MPI_Comm_size = %d;\n",rank,size);
67*5c6c1daeSBarry Smith   engEvalString(e->ep, buffer);
68*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Started MATLAB engine on %s\n",machine);CHKERRQ(ierr);
69*5c6c1daeSBarry Smith 
70*5c6c1daeSBarry Smith   *mengine = e;
71*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
72*5c6c1daeSBarry Smith }
73*5c6c1daeSBarry Smith 
74*5c6c1daeSBarry Smith #undef __FUNCT__
75*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineDestroy"
76*5c6c1daeSBarry Smith /*@
77*5c6c1daeSBarry Smith    PetscMatlabEngineDestroy - Destroys a vector.
78*5c6c1daeSBarry Smith 
79*5c6c1daeSBarry Smith    Collective on PetscMatlabEngine
80*5c6c1daeSBarry Smith 
81*5c6c1daeSBarry Smith    Input Parameters:
82*5c6c1daeSBarry Smith .  e  - the engine
83*5c6c1daeSBarry Smith 
84*5c6c1daeSBarry Smith    Level: advanced
85*5c6c1daeSBarry Smith 
86*5c6c1daeSBarry Smith .seealso: PetscMatlabEnginCreate(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
87*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
88*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
89*5c6c1daeSBarry Smith @*/
90*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineDestroy(PetscMatlabEngine *v)
91*5c6c1daeSBarry Smith {
92*5c6c1daeSBarry Smith   PetscErrorCode ierr;
93*5c6c1daeSBarry Smith   PetscFunctionBegin;
94*5c6c1daeSBarry Smith   if (!*v) PetscFunctionReturn(0);
95*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(*v,MATLABENGINE_CLASSID,1);
96*5c6c1daeSBarry Smith   if (--((PetscObject)(*v))->refct > 0) PetscFunctionReturn(0);
97*5c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(v);CHKERRQ(ierr);
98*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
99*5c6c1daeSBarry Smith }
100*5c6c1daeSBarry Smith 
101*5c6c1daeSBarry Smith #undef __FUNCT__
102*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineEvaluate"
103*5c6c1daeSBarry Smith /*@C
104*5c6c1daeSBarry Smith     PetscMatlabEngineEvaluate - Evaluates a string in MATLAB
105*5c6c1daeSBarry Smith 
106*5c6c1daeSBarry Smith     Not Collective
107*5c6c1daeSBarry Smith 
108*5c6c1daeSBarry Smith     Input Parameters:
109*5c6c1daeSBarry Smith +   mengine - the MATLAB engine
110*5c6c1daeSBarry Smith -   string - format as in a printf()
111*5c6c1daeSBarry Smith 
112*5c6c1daeSBarry Smith    Level: advanced
113*5c6c1daeSBarry Smith 
114*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
115*5c6c1daeSBarry Smith           PetscMatlabEngineCreate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
116*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
117*5c6c1daeSBarry Smith @*/
118*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineEvaluate(PetscMatlabEngine mengine,const char string[],...)
119*5c6c1daeSBarry Smith {
120*5c6c1daeSBarry Smith   va_list        Argp;
121*5c6c1daeSBarry Smith   char           buffer[1024];
122*5c6c1daeSBarry Smith   PetscErrorCode ierr;
123*5c6c1daeSBarry Smith   size_t         fullLength;
124*5c6c1daeSBarry Smith 
125*5c6c1daeSBarry Smith   PetscFunctionBegin;
126*5c6c1daeSBarry Smith   va_start(Argp,string);
127*5c6c1daeSBarry Smith   ierr = PetscVSNPrintf(buffer,1024-9-5,string,&fullLength,Argp);CHKERRQ(ierr);
128*5c6c1daeSBarry Smith   va_end(Argp);
129*5c6c1daeSBarry Smith 
130*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Evaluating MATLAB string: %s\n",buffer);CHKERRQ(ierr);
131*5c6c1daeSBarry Smith   engEvalString(mengine->ep, buffer);
132*5c6c1daeSBarry Smith 
133*5c6c1daeSBarry Smith   /*
134*5c6c1daeSBarry Smith      Check for error in MATLAB: indicated by ? as first character in engine->buffer
135*5c6c1daeSBarry Smith   */
136*5c6c1daeSBarry Smith   if (mengine->buffer[4] == '?') {
137*5c6c1daeSBarry Smith     SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in evaluating MATLAB command:%s\n%s",string,mengine->buffer);
138*5c6c1daeSBarry Smith   }
139*5c6c1daeSBarry Smith 
140*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Done evaluating Matlab string: %s\n",buffer);CHKERRQ(ierr);
141*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
142*5c6c1daeSBarry Smith }
143*5c6c1daeSBarry Smith 
144*5c6c1daeSBarry Smith #undef __FUNCT__
145*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGetOutput"
146*5c6c1daeSBarry Smith /*@C
147*5c6c1daeSBarry Smith     PetscMatlabEngineGetOutput - Gets a string buffer where the MATLAB output is
148*5c6c1daeSBarry Smith           printed
149*5c6c1daeSBarry Smith 
150*5c6c1daeSBarry Smith     Not Collective
151*5c6c1daeSBarry Smith 
152*5c6c1daeSBarry Smith     Input Parameter:
153*5c6c1daeSBarry Smith .   mengine - the MATLAB engine
154*5c6c1daeSBarry Smith 
155*5c6c1daeSBarry Smith     Output Parameter:
156*5c6c1daeSBarry Smith .   string - buffer where MATLAB output is printed
157*5c6c1daeSBarry Smith 
158*5c6c1daeSBarry Smith    Level: advanced
159*5c6c1daeSBarry Smith 
160*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
161*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineCreate(), PetscMatlabEnginePrintOutput(),
162*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
163*5c6c1daeSBarry Smith @*/
164*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGetOutput(PetscMatlabEngine mengine,char **string)
165*5c6c1daeSBarry Smith {
166*5c6c1daeSBarry Smith   PetscFunctionBegin;
167*5c6c1daeSBarry Smith   *string = mengine->buffer;
168*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
169*5c6c1daeSBarry Smith }
170*5c6c1daeSBarry Smith 
171*5c6c1daeSBarry Smith #undef __FUNCT__
172*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePrintOutput"
173*5c6c1daeSBarry Smith /*@C
174*5c6c1daeSBarry Smith     PetscMatlabEnginePrintOutput - prints the output from MATLAB
175*5c6c1daeSBarry Smith 
176*5c6c1daeSBarry Smith     Collective on PetscMatlabEngine
177*5c6c1daeSBarry Smith 
178*5c6c1daeSBarry Smith     Input Parameters:
179*5c6c1daeSBarry Smith .    mengine - the Matlab engine
180*5c6c1daeSBarry Smith 
181*5c6c1daeSBarry Smith    Level: advanced
182*5c6c1daeSBarry Smith 
183*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
184*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEngineCreate(),
185*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
186*5c6c1daeSBarry Smith @*/
187*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePrintOutput(PetscMatlabEngine mengine,FILE *fd)
188*5c6c1daeSBarry Smith {
189*5c6c1daeSBarry Smith   PetscErrorCode ierr;
190*5c6c1daeSBarry Smith   PetscMPIInt    rank;
191*5c6c1daeSBarry Smith 
192*5c6c1daeSBarry Smith   PetscFunctionBegin;
193*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(((PetscObject)mengine)->comm,&rank);CHKERRQ(ierr);
194*5c6c1daeSBarry Smith   ierr = PetscSynchronizedFPrintf(((PetscObject)mengine)->comm,fd,"[%d]%s",rank,mengine->buffer);CHKERRQ(ierr);
195*5c6c1daeSBarry Smith   ierr = PetscSynchronizedFlush(((PetscObject)mengine)->comm);CHKERRQ(ierr);
196*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
197*5c6c1daeSBarry Smith }
198*5c6c1daeSBarry Smith 
199*5c6c1daeSBarry Smith #undef __FUNCT__
200*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePut"
201*5c6c1daeSBarry Smith /*@
202*5c6c1daeSBarry Smith     PetscMatlabEnginePut - Puts a Petsc object into the MATLAB space. For parallel objects,
203*5c6c1daeSBarry Smith       each processors part is put in a separate  MATLAB process.
204*5c6c1daeSBarry Smith 
205*5c6c1daeSBarry Smith     Collective on PetscObject
206*5c6c1daeSBarry Smith 
207*5c6c1daeSBarry Smith     Input Parameters:
208*5c6c1daeSBarry Smith +    mengine - the MATLAB engine
209*5c6c1daeSBarry Smith -    object - the PETSc object, for example Vec
210*5c6c1daeSBarry Smith 
211*5c6c1daeSBarry Smith    Level: advanced
212*5c6c1daeSBarry Smith 
213*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(),
214*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
215*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine
216*5c6c1daeSBarry Smith @*/
217*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePut(PetscMatlabEngine mengine,PetscObject obj)
218*5c6c1daeSBarry Smith {
219*5c6c1daeSBarry Smith   PetscErrorCode ierr,(*put)(PetscObject,void*);
220*5c6c1daeSBarry Smith 
221*5c6c1daeSBarry Smith   PetscFunctionBegin;
222*5c6c1daeSBarry Smith   ierr = PetscObjectQueryFunction(obj,"PetscMatlabEnginePut_C",(void (**)(void))&put);CHKERRQ(ierr);
223*5c6c1daeSBarry Smith   if (!put) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be put into MATLAB engine",obj->class_name);
224*5c6c1daeSBarry Smith   ierr = PetscInfo(0,"Putting MATLAB object\n");CHKERRQ(ierr);
225*5c6c1daeSBarry Smith   ierr = (*put)(obj,mengine->ep);CHKERRQ(ierr);
226*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Put MATLAB object: %s\n",obj->name);CHKERRQ(ierr);
227*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
228*5c6c1daeSBarry Smith }
229*5c6c1daeSBarry Smith 
230*5c6c1daeSBarry Smith #undef __FUNCT__
231*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGet"
232*5c6c1daeSBarry Smith /*@
233*5c6c1daeSBarry Smith     PetscMatlabEngineGet - Gets a variable from MATLAB into a PETSc object.
234*5c6c1daeSBarry Smith 
235*5c6c1daeSBarry Smith     Collective on PetscObject
236*5c6c1daeSBarry Smith 
237*5c6c1daeSBarry Smith     Input Parameters:
238*5c6c1daeSBarry Smith +    mengine - the MATLAB engine
239*5c6c1daeSBarry Smith -    object - the PETSc object, for example Vec
240*5c6c1daeSBarry Smith 
241*5c6c1daeSBarry Smith    Level: advanced
242*5c6c1daeSBarry Smith 
243*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(),
244*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
245*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine
246*5c6c1daeSBarry Smith @*/
247*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGet(PetscMatlabEngine mengine,PetscObject obj)
248*5c6c1daeSBarry Smith {
249*5c6c1daeSBarry Smith   PetscErrorCode ierr,(*get)(PetscObject,void*);
250*5c6c1daeSBarry Smith 
251*5c6c1daeSBarry Smith   PetscFunctionBegin;
252*5c6c1daeSBarry Smith   if (!obj->name) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Cannot get object that has no name");
253*5c6c1daeSBarry Smith   ierr = PetscObjectQueryFunction(obj,"PetscMatlabEngineGet_C",(void (**)(void))&get);CHKERRQ(ierr);
254*5c6c1daeSBarry Smith   if (!get) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be gotten from MATLAB engine",obj->class_name);
255*5c6c1daeSBarry Smith   ierr = PetscInfo(0,"Getting MATLAB object\n");CHKERRQ(ierr);
256*5c6c1daeSBarry Smith   ierr = (*get)(obj,mengine->ep);CHKERRQ(ierr);
257*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Got MATLAB object: %s\n",obj->name);CHKERRQ(ierr);
258*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
259*5c6c1daeSBarry Smith }
260*5c6c1daeSBarry Smith 
261*5c6c1daeSBarry Smith /*
262*5c6c1daeSBarry Smith     The variable Petsc_Matlab_Engine_keyval is used to indicate an MPI attribute that
263*5c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscMatlabEngine
264*5c6c1daeSBarry Smith */
265*5c6c1daeSBarry Smith static PetscMPIInt Petsc_Matlab_Engine_keyval = MPI_KEYVAL_INVALID;
266*5c6c1daeSBarry Smith 
267*5c6c1daeSBarry Smith 
268*5c6c1daeSBarry Smith #undef __FUNCT__
269*5c6c1daeSBarry Smith #define __FUNCT__ "PETSC_MATLAB_ENGINE_"
270*5c6c1daeSBarry Smith /*@C
271*5c6c1daeSBarry Smith    PETSC_MATLAB_ENGINE_ - Creates a matlab engine shared by all processors
272*5c6c1daeSBarry Smith                     in a communicator.
273*5c6c1daeSBarry Smith 
274*5c6c1daeSBarry Smith    Not Collective
275*5c6c1daeSBarry Smith 
276*5c6c1daeSBarry Smith    Input Parameter:
277*5c6c1daeSBarry Smith .  comm - the MPI communicator to share the engine
278*5c6c1daeSBarry Smith 
279*5c6c1daeSBarry Smith    Level: developer
280*5c6c1daeSBarry Smith 
281*5c6c1daeSBarry Smith    Notes:
282*5c6c1daeSBarry Smith    Unlike almost all other PETSc routines, this does not return
283*5c6c1daeSBarry Smith    an error code. Usually used in the form
284*5c6c1daeSBarry Smith $      PetscMatlabEngineYYY(XXX object,PETSC_MATLAB_ENGINE_(comm));
285*5c6c1daeSBarry Smith 
286*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
287*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
288*5c6c1daeSBarry Smith           PetscMatlabEngineCreate(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine,
289*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_WORLD, PETSC_MATLAB_ENGINE_SELF
290*5c6c1daeSBarry Smith 
291*5c6c1daeSBarry Smith @*/
292*5c6c1daeSBarry Smith PetscMatlabEngine  PETSC_MATLAB_ENGINE_(MPI_Comm comm)
293*5c6c1daeSBarry Smith {
294*5c6c1daeSBarry Smith   PetscErrorCode ierr;
295*5c6c1daeSBarry Smith   PetscBool         flg;
296*5c6c1daeSBarry Smith   PetscMatlabEngine mengine;
297*5c6c1daeSBarry Smith 
298*5c6c1daeSBarry Smith   PetscFunctionBegin;
299*5c6c1daeSBarry Smith   if (Petsc_Matlab_Engine_keyval == MPI_KEYVAL_INVALID) {
300*5c6c1daeSBarry Smith     ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Matlab_Engine_keyval,0);
301*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
302*5c6c1daeSBarry Smith   }
303*5c6c1daeSBarry Smith   ierr = MPI_Attr_get(comm,Petsc_Matlab_Engine_keyval,(void **)&mengine,(int*)&flg);
304*5c6c1daeSBarry Smith   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
305*5c6c1daeSBarry Smith   if (!flg) { /* viewer not yet created */
306*5c6c1daeSBarry Smith     char *machinename = 0,machine[64];
307*5c6c1daeSBarry Smith 
308*5c6c1daeSBarry Smith     ierr = PetscOptionsGetString(PETSC_NULL,"-matlab_engine_machine",machine,64,&flg);
309*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
310*5c6c1daeSBarry Smith     if (flg) machinename = machine;
311*5c6c1daeSBarry Smith     ierr = PetscMatlabEngineCreate(comm,machinename,&mengine);
312*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
313*5c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)mengine);
314*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
315*5c6c1daeSBarry Smith     ierr = MPI_Attr_put(comm,Petsc_Matlab_Engine_keyval,mengine);
316*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
317*5c6c1daeSBarry Smith   }
318*5c6c1daeSBarry Smith   PetscFunctionReturn(mengine);
319*5c6c1daeSBarry Smith }
320*5c6c1daeSBarry Smith 
321*5c6c1daeSBarry Smith #undef __FUNCT__
322*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePutArray"
323*5c6c1daeSBarry Smith /*@C
324*5c6c1daeSBarry Smith     PetscMatlabEnginePutArray - Puts an array into the MATLAB space, treating it as a Fortran style (column major ordering) array. For parallel objects,
325*5c6c1daeSBarry Smith       each processors part is put in a separate  MATLAB process.
326*5c6c1daeSBarry Smith 
327*5c6c1daeSBarry Smith     Collective on PetscObject
328*5c6c1daeSBarry Smith 
329*5c6c1daeSBarry Smith     Input Parameters:
330*5c6c1daeSBarry Smith +    mengine - the MATLAB engine
331*5c6c1daeSBarry Smith .    m,n - the dimensions of the array
332*5c6c1daeSBarry Smith .    array - the array (represented in one dimension)
333*5c6c1daeSBarry Smith -    name - the name of the array
334*5c6c1daeSBarry Smith 
335*5c6c1daeSBarry Smith    Level: advanced
336*5c6c1daeSBarry Smith 
337*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(),
338*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
339*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePut(), MatlabEngineGetArray(), PetscMatlabEngine
340*5c6c1daeSBarry Smith @*/
341*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePutArray(PetscMatlabEngine mengine,int m,int n,const PetscScalar *array,const char name[])
342*5c6c1daeSBarry Smith {
343*5c6c1daeSBarry Smith   PetscErrorCode ierr;
344*5c6c1daeSBarry Smith   mxArray *mat;
345*5c6c1daeSBarry Smith 
346*5c6c1daeSBarry Smith   PetscFunctionBegin;
347*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Putting MATLAB array %s\n",name);CHKERRQ(ierr);
348*5c6c1daeSBarry Smith #if !defined(PETSC_USE_COMPLEX)
349*5c6c1daeSBarry Smith   mat  = mxCreateDoubleMatrix(m,n,mxREAL);
350*5c6c1daeSBarry Smith #else
351*5c6c1daeSBarry Smith   mat  = mxCreateDoubleMatrix(m,n,mxCOMPLEX);
352*5c6c1daeSBarry Smith #endif
353*5c6c1daeSBarry Smith   ierr = PetscMemcpy(mxGetPr(mat),array,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
354*5c6c1daeSBarry Smith   engPutVariable(mengine->ep,name,mat);
355*5c6c1daeSBarry Smith 
356*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Put MATLAB array %s\n",name);CHKERRQ(ierr);
357*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
358*5c6c1daeSBarry Smith }
359*5c6c1daeSBarry Smith 
360*5c6c1daeSBarry Smith #undef __FUNCT__
361*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGetArray"
362*5c6c1daeSBarry Smith /*@C
363*5c6c1daeSBarry Smith     PetscMatlabEngineGetArray - Gets a variable from Matlab into an array
364*5c6c1daeSBarry Smith 
365*5c6c1daeSBarry Smith     Not Collective
366*5c6c1daeSBarry Smith 
367*5c6c1daeSBarry Smith     Input Parameters:
368*5c6c1daeSBarry Smith +    mengine - the Matlab engine
369*5c6c1daeSBarry Smith .    m,n - the dimensions of the array
370*5c6c1daeSBarry Smith .    array - the array (represented in one dimension)
371*5c6c1daeSBarry Smith -    name - the name of the array
372*5c6c1daeSBarry Smith 
373*5c6c1daeSBarry Smith    Level: advanced
374*5c6c1daeSBarry Smith 
375*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(),
376*5c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
377*5c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGet(), PetscMatlabEngine
378*5c6c1daeSBarry Smith @*/
379*5c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGetArray(PetscMatlabEngine mengine,int m,int n,PetscScalar *array,const char name[])
380*5c6c1daeSBarry Smith {
381*5c6c1daeSBarry Smith   PetscErrorCode ierr;
382*5c6c1daeSBarry Smith   mxArray *mat;
383*5c6c1daeSBarry Smith 
384*5c6c1daeSBarry Smith   PetscFunctionBegin;
385*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Getting MATLAB array %s\n",name);CHKERRQ(ierr);
386*5c6c1daeSBarry Smith   mat  = engGetVariable(mengine->ep,name);
387*5c6c1daeSBarry Smith   if (!mat) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to get array %s from matlab",name);
388*5c6c1daeSBarry Smith   ierr = PetscMemcpy(array,mxGetPr(mat),m*n*sizeof(PetscScalar));CHKERRQ(ierr);
389*5c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Got MATLAB array %s\n",name);CHKERRQ(ierr);
390*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
391*5c6c1daeSBarry Smith }
392*5c6c1daeSBarry Smith 
393*5c6c1daeSBarry Smith 
394*5c6c1daeSBarry Smith 
395*5c6c1daeSBarry Smith 
396