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