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