本文整理汇总了C++中PetscMalloc函数的典型用法代码示例。如果您正苦于以下问题:C++ PetscMalloc函数的具体用法?C++ PetscMalloc怎么用?C++ PetscMalloc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PetscMalloc函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: DMDAGetElements_2D
static PetscErrorCode DMDAGetElements_2D(DM dm,PetscInt *nel,PetscInt *nen,const PetscInt *e[])
{
PetscErrorCode ierr;
DM_DA *da = (DM_DA*)dm->data;
PetscInt i,xs,xe,Xs,Xe;
PetscInt j,ys,ye,Ys,Ye;
PetscInt cnt=0, cell[4], ns=2, nn=3;
PetscInt c, split[] = {0,1,3,
2,3,1};
PetscFunctionBegin;
if (!da->e) {
if (da->elementtype == DMDA_ELEMENT_P1) {ns=2; nn=3;}
if (da->elementtype == DMDA_ELEMENT_Q1) {ns=1; nn=4;}
ierr = DMDAGetCorners(dm,&xs,&ys,0,&xe,&ye,0);CHKERRQ(ierr);
ierr = DMDAGetGhostCorners(dm,&Xs,&Ys,0,&Xe,&Ye,0);CHKERRQ(ierr);
xe += xs; Xe += Xs; if (xs != Xs) xs -= 1;
ye += ys; Ye += Ys; if (ys != Ys) ys -= 1;
da->ne = ns*(xe - xs - 1)*(ye - ys - 1);
ierr = PetscMalloc((1 + nn*da->ne)*sizeof(PetscInt),&da->e);CHKERRQ(ierr);
for (j=ys; j<ye-1; j++) {
for (i=xs; i<xe-1; i++) {
cell[0] = (i-Xs ) + (j-Ys )*(Xe-Xs);
cell[1] = (i-Xs+1) + (j-Ys )*(Xe-Xs);
cell[2] = (i-Xs+1) + (j-Ys+1)*(Xe-Xs);
cell[3] = (i-Xs ) + (j-Ys+1)*(Xe-Xs);
if (da->elementtype == DMDA_ELEMENT_P1) {
for (c=0; c<ns*nn; c++)
da->e[cnt++] = cell[split[c]];
}
if (da->elementtype == DMDA_ELEMENT_Q1) {
for (c=0; c<ns*nn; c++)
da->e[cnt++] = cell[c];
}
}
}
}
*nel = da->ne;
*nen = nn;
*e = da->e;
PetscFunctionReturn(0);
}
开发者ID:Kun-Qu,项目名称:petsc,代码行数:41,代码来源:dagetelem.c
示例2: InitializeVectors
PetscErrorCode InitializeVectors( UserContext* uc)
{
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = VecCreate(PETSC_COMM_WORLD, &uc->b); CHKERRQ(ierr);
ierr = VecSetSizes(uc->b, uc->numNodes, uc->numNodes); CHKERRQ(ierr);
ierr = VecSetType(uc->b, VECSEQ); CHKERRQ(ierr);
ierr = VecDuplicate(uc->b,&uc->p);CHKERRQ(ierr);
ierr = VecDuplicate(uc->b,&uc->u);CHKERRQ(ierr);
ierr = VecDuplicate(uc->b,&uc->v);CHKERRQ(ierr);
ierr = VecDuplicate(uc->b,&uc->px);CHKERRQ(ierr);
ierr = VecDuplicate(uc->b,&uc->py);CHKERRQ(ierr);
ierr = VecDuplicate(uc->b,&uc->c);CHKERRQ(ierr);
ierr = PetscMalloc(uc->n * sizeof(PetscReal), &uc->imageResult ); CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:adrielb,项目名称:DCell,代码行数:21,代码来源:PressurePoisson.c
示例3: insertnode
void insertnode(LIST *ilist, PetscInt Node)
{
node *_new;
node *current;
current = ilist->head;
PetscTruth Exist = PETSC_FALSE;
while(current) {
if (Node == current->Node) {
Exist = PETSC_TRUE;
}
if (Exist) break;
current = current->next;
}
if (!Exist) {
PetscMalloc(sizeof(node), &_new);
_new->next = ilist->head;
_new->Node = Node;
ilist->head = _new;
}
}
开发者ID:SAFL-CFD-Lab,项目名称:VFS-Rivers,代码行数:21,代码来源:variables.c
示例4: SNESMonitorSet
/*@C
SNESMonitorSetRatio - Sets SNES to use a monitor that prints the
ratio of the function norm at each iteration.
Collective on SNES
Input Parameters:
+ snes - the SNES context
- viewer - ASCII viewer to print output
Level: intermediate
.keywords: SNES, nonlinear, monitor, norm
.seealso: SNESMonitorSet(), SNESMonitorSolution(), SNESMonitorDefault()
@*/
PetscErrorCode SNESMonitorSetRatio(SNES snes,PetscViewer viewer)
{
PetscErrorCode ierr;
SNESMonitorRatioContext *ctx;
PetscReal *history;
PetscFunctionBegin;
if (!viewer) {
ierr = PetscViewerASCIIOpen(((PetscObject)snes)->comm,"stdout",&viewer);CHKERRQ(ierr);
ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr);
}
ierr = PetscNewLog(snes,SNESMonitorRatioContext,&ctx);CHKERRQ(ierr);
ierr = SNESGetConvergenceHistory(snes,&history,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
if (!history) {
ierr = PetscMalloc(100*sizeof(PetscReal),&ctx->history);CHKERRQ(ierr);
ierr = SNESSetConvergenceHistory(snes,ctx->history,0,100,PETSC_TRUE);CHKERRQ(ierr);
}
ctx->viewer = viewer;
ierr = SNESMonitorSet(snes,SNESMonitorRatio,ctx,SNESMonitorRatioDestroy);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:erdc-cm,项目名称:petsc-dev,代码行数:37,代码来源:snesut.c
示例5: VecDuplicate_Nest
static PetscErrorCode VecDuplicate_Nest(Vec x,Vec *y)
{
Vec_Nest *bx = (Vec_Nest*)x->data;
Vec Y;
Vec *sub;
PetscInt i;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscMalloc(sizeof(Vec)*bx->nb,&sub);CHKERRQ(ierr);
for (i=0; i<bx->nb; i++) {
ierr = VecDuplicate(bx->v[i],&sub[i]);CHKERRQ(ierr);
}
ierr = VecCreateNest(PetscObjectComm((PetscObject)x),bx->nb,bx->is,sub,&Y);CHKERRQ(ierr);
for (i=0; i<bx->nb; i++) {
ierr = VecDestroy(&sub[i]);CHKERRQ(ierr);
}
ierr = PetscFree(sub);CHKERRQ(ierr);
*y = Y;
PetscFunctionReturn(0);
}
开发者ID:plguhur,项目名称:petsc,代码行数:21,代码来源:vecnest.c
示例6: PetscCDGetMIS
PetscErrorCode PetscCDGetMIS(PetscCoarsenData *ail, IS *a_mis)
{
PetscErrorCode ierr;
PetscCDIntNd *n;
PetscInt ii,kk;
PetscInt *permute;
PetscFunctionBegin;
for (ii=kk=0;ii<ail->size;ii++){
n = ail->array[ii];
if (n) kk++;
}
ierr = PetscMalloc(kk*sizeof(PetscInt), &permute);CHKERRQ(ierr);
for (ii=kk=0;ii<ail->size;ii++){
n = ail->array[ii];
if (n) permute[kk++] = ii;
}
ierr = ISCreateGeneral(PETSC_COMM_SELF, kk, permute, PETSC_OWN_POINTER, a_mis);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:erdc-cm,项目名称:petsc-dev,代码行数:21,代码来源:hem.c
示例7: DMLibMeshGetVariables
PetscErrorCode DMLibMeshGetVariables(DM dm, PetscInt *n, char*** varnames)
{
PetscErrorCode ierr;
PetscFunctionBegin;
PetscValidHeaderSpecific(dm,DM_CLASSID,1);
PetscBool islibmesh;
PetscInt i;
ierr = PetscObjectTypeCompare((PetscObject)dm, DMLIBMESH,&islibmesh);
if(!islibmesh) SETERRQ2(((PetscObject)dm)->comm, PETSC_ERR_ARG_WRONG, "Got DM oftype %s, not of type %s", ((PetscObject)dm)->type_name, DMLIBMESH);
DM_libMesh *dlm = (DM_libMesh *)(dm->data);
PetscValidPointer(n,2);
*n = dlm->varids->size();
if(!varnames) PetscFunctionReturn(0);
ierr = PetscMalloc(*n*sizeof(char*), varnames); CHKERRQ(ierr);
i = 0;
for(std::map<std::string, unsigned int>::const_iterator it = dlm->varids->begin(); it != dlm->varids->end(); ++it){
ierr = PetscStrallocpy(it->first.c_str(), *varnames+i); CHKERRQ(ierr);
++i;
}
PetscFunctionReturn(0);
}
开发者ID:mikegraham,项目名称:libmesh,代码行数:21,代码来源:petscdmlibmesh.C
示例8: vsnprintf
/*@C
PetscVSNPrintf - The PETSc version of vsnprintf(). Converts a PETSc format string into a standard C format string and then puts all the
function arguments into a string using the format statement.
Input Parameters:
+ str - location to put result
. len - the amount of space in str
+ format - the PETSc format string
- fullLength - the amount of space in str actually used.
Developer Notes: this function may be called from an error handler, if an error occurs when it is called by the error handler than likely
a recursion will occur and possible crash.
Level: developer
@*/
PetscErrorCode PetscVSNPrintf(char *str,size_t len,const char *format,size_t *fullLength,va_list Argp)
{
char *newformat;
char formatbuf[8*1024];
size_t oldLength,length;
int fullLengthInt;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscStrlen(format, &oldLength);CHKERRQ(ierr);
if (oldLength < 8*1024) {
newformat = formatbuf;
oldLength = 8*1024-1;
} else {
oldLength = PETSC_MAX_LENGTH_FORMAT(oldLength);
ierr = PetscMalloc(oldLength * sizeof(char), &newformat);CHKERRQ(ierr);
}
PetscFormatConvert(format,newformat,oldLength);
ierr = PetscStrlen(newformat, &length);CHKERRQ(ierr);
#if 0
if (length > len) {
newformat[len] = '\0';
}
#endif
#if defined(PETSC_HAVE_VSNPRINTF_CHAR)
fullLengthInt = vsnprintf(str,len,newformat,(char *)Argp);
#elif defined(PETSC_HAVE_VSNPRINTF)
fullLengthInt = vsnprintf(str,len,newformat,Argp);
#elif defined(PETSC_HAVE__VSNPRINTF)
fullLengthInt = _vsnprintf(str,len,newformat,Argp);
#else
#error "vsnprintf not found"
#endif
if (fullLengthInt < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"vsnprintf() failed");
if (fullLength) *fullLength = (size_t)fullLengthInt;
if (oldLength >= 8*1024) {
ierr = PetscFree(newformat);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
开发者ID:Kun-Qu,项目名称:petsc,代码行数:56,代码来源:mprint.c
示例9: printf
/*@C
PetscSynchronizedPrintf - Prints synchronized output from several processors.
Output of the first processor is followed by that of the second, etc.
Not Collective
Input Parameters:
+ comm - the communicator
- format - the usual printf() format string
Level: intermediate
Notes:
REQUIRES a intervening call to PetscSynchronizedFlush() for the information
from all the processors to be printed.
Fortran Note:
The call sequence is PetscSynchronizedPrintf(MPI_Comm, character(*), PetscErrorCode ierr) from Fortran.
That is, you can only pass a single character string from Fortran.
.seealso: PetscSynchronizedFlush(), PetscSynchronizedFPrintf(), PetscFPrintf(),
PetscPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
@*/
PetscErrorCode PetscSynchronizedPrintf(MPI_Comm comm,const char format[],...)
{
PetscErrorCode ierr;
PetscMPIInt rank;
PetscFunctionBegin;
ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
/* First processor prints immediately to stdout */
if (!rank) {
va_list Argp;
va_start(Argp,format);
ierr = (*PetscVFPrintf)(PETSC_STDOUT,format,Argp);CHKERRQ(ierr);
if (petsc_history) {
va_start(Argp,format);
ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
}
va_end(Argp);
} else { /* other processors add to local queue */
va_list Argp;
PrintfQueue next;
size_t fullLength = 8191;
ierr = PetscNew(struct _PrintfQueue,&next);CHKERRQ(ierr);
if (petsc_printfqueue) {petsc_printfqueue->next = next; petsc_printfqueue = next; petsc_printfqueue->next = 0;}
else {petsc_printfqueuebase = petsc_printfqueue = next;}
petsc_printfqueuelength++;
next->size = -1;
while((PetscInt)fullLength >= next->size) {
next->size = fullLength+1;
ierr = PetscMalloc(next->size * sizeof(char), &next->string);CHKERRQ(ierr);
va_start(Argp,format);
ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
ierr = PetscVSNPrintf(next->string,next->size,format, &fullLength,Argp);CHKERRQ(ierr);
va_end(Argp);
}
}
PetscFunctionReturn(0);
}
开发者ID:Kun-Qu,项目名称:petsc,代码行数:63,代码来源:mprint.c
示例10: MatCreateFFT
/*@
MatCreateFFT - Creates a matrix object that provides FFT via an external package
Collective on MPI_Comm
Input Parameter:
+ comm - MPI communicator
. ndim - the ndim-dimensional transform
. dim - array of size ndim, dim[i] contains the vector length in the i-dimension
- type - package type, e.g., FFTW or FFTCU
Output Parameter:
. A - the matrix
Options Database Keys:
+ -mat_fft_type - set FFT type
Level: intermediate
@*/
PetscErrorCode MatCreateFFT(MPI_Comm comm,PetscInt ndim,const PetscInt dim[],MatType mattype,Mat *A)
{
PetscErrorCode ierr;
PetscMPIInt size;
Mat FFT;
PetscInt N,i;
Mat_FFT *fft;
PetscFunctionBegin;
if (ndim < 1) SETERRQ1(comm,PETSC_ERR_USER,"ndim %d must be > 0",ndim);
ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
ierr = MatCreate(comm,&FFT);CHKERRQ(ierr);
ierr = PetscNewLog(FFT,Mat_FFT,&fft);CHKERRQ(ierr);
FFT->data = (void*)fft;
N = 1;
for (i=0; i<ndim; i++) {
if (dim[i] < 1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"dim[%d]=%d must be > 0",i,dim[i]);
N *= dim[i];
}
ierr = PetscMalloc(ndim*sizeof(PetscInt),&fft->dim);CHKERRQ(ierr);
ierr = PetscMemcpy(fft->dim,dim,ndim*sizeof(PetscInt));CHKERRQ(ierr);
fft->ndim = ndim;
fft->n = PETSC_DECIDE;
fft->N = N;
fft->data = NULL;
ierr = MatSetType(FFT,mattype);CHKERRQ(ierr);
FFT->ops->destroy = MatDestroy_FFT;
/* get runtime options */
ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)FFT),((PetscObject)FFT)->prefix,"FFT Options","Mat");CHKERRQ(ierr);
PetscOptionsEnd();
*A = FFT;
PetscFunctionReturn(0);
}
开发者ID:feelpp,项目名称:debian-petsc,代码行数:60,代码来源:fft.c
示例11: PetscCommBuildTwoSided_Allreduce
static PetscErrorCode PetscCommBuildTwoSided_Allreduce(MPI_Comm comm,PetscMPIInt count,MPI_Datatype dtype,PetscMPIInt nto,const PetscMPIInt *toranks,const void *todata,PetscMPIInt *nfrom,PetscMPIInt **fromranks,void *fromdata)
{
PetscErrorCode ierr;
PetscMPIInt size,*iflags,nrecvs,tag,*franks,i;
MPI_Aint lb,unitbytes;
char *tdata,*fdata;
MPI_Request *reqs,*sendreqs;
MPI_Status *statuses;
PetscFunctionBegin;
ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
ierr = PetscCalloc1(size,&iflags);CHKERRQ(ierr);
for (i=0; i<nto; i++) iflags[toranks[i]] = 1;
ierr = PetscGatherNumberOfMessages(comm,iflags,NULL,&nrecvs);CHKERRQ(ierr);
ierr = PetscFree(iflags);CHKERRQ(ierr);
ierr = PetscCommDuplicate(comm,&comm,&tag);CHKERRQ(ierr);
ierr = MPI_Type_get_extent(dtype,&lb,&unitbytes);CHKERRQ(ierr);
if (lb != 0) SETERRQ1(comm,PETSC_ERR_SUP,"Datatype with nonzero lower bound %ld\n",(long)lb);
ierr = PetscMalloc(nrecvs*count*unitbytes,&fdata);CHKERRQ(ierr);
tdata = (char*)todata;
ierr = PetscMalloc2(nto+nrecvs,&reqs,nto+nrecvs,&statuses);CHKERRQ(ierr);
sendreqs = reqs + nrecvs;
for (i=0; i<nrecvs; i++) {
ierr = MPI_Irecv((void*)(fdata+count*unitbytes*i),count,dtype,MPI_ANY_SOURCE,tag,comm,reqs+i);CHKERRQ(ierr);
}
for (i=0; i<nto; i++) {
ierr = MPI_Isend((void*)(tdata+count*unitbytes*i),count,dtype,toranks[i],tag,comm,sendreqs+i);CHKERRQ(ierr);
}
ierr = MPI_Waitall(nto+nrecvs,reqs,statuses);CHKERRQ(ierr);
ierr = PetscMalloc1(nrecvs,&franks);CHKERRQ(ierr);
for (i=0; i<nrecvs; i++) franks[i] = statuses[i].MPI_SOURCE;
ierr = PetscFree2(reqs,statuses);CHKERRQ(ierr);
ierr = PetscCommDestroy(&comm);CHKERRQ(ierr);
*nfrom = nrecvs;
*fromranks = franks;
*(void**)fromdata = fdata;
PetscFunctionReturn(0);
}
开发者ID:firedrakeproject,项目名称:petsc,代码行数:40,代码来源:mpits.c
示例12: Monitor
PetscErrorCode Monitor(TS ts,PetscInt step,PetscReal time,Vec global,void *ctx)
{
VecScatter scatter;
IS from,to;
PetscInt i,n,*idx;
Vec tmp_vec;
PetscErrorCode ierr;
PetscScalar *tmp;
/* Get the size of the vector */
ierr = VecGetSize(global,&n);CHKERRQ(ierr);
/* Set the index sets */
ierr = PetscMalloc(n*sizeof(PetscInt),&idx);CHKERRQ(ierr);
for(i=0; i<n; i++) idx[i]=i;
/* Create local sequential vectors */
ierr = VecCreateSeq(PETSC_COMM_SELF,n,&tmp_vec);CHKERRQ(ierr);
/* Create scatter context */
ierr = ISCreateGeneral(PETSC_COMM_SELF,n,idx,PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
ierr = ISCreateGeneral(PETSC_COMM_SELF,n,idx,PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
ierr = VecScatterCreate(global,from,tmp_vec,to,&scatter);CHKERRQ(ierr);
ierr = VecScatterBegin(scatter,global,tmp_vec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
ierr = VecScatterEnd(scatter,global,tmp_vec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);
ierr = VecGetArray(tmp_vec,&tmp);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,"At t =%14.6e u = %14.6e %14.6e %14.6e \n",
time,PetscRealPart(tmp[0]),PetscRealPart(tmp[1]),PetscRealPart(tmp[2]));CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,"At t =%14.6e errors = %14.6e %14.6e %14.6e \n",
time,PetscRealPart(tmp[0]-solx(time)),PetscRealPart(tmp[1]-soly(time)),PetscRealPart(tmp[2]-solz(time)));CHKERRQ(ierr);
ierr = VecRestoreArray(tmp_vec,&tmp);CHKERRQ(ierr);
ierr = VecScatterDestroy(&scatter);CHKERRQ(ierr);
ierr = ISDestroy(&from);CHKERRQ(ierr);
ierr = ISDestroy(&to);CHKERRQ(ierr);
ierr = PetscFree(idx);CHKERRQ(ierr);
ierr = VecDestroy(&tmp_vec);CHKERRQ(ierr);
return 0;
}
开发者ID:Kun-Qu,项目名称:petsc,代码行数:39,代码来源:ex2.c
示例13: DMPlexDistribute
/*@
DMPlexDistributeData - Distribute field data to match a given PetscSF, usually the SF from mesh distribution
Collective on DM
Input Parameters:
+ dm - The DMPlex object
. pointSF - The PetscSF describing the communication pattern
. originalSection - The PetscSection for existing data layout
. datatype - The type of data
- originalData - The existing data
Output Parameters:
+ newSection - The PetscSF describing the new data layout
- newData - The new data
Level: developer
.seealso: DMPlexDistribute(), DMPlexDistributeField()
@*/
PetscErrorCode DMPlexDistributeData(DM dm, PetscSF pointSF, PetscSection originalSection, MPI_Datatype datatype, void *originalData, PetscSection newSection, void **newData)
{
PetscSF fieldSF;
PetscInt *remoteOffsets, fieldSize;
PetscMPIInt dataSize;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscLogEventBegin(DMPLEX_DistributeData,dm,0,0,0);CHKERRQ(ierr);
ierr = PetscSFDistributeSection(pointSF, originalSection, &remoteOffsets, newSection);CHKERRQ(ierr);
ierr = PetscSectionGetStorageSize(newSection, &fieldSize);CHKERRQ(ierr);
ierr = MPI_Type_size(datatype, &dataSize);CHKERRQ(ierr);
ierr = PetscMalloc(fieldSize * dataSize, newData);CHKERRQ(ierr);
ierr = PetscSFCreateSectionSF(pointSF, originalSection, remoteOffsets, newSection, &fieldSF);CHKERRQ(ierr);
ierr = PetscSFBcastBegin(fieldSF, datatype, originalData, *newData);CHKERRQ(ierr);
ierr = PetscSFBcastEnd(fieldSF, datatype, originalData, *newData);CHKERRQ(ierr);
ierr = PetscSFDestroy(&fieldSF);CHKERRQ(ierr);
ierr = PetscLogEventEnd(DMPLEX_DistributeData,dm,0,0,0);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:OpenCMISS-Dependencies,项目名称:petsc,代码行数:42,代码来源:plexdistribute.c
示例14: PetscViewersCreate
/*@C
PetscViewersGetViewer - Gets a PetscViewer from a PetscViewer collection
Not Collective, but PetscViewer will be collective object on PetscViewers
Input Parameter:
+ viewers - object created with PetscViewersCreate()
- n - number of PetscViewer you want
Output Parameter:
. viewer - the PetscViewer
Level: intermediate
Concepts: PetscViewer^array of
.seealso: PetscViewersCreate(), PetscViewersDestroy()
@*/
PetscErrorCode PetscViewersGetViewer(PetscViewers viewers,PetscInt n,PetscViewer *viewer)
{
PetscErrorCode ierr;
PetscFunctionBegin;
if (n < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot access using a negative index - %d\n",n);
if (n >= viewers->n) {
PetscViewer *v;
int newn = n + 64; /* add 64 new ones at a time */
ierr = PetscMalloc(newn*sizeof(PetscViewer),&v);CHKERRQ(ierr);
ierr = PetscMemzero(v,newn*sizeof(PetscViewer));CHKERRQ(ierr);
ierr = PetscMemcpy(v,viewers->viewer,viewers->n*sizeof(PetscViewer));CHKERRQ(ierr);
ierr = PetscFree(viewers->viewer);CHKERRQ(ierr);
viewers->viewer = v;
}
if (!viewers->viewer[n]) {
ierr = PetscViewerCreate(viewers->comm,&viewers->viewer[n]);CHKERRQ(ierr);
}
*viewer = viewers->viewer[n];
PetscFunctionReturn(0);
}
开发者ID:erdc-cm,项目名称:petsc-dev,代码行数:41,代码来源:viewers.c
示例15: time
/*@
PetscSequentialPhaseBegin - Begins a sequential section of code.
Collective on MPI_Comm
Input Parameters:
+ comm - Communicator to sequentialize.
- ng - Number in processor group. This many processes are allowed to execute
at the same time (usually 1)
Level: intermediate
Notes:
PetscSequentialPhaseBegin() and PetscSequentialPhaseEnd() provide a
way to force a section of code to be executed by the processes in
rank order. Typically, this is done with
.vb
PetscSequentialPhaseBegin(comm, 1);
<code to be executed sequentially>
PetscSequentialPhaseEnd(comm, 1);
.ve
Often, the sequential code contains output statements (e.g., printf) to
be executed. Note that you may need to flush the I/O buffers before
calling PetscSequentialPhaseEnd(). Also, note that some systems do
not propagate I/O in any order to the controling terminal (in other words,
even if you flush the output, you may not get the data in the order
that you want).
.seealso: PetscSequentialPhaseEnd()
Concepts: sequential stage
@*/
PetscErrorCode PetscSequentialPhaseBegin(MPI_Comm comm,int ng)
{
PetscErrorCode ierr;
PetscMPIInt size;
MPI_Comm local_comm,*addr_local_comm;
PetscFunctionBegin;
ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
if (size == 1) PetscFunctionReturn(0);
/* Get the private communicator for the sequential operations */
if (Petsc_Seq_keyval == MPI_KEYVAL_INVALID) {
ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Seq_keyval,0);CHKERRQ(ierr);
}
ierr = MPI_Comm_dup(comm,&local_comm);CHKERRQ(ierr);
ierr = PetscMalloc(sizeof(MPI_Comm),&addr_local_comm);CHKERRQ(ierr);
*addr_local_comm = local_comm;
ierr = MPI_Attr_put(comm,Petsc_Seq_keyval,(void*)addr_local_comm);CHKERRQ(ierr);
ierr = PetscSequentialPhaseBegin_Private(local_comm,ng);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:Kun-Qu,项目名称:petsc,代码行数:56,代码来源:mpiu.c
示例16: set
/*@
ISAllGather - Given an index set (IS) on each processor, generates a large
index set (same on each processor) by concatenating together each
processors index set.
Collective on IS
Input Parameter:
. is - the distributed index set
Output Parameter:
. isout - the concatenated index set (same on all processors)
Notes:
ISAllGather() is clearly not scalable for large index sets.
The IS created on each processor must be created with a common
communicator (e.g., PETSC_COMM_WORLD). If the index sets were created
with PETSC_COMM_SELF, this routine will not work as expected, since
each process will generate its own new IS that consists only of
itself.
The communicator for this new IS is PETSC_COMM_SELF
Level: intermediate
Concepts: gather^index sets
Concepts: index sets^gathering to all processors
Concepts: IS^gathering to all processors
.seealso: ISCreateGeneral(), ISCreateStride(), ISCreateBlock()
@*/
PetscErrorCode ISAllGather(IS is,IS *isout)
{
PetscErrorCode ierr;
PetscInt *indices,n,i,N,step,first;
const PetscInt *lindices;
MPI_Comm comm;
PetscMPIInt size,*sizes = NULL,*offsets = NULL,nn;
PetscBool stride;
PetscFunctionBegin;
PetscValidHeaderSpecific(is,IS_CLASSID,1);
PetscValidPointer(isout,2);
ierr = PetscObjectGetComm((PetscObject)is,&comm);CHKERRQ(ierr);
ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr);
ierr = PetscObjectTypeCompare((PetscObject)is,ISSTRIDE,&stride);CHKERRQ(ierr);
if (size == 1 && stride) { /* should handle parallel ISStride also */
ierr = ISStrideGetInfo(is,&first,&step);CHKERRQ(ierr);
ierr = ISCreateStride(PETSC_COMM_SELF,n,first,step,isout);CHKERRQ(ierr);
} else {
ierr = PetscMalloc2(size,PetscMPIInt,&sizes,size,PetscMPIInt,&offsets);CHKERRQ(ierr);
ierr = PetscMPIIntCast(n,&nn);CHKERRQ(ierr);
ierr = MPI_Allgather(&nn,1,MPI_INT,sizes,1,MPI_INT,comm);CHKERRQ(ierr);
offsets[0] = 0;
for (i=1; i<size; i++) offsets[i] = offsets[i-1] + sizes[i-1];
N = offsets[size-1] + sizes[size-1];
ierr = PetscMalloc(N*sizeof(PetscInt),&indices);CHKERRQ(ierr);
ierr = ISGetIndices(is,&lindices);CHKERRQ(ierr);
ierr = MPI_Allgatherv((void*)lindices,nn,MPIU_INT,indices,sizes,offsets,MPIU_INT,comm);CHKERRQ(ierr);
ierr = ISRestoreIndices(is,&lindices);CHKERRQ(ierr);
ierr = PetscFree2(sizes,offsets);CHKERRQ(ierr);
ierr = ISCreateGeneral(PETSC_COMM_SELF,N,indices,PETSC_OWN_POINTER,isout);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
开发者ID:feelpp,项目名称:debian-petsc,代码行数:71,代码来源:iscoloring.c
示例17: DMCoarsen_ADDA
PetscErrorCode DMCoarsen_ADDA(DM dm, MPI_Comm comm,DM *dmc)
{
PetscErrorCode ierr;
PetscInt *nodesc;
PetscInt dofc;
PetscInt i;
DM_ADDA *dd = (DM_ADDA*)dm->data;
PetscFunctionBegin;
PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
PetscValidPointer(dmc, 3);
ierr = PetscMalloc(dd->dim*sizeof(PetscInt), &nodesc);CHKERRQ(ierr);
for (i=0; i<dd->dim; i++) {
nodesc[i] = (dd->nodes[i] % dd->refine[i]) ? dd->nodes[i] / dd->refine[i] + 1 : dd->nodes[i] / dd->refine[i];
}
dofc = (dd->dof % dd->dofrefine) ? dd->dof / dd->dofrefine + 1 : dd->dof / dd->dofrefine;
ierr = DMADDACreate(PetscObjectComm((PetscObject)dm), dd->dim, nodesc, dd->procs, dofc, dd->periodic, dmc);CHKERRQ(ierr);
ierr = PetscFree(nodesc);CHKERRQ(ierr);
/* copy refinement factors */
ierr = DMADDASetRefinement(*dmc, dd->refine, dd->dofrefine);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:hsahasra,项目名称:petsc-magma-dense-mat,代码行数:22,代码来源:adda.c
示例18: PetscViewerASCIIOpen
/*@C
PetscViewerBinaryWriteStringArray - writes to a binary file, only from the first process an array of strings
Collective on MPI_Comm
Input Parameters:
+ viewer - the binary viewer
- data - location of the array of strings
Level: intermediate
Concepts: binary files
Notes: array of strings is null terminated
.seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(),
VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
@*/
PetscErrorCode PetscViewerBinaryWriteStringArray(PetscViewer viewer,char **data)
{
PetscErrorCode ierr;
PetscInt i,n = 0,*sizes;
/* count number of strings */
while (data[n++]);
n--;
ierr = PetscMalloc((n+1)*sizeof(PetscInt),&sizes);CHKERRQ(ierr);
sizes[0] = n;
for (i=0; i<n; i++) {
size_t tmp;
ierr = PetscStrlen(data[i],&tmp);CHKERRQ(ierr);
sizes[i+1] = tmp + 1; /* size includes space for the null terminator */
}
ierr = PetscViewerBinaryWrite(viewer,sizes,n+1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
for (i=0; i<n; i++) {
ierr = PetscViewerBinaryWrite(viewer,data[i],sizes[i+1],PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
}
ierr = PetscFree(sizes);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:Kun-Qu,项目名称:petsc,代码行数:42,代码来源:binv.c
示例19: SampleGridRangeCreate
// gridsizes is array of length nsamples, to be PetscFree'd by caller
PetscErrorCode SampleGridRangeCreate(PetscMPIInt nranks,PetscInt minlocal,PetscInt maxlocal,PetscInt maxsamples,PetscInt *nsamples,PetscInt **gridsizes) {
PetscErrorCode ierr;
int64_t target;
PetscInt gsize[100][3],n;
PetscFunctionBegin;
if (maxsamples < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_INCOMP,"The max number of samples must be at least 2");
// Build a list of compatible grid sizes in descending order
for (target=maxlocal,n=0; target>=minlocal; n++) {
ierr = FindCompatibleProblemSize(nranks,target,gsize[n]);CHKERRQ(ierr);
if (SampleGridNumElements(gsize[n]) < minlocal) {
if (!n) n = 1; // Keep whatever we found if it's the only one
break;
}
target = (SampleGridNumElements(gsize[n]) - 1)/nranks;
}
// Filter the list by greedily removing interior sample locations whose removal would leave behind the smallest
// possible ratio between successive sizes
while (n > maxsamples) {
PetscInt loc = -1;
double ratio = 1e10;
for (PetscInt i=1; i<n-1; i++) {
double r = (double)SampleGridNumElements(gsize[i-1]) / SampleGridNumElements(gsize[i+1]);
if (r < ratio) {
loc = i;
ratio = r;
}
}
ierr = PetscMemmove(gsize[loc],gsize[loc+1],(char*)gsize[n]-(char*)gsize[loc+1]);CHKERRQ(ierr);
n--;
}
*nsamples = n;
ierr = PetscMalloc(n*sizeof gsize[0],gridsizes);CHKERRQ(ierr);
ierr = PetscMemcpy(*gridsizes,gsize[0],n*sizeof gsize[0]);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
开发者ID:hpgmg,项目名称:hpgmg,代码行数:40,代码来源:sampler.c
示例20: VectorPetsc
VectorPetsc( Vector<value_type> const& v, std::vector<int> const& index )
:
super(),
//super(v,index),
M_destroy_vec_on_exit( false )
{
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunsequenced"
#endif
#if (PETSC_VERSION_MAJOR == 3) && (PETSC_VERSION_MINOR >= 2)
VectorPetsc<T> const* V = dynamic_cast<VectorPetsc<T> const*> ( &v );
int ierr=0;
IS is;
PetscInt *map;
int n = index.size();
PetscMalloc(n*sizeof(PetscInt),&map);
for (int i=0; i<n; i++) map[i] = index[i];
ierr = ISCreateGeneral(Environment::worldComm(),n,map,PETSC_COPY_VALUES,&is);
CHKERRABORT( this->comm(),ierr );
PetscFree(map);
datamap_ptrtype dm( new datamap_type(n, n, V->comm()) );
this->setMap(dm);
/* init */
ierr = VecGetSubVector(V->vec(), is, &this->M_vec);
CHKERRABORT( this->comm(),ierr );
this->M_is_initialized = true;
/* close */
this->close(); /* no // assembly required */
#endif
#if defined(__clang__)
#pragma clang diagnostic pop
#endif
}
开发者ID:bachir151,项目名称:feelpp,代码行数:38,代码来源:vectorpetsc.hpp
注:本文中的PetscMalloc函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论