1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <engine.h> /* Matlab include file */ 3*5c6c1daeSBarry Smith #include <petscsys.h> 4*5c6c1daeSBarry Smith #include <stdarg.h> 5*5c6c1daeSBarry Smith 6*5c6c1daeSBarry Smith struct _p_PetscMatlabEngine { 7*5c6c1daeSBarry Smith PETSCHEADER(int); 8*5c6c1daeSBarry Smith Engine *ep; 9*5c6c1daeSBarry Smith char buffer[1024]; 10*5c6c1daeSBarry Smith }; 11*5c6c1daeSBarry Smith 12*5c6c1daeSBarry Smith PetscClassId MATLABENGINE_CLASSID = -1; 13*5c6c1daeSBarry Smith 14*5c6c1daeSBarry Smith #undef __FUNCT__ 15*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineCreate" 16*5c6c1daeSBarry Smith /*@C 17*5c6c1daeSBarry Smith PetscMatlabEngineCreate - Creates a MATLAB engine object 18*5c6c1daeSBarry Smith 19*5c6c1daeSBarry Smith Not Collective 20*5c6c1daeSBarry Smith 21*5c6c1daeSBarry Smith Input Parameters: 22*5c6c1daeSBarry Smith + comm - a separate MATLAB engine is started for each process in the communicator 23*5c6c1daeSBarry Smith - machine - name of machine where MATLAB engine is to be run (usually PETSC_NULL) 24*5c6c1daeSBarry Smith 25*5c6c1daeSBarry Smith Output Parameter: 26*5c6c1daeSBarry Smith . mengine - the resulting object 27*5c6c1daeSBarry Smith 28*5c6c1daeSBarry Smith Options Database: 29*5c6c1daeSBarry Smith . -matlab_engine_graphics - allow the MATLAB engine to display graphics 30*5c6c1daeSBarry Smith 31*5c6c1daeSBarry Smith Level: advanced 32*5c6c1daeSBarry Smith 33*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(), 34*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 35*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine 36*5c6c1daeSBarry Smith @*/ 37*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEngineCreate(MPI_Comm comm,const char machine[],PetscMatlabEngine *mengine) 38*5c6c1daeSBarry Smith { 39*5c6c1daeSBarry Smith PetscErrorCode ierr; 40*5c6c1daeSBarry Smith PetscMPIInt rank,size; 41*5c6c1daeSBarry Smith char buffer[256]; 42*5c6c1daeSBarry Smith PetscMatlabEngine e; 43*5c6c1daeSBarry Smith PetscBool flg = PETSC_FALSE; 44*5c6c1daeSBarry Smith 45*5c6c1daeSBarry Smith PetscFunctionBegin; 46*5c6c1daeSBarry Smith if (MATLABENGINE_CLASSID == -1) { 47*5c6c1daeSBarry Smith ierr = PetscClassIdRegister("MATLAB Engine",&MATLABENGINE_CLASSID);CHKERRQ(ierr); 48*5c6c1daeSBarry Smith } 49*5c6c1daeSBarry Smith ierr = PetscOptionsGetBool(PETSC_NULL,"-matlab_engine_graphics",&flg,PETSC_NULL);CHKERRQ(ierr); 50*5c6c1daeSBarry Smith 51*5c6c1daeSBarry Smith ierr = PetscHeaderCreate(e,_p_PetscMatlabEngine,int,MATLABENGINE_CLASSID,0,"MatlabEngine","MATLAB Engine","Sys",comm,PetscMatlabEngineDestroy,0);CHKERRQ(ierr); 52*5c6c1daeSBarry Smith 53*5c6c1daeSBarry Smith if (!machine) machine = "\0"; 54*5c6c1daeSBarry Smith ierr = PetscStrcpy(buffer,PETSC_MATLAB_COMMAND);CHKERRQ(ierr); 55*5c6c1daeSBarry Smith if (!flg) { 56*5c6c1daeSBarry Smith ierr = PetscStrcat(buffer," -nodisplay ");CHKERRQ(ierr); 57*5c6c1daeSBarry Smith } 58*5c6c1daeSBarry Smith ierr = PetscStrcat(buffer," -nojvm ");CHKERRQ(ierr); 59*5c6c1daeSBarry Smith ierr = PetscInfo2(0,"Starting MATLAB engine on %s with command %s\n",machine,buffer);CHKERRQ(ierr); 60*5c6c1daeSBarry Smith e->ep = engOpen(buffer); 61*5c6c1daeSBarry Smith if (!e->ep) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to start MATLAB engine on %s\n",machine); 62*5c6c1daeSBarry Smith engOutputBuffer(e->ep,e->buffer,1024); 63*5c6c1daeSBarry Smith 64*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 65*5c6c1daeSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 66*5c6c1daeSBarry Smith sprintf(buffer,"MPI_Comm_rank = %d; MPI_Comm_size = %d;\n",rank,size); 67*5c6c1daeSBarry Smith engEvalString(e->ep, buffer); 68*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Started MATLAB engine on %s\n",machine);CHKERRQ(ierr); 69*5c6c1daeSBarry Smith 70*5c6c1daeSBarry Smith *mengine = e; 71*5c6c1daeSBarry Smith PetscFunctionReturn(0); 72*5c6c1daeSBarry Smith } 73*5c6c1daeSBarry Smith 74*5c6c1daeSBarry Smith #undef __FUNCT__ 75*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineDestroy" 76*5c6c1daeSBarry Smith /*@ 77*5c6c1daeSBarry Smith PetscMatlabEngineDestroy - Destroys a vector. 78*5c6c1daeSBarry Smith 79*5c6c1daeSBarry Smith Collective on PetscMatlabEngine 80*5c6c1daeSBarry Smith 81*5c6c1daeSBarry Smith Input Parameters: 82*5c6c1daeSBarry Smith . e - the engine 83*5c6c1daeSBarry Smith 84*5c6c1daeSBarry Smith Level: advanced 85*5c6c1daeSBarry Smith 86*5c6c1daeSBarry Smith .seealso: PetscMatlabEnginCreate(), PetscMatlabEnginePut(), PetscMatlabEngineGet(), 87*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 88*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine 89*5c6c1daeSBarry Smith @*/ 90*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEngineDestroy(PetscMatlabEngine *v) 91*5c6c1daeSBarry Smith { 92*5c6c1daeSBarry Smith PetscErrorCode ierr; 93*5c6c1daeSBarry Smith PetscFunctionBegin; 94*5c6c1daeSBarry Smith if (!*v) PetscFunctionReturn(0); 95*5c6c1daeSBarry Smith PetscValidHeaderSpecific(*v,MATLABENGINE_CLASSID,1); 96*5c6c1daeSBarry Smith if (--((PetscObject)(*v))->refct > 0) PetscFunctionReturn(0); 97*5c6c1daeSBarry Smith ierr = PetscHeaderDestroy(v);CHKERRQ(ierr); 98*5c6c1daeSBarry Smith PetscFunctionReturn(0); 99*5c6c1daeSBarry Smith } 100*5c6c1daeSBarry Smith 101*5c6c1daeSBarry Smith #undef __FUNCT__ 102*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineEvaluate" 103*5c6c1daeSBarry Smith /*@C 104*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate - Evaluates a string in MATLAB 105*5c6c1daeSBarry Smith 106*5c6c1daeSBarry Smith Not Collective 107*5c6c1daeSBarry Smith 108*5c6c1daeSBarry Smith Input Parameters: 109*5c6c1daeSBarry Smith + mengine - the MATLAB engine 110*5c6c1daeSBarry Smith - string - format as in a printf() 111*5c6c1daeSBarry Smith 112*5c6c1daeSBarry Smith Level: advanced 113*5c6c1daeSBarry Smith 114*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(), 115*5c6c1daeSBarry Smith PetscMatlabEngineCreate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 116*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine 117*5c6c1daeSBarry Smith @*/ 118*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEngineEvaluate(PetscMatlabEngine mengine,const char string[],...) 119*5c6c1daeSBarry Smith { 120*5c6c1daeSBarry Smith va_list Argp; 121*5c6c1daeSBarry Smith char buffer[1024]; 122*5c6c1daeSBarry Smith PetscErrorCode ierr; 123*5c6c1daeSBarry Smith size_t fullLength; 124*5c6c1daeSBarry Smith 125*5c6c1daeSBarry Smith PetscFunctionBegin; 126*5c6c1daeSBarry Smith va_start(Argp,string); 127*5c6c1daeSBarry Smith ierr = PetscVSNPrintf(buffer,1024-9-5,string,&fullLength,Argp);CHKERRQ(ierr); 128*5c6c1daeSBarry Smith va_end(Argp); 129*5c6c1daeSBarry Smith 130*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Evaluating MATLAB string: %s\n",buffer);CHKERRQ(ierr); 131*5c6c1daeSBarry Smith engEvalString(mengine->ep, buffer); 132*5c6c1daeSBarry Smith 133*5c6c1daeSBarry Smith /* 134*5c6c1daeSBarry Smith Check for error in MATLAB: indicated by ? as first character in engine->buffer 135*5c6c1daeSBarry Smith */ 136*5c6c1daeSBarry Smith if (mengine->buffer[4] == '?') { 137*5c6c1daeSBarry Smith SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in evaluating MATLAB command:%s\n%s",string,mengine->buffer); 138*5c6c1daeSBarry Smith } 139*5c6c1daeSBarry Smith 140*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Done evaluating Matlab string: %s\n",buffer);CHKERRQ(ierr); 141*5c6c1daeSBarry Smith PetscFunctionReturn(0); 142*5c6c1daeSBarry Smith } 143*5c6c1daeSBarry Smith 144*5c6c1daeSBarry Smith #undef __FUNCT__ 145*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGetOutput" 146*5c6c1daeSBarry Smith /*@C 147*5c6c1daeSBarry Smith PetscMatlabEngineGetOutput - Gets a string buffer where the MATLAB output is 148*5c6c1daeSBarry Smith printed 149*5c6c1daeSBarry Smith 150*5c6c1daeSBarry Smith Not Collective 151*5c6c1daeSBarry Smith 152*5c6c1daeSBarry Smith Input Parameter: 153*5c6c1daeSBarry Smith . mengine - the MATLAB engine 154*5c6c1daeSBarry Smith 155*5c6c1daeSBarry Smith Output Parameter: 156*5c6c1daeSBarry Smith . string - buffer where MATLAB output is printed 157*5c6c1daeSBarry Smith 158*5c6c1daeSBarry Smith Level: advanced 159*5c6c1daeSBarry Smith 160*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(), 161*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineCreate(), PetscMatlabEnginePrintOutput(), 162*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine 163*5c6c1daeSBarry Smith @*/ 164*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEngineGetOutput(PetscMatlabEngine mengine,char **string) 165*5c6c1daeSBarry Smith { 166*5c6c1daeSBarry Smith PetscFunctionBegin; 167*5c6c1daeSBarry Smith *string = mengine->buffer; 168*5c6c1daeSBarry Smith PetscFunctionReturn(0); 169*5c6c1daeSBarry Smith } 170*5c6c1daeSBarry Smith 171*5c6c1daeSBarry Smith #undef __FUNCT__ 172*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePrintOutput" 173*5c6c1daeSBarry Smith /*@C 174*5c6c1daeSBarry Smith PetscMatlabEnginePrintOutput - prints the output from MATLAB 175*5c6c1daeSBarry Smith 176*5c6c1daeSBarry Smith Collective on PetscMatlabEngine 177*5c6c1daeSBarry Smith 178*5c6c1daeSBarry Smith Input Parameters: 179*5c6c1daeSBarry Smith . mengine - the Matlab engine 180*5c6c1daeSBarry Smith 181*5c6c1daeSBarry Smith Level: advanced 182*5c6c1daeSBarry Smith 183*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(), 184*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEngineCreate(), 185*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine 186*5c6c1daeSBarry Smith @*/ 187*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEnginePrintOutput(PetscMatlabEngine mengine,FILE *fd) 188*5c6c1daeSBarry Smith { 189*5c6c1daeSBarry Smith PetscErrorCode ierr; 190*5c6c1daeSBarry Smith PetscMPIInt rank; 191*5c6c1daeSBarry Smith 192*5c6c1daeSBarry Smith PetscFunctionBegin; 193*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)mengine)->comm,&rank);CHKERRQ(ierr); 194*5c6c1daeSBarry Smith ierr = PetscSynchronizedFPrintf(((PetscObject)mengine)->comm,fd,"[%d]%s",rank,mengine->buffer);CHKERRQ(ierr); 195*5c6c1daeSBarry Smith ierr = PetscSynchronizedFlush(((PetscObject)mengine)->comm);CHKERRQ(ierr); 196*5c6c1daeSBarry Smith PetscFunctionReturn(0); 197*5c6c1daeSBarry Smith } 198*5c6c1daeSBarry Smith 199*5c6c1daeSBarry Smith #undef __FUNCT__ 200*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePut" 201*5c6c1daeSBarry Smith /*@ 202*5c6c1daeSBarry Smith PetscMatlabEnginePut - Puts a Petsc object into the MATLAB space. For parallel objects, 203*5c6c1daeSBarry Smith each processors part is put in a separate MATLAB process. 204*5c6c1daeSBarry Smith 205*5c6c1daeSBarry Smith Collective on PetscObject 206*5c6c1daeSBarry Smith 207*5c6c1daeSBarry Smith Input Parameters: 208*5c6c1daeSBarry Smith + mengine - the MATLAB engine 209*5c6c1daeSBarry Smith - object - the PETSc object, for example Vec 210*5c6c1daeSBarry Smith 211*5c6c1daeSBarry Smith Level: advanced 212*5c6c1daeSBarry Smith 213*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(), 214*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 215*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine 216*5c6c1daeSBarry Smith @*/ 217*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEnginePut(PetscMatlabEngine mengine,PetscObject obj) 218*5c6c1daeSBarry Smith { 219*5c6c1daeSBarry Smith PetscErrorCode ierr,(*put)(PetscObject,void*); 220*5c6c1daeSBarry Smith 221*5c6c1daeSBarry Smith PetscFunctionBegin; 222*5c6c1daeSBarry Smith ierr = PetscObjectQueryFunction(obj,"PetscMatlabEnginePut_C",(void (**)(void))&put);CHKERRQ(ierr); 223*5c6c1daeSBarry Smith if (!put) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be put into MATLAB engine",obj->class_name); 224*5c6c1daeSBarry Smith ierr = PetscInfo(0,"Putting MATLAB object\n");CHKERRQ(ierr); 225*5c6c1daeSBarry Smith ierr = (*put)(obj,mengine->ep);CHKERRQ(ierr); 226*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Put MATLAB object: %s\n",obj->name);CHKERRQ(ierr); 227*5c6c1daeSBarry Smith PetscFunctionReturn(0); 228*5c6c1daeSBarry Smith } 229*5c6c1daeSBarry Smith 230*5c6c1daeSBarry Smith #undef __FUNCT__ 231*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGet" 232*5c6c1daeSBarry Smith /*@ 233*5c6c1daeSBarry Smith PetscMatlabEngineGet - Gets a variable from MATLAB into a PETSc object. 234*5c6c1daeSBarry Smith 235*5c6c1daeSBarry Smith Collective on PetscObject 236*5c6c1daeSBarry Smith 237*5c6c1daeSBarry Smith Input Parameters: 238*5c6c1daeSBarry Smith + mengine - the MATLAB engine 239*5c6c1daeSBarry Smith - object - the PETSc object, for example Vec 240*5c6c1daeSBarry Smith 241*5c6c1daeSBarry Smith Level: advanced 242*5c6c1daeSBarry Smith 243*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(), 244*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 245*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), MatlabEngineGetArray(), PetscMatlabEngine 246*5c6c1daeSBarry Smith @*/ 247*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEngineGet(PetscMatlabEngine mengine,PetscObject obj) 248*5c6c1daeSBarry Smith { 249*5c6c1daeSBarry Smith PetscErrorCode ierr,(*get)(PetscObject,void*); 250*5c6c1daeSBarry Smith 251*5c6c1daeSBarry Smith PetscFunctionBegin; 252*5c6c1daeSBarry Smith if (!obj->name) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Cannot get object that has no name"); 253*5c6c1daeSBarry Smith ierr = PetscObjectQueryFunction(obj,"PetscMatlabEngineGet_C",(void (**)(void))&get);CHKERRQ(ierr); 254*5c6c1daeSBarry Smith if (!get) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Object %s cannot be gotten from MATLAB engine",obj->class_name); 255*5c6c1daeSBarry Smith ierr = PetscInfo(0,"Getting MATLAB object\n");CHKERRQ(ierr); 256*5c6c1daeSBarry Smith ierr = (*get)(obj,mengine->ep);CHKERRQ(ierr); 257*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Got MATLAB object: %s\n",obj->name);CHKERRQ(ierr); 258*5c6c1daeSBarry Smith PetscFunctionReturn(0); 259*5c6c1daeSBarry Smith } 260*5c6c1daeSBarry Smith 261*5c6c1daeSBarry Smith /* 262*5c6c1daeSBarry Smith The variable Petsc_Matlab_Engine_keyval is used to indicate an MPI attribute that 263*5c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscMatlabEngine 264*5c6c1daeSBarry Smith */ 265*5c6c1daeSBarry Smith static PetscMPIInt Petsc_Matlab_Engine_keyval = MPI_KEYVAL_INVALID; 266*5c6c1daeSBarry Smith 267*5c6c1daeSBarry Smith 268*5c6c1daeSBarry Smith #undef __FUNCT__ 269*5c6c1daeSBarry Smith #define __FUNCT__ "PETSC_MATLAB_ENGINE_" 270*5c6c1daeSBarry Smith /*@C 271*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_ - Creates a matlab engine shared by all processors 272*5c6c1daeSBarry Smith in a communicator. 273*5c6c1daeSBarry Smith 274*5c6c1daeSBarry Smith Not Collective 275*5c6c1daeSBarry Smith 276*5c6c1daeSBarry Smith Input Parameter: 277*5c6c1daeSBarry Smith . comm - the MPI communicator to share the engine 278*5c6c1daeSBarry Smith 279*5c6c1daeSBarry Smith Level: developer 280*5c6c1daeSBarry Smith 281*5c6c1daeSBarry Smith Notes: 282*5c6c1daeSBarry Smith Unlike almost all other PETSc routines, this does not return 283*5c6c1daeSBarry Smith an error code. Usually used in the form 284*5c6c1daeSBarry Smith $ PetscMatlabEngineYYY(XXX object,PETSC_MATLAB_ENGINE_(comm)); 285*5c6c1daeSBarry Smith 286*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineGet(), 287*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 288*5c6c1daeSBarry Smith PetscMatlabEngineCreate(), PetscMatlabEnginePutArray(), PetscMatlabEngineGetArray(), PetscMatlabEngine, 289*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_WORLD, PETSC_MATLAB_ENGINE_SELF 290*5c6c1daeSBarry Smith 291*5c6c1daeSBarry Smith @*/ 292*5c6c1daeSBarry Smith PetscMatlabEngine PETSC_MATLAB_ENGINE_(MPI_Comm comm) 293*5c6c1daeSBarry Smith { 294*5c6c1daeSBarry Smith PetscErrorCode ierr; 295*5c6c1daeSBarry Smith PetscBool flg; 296*5c6c1daeSBarry Smith PetscMatlabEngine mengine; 297*5c6c1daeSBarry Smith 298*5c6c1daeSBarry Smith PetscFunctionBegin; 299*5c6c1daeSBarry Smith if (Petsc_Matlab_Engine_keyval == MPI_KEYVAL_INVALID) { 300*5c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Matlab_Engine_keyval,0); 301*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;} 302*5c6c1daeSBarry Smith } 303*5c6c1daeSBarry Smith ierr = MPI_Attr_get(comm,Petsc_Matlab_Engine_keyval,(void **)&mengine,(int*)&flg); 304*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;} 305*5c6c1daeSBarry Smith if (!flg) { /* viewer not yet created */ 306*5c6c1daeSBarry Smith char *machinename = 0,machine[64]; 307*5c6c1daeSBarry Smith 308*5c6c1daeSBarry Smith ierr = PetscOptionsGetString(PETSC_NULL,"-matlab_engine_machine",machine,64,&flg); 309*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;} 310*5c6c1daeSBarry Smith if (flg) machinename = machine; 311*5c6c1daeSBarry Smith ierr = PetscMatlabEngineCreate(comm,machinename,&mengine); 312*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;} 313*5c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)mengine); 314*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;} 315*5c6c1daeSBarry Smith ierr = MPI_Attr_put(comm,Petsc_Matlab_Engine_keyval,mengine); 316*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_MATLAB_ENGINE_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); mengine = 0;} 317*5c6c1daeSBarry Smith } 318*5c6c1daeSBarry Smith PetscFunctionReturn(mengine); 319*5c6c1daeSBarry Smith } 320*5c6c1daeSBarry Smith 321*5c6c1daeSBarry Smith #undef __FUNCT__ 322*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEnginePutArray" 323*5c6c1daeSBarry Smith /*@C 324*5c6c1daeSBarry Smith PetscMatlabEnginePutArray - Puts an array into the MATLAB space, treating it as a Fortran style (column major ordering) array. For parallel objects, 325*5c6c1daeSBarry Smith each processors part is put in a separate MATLAB process. 326*5c6c1daeSBarry Smith 327*5c6c1daeSBarry Smith Collective on PetscObject 328*5c6c1daeSBarry Smith 329*5c6c1daeSBarry Smith Input Parameters: 330*5c6c1daeSBarry Smith + mengine - the MATLAB engine 331*5c6c1daeSBarry Smith . m,n - the dimensions of the array 332*5c6c1daeSBarry Smith . array - the array (represented in one dimension) 333*5c6c1daeSBarry Smith - name - the name of the array 334*5c6c1daeSBarry Smith 335*5c6c1daeSBarry Smith Level: advanced 336*5c6c1daeSBarry Smith 337*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEngineCreate(), PetscMatlabEngineGet(), 338*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 339*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePut(), MatlabEngineGetArray(), PetscMatlabEngine 340*5c6c1daeSBarry Smith @*/ 341*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEnginePutArray(PetscMatlabEngine mengine,int m,int n,const PetscScalar *array,const char name[]) 342*5c6c1daeSBarry Smith { 343*5c6c1daeSBarry Smith PetscErrorCode ierr; 344*5c6c1daeSBarry Smith mxArray *mat; 345*5c6c1daeSBarry Smith 346*5c6c1daeSBarry Smith PetscFunctionBegin; 347*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Putting MATLAB array %s\n",name);CHKERRQ(ierr); 348*5c6c1daeSBarry Smith #if !defined(PETSC_USE_COMPLEX) 349*5c6c1daeSBarry Smith mat = mxCreateDoubleMatrix(m,n,mxREAL); 350*5c6c1daeSBarry Smith #else 351*5c6c1daeSBarry Smith mat = mxCreateDoubleMatrix(m,n,mxCOMPLEX); 352*5c6c1daeSBarry Smith #endif 353*5c6c1daeSBarry Smith ierr = PetscMemcpy(mxGetPr(mat),array,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 354*5c6c1daeSBarry Smith engPutVariable(mengine->ep,name,mat); 355*5c6c1daeSBarry Smith 356*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Put MATLAB array %s\n",name);CHKERRQ(ierr); 357*5c6c1daeSBarry Smith PetscFunctionReturn(0); 358*5c6c1daeSBarry Smith } 359*5c6c1daeSBarry Smith 360*5c6c1daeSBarry Smith #undef __FUNCT__ 361*5c6c1daeSBarry Smith #define __FUNCT__ "PetscMatlabEngineGetArray" 362*5c6c1daeSBarry Smith /*@C 363*5c6c1daeSBarry Smith PetscMatlabEngineGetArray - Gets a variable from Matlab into an array 364*5c6c1daeSBarry Smith 365*5c6c1daeSBarry Smith Not Collective 366*5c6c1daeSBarry Smith 367*5c6c1daeSBarry Smith Input Parameters: 368*5c6c1daeSBarry Smith + mengine - the Matlab engine 369*5c6c1daeSBarry Smith . m,n - the dimensions of the array 370*5c6c1daeSBarry Smith . array - the array (represented in one dimension) 371*5c6c1daeSBarry Smith - name - the name of the array 372*5c6c1daeSBarry Smith 373*5c6c1daeSBarry Smith Level: advanced 374*5c6c1daeSBarry Smith 375*5c6c1daeSBarry Smith .seealso: PetscMatlabEngineDestroy(), PetscMatlabEnginePut(), PetscMatlabEngineCreate(), 376*5c6c1daeSBarry Smith PetscMatlabEngineEvaluate(), PetscMatlabEngineGetOutput(), PetscMatlabEnginePrintOutput(), 377*5c6c1daeSBarry Smith PETSC_MATLAB_ENGINE_(), PetscMatlabEnginePutArray(), PetscMatlabEngineGet(), PetscMatlabEngine 378*5c6c1daeSBarry Smith @*/ 379*5c6c1daeSBarry Smith PetscErrorCode PetscMatlabEngineGetArray(PetscMatlabEngine mengine,int m,int n,PetscScalar *array,const char name[]) 380*5c6c1daeSBarry Smith { 381*5c6c1daeSBarry Smith PetscErrorCode ierr; 382*5c6c1daeSBarry Smith mxArray *mat; 383*5c6c1daeSBarry Smith 384*5c6c1daeSBarry Smith PetscFunctionBegin; 385*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Getting MATLAB array %s\n",name);CHKERRQ(ierr); 386*5c6c1daeSBarry Smith mat = engGetVariable(mengine->ep,name); 387*5c6c1daeSBarry Smith if (!mat) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to get array %s from matlab",name); 388*5c6c1daeSBarry Smith ierr = PetscMemcpy(array,mxGetPr(mat),m*n*sizeof(PetscScalar));CHKERRQ(ierr); 389*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Got MATLAB array %s\n",name);CHKERRQ(ierr); 390*5c6c1daeSBarry Smith PetscFunctionReturn(0); 391*5c6c1daeSBarry Smith } 392*5c6c1daeSBarry Smith 393*5c6c1daeSBarry Smith 394*5c6c1daeSBarry Smith 395*5c6c1daeSBarry Smith 396