xref: /petsc/src/sys/classes/matlabengine/matlab.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <engine.h>   /* Matlab include file */
35c6c1daeSBarry Smith #include <petscsys.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith struct  _p_PetscMatlabEngine {
65c6c1daeSBarry Smith   PETSCHEADER(int);
75c6c1daeSBarry Smith   Engine *ep;
85c6c1daeSBarry Smith   char   buffer[1024];
95c6c1daeSBarry Smith };
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith PetscClassId MATLABENGINE_CLASSID = -1;
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith #undef __FUNCT__
145c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineCreate"
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   }
480298fd71SBarry Smith   ierr = PetscOptionsGetBool(NULL,"-matlab_engine_graphics",&flg,NULL);CHKERRQ(ierr);
495c6c1daeSBarry Smith 
5067c2884eSBarry Smith   ierr = PetscHeaderCreate(e,_p_PetscMatlabEngine,int,MATLABENGINE_CLASSID,"MatlabEngine","MATLAB Engine","Sys",comm,PetscMatlabEngineDestroy,0);CHKERRQ(ierr);
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith   if (!machine) machine = "\0";
535c6c1daeSBarry Smith   ierr = PetscStrcpy(buffer,PETSC_MATLAB_COMMAND);CHKERRQ(ierr);
545c6c1daeSBarry Smith   if (!flg) {
555c6c1daeSBarry Smith     ierr = PetscStrcat(buffer," -nodisplay ");CHKERRQ(ierr);
565c6c1daeSBarry Smith   }
575c6c1daeSBarry Smith   ierr  = PetscStrcat(buffer," -nojvm ");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);
605c6c1daeSBarry Smith   if (!e->ep) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to start MATLAB engine on %s\n",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 #undef __FUNCT__
745c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineDestroy"
755c6c1daeSBarry Smith /*@
765c6c1daeSBarry Smith    PetscMatlabEngineDestroy - Destroys a vector.
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith    Collective on PetscMatlabEngine
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith    Input Parameters:
815c6c1daeSBarry Smith .  e  - the engine
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith    Level: advanced
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith .seealso: PetscMatlabEnginCreate(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
865c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
875c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
885c6c1daeSBarry Smith @*/
895c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineDestroy(PetscMatlabEngine *v)
905c6c1daeSBarry Smith {
915c6c1daeSBarry Smith   PetscErrorCode ierr;
925fd66863SKarl Rupp 
935c6c1daeSBarry Smith   PetscFunctionBegin;
945c6c1daeSBarry Smith   if (!*v) PetscFunctionReturn(0);
955c6c1daeSBarry Smith   PetscValidHeaderSpecific(*v,MATLABENGINE_CLASSID,1);
965c6c1daeSBarry Smith   if (--((PetscObject)(*v))->refct > 0) PetscFunctionReturn(0);
975c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(v);CHKERRQ(ierr);
985c6c1daeSBarry Smith   PetscFunctionReturn(0);
995c6c1daeSBarry Smith }
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith #undef __FUNCT__
1025c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineEvaluate"
1035c6c1daeSBarry Smith /*@C
1045c6c1daeSBarry Smith     PetscMatlabEngineEvaluate - Evaluates a string in MATLAB
1055c6c1daeSBarry Smith 
1065c6c1daeSBarry Smith     Not Collective
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith     Input Parameters:
1095c6c1daeSBarry Smith +   mengine - the MATLAB engine
1105c6c1daeSBarry Smith -   string - format as in a printf()
1115c6c1daeSBarry Smith 
1125c6c1daeSBarry Smith    Level: advanced
1135c6c1daeSBarry Smith 
1145c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
1155c6c1daeSBarry Smith           PetscMatlabEngineCreate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
1165c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
1175c6c1daeSBarry Smith @*/
1185c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineEvaluate(PetscMatlabEngine mengine,const char string[],...)
1195c6c1daeSBarry Smith {
1205c6c1daeSBarry Smith   va_list        Argp;
1215c6c1daeSBarry Smith   char           buffer[1024];
1225c6c1daeSBarry Smith   PetscErrorCode ierr;
1235c6c1daeSBarry Smith   size_t         fullLength;
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith   PetscFunctionBegin;
1265c6c1daeSBarry Smith   va_start(Argp,string);
1275c6c1daeSBarry Smith   ierr = PetscVSNPrintf(buffer,1024-9-5,string,&fullLength,Argp);CHKERRQ(ierr);
1285c6c1daeSBarry Smith   va_end(Argp);
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Evaluating MATLAB string: %s\n",buffer);CHKERRQ(ierr);
1315c6c1daeSBarry Smith   engEvalString(mengine->ep, buffer);
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   /*
1345c6c1daeSBarry Smith      Check for error in MATLAB: indicated by ? as first character in engine->buffer
1355c6c1daeSBarry Smith   */
136f23aa3ddSBarry Smith   if (mengine->buffer[4] == '?') SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in evaluating MATLAB command:%s\n%s",string,mengine->buffer);
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Done evaluating Matlab string: %s\n",buffer);CHKERRQ(ierr);
1395c6c1daeSBarry Smith   PetscFunctionReturn(0);
1405c6c1daeSBarry Smith }
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith #undef __FUNCT__
1435c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGetOutput"
1445c6c1daeSBarry Smith /*@C
1455c6c1daeSBarry Smith     PetscMatlabEngineGetOutput - Gets a string buffer where the MATLAB output is
1465c6c1daeSBarry Smith           printed
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith     Not Collective
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith     Input Parameter:
1515c6c1daeSBarry Smith .   mengine - the MATLAB engine
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith     Output Parameter:
1545c6c1daeSBarry Smith .   string - buffer where MATLAB output is printed
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith    Level: advanced
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
1595c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineCreate(), PetscMatlabEnginePrintOutput(),
1605c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
1615c6c1daeSBarry Smith @*/
1625c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGetOutput(PetscMatlabEngine mengine,char **string)
1635c6c1daeSBarry Smith {
1645c6c1daeSBarry Smith   PetscFunctionBegin;
1655c6c1daeSBarry Smith   *string = mengine->buffer;
1665c6c1daeSBarry Smith   PetscFunctionReturn(0);
1675c6c1daeSBarry Smith }
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith #undef __FUNCT__
1705c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePrintOutput"
1715c6c1daeSBarry Smith /*@C
1725c6c1daeSBarry Smith     PetscMatlabEnginePrintOutput - prints the output from MATLAB
1735c6c1daeSBarry Smith 
1745c6c1daeSBarry Smith     Collective on PetscMatlabEngine
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith     Input Parameters:
1775c6c1daeSBarry Smith .    mengine - the Matlab engine
1785c6c1daeSBarry Smith 
1795c6c1daeSBarry Smith    Level: advanced
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
1825c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEngineCreate(),
1835c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine
1845c6c1daeSBarry Smith @*/
1855c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePrintOutput(PetscMatlabEngine mengine,FILE *fd)
1865c6c1daeSBarry Smith {
1875c6c1daeSBarry Smith   PetscErrorCode ierr;
1885c6c1daeSBarry Smith   PetscMPIInt    rank;
1895c6c1daeSBarry Smith 
1905c6c1daeSBarry Smith   PetscFunctionBegin;
191*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)mengine),&rank);CHKERRQ(ierr);
192*ce94432eSBarry Smith   ierr = PetscSynchronizedFPrintf(PetscObjectComm((PetscObject)mengine),fd,"[%d]%s",rank,mengine->buffer);CHKERRQ(ierr);
193*ce94432eSBarry Smith   ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)mengine));CHKERRQ(ierr);
1945c6c1daeSBarry Smith   PetscFunctionReturn(0);
1955c6c1daeSBarry Smith }
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith #undef __FUNCT__
1985c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePut"
1995c6c1daeSBarry Smith /*@
2005c6c1daeSBarry Smith     PetscMatlabEnginePut - Puts a Petsc object into the MATLAB space. For parallel objects,
2015c6c1daeSBarry Smith       each processors part is put in a separate  MATLAB process.
2025c6c1daeSBarry Smith 
2035c6c1daeSBarry Smith     Collective on PetscObject
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith     Input Parameters:
2065c6c1daeSBarry Smith +    mengine - the MATLAB engine
2075c6c1daeSBarry Smith -    object - the PETSc object, for example Vec
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith    Level: advanced
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(),
2125c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
2135c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine
2145c6c1daeSBarry Smith @*/
2155c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePut(PetscMatlabEngine mengine,PetscObject obj)
2165c6c1daeSBarry Smith {
2175c6c1daeSBarry Smith   PetscErrorCode ierr,(*put)(PetscObject,void*);
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith   PetscFunctionBegin;
2205c6c1daeSBarry Smith   ierr = PetscObjectQueryFunction(obj,"PetscMatlabEnginePut_C",(void (**)(void))&put);CHKERRQ(ierr);
2215c6c1daeSBarry Smith   if (!put) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be put into MATLAB engine",obj->class_name);
2225c6c1daeSBarry Smith   ierr = PetscInfo(0,"Putting MATLAB object\n");CHKERRQ(ierr);
2235c6c1daeSBarry Smith   ierr = (*put)(obj,mengine->ep);CHKERRQ(ierr);
2245c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Put MATLAB object: %s\n",obj->name);CHKERRQ(ierr);
2255c6c1daeSBarry Smith   PetscFunctionReturn(0);
2265c6c1daeSBarry Smith }
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith #undef __FUNCT__
2295c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGet"
2305c6c1daeSBarry Smith /*@
2315c6c1daeSBarry Smith     PetscMatlabEngineGet - Gets a variable from MATLAB into a PETSc object.
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith     Collective on PetscObject
2345c6c1daeSBarry Smith 
2355c6c1daeSBarry Smith     Input Parameters:
2365c6c1daeSBarry Smith +    mengine - the MATLAB engine
2375c6c1daeSBarry Smith -    object - the PETSc object, for example Vec
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith    Level: advanced
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(),
2425c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
2435c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine
2445c6c1daeSBarry Smith @*/
2455c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGet(PetscMatlabEngine mengine,PetscObject obj)
2465c6c1daeSBarry Smith {
2475c6c1daeSBarry Smith   PetscErrorCode ierr,(*get)(PetscObject,void*);
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith   PetscFunctionBegin;
2505c6c1daeSBarry Smith   if (!obj->name) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Cannot get object that has no name");
2515c6c1daeSBarry Smith   ierr = PetscObjectQueryFunction(obj,"PetscMatlabEngineGet_C",(void (**)(void))&get);CHKERRQ(ierr);
2525c6c1daeSBarry Smith   if (!get) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be gotten from MATLAB engine",obj->class_name);
2535c6c1daeSBarry Smith   ierr = PetscInfo(0,"Getting MATLAB object\n");CHKERRQ(ierr);
2545c6c1daeSBarry Smith   ierr = (*get)(obj,mengine->ep);CHKERRQ(ierr);
2555c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Got MATLAB object: %s\n",obj->name);CHKERRQ(ierr);
2565c6c1daeSBarry Smith   PetscFunctionReturn(0);
2575c6c1daeSBarry Smith }
2585c6c1daeSBarry Smith 
2595c6c1daeSBarry Smith /*
2605c6c1daeSBarry Smith     The variable Petsc_Matlab_Engine_keyval is used to indicate an MPI attribute that
2615c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscMatlabEngine
2625c6c1daeSBarry Smith */
2635c6c1daeSBarry Smith static PetscMPIInt Petsc_Matlab_Engine_keyval = MPI_KEYVAL_INVALID;
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith 
2665c6c1daeSBarry Smith #undef __FUNCT__
2675c6c1daeSBarry Smith #define __FUNCT__ "PETSC_MATLAB_ENGINE_"
2685c6c1daeSBarry Smith /*@C
2695c6c1daeSBarry Smith    PETSC_MATLAB_ENGINE_ - Creates a matlab engine shared by all processors
2705c6c1daeSBarry Smith                     in a communicator.
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith    Not Collective
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith    Input Parameter:
2755c6c1daeSBarry Smith .  comm - the MPI communicator to share the engine
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith    Level: developer
2785c6c1daeSBarry Smith 
2795c6c1daeSBarry Smith    Notes:
2805c6c1daeSBarry Smith    Unlike almost all other PETSc routines, this does not return
2815c6c1daeSBarry Smith    an error code. Usually used in the form
2825c6c1daeSBarry Smith $      PetscMatlabEngineYYY(XXX object,PETSC_MATLAB_ENGINE_(comm));
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(),
2855c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
2865c6c1daeSBarry Smith           PetscMatlabEngineCreate(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine,
2875c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_WORLD, PETSC_MATLAB_ENGINE_SELF
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith @*/
2905c6c1daeSBarry Smith PetscMatlabEngine  PETSC_MATLAB_ENGINE_(MPI_Comm comm)
2915c6c1daeSBarry Smith {
2925c6c1daeSBarry Smith   PetscErrorCode    ierr;
2935c6c1daeSBarry Smith   PetscBool         flg;
2945c6c1daeSBarry Smith   PetscMatlabEngine mengine;
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith   PetscFunctionBegin;
2975c6c1daeSBarry Smith   if (Petsc_Matlab_Engine_keyval == MPI_KEYVAL_INVALID) {
2985c6c1daeSBarry Smith     ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Matlab_Engine_keyval,0);
2995c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3005c6c1daeSBarry Smith   }
3015c6c1daeSBarry Smith   ierr = MPI_Attr_get(comm,Petsc_Matlab_Engine_keyval,(void**)&mengine,(int*)&flg);
3025c6c1daeSBarry Smith   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3035c6c1daeSBarry Smith   if (!flg) { /* viewer not yet created */
3045c6c1daeSBarry Smith     char *machinename = 0,machine[64];
3055c6c1daeSBarry Smith 
3060298fd71SBarry Smith     ierr = PetscOptionsGetString(NULL,"-matlab_engine_machine",machine,64,&flg);
3075c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3085c6c1daeSBarry Smith     if (flg) machinename = machine;
3095c6c1daeSBarry Smith     ierr = PetscMatlabEngineCreate(comm,machinename,&mengine);
3105c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3115c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)mengine);
3125c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3135c6c1daeSBarry Smith     ierr = MPI_Attr_put(comm,Petsc_Matlab_Engine_keyval,mengine);
3145c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;}
3155c6c1daeSBarry Smith   }
3165c6c1daeSBarry Smith   PetscFunctionReturn(mengine);
3175c6c1daeSBarry Smith }
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith #undef __FUNCT__
3205c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePutArray"
3215c6c1daeSBarry Smith /*@C
3225c6c1daeSBarry Smith     PetscMatlabEnginePutArray - Puts an array into the MATLAB space, treating it as a Fortran style (column major ordering) array. For parallel objects,
3235c6c1daeSBarry Smith       each processors part is put in a separate  MATLAB process.
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith     Collective on PetscObject
3265c6c1daeSBarry Smith 
3275c6c1daeSBarry Smith     Input Parameters:
3285c6c1daeSBarry Smith +    mengine - the MATLAB engine
3295c6c1daeSBarry Smith .    m,n - the dimensions of the array
3305c6c1daeSBarry Smith .    array - the array (represented in one dimension)
3315c6c1daeSBarry Smith -    name - the name of the array
3325c6c1daeSBarry Smith 
3335c6c1daeSBarry Smith    Level: advanced
3345c6c1daeSBarry Smith 
3355c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(),
3365c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
3375c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePut(), MatlabEngineGetArray(), PetscMatlabEngine
3385c6c1daeSBarry Smith @*/
3395c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEnginePutArray(PetscMatlabEngine mengine,int m,int n,const PetscScalar *array,const char name[])
3405c6c1daeSBarry Smith {
3415c6c1daeSBarry Smith   PetscErrorCode ierr;
3425c6c1daeSBarry Smith   mxArray        *mat;
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith   PetscFunctionBegin;
3455c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Putting MATLAB array %s\n",name);CHKERRQ(ierr);
3465c6c1daeSBarry Smith #if !defined(PETSC_USE_COMPLEX)
3475c6c1daeSBarry Smith   mat = mxCreateDoubleMatrix(m,n,mxREAL);
3485c6c1daeSBarry Smith #else
3495c6c1daeSBarry Smith   mat = mxCreateDoubleMatrix(m,n,mxCOMPLEX);
3505c6c1daeSBarry Smith #endif
3515c6c1daeSBarry Smith   ierr = PetscMemcpy(mxGetPr(mat),array,m*n*sizeof(PetscScalar));CHKERRQ(ierr);
3525c6c1daeSBarry Smith   engPutVariable(mengine->ep,name,mat);
3535c6c1daeSBarry Smith 
3545c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Put MATLAB array %s\n",name);CHKERRQ(ierr);
3555c6c1daeSBarry Smith   PetscFunctionReturn(0);
3565c6c1daeSBarry Smith }
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith #undef __FUNCT__
3595c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGetArray"
3605c6c1daeSBarry Smith /*@C
3615c6c1daeSBarry Smith     PetscMatlabEngineGetArray - Gets a variable from Matlab into an array
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith     Not Collective
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith     Input Parameters:
3665c6c1daeSBarry Smith +    mengine - the Matlab engine
3675c6c1daeSBarry Smith .    m,n - the dimensions of the array
3685c6c1daeSBarry Smith .    array - the array (represented in one dimension)
3695c6c1daeSBarry Smith -    name - the name of the array
3705c6c1daeSBarry Smith 
3715c6c1daeSBarry Smith    Level: advanced
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(),
3745c6c1daeSBarry Smith           PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(),
3755c6c1daeSBarry Smith           PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGet(), PetscMatlabEngine
3765c6c1daeSBarry Smith @*/
3775c6c1daeSBarry Smith PetscErrorCode  PetscMatlabEngineGetArray(PetscMatlabEngine mengine,int m,int n,PetscScalar *array,const char name[])
3785c6c1daeSBarry Smith {
3795c6c1daeSBarry Smith   PetscErrorCode ierr;
3805c6c1daeSBarry Smith   mxArray        *mat;
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith   PetscFunctionBegin;
3835c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Getting MATLAB array %s\n",name);CHKERRQ(ierr);
3845c6c1daeSBarry Smith   mat  = engGetVariable(mengine->ep,name);
3855c6c1daeSBarry Smith   if (!mat) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to get array %s from matlab",name);
3865c6c1daeSBarry Smith   ierr = PetscMemcpy(array,mxGetPr(mat),m*n*sizeof(PetscScalar));CHKERRQ(ierr);
3875c6c1daeSBarry Smith   ierr = PetscInfo1(0,"Got MATLAB array %s\n",name);CHKERRQ(ierr);
3885c6c1daeSBarry Smith   PetscFunctionReturn(0);
3895c6c1daeSBarry Smith }
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith 
3925c6c1daeSBarry Smith 
3935c6c1daeSBarry Smith 
394