1 #include <petsc-private/dmimpl.h> /*I "petscdm.h" I*/ 2 3 extern PetscErrorCode VecView_Seq(Vec, PetscViewer); 4 extern PetscErrorCode VecView_MPI(Vec, PetscViewer); 5 6 #undef __FUNCT__ 7 #define __FUNCT__ "DMCreateGlobalVector_Section_Private" 8 PetscErrorCode DMCreateGlobalVector_Section_Private(DM dm,Vec *vec) 9 { 10 PetscSection gSection; 11 PetscInt localSize, bs, blockSize = -1, pStart, pEnd, p; 12 PetscErrorCode ierr; 13 14 PetscFunctionBegin; 15 ierr = DMGetDefaultGlobalSection(dm, &gSection);CHKERRQ(ierr); 16 ierr = PetscSectionGetChart(gSection, &pStart, &pEnd);CHKERRQ(ierr); 17 for (p = pStart; p < pEnd; ++p) { 18 PetscInt dof, cdof; 19 20 ierr = PetscSectionGetDof(gSection, p, &dof);CHKERRQ(ierr); 21 ierr = PetscSectionGetConstraintDof(gSection, p, &cdof);CHKERRQ(ierr); 22 if ((blockSize < 0) && (dof > 0)) blockSize = dof-cdof; 23 if ((dof > 0) && (dof-cdof != blockSize)) { 24 blockSize = 1; 25 break; 26 } 27 } 28 if (blockSize < 0) blockSize = 1; 29 ierr = MPI_Allreduce(&blockSize, &bs, 1, MPIU_INT, MPI_MIN, PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); 30 ierr = PetscSectionGetConstrainedStorageSize(gSection, &localSize);CHKERRQ(ierr); 31 if (localSize%blockSize) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Mismatch between blocksize %d and local storage size %d", blockSize, localSize); 32 ierr = VecCreate(PetscObjectComm((PetscObject)dm), vec);CHKERRQ(ierr); 33 ierr = VecSetSizes(*vec, localSize, PETSC_DETERMINE);CHKERRQ(ierr); 34 ierr = VecSetBlockSize(*vec, bs);CHKERRQ(ierr); 35 /* ierr = VecSetType(*vec, dm->vectype);CHKERRQ(ierr); */ 36 ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 37 ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 38 /* ierr = VecSetLocalToGlobalMapping(*vec, dm->ltogmap);CHKERRQ(ierr); */ 39 /* ierr = VecSetLocalToGlobalMappingBlock(*vec, dm->ltogmapb);CHKERRQ(ierr); */ 40 PetscFunctionReturn(0); 41 } 42 43 #undef __FUNCT__ 44 #define __FUNCT__ "DMCreateLocalVector_Section_Private" 45 PetscErrorCode DMCreateLocalVector_Section_Private(DM dm,Vec *vec) 46 { 47 PetscSection section; 48 PetscInt localSize, blockSize = -1, pStart, pEnd, p; 49 PetscErrorCode ierr; 50 51 PetscFunctionBegin; 52 ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 53 ierr = PetscSectionGetChart(section, &pStart, &pEnd);CHKERRQ(ierr); 54 for (p = pStart; p < pEnd; ++p) { 55 PetscInt dof; 56 57 ierr = PetscSectionGetDof(section, p, &dof);CHKERRQ(ierr); 58 if ((blockSize < 0) && (dof > 0)) blockSize = dof; 59 if ((dof > 0) && (dof != blockSize)) { 60 blockSize = 1; 61 break; 62 } 63 } 64 ierr = PetscSectionGetStorageSize(section, &localSize);CHKERRQ(ierr); 65 ierr = VecCreate(PETSC_COMM_SELF, vec);CHKERRQ(ierr); 66 ierr = VecSetSizes(*vec, localSize, localSize);CHKERRQ(ierr); 67 ierr = VecSetBlockSize(*vec, blockSize);CHKERRQ(ierr); 68 ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 69 ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 70 PetscFunctionReturn(0); 71 } 72