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