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