xref: /petsc/src/sys/classes/matlabengine/matlab.c (revision ddcfb6fc814de002685263716f916f1eccaf9f7f)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <engine.h>   /* Matlab include file */
35c6c1daeSBarry Smith #include <petscsys.h>
4a3afe2d1SBarry Smith #include <petscmatlab.h>               /*I   "petscmatlab.h"  I*/
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h>
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith struct  _p_PetscMatlabEngine {
85c6c1daeSBarry Smith   PETSCHEADER(int);
95c6c1daeSBarry Smith   Engine *ep;
105c6c1daeSBarry Smith   char   buffer[1024];
115c6c1daeSBarry Smith };
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith PetscClassId MATLABENGINE_CLASSID = -1;
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith /*@C
165c6c1daeSBarry Smith     PetscMatlabEngineCreate - Creates a MATLAB engine object
175c6c1daeSBarry Smith 
185c6c1daeSBarry Smith     Not Collective
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith     Input Parameters:
215c6c1daeSBarry Smith +   comm - a separate MATLAB engine is started for each process in the communicator
220298fd71SBarry Smith -   machine - name of machine where MATLAB engine is to be run (usually NULL)
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith     Output Parameter:
255c6c1daeSBarry Smith .   mengine - the resulting object
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith    Options Database:
285c6c1daeSBarry Smith .    -matlab_engine_graphics - allow the MATLAB engine to display graphics
295c6c1daeSBarry Smith 
305c6c1daeSBarry Smith    Level: advanced
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
335c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
345c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
355c6c1daeSBarry Smith @*/
365c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineCreate(MPI_Comm comm,const char machine[],PetscMatlabEngine *mengine)
375c6c1daeSBarry Smith {
385c6c1daeSBarry Smith   PetscErrorCode    ierr;
395c6c1daeSBarry Smith   PetscMPIInt       rank,size;
405c6c1daeSBarry Smith   char              buffer[256];
415c6c1daeSBarry Smith   PetscMatlabEngine e;
425c6c1daeSBarry Smith   PetscBool         flg = PETSC_FALSE;
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith   PetscFunctionBegin;
455c6c1daeSBarry Smith   if (MATLABENGINE_CLASSID == -1) {
465c6c1daeSBarry Smith     ierr = PetscClassIdRegister("MATLAB Engine",&MATLABENGINE_CLASSID);CHKERRQ(ierr);
475c6c1daeSBarry Smith   }
48c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(NULL,NULL,"-matlab_engine_graphics",&flg,NULL);CHKERRQ(ierr);
495c6c1daeSBarry Smith 
5073107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(e,MATLABENGINE_CLASSID,"MatlabEngine","MATLAB Engine","Sys",comm,PetscMatlabEngineDestroy,NULL);CHKERRQ(ierr);
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith   if (!machine) machine = "\0";
53a126751eSBarry Smith   ierr = PetscStrncpy(buffer,PETSC_MATLAB_COMMAND,sizeof(buffer));CHKERRQ(ierr);
545c6c1daeSBarry Smith   if (!flg) {
55a126751eSBarry Smith     ierr = PetscStrlcat(buffer," -nodisplay ",sizeof(buffer));CHKERRQ(ierr);
565c6c1daeSBarry Smith   }
57a126751eSBarry Smith   ierr  = PetscStrlcat(buffer," -nojvm ",sizeof(buffer));CHKERRQ(ierr);
585c6c1daeSBarry Smith   ierr  = PetscInfo2(0,"Starting MATLAB engine on %s with command %s\n",machine,buffer);CHKERRQ(ierr);
595c6c1daeSBarry Smith   e->ep = engOpen(buffer);
60c783eb9eSBarry Smith   if (!e->ep) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to start MATLAB engine on %s",machine);
615c6c1daeSBarry Smith   engOutputBuffer(e->ep,e->buffer,1024);
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
645c6c1daeSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
655c6c1daeSBarry Smith   sprintf(buffer,"MPI_Comm_rank = %d; MPI_Comm_size = %d;\n",rank,size);
665c6c1daeSBarry Smith   engEvalString(e->ep, buffer);
675c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Started MATLAB engine on %s\n",machine);CHKERRQ(ierr);
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith   *mengine = e;
705c6c1daeSBarry Smith   PetscFunctionReturn(0);
715c6c1daeSBarry Smith }
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith /*@
745c6c1daeSBarry Smith    PetscMatlabEngineDestroy - Destroys a vector.
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith    Collective on PetscMatlabEngine
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith    Input Parameters:
795c6c1daeSBarry Smith .  e  - the engine
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith    Level: advanced
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith .seealso: PetscMatlabEnginCreate(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
845c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
855c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
865c6c1daeSBarry Smith @*/
875c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineDestroy(PetscMatlabEngine *v)
885c6c1daeSBarry Smith {
895c6c1daeSBarry Smith   PetscErrorCode ierr;
905fd66863SKarl Rupp 
915c6c1daeSBarry Smith   PetscFunctionBegin;
925c6c1daeSBarry Smith   if (!*v) PetscFunctionReturn(0);
935c6c1daeSBarry Smith   PetscValidHeaderSpecific(*v,MATLABENGINE_CLASSID,1);
945c6c1daeSBarry Smith   if (--((PetscObject)(*v))->refct > 0) PetscFunctionReturn(0);
955c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(v);CHKERRQ(ierr);
965c6c1daeSBarry Smith   PetscFunctionReturn(0);
975c6c1daeSBarry Smith }
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith /*@C
1005c6c1daeSBarry Smith     PetscMatlabEngineEvaluate - Evaluates a string in MATLAB
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith     Not Collective
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith     Input Parameters:
1055c6c1daeSBarry Smith +   mengine - the MATLAB engine
1065c6c1daeSBarry Smith -   string - format as in a printf()
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith    Level: advanced
1095c6c1daeSBarry Smith 
1105c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
1115c6c1daeSBarry Smith           PetscMatlabEngineCreate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
1125c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
1135c6c1daeSBarry Smith @*/
1145c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineEvaluate(PetscMatlabEngine mengine,const char string[],...)
1155c6c1daeSBarry Smith {
1165c6c1daeSBarry Smith   va_list        Argp;
1175c6c1daeSBarry Smith   char           buffer[1024];
1185c6c1daeSBarry Smith   PetscErrorCode ierr;
1195c6c1daeSBarry Smith   size_t         fullLength;
1205c6c1daeSBarry Smith 
1215c6c1daeSBarry Smith   PetscFunctionBegin;
1225c6c1daeSBarry Smith   va_start(Argp,string);
1235c6c1daeSBarry Smith   ierr = PetscVSNPrintf(buffer,1024-9-5,string,&fullLength,Argp);CHKERRQ(ierr);
1245c6c1daeSBarry Smith   va_end(Argp);
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Evaluating MATLAB string: %s\n",buffer);CHKERRQ(ierr);
1275c6c1daeSBarry Smith   engEvalString(mengine->ep, buffer);
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith   /*
1305c6c1daeSBarry Smith      Check for error in MATLAB: indicated by ? as first character in engine->buffer
1315c6c1daeSBarry Smith   */
132f23aa3ddSBarry Smith   if (mengine->buffer[4] == '?') SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in evaluating MATLAB command:%s\n%s",string,mengine->buffer);
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Done evaluating Matlab string: %s\n",buffer);CHKERRQ(ierr);
1355c6c1daeSBarry Smith   PetscFunctionReturn(0);
1365c6c1daeSBarry Smith }
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith /*@C
1395c6c1daeSBarry Smith     PetscMatlabEngineGetOutput - Gets a string buffer where the MATLAB output is
1405c6c1daeSBarry Smith           printed
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith     Not Collective
1435c6c1daeSBarry Smith 
1445c6c1daeSBarry Smith     Input Parameter:
1455c6c1daeSBarry Smith .   mengine - the MATLAB engine
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith     Output Parameter:
1485c6c1daeSBarry Smith .   string - buffer where MATLAB output is printed
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith    Level: advanced
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
1535c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineCreate(), PetscMatlabEnginePrintOutput(),
1545c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
1555c6c1daeSBarry Smith @*/
1565c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGetOutput(PetscMatlabEngine mengine,char **string)
1575c6c1daeSBarry Smith {
1585c6c1daeSBarry Smith   PetscFunctionBegin;
1595c6c1daeSBarry Smith   *string = mengine->buffer;
1605c6c1daeSBarry Smith   PetscFunctionReturn(0);
1615c6c1daeSBarry Smith }
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith /*@C
1645c6c1daeSBarry Smith     PetscMatlabEnginePrintOutput - prints the output from MATLAB
1655c6c1daeSBarry Smith 
1665c6c1daeSBarry Smith     Collective on PetscMatlabEngine
1675c6c1daeSBarry Smith 
1685c6c1daeSBarry Smith     Input Parameters:
1695c6c1daeSBarry Smith .    mengine - the Matlab engine
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith    Level: advanced
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
1745c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEngineCreate(),
1755c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
1765c6c1daeSBarry Smith @*/
1775c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePrintOutput(PetscMatlabEngine mengine,FILE *fd)
1785c6c1daeSBarry Smith {
1795c6c1daeSBarry Smith   PetscErrorCode ierr;
1805c6c1daeSBarry Smith   PetscMPIInt    rank;
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   PetscFunctionBegin;
183ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)mengine),&rank);CHKERRQ(ierr);
184ce94432eSBarry Smith   ierr = PetscSynchronizedFPrintf(PetscObjectComm((PetscObject)mengine),fd,"[%d]%s",rank,mengine->buffer);CHKERRQ(ierr);
1850ec8b6e3SBarry Smith   ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)mengine),fd);CHKERRQ(ierr);
1865c6c1daeSBarry Smith   PetscFunctionReturn(0);
1875c6c1daeSBarry Smith }
1885c6c1daeSBarry Smith 
1895c6c1daeSBarry Smith /*@
1905c6c1daeSBarry Smith     PetscMatlabEnginePut - Puts a Petsc object into the MATLAB space. For parallel objects,
1915c6c1daeSBarry Smith       each processors part is put in a separate  MATLAB process.
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith     Collective on PetscObject
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith     Input Parameters:
1965c6c1daeSBarry Smith +    mengine - the MATLAB engine
1975c6c1daeSBarry Smith -    object - the PETSc object, for example Vec
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith    Level: advanced
2005c6c1daeSBarry Smith 
201*ddcfb6fcSBarry Smith    Note: Mats transfered between PETSc and MATLAB and vis versa are transposed in the other space
202*ddcfb6fcSBarry Smith          (this is because MATLAB uses compressed column format and PETSc uses compressed row format)
203*ddcfb6fcSBarry Smith 
2045c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(),
2055c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
2065c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine
2075c6c1daeSBarry Smith @*/
2085c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePut(PetscMatlabEngine mengine,PetscObject obj)
2095c6c1daeSBarry Smith {
2105c6c1daeSBarry Smith   PetscErrorCode ierr,(*put)(PetscObject,void*);
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith   PetscFunctionBegin;
2130005d66cSJed Brown   ierr = PetscObjectQueryFunction(obj,"PetscMatlabEnginePut_C",&put);CHKERRQ(ierr);
2145c6c1daeSBarry Smith   if (!put) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be put into MATLAB engine",obj->class_name);
2155c6c1daeSBarry Smith   ierr = PetscInfo(0,"Putting MATLAB object\n");CHKERRQ(ierr);
2165c6c1daeSBarry Smith   ierr = (*put)(obj,mengine->ep);CHKERRQ(ierr);
2175c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Put MATLAB object: %s\n",obj->name);CHKERRQ(ierr);
2185c6c1daeSBarry Smith   PetscFunctionReturn(0);
2195c6c1daeSBarry Smith }
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith /*@
2225c6c1daeSBarry Smith     PetscMatlabEngineGet - Gets a variable from MATLAB into a PETSc object.
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith     Collective on PetscObject
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith     Input Parameters:
2275c6c1daeSBarry Smith +    mengine - the MATLAB engine
2285c6c1daeSBarry Smith -    object - the PETSc object, for example Vec
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith    Level: advanced
2315c6c1daeSBarry Smith 
232*ddcfb6fcSBarry Smith    Note: Mats transfered between PETSc and MATLAB and vis versa are transposed in the other space
233*ddcfb6fcSBarry Smith          (this is because MATLAB uses compressed column format and PETSc uses compressed row format)
234*ddcfb6fcSBarry Smith 
2355c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(),
2365c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
2375c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine
2385c6c1daeSBarry Smith @*/
2395c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGet(PetscMatlabEngine mengine,PetscObject obj)
2405c6c1daeSBarry Smith {
2415c6c1daeSBarry Smith   PetscErrorCode ierr,(*get)(PetscObject,void*);
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith   PetscFunctionBegin;
2445c6c1daeSBarry Smith   if (!obj->name) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Cannot get object that has no name");
2450005d66cSJed Brown   ierr = PetscObjectQueryFunction(obj,"PetscMatlabEngineGet_C",&get);CHKERRQ(ierr);
2465c6c1daeSBarry Smith   if (!get) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be gotten from MATLAB engine",obj->class_name);
2475c6c1daeSBarry Smith   ierr = PetscInfo(0,"Getting MATLAB object\n");CHKERRQ(ierr);
2485c6c1daeSBarry Smith   ierr = (*get)(obj,mengine->ep);CHKERRQ(ierr);
2495c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Got MATLAB object: %s\n",obj->name);CHKERRQ(ierr);
2505c6c1daeSBarry Smith   PetscFunctionReturn(0);
2515c6c1daeSBarry Smith }
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith /*
2545c6c1daeSBarry Smith     The variable Petsc_Matlab_Engine_keyval is used to indicate an MPI attribute that
2555c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscMatlabEngine
2565c6c1daeSBarry Smith */
2575c6c1daeSBarry Smith static PetscMPIInt Petsc_Matlab_Engine_keyval = MPI_KEYVAL_INVALID;
2585c6c1daeSBarry Smith 
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith /*@C
2615c6c1daeSBarry Smith    PETSC_MATLAB_ENGINE_ - Creates a matlab engine shared by all processors
2625c6c1daeSBarry Smith                     in a communicator.
2635c6c1daeSBarry Smith 
2645c6c1daeSBarry Smith    Not Collective
2655c6c1daeSBarry Smith 
2665c6c1daeSBarry Smith    Input Parameter:
2675c6c1daeSBarry Smith .  comm - the MPI communicator to share the engine
2685c6c1daeSBarry Smith 
2695c6c1daeSBarry Smith    Level: developer
2705c6c1daeSBarry Smith 
2715c6c1daeSBarry Smith    Notes:
2725c6c1daeSBarry Smith    Unlike almost all other PETSc routines, this does not return
2735c6c1daeSBarry Smith    an error code. Usually used in the form
2745c6c1daeSBarry Smith $      PetscMatlabEngineYYY(XXX object,PETSC_MATLAB_ENGINE_(comm));
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
2775c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
2785c6c1daeSBarry Smith           PetscMatlabEngineCreate(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine,
2795c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_WORLD, PETSC_MATLAB_ENGINE_SELF
2805c6c1daeSBarry Smith 
2815c6c1daeSBarry Smith @*/
2825c6c1daeSBarry Smith PetscMatlabEngine  PETSC_MATLAB_ENGINE_(MPI_Comm comm)
2835c6c1daeSBarry Smith {
2845c6c1daeSBarry Smith   PetscErrorCode    ierr;
2855c6c1daeSBarry Smith   PetscBool         flg;
2865c6c1daeSBarry Smith   PetscMatlabEngine mengine;
2875c6c1daeSBarry Smith 
2885c6c1daeSBarry Smith   PetscFunctionBegin;
2895c6c1daeSBarry Smith   if (Petsc_Matlab_Engine_keyval == MPI_KEYVAL_INVALID) {
29012801b39SBarry Smith     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN,MPI_COMM_NULL_DELETE_FN,&Petsc_Matlab_Engine_keyval,0);
291efca3c55SSatish Balay     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
2925c6c1daeSBarry Smith   }
29347435625SJed Brown   ierr = MPI_Comm_get_attr(comm,Petsc_Matlab_Engine_keyval,(void**)&mengine,(int*)&flg);
294efca3c55SSatish Balay   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
2955c6c1daeSBarry Smith   if (!flg) { /* viewer not yet created */
2965c6c1daeSBarry Smith     char *machinename = 0,machine[64];
2975c6c1daeSBarry Smith 
298c5929fdfSBarry Smith     ierr = PetscOptionsGetString(NULL,NULL,"-matlab_engine_machine",machine,64,&flg);
299efca3c55SSatish Balay     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3005c6c1daeSBarry Smith     if (flg) machinename = machine;
3015c6c1daeSBarry Smith     ierr = PetscMatlabEngineCreate(comm,machinename,&mengine);
302efca3c55SSatish Balay     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3035c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)mengine);
304efca3c55SSatish Balay     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
30547435625SJed Brown     ierr = MPI_Comm_set_attr(comm,Petsc_Matlab_Engine_keyval,mengine);
306efca3c55SSatish Balay     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3075c6c1daeSBarry Smith   }
3085c6c1daeSBarry Smith   PetscFunctionReturn(mengine);
3095c6c1daeSBarry Smith }
3105c6c1daeSBarry Smith 
3115c6c1daeSBarry Smith /*@C
3125c6c1daeSBarry Smith     PetscMatlabEnginePutArray - Puts an array into the MATLAB space, treating it as a Fortran style (column major ordering) array. For parallel objects,
3135c6c1daeSBarry Smith       each processors part is put in a separate  MATLAB process.
3145c6c1daeSBarry Smith 
3155c6c1daeSBarry Smith     Collective on PetscObject
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith     Input Parameters:
3185c6c1daeSBarry Smith +    mengine - the MATLAB engine
3195c6c1daeSBarry Smith .    m,n - the dimensions of the array
3205c6c1daeSBarry Smith .    array - the array (represented in one dimension)
3215c6c1daeSBarry Smith -    name - the name of the array
3225c6c1daeSBarry Smith 
3235c6c1daeSBarry Smith    Level: advanced
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(),
3265c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
3275c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePut(), MatlabEngineGetArray(), PetscMatlabEngine
3285c6c1daeSBarry Smith @*/
3295c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePutArray(PetscMatlabEngine mengine,int m,int n,const PetscScalar *array,const char name[])
3305c6c1daeSBarry Smith {
3315c6c1daeSBarry Smith   PetscErrorCode ierr;
3325c6c1daeSBarry Smith   mxArray        *mat;
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith   PetscFunctionBegin;
3355c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Putting MATLAB array %s\n",name);CHKERRQ(ierr);
3365c6c1daeSBarry Smith #if !defined(PETSC_USE_COMPLEX)
3375c6c1daeSBarry Smith   mat = mxCreateDoubleMatrix(m,n,mxREAL);
3385c6c1daeSBarry Smith #else
3395c6c1daeSBarry Smith   mat = mxCreateDoubleMatrix(m,n,mxCOMPLEX);
3405c6c1daeSBarry Smith #endif
3415c6c1daeSBarry Smith   ierr = PetscMemcpy(mxGetPr(mat),array,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
3425c6c1daeSBarry Smith   engPutVariable(mengine->ep,name,mat);
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Put MATLAB array %s\n",name);CHKERRQ(ierr);
3455c6c1daeSBarry Smith   PetscFunctionReturn(0);
3465c6c1daeSBarry Smith }
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith /*@C
3495c6c1daeSBarry Smith     PetscMatlabEngineGetArray - Gets a variable from Matlab into an array
3505c6c1daeSBarry Smith 
3515c6c1daeSBarry Smith     Not Collective
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith     Input Parameters:
3545c6c1daeSBarry Smith +    mengine - the Matlab engine
3555c6c1daeSBarry Smith .    m,n - the dimensions of the array
3565c6c1daeSBarry Smith .    array - the array (represented in one dimension)
3575c6c1daeSBarry Smith -    name - the name of the array
3585c6c1daeSBarry Smith 
3595c6c1daeSBarry Smith    Level: advanced
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(),
3625c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
3635c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGet(), PetscMatlabEngine
3645c6c1daeSBarry Smith @*/
3655c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGetArray(PetscMatlabEngine mengine,int m,int n,PetscScalar *array,const char name[])
3665c6c1daeSBarry Smith {
3675c6c1daeSBarry Smith   PetscErrorCode ierr;
3685c6c1daeSBarry Smith   mxArray        *mat;
3695c6c1daeSBarry Smith 
3705c6c1daeSBarry Smith   PetscFunctionBegin;
3715c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Getting MATLAB array %s\n",name);CHKERRQ(ierr);
3725c6c1daeSBarry Smith   mat  = engGetVariable(mengine->ep,name);
3735c6c1daeSBarry Smith   if (!mat) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to get array %s from matlab",name);
3745c6c1daeSBarry Smith   ierr = PetscMemcpy(array,mxGetPr(mat),m*n*sizeof(PetscScalar));CHKERRQ(ierr);
3755c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Got MATLAB array %s\n",name);CHKERRQ(ierr);
3765c6c1daeSBarry Smith   PetscFunctionReturn(0);
3775c6c1daeSBarry Smith }
3785c6c1daeSBarry Smith 
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith 
382