PetscErrorCode DMCreateGlobalVector_Section_Private(DM dm,Vec *vec) { PetscSection gSection; PetscInt localSize, bs, blockSize = -1, pStart, pEnd, p; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMGetDefaultGlobalSection(dm, &gSection);CHKERRQ(ierr); ierr = PetscSectionGetChart(gSection, &pStart, &pEnd);CHKERRQ(ierr); for (p = pStart; p < pEnd; ++p) { PetscInt dof, cdof; ierr = PetscSectionGetDof(gSection, p, &dof);CHKERRQ(ierr); ierr = PetscSectionGetConstraintDof(gSection, p, &cdof);CHKERRQ(ierr); if ((blockSize < 0) && (dof > 0) && (dof-cdof > 0)) blockSize = dof-cdof; if ((dof > 0) && (dof-cdof != blockSize)) { blockSize = 1; break; } } if (blockSize < 0) blockSize = PETSC_MAX_INT; ierr = MPIU_Allreduce(&blockSize, &bs, 1, MPIU_INT, MPI_MIN, PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); if (blockSize == PETSC_MAX_INT) blockSize = 1; /* Everyone was empty */ ierr = PetscSectionGetConstrainedStorageSize(gSection, &localSize);CHKERRQ(ierr); if (localSize%blockSize) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Mismatch between blocksize %d and local storage size %d", blockSize, localSize); ierr = VecCreate(PetscObjectComm((PetscObject)dm), vec);CHKERRQ(ierr); ierr = VecSetSizes(*vec, localSize, PETSC_DETERMINE);CHKERRQ(ierr); ierr = VecSetBlockSize(*vec, bs);CHKERRQ(ierr); ierr = VecSetType(*vec,dm->vectype);CHKERRQ(ierr); ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); /* ierr = VecSetLocalToGlobalMapping(*vec, dm->ltogmap);CHKERRQ(ierr); */ PetscFunctionReturn(0); }
PetscErrorCode DMCreateGlobalVector_DA(DM da,Vec *g) { PetscErrorCode ierr; DM_DA *dd = (DM_DA*)da->data; PetscFunctionBegin; PetscValidHeaderSpecific(da,DM_CLASSID,1); PetscValidPointer(g,2); if (da->defaultSection) { ierr = DMCreateGlobalVector_Section_Private(da,g);CHKERRQ(ierr); /* The view and load functions break for general layouts */ PetscFunctionReturn(0); } else { ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr); ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); ierr = VecSetDM(*g, da);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr); } ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr); ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr); ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode DMCreateLocalVector_Section_Private(DM dm,Vec *vec) { PetscSection section; PetscInt localSize, blockSize = -1, pStart, pEnd, p; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); ierr = PetscSectionGetChart(section, &pStart, &pEnd);CHKERRQ(ierr); for (p = pStart; p < pEnd; ++p) { PetscInt dof; ierr = PetscSectionGetDof(section, p, &dof);CHKERRQ(ierr); if ((blockSize < 0) && (dof > 0)) blockSize = dof; if ((dof > 0) && (dof != blockSize)) { blockSize = 1; break; } } ierr = PetscSectionGetStorageSize(section, &localSize);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_SELF, vec);CHKERRQ(ierr); ierr = VecSetSizes(*vec, localSize, localSize);CHKERRQ(ierr); ierr = VecSetBlockSize(*vec, blockSize);CHKERRQ(ierr); ierr = VecSetType(*vec,dm->vectype);CHKERRQ(ierr); ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode DMCreateLocalVector_Shell(DM dm,Vec *gvec) { PetscErrorCode ierr; DM_Shell *shell = (DM_Shell*)dm->data; Vec X; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); PetscValidPointer(gvec,2); *gvec = 0; X = shell->Xlocal; if (!X) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_USER,"Must call DMShellSetLocalVector() or DMShellSetCreateLocalVector()"); if (((PetscObject)X)->refct < 2) { /* We have an exclusive reference so we can give it out */ ierr = PetscObjectReference((PetscObject)X); CHKERRQ(ierr); ierr = VecZeroEntries(X); CHKERRQ(ierr); *gvec = X; } else { /* Need to create a copy, could use MAT_SHARE_NONZERO_PATTERN in most cases */ ierr = VecDuplicate(X,gvec); CHKERRQ(ierr); ierr = VecZeroEntries(*gvec); CHKERRQ(ierr); } ierr = VecSetDM(*gvec,dm); CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode CreateLocalVector(DM shell,Vec *x) { PetscErrorCode ierr; DM da; ierr = DMShellGetContext(shell,(void**)&da);CHKERRQ(ierr); ierr = DMCreateLocalVector(da,x);CHKERRQ(ierr); ierr = VecSetDM(*x,shell);CHKERRQ(ierr); return 0; }
static PetscErrorCode DMCreateGlobalVector_Sliced(DM dm,Vec *gvec) { PetscErrorCode ierr; DM_Sliced *slice = (DM_Sliced*)dm->data; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); PetscValidPointer(gvec,2); *gvec = 0; ierr = VecCreateGhostBlock(((PetscObject)dm)->comm,slice->bs,slice->n*slice->bs,PETSC_DETERMINE,slice->Nghosts,slice->ghosts,gvec);CHKERRQ(ierr); ierr = VecSetDM(*gvec,dm);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode DMCreateLocalVector_Composite(DM dm,Vec *lvec) { PetscErrorCode ierr; DM_Composite *com = (DM_Composite*)dm->data; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); if (!com->setup) { ierr = DMSetUp(dm);CHKERRQ(ierr); } ierr = VecCreateSeq(((PetscObject)dm)->comm,com->nghost,lvec);CHKERRQ(ierr); ierr = VecSetDM(*lvec, dm);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode DMCreateLocalVector_Redundant(DM dm,Vec *lvec) { PetscErrorCode ierr; DM_Redundant *red = (DM_Redundant*)dm->data; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); PetscValidPointer(lvec,2); *lvec = 0; ierr = VecCreate(PETSC_COMM_SELF,lvec);CHKERRQ(ierr); ierr = VecSetSizes(*lvec,red->N,red->N);CHKERRQ(ierr); ierr = VecSetType(*lvec,dm->vectype);CHKERRQ(ierr); ierr = VecSetDM(*lvec,dm);CHKERRQ(ierr); PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "DMCreateGlobalVector_Composite" PetscErrorCode DMCreateGlobalVector_Composite(DM dm,Vec *gvec) { PetscErrorCode ierr; DM_Composite *com = (DM_Composite*)dm->data; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); ierr = DMSetUp(dm);CHKERRQ(ierr); ierr = VecCreateMPI(((PetscObject)dm)->comm,com->n,com->N,gvec);CHKERRQ(ierr); ierr = VecSetDM(*gvec, dm);CHKERRQ(ierr); ierr = VecSetOperation(*gvec,VECOP_VIEW,(void(*)(void))VecView_DMComposite);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode DMCreateGlobalVector_Redundant(DM dm,Vec *gvec) { PetscErrorCode ierr; DM_Redundant *red = (DM_Redundant*)dm->data; ISLocalToGlobalMapping ltog,ltogb; PetscFunctionBegin; PetscValidHeaderSpecific(dm,DM_CLASSID,1); PetscValidPointer(gvec,2); *gvec = 0; ierr = VecCreate(PetscObjectComm((PetscObject)dm),gvec);CHKERRQ(ierr); ierr = VecSetSizes(*gvec,red->n,red->N);CHKERRQ(ierr); ierr = VecSetType(*gvec,dm->vectype);CHKERRQ(ierr); ierr = DMGetLocalToGlobalMapping(dm,<og);CHKERRQ(ierr); ierr = DMGetLocalToGlobalMappingBlock(dm,<ogb);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMapping(*gvec,ltog);CHKERRQ(ierr); ierr = VecSetLocalToGlobalMappingBlock(*gvec,ltog);CHKERRQ(ierr); ierr = VecSetDM(*gvec,dm);CHKERRQ(ierr); PetscFunctionReturn(0); }