/*@C PetscObjectsDump - Prints the currently existing objects. Logically Collective on PetscViewer Input Parameter: + fd - file pointer - all - by default only tries to display objects created explicitly by the user, if all is PETSC_TRUE then lists all outstanding objects Options Database: . -objects_dump <all> Level: advanced Concepts: options database^printing @*/ PetscErrorCode PetscObjectsDump(FILE *fd,PetscBool all) { PetscErrorCode ierr; PetscInt i; #if defined(PETSC_USE_DEBUG) PetscInt j,k=0; #endif PetscObject h; PetscFunctionBegin; if (PetscObjectsCounts) { ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"The following objects were never freed\n");CHKERRQ(ierr); ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-----------------------------------------\n");CHKERRQ(ierr); for (i=0; i<PetscObjectsMaxCounts; i++) { if ((h = PetscObjects[i])) { ierr = PetscObjectName(h);CHKERRQ(ierr); { #if defined(PETSC_USE_DEBUG) PetscStack *stack = 0; char *create,*rclass; /* if the PETSc function the user calls is not a create then this object was NOT directly created by them */ ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr); if (stack) { k = stack->currentsize-2; if (!all) { k = 0; while (!stack->petscroutine[k]) k++; ierr = PetscStrstr(stack->function[k],"Create",&create);CHKERRQ(ierr); if (!create) { ierr = PetscStrstr(stack->function[k],"Get",&create);CHKERRQ(ierr); } ierr = PetscStrstr(stack->function[k],h->class_name,&rclass);CHKERRQ(ierr); if (!create) continue; if (!rclass) continue; } } #endif ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"[%d] %s %s %s\n",PetscGlobalRank,h->class_name,h->type_name,h->name);CHKERRQ(ierr); #if defined(PETSC_USE_DEBUG) ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr); if (stack) { for (j=k; j>=0; j--) { fprintf(fd," [%d] %s() in %s\n",PetscGlobalRank,stack->function[j],stack->file[j]); } } #endif } } } } PetscFunctionReturn(0); }
PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x) { PetscErrorCode ierr; const char *_A,*_b,*_x; PetscFunctionBegin; /* make sure objects have names; use default if not */ ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),(PetscObject)b);CHKERRQ(ierr); ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr); ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"%s = 0;",_b);CHKERRQ(ierr); /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),stdout);CHKERRQ(ierr); */ ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),(PetscObject)x);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode MatlabEnginePut_SeqAIJ(PetscObject obj,void *mengine) { PetscErrorCode ierr; mxArray *mat; PetscFunctionBegin; mat = MatSeqAIJToMatlab((Mat)obj);if (!mat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot create MATLAB matrix"); ierr = PetscObjectName(obj);CHKERRQ(ierr); engPutVariable((Engine*)mengine,obj->name,mat); PetscFunctionReturn(0); }
/*@C PetscObjectGetName - Gets a string name associated with a PETSc object. Not Collective Input Parameters: + obj - the Petsc variable Thus must be cast with a (PetscObject), for example, PetscObjectGetName((PetscObject)mat,&name); - name - the name associated with obj Level: intermediate Concepts: object name .seealso: PetscObjectSetName() @*/ PetscErrorCode PETSC_DLLEXPORT PetscObjectGetName(PetscObject obj,const char *name[]) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidPointer(name,2); if (!obj->name) { ierr = PetscObjectName(obj);CHKERRQ(ierr); } *name = obj->name; PetscFunctionReturn(0); }
/* Write vector contents */ #if defined(PETSC_HAVE_MPIIO) ierr = PetscViewerBinaryGetUseMPIIO(viewer,&isMPIIO);CHKERRQ(ierr); if (!isMPIIO) { #endif ierr = PetscViewerBinaryGetDescriptor(viewer,&fdes);CHKERRQ(ierr); ierr = VecGetArrayRead(xin,&xv);CHKERRQ(ierr); ierr = PetscBinaryWrite(fdes,(void*)xv,n,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); ierr = VecRestoreArrayRead(xin,&xv);CHKERRQ(ierr); ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); if (format == PETSC_VIEWER_BINARY_MATLAB) { MPI_Comm comm; FILE *info; const char *name; ierr = PetscObjectGetName((PetscObject)xin,&name);CHKERRQ(ierr); ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); ierr = PetscViewerBinaryGetInfoPointer(viewer,&info);CHKERRQ(ierr); ierr = PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n");CHKERRQ(ierr); ierr = PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",name);CHKERRQ(ierr); ierr = PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n");CHKERRQ(ierr); } #if defined(PETSC_HAVE_MPIIO) } else { MPI_Offset off; MPI_File mfdes; PetscMPIInt lsize; ierr = PetscMPIIntCast(n,&lsize);CHKERRQ(ierr); ierr = PetscViewerBinaryGetMPIIODescriptor(viewer,&mfdes);CHKERRQ(ierr); ierr = PetscViewerBinaryGetMPIIOOffset(viewer,&off);CHKERRQ(ierr); ierr = MPI_File_set_view(mfdes,off,MPIU_SCALAR,MPIU_SCALAR,(char*)"native",MPI_INFO_NULL);CHKERRQ(ierr); ierr = VecGetArrayRead(xin,&xv);CHKERRQ(ierr); ierr = MPIU_File_write_all(mfdes,(void*)xv,lsize,MPIU_SCALAR,MPI_STATUS_IGNORE);CHKERRQ(ierr); ierr = VecRestoreArrayRead(xin,&xv);CHKERRQ(ierr); ierr = PetscViewerBinaryAddMPIIOOffset(viewer,n*sizeof(PetscScalar));CHKERRQ(ierr); } #endif ierr = PetscViewerBinaryGetInfoPointer(viewer,&file);CHKERRQ(ierr); if (file) { if (((PetscObject)xin)->prefix) { ierr = PetscFPrintf(PETSC_COMM_SELF,file,"-%svecload_block_size %D\n",((PetscObject)xin)->prefix,PetscAbs(xin->map->bs));CHKERRQ(ierr); } else { ierr = PetscFPrintf(PETSC_COMM_SELF,file,"-vecload_block_size %D\n",PetscAbs(xin->map->bs));CHKERRQ(ierr); } } PetscFunctionReturn(0); } #if defined(PETSC_HAVE_MATLAB_ENGINE) #include <petscmatlab.h> #include <mat.h> /* MATLAB include file */ PetscErrorCode VecView_Seq_Matlab(Vec vec,PetscViewer viewer) { PetscErrorCode ierr; PetscInt n; const PetscScalar *array; PetscFunctionBegin; ierr = VecGetLocalSize(vec,&n);CHKERRQ(ierr); ierr = PetscObjectName((PetscObject)vec);CHKERRQ(ierr); ierr = VecGetArrayRead(vec,&array);CHKERRQ(ierr); ierr = PetscViewerMatlabPutArray(viewer,n,1,array,((PetscObject)vec)->name);CHKERRQ(ierr); ierr = VecRestoreArrayRead(vec,&array);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscDrawView - Prints the PetscDraw data structure. Collective on PetscDraw Input Parameters: + indraw - the PetscDraw context - viewer - visualization context Options Database Keys: . -draw_view - print the ksp data structure at the end of a PetscDrawSetFromOptions() call Note: The available visualization contexts include + PETSC_VIEWER_STDOUT_SELF - standard output (default) - PETSC_VIEWER_STDOUT_WORLD - synchronized standard output where only the first processor opens the file. All other processors send their data to the first processor to print. The user can open an alternative visualization context with PetscViewerASCIIOpen() - output to a specified file. Level: beginner .keywords: PetscDraw, view .seealso: PCView(), PetscViewerASCIIOpen() @*/ PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer) { PetscErrorCode ierr; PetscBool isdraw; #if defined(PETSC_HAVE_SAWS) PetscBool isams; #endif PetscFunctionBegin; PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1); if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)indraw)); PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); PetscCheckSameComm(indraw,1,viewer,2); ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); #if defined(PETSC_HAVE_SAWS) ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&isams);CHKERRQ(ierr); #endif if (isdraw) { PetscDraw draw; char str[36]; PetscReal x,y,bottom,h; ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr); ierr = PetscStrcpy(str,"PetscDraw: ");CHKERRQ(ierr); ierr = PetscStrcat(str,((PetscObject)indraw)->type_name);CHKERRQ(ierr); ierr = PetscDrawBoxedString(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr); bottom = y - h; ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr); #if defined(PETSC_HAVE_SAWS) } else if (isams) { PetscMPIInt rank; ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); if (!((PetscObject)indraw)->amsmem && !rank) { ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr); } #endif } else if (indraw->ops->view) { ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr); } PetscFunctionReturn(0); }
char *PetscObjectsGetObjectMatlab(const char* name,PetscObject *obj) { PetscErrorCode ierr; PetscInt i; PetscObject h; PetscBool flg; PetscFunctionBegin; *obj = NULL; for (i=0; i<PetscObjectsMaxCounts; i++) { if ((h = PetscObjects[i])) { ierr = PetscObjectName(h);if (ierr) PetscFunctionReturn(0); ierr = PetscStrcmp(h->name,name,&flg);if (ierr) PetscFunctionReturn(0); if (flg) { *obj = h; PetscFunctionReturn(h->class_name); } } } PetscFunctionReturn(0); }
/*@C PetscObjectsGetObject - Get a pointer to a named object Not collective Input Parameter: . name - the name of an object Output Parameter: . obj - the object or null if there is no object Level: advanced Concepts: options database^printing @*/ PetscErrorCode PetscObjectsGetObject(const char *name,PetscObject *obj,char **classname) { PetscErrorCode ierr; PetscInt i; PetscObject h; PetscBool flg; PetscFunctionBegin; *obj = NULL; for (i=0; i<PetscObjectsMaxCounts; i++) { if ((h = PetscObjects[i])) { ierr = PetscObjectName(h);CHKERRQ(ierr); ierr = PetscStrcmp(h->name,name,&flg);CHKERRQ(ierr); if (flg) { *obj = h; if (classname) *classname = h->class_name; PetscFunctionReturn(0); } } } PetscFunctionReturn(0); }
PetscErrorCode VecMatlabEnginePut_Default(PetscObject obj,void *mengine) { PetscErrorCode ierr; PetscInt n; Vec vec = (Vec)obj; PetscScalar *array; mxArray *mat; PetscFunctionBegin; ierr = VecGetArray(vec,&array);CHKERRQ(ierr); ierr = VecGetLocalSize(vec,&n);CHKERRQ(ierr); #if !defined(PETSC_USE_COMPLEX) mat = mxCreateDoubleMatrix(n,1,mxREAL); #else mat = mxCreateDoubleMatrix(n,1,mxCOMPLEX); #endif ierr = PetscMemcpy(mxGetPr(mat),array,n*sizeof(PetscScalar));CHKERRQ(ierr); ierr = PetscObjectName(obj);CHKERRQ(ierr); engPutVariable((Engine*)mengine,obj->name,mat); ierr = VecRestoreArray(vec,&array);CHKERRQ(ierr); PetscFunctionReturn(0); }