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, 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 ierr = PetscSectionGetConstrainedStorageSize(gSection, &localSize);CHKERRQ(ierr); 29 if (localSize%blockSize) SETERRQ2(((PetscObject) dm)->comm, PETSC_ERR_ARG_WRONG, "Mismatch between blocksize %d and local storage size %d", blockSize, localSize); 30 ierr = VecCreate(((PetscObject) dm)->comm, vec);CHKERRQ(ierr); 31 ierr = VecSetSizes(*vec, localSize, PETSC_DETERMINE);CHKERRQ(ierr); 32 ierr = VecSetBlockSize(*vec, blockSize);CHKERRQ(ierr); 33 /* ierr = VecSetType(*vec, dm->vectype);CHKERRQ(ierr); */ 34 ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 35 ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 36 /* ierr = VecSetLocalToGlobalMapping(*vec, dm->ltogmap);CHKERRQ(ierr); */ 37 /* ierr = VecSetLocalToGlobalMappingBlock(*vec, dm->ltogmapb);CHKERRQ(ierr); */ 38 PetscFunctionReturn(0); 39 } 40 41 #undef __FUNCT__ 42 #define __FUNCT__ "DMCreateLocalVector_Section_Private" 43 PetscErrorCode DMCreateLocalVector_Section_Private(DM dm,Vec *vec) 44 { 45 PetscSection section; 46 PetscInt localSize, blockSize = -1, pStart, pEnd, p; 47 PetscErrorCode ierr; 48 49 PetscFunctionBegin; 50 ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 51 ierr = PetscSectionGetChart(section, &pStart, &pEnd);CHKERRQ(ierr); 52 for (p = pStart; p < pEnd; ++p) { 53 PetscInt dof; 54 55 ierr = PetscSectionGetDof(section, p, &dof);CHKERRQ(ierr); 56 if ((blockSize < 0) && (dof > 0)) blockSize = dof; 57 if ((dof > 0) && (dof != blockSize)) { 58 blockSize = 1; 59 break; 60 } 61 } 62 ierr = PetscSectionGetStorageSize(section, &localSize);CHKERRQ(ierr); 63 ierr = VecCreate(PETSC_COMM_SELF, vec);CHKERRQ(ierr); 64 ierr = VecSetSizes(*vec, localSize, localSize);CHKERRQ(ierr); 65 ierr = VecSetBlockSize(*vec, blockSize);CHKERRQ(ierr); 66 ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 67 ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 68 PetscFunctionReturn(0); 69 } 70