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