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 PetscErrorCode ierr; 11 PetscSection gSection; 12 PetscInt localSize, blockSize = -1, pStart, pEnd, p; 13 14 PetscFunctionBegin; 15 ierr = DMGetDefaultGlobalSection(dm, &gSection);CHKERRQ(ierr); 16 ierr = PetscSectionGetChart(dm->defaultSection, &pStart, &pEnd);CHKERRQ(ierr); 17 for(p = pStart; p < pEnd; ++p) { 18 PetscInt dof, cdof; 19 20 ierr = PetscSectionGetDof(dm->defaultSection, p, &dof);CHKERRQ(ierr); 21 ierr = PetscSectionGetConstraintDof(dm->defaultSection, 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(dm->defaultGlobalSection, &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 PetscErrorCode ierr; 46 PetscInt localSize, blockSize = -1, pStart, pEnd, p; 47 48 PetscFunctionBegin; 49 ierr = PetscSectionGetChart(dm->defaultSection, &pStart, &pEnd);CHKERRQ(ierr); 50 for(p = pStart; p < pEnd; ++p) { 51 PetscInt dof; 52 53 ierr = PetscSectionGetDof(dm->defaultSection, p, &dof);CHKERRQ(ierr); 54 if ((blockSize < 0) && (dof > 0)) blockSize = dof; 55 if ((dof > 0) && (dof != blockSize)) { 56 blockSize = 1; 57 break; 58 } 59 } 60 ierr = PetscSectionGetStorageSize(dm->defaultSection, &localSize);CHKERRQ(ierr); 61 ierr = VecCreate(PETSC_COMM_SELF, vec);CHKERRQ(ierr); 62 ierr = VecSetSizes(*vec, localSize, localSize);CHKERRQ(ierr); 63 ierr = VecSetBlockSize(*vec, blockSize);CHKERRQ(ierr); 64 ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 65 ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 66 PetscFunctionReturn(0); 67 } 68