PetscErrorCode MatDestroy_MPIAdj(Mat mat) { Mat_MPIAdj *a = (Mat_MPIAdj*)mat->data; PetscErrorCode ierr; PetscFunctionBegin; #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject)mat,"Rows=%D, Cols=%D, NZ=%D",mat->rmap->n,mat->cmap->n,a->nz); #endif ierr = PetscFree(a->diag);CHKERRQ(ierr); if (a->freeaij) { if (a->freeaijwithfree) { if (a->i) free(a->i); if (a->j) free(a->j); } else { ierr = PetscFree(a->i);CHKERRQ(ierr); ierr = PetscFree(a->j);CHKERRQ(ierr); ierr = PetscFree(a->values);CHKERRQ(ierr); } } ierr = PetscFree(a);CHKERRQ(ierr); ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMPIAdjSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PetscViewerFileSetName_MPIIO(PetscViewer viewer,const char name[]) { PetscMPIInt rank; PetscErrorCode ierr; size_t len; PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data; char *gz; PetscBool found; PetscFileMode type = vbinary->btype; PetscFunctionBegin; if (type == (PetscFileMode) -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetMode() before PetscViewerFileSetName()"); ierr = PetscViewerFileClose_MPIIO(viewer);CHKERRQ(ierr); ierr = PetscOptionsGetBool(((PetscObject)viewer)->prefix,"-viewer_binary_skip_info",&vbinary->skipinfo,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(((PetscObject)viewer)->prefix,"-viewer_binary_skip_options",&vbinary->skipoptions,NULL);CHKERRQ(ierr); ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); ierr = PetscStrallocpy(name,&vbinary->filename);CHKERRQ(ierr); vbinary->storecompressed = PETSC_FALSE; /* only first processor opens file if writeable */ if (type == FILE_MODE_READ) { MPI_File_open(PetscObjectComm((PetscObject)viewer),vbinary->filename,MPI_MODE_RDONLY,MPI_INFO_NULL,&vbinary->mfdes);CHKERRQ(ierr); } else if (type == FILE_MODE_WRITE) { MPI_File_open(PetscObjectComm((PetscObject)viewer),vbinary->filename,MPI_MODE_WRONLY | MPI_MODE_CREATE,MPI_INFO_NULL,&vbinary->mfdes);CHKERRQ(ierr); } /* try to open info file: all processors open this file if read only Below is identical code to the code for Binary above, should be put in seperate routine */ if (!vbinary->skipinfo && (!rank || type == FILE_MODE_READ)) { char infoname[PETSC_MAX_PATH_LEN],iname[PETSC_MAX_PATH_LEN]; ierr = PetscStrcpy(infoname,name);CHKERRQ(ierr); /* remove .gz if it ends library name */ ierr = PetscStrstr(infoname,".gz",&gz);CHKERRQ(ierr); if (gz) { ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); if (len == 3) *gz = 0; } ierr = PetscStrcat(infoname,".info");CHKERRQ(ierr); ierr = PetscFixFilename(infoname,iname);CHKERRQ(ierr); if (type == FILE_MODE_READ) { ierr = PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),iname,infoname,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); ierr = PetscOptionsInsertFile(PetscObjectComm((PetscObject)viewer),infoname,PETSC_FALSE);CHKERRQ(ierr); } else { vbinary->fdes_info = fopen(infoname,"w"); if (!vbinary->fdes_info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open .info file %s for writing",infoname); } } #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject)viewer,"File: %s",name); #endif PetscFunctionReturn(0); }
PetscErrorCode VecDestroy_Seq(Vec v) { Vec_Seq *vs = (Vec_Seq*)v->data; PetscErrorCode ierr; PetscFunctionBegin; #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject)v,"Length=%D",v->map->n); #endif ierr = PetscFree(vs->array_allocated);CHKERRQ(ierr); ierr = PetscFree(v->data);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PetscViewerFileSetName_VU(PetscViewer viewer, const char name[]) { PetscViewer_VU *vu = (PetscViewer_VU*) viewer->data; char fname[PETSC_MAX_PATH_LEN]; int rank; PetscErrorCode ierr; PetscFunctionBegin; if (!name) PetscFunctionReturn(0); ierr = PetscViewerFileClose_VU(viewer);CHKERRQ(ierr); ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank);CHKERRQ(ierr); if (rank != 0) PetscFunctionReturn(0); ierr = PetscStrallocpy(name, &vu->filename);CHKERRQ(ierr); ierr = PetscFixFilename(name, fname);CHKERRQ(ierr); switch (vu->mode) { case FILE_MODE_READ: vu->fd = fopen(fname, "r"); break; case FILE_MODE_WRITE: vu->fd = fopen(fname, "w"); break; case FILE_MODE_APPEND: vu->fd = fopen(fname, "a"); break; case FILE_MODE_UPDATE: vu->fd = fopen(fname, "r+"); if (!vu->fd) vu->fd = fopen(fname, "w+"); break; case FILE_MODE_APPEND_UPDATE: /* I really want a file which is opened at the end for updating, not a+, which opens at the beginning, but makes writes at the end. */ vu->fd = fopen(fname, "r+"); if (!vu->fd) vu->fd = fopen(fname, "w+"); else { ierr = fseek(vu->fd, 0, SEEK_END);CHKERRQ(ierr); } break; default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vu->mode); } if (!vu->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN, "Cannot open PetscViewer file: %s", fname); #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject) viewer, "File: %s", name); #endif PetscFunctionReturn(0); }
EXTERN_C_END EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "PetscViewerFileSetName_ASCII" PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[]) { PetscErrorCode ierr; size_t len; char fname[PETSC_MAX_PATH_LEN],*gz; PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; PetscBool isstderr,isstdout; PetscMPIInt rank; PetscFunctionBegin; ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); if (!name) PetscFunctionReturn(0); ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr); /* Is this file to be compressed */ vascii->storecompressed = PETSC_FALSE; ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr); if (gz) { ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); if (len == 3) { *gz = 0; vascii->storecompressed = PETSC_TRUE; } } ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); if (!rank) { ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr); ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr); /* empty filename means stdout */ if (name[0] == 0) isstdout = PETSC_TRUE; if (isstderr) vascii->fd = PETSC_STDERR; else if (isstdout) vascii->fd = PETSC_STDOUT; else { ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); switch(vascii->mode) { case FILE_MODE_READ: vascii->fd = fopen(fname,"r"); break; case FILE_MODE_WRITE: vascii->fd = fopen(fname,"w"); break; case FILE_MODE_APPEND: vascii->fd = fopen(fname,"a"); break; case FILE_MODE_UPDATE: vascii->fd = fopen(fname,"r+"); if (!vascii->fd) { vascii->fd = fopen(fname,"w+"); } break; case FILE_MODE_APPEND_UPDATE: /* I really want a file which is opened at the end for updating, not a+, which opens at the beginning, but makes writes at the end. */ vascii->fd = fopen(fname,"r+"); if (!vascii->fd) { vascii->fd = fopen(fname,"w+"); } else { ierr = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr); } break; default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode); } if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname); } } #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject)viewer,"File: %s",name); #endif PetscFunctionReturn(0); }
PetscErrorCode PetscViewerFileSetName_Binary(PetscViewer viewer,const char name[]) { PetscMPIInt rank; PetscErrorCode ierr; size_t len; PetscViewer_Binary *vbinary = (PetscViewer_Binary*)viewer->data; const char *fname; char bname[PETSC_MAX_PATH_LEN],*gz; PetscBool found; PetscFileMode type = vbinary->btype; PetscFunctionBegin; if (type == (PetscFileMode) -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Must call PetscViewerFileSetMode() before PetscViewerFileSetName()"); ierr = PetscViewerFileClose_Binary(viewer);CHKERRQ(ierr); ierr = PetscOptionsGetBool(((PetscObject)viewer)->prefix,"-viewer_binary_skip_info",&vbinary->skipinfo,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(((PetscObject)viewer)->prefix,"-viewer_binary_skip_options",&vbinary->skipoptions,NULL);CHKERRQ(ierr); ierr = PetscOptionsGetBool(((PetscObject)viewer)->prefix,"-viewer_binary_skip_header",&vbinary->skipheader,NULL);CHKERRQ(ierr); ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); /* copy name so we can edit it */ ierr = PetscStrallocpy(name,&vbinary->filename);CHKERRQ(ierr); /* if ends in .gz strip that off and note user wants file compressed */ vbinary->storecompressed = PETSC_FALSE; if (!rank && type == FILE_MODE_WRITE) { /* remove .gz if it ends library name */ ierr = PetscStrstr(vbinary->filename,".gz",&gz);CHKERRQ(ierr); if (gz) { ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); if (len == 3) { *gz = 0; vbinary->storecompressed = PETSC_TRUE; } } } /* only first processor opens file if writeable */ if (!rank || type == FILE_MODE_READ) { if (type == FILE_MODE_READ) { /* possibly get the file from remote site or compressed file */ ierr = PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),vbinary->filename,bname,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); fname = bname; if (!rank && !found) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot locate file: %s on node zero",vbinary->filename); else if (!found) { ierr = PetscInfo(viewer,"Nonzero processor did not locate readonly file\n");CHKERRQ(ierr); fname = 0; } } else fname = vbinary->filename; #if defined(PETSC_HAVE_O_BINARY) if (type == FILE_MODE_WRITE) { if ((vbinary->fdes = open(fname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0666)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot create file %s for writing",fname); } else if (type == FILE_MODE_READ && fname) { if ((vbinary->fdes = open(fname,O_RDONLY|O_BINARY,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for reading",fname); } else if (type == FILE_MODE_APPEND) { if ((vbinary->fdes = open(fname,O_WRONLY|O_APPEND|O_BINARY,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for writing",fname); } else if (fname) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown file type"); #else if (type == FILE_MODE_WRITE) { if ((vbinary->fdes = creat(fname,0666)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot create file %s for writing",fname); } else if (type == FILE_MODE_READ && fname) { if ((vbinary->fdes = open(fname,O_RDONLY,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for reading",fname); } else if (type == FILE_MODE_APPEND) { if ((vbinary->fdes = open(fname,O_WRONLY|O_APPEND,0)) == -1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file %s for writing",fname); } else if (fname) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Unknown file type"); #endif } else vbinary->fdes = -1; /* try to open info file: all processors open this file if read only */ if (!vbinary->skipinfo && (!rank || type == FILE_MODE_READ)) { char infoname[PETSC_MAX_PATH_LEN],iname[PETSC_MAX_PATH_LEN]; ierr = PetscStrcpy(infoname,name);CHKERRQ(ierr); /* remove .gz if it ends library name */ ierr = PetscStrstr(infoname,".gz",&gz);CHKERRQ(ierr); if (gz) { ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); if (len == 3) *gz = 0; } ierr = PetscStrcat(infoname,".info");CHKERRQ(ierr); ierr = PetscFixFilename(infoname,iname);CHKERRQ(ierr); if (type == FILE_MODE_READ) { ierr = PetscFileRetrieve(PetscObjectComm((PetscObject)viewer),iname,infoname,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); ierr = PetscOptionsInsertFile(PetscObjectComm((PetscObject)viewer),infoname,PETSC_FALSE);CHKERRQ(ierr); } else { vbinary->fdes_info = fopen(infoname,"w"); if (!vbinary->fdes_info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open .info file %s for writing",infoname); } } #if defined(PETSC_USE_LOG) PetscLogObjectState((PetscObject)viewer,"File: %s",name); #endif PetscFunctionReturn(0); }