111689aebSJed Brown #include <petsc-private/dmimpl.h> /*I "petscdm.h" I*/ 211689aebSJed Brown 311689aebSJed Brown extern PetscErrorCode VecView_Seq(Vec, PetscViewer); 411689aebSJed Brown extern PetscErrorCode VecView_MPI(Vec, PetscViewer); 511689aebSJed Brown 611689aebSJed Brown #undef __FUNCT__ 711689aebSJed Brown #define __FUNCT__ "DMCreateGlobalVector_Section_Private" 811689aebSJed Brown PetscErrorCode DMCreateGlobalVector_Section_Private(DM dm,Vec *vec) 911689aebSJed Brown { 1011689aebSJed Brown PetscSection gSection; 11cc30b04dSMatthew G Knepley PetscInt localSize, bs, blockSize = -1, pStart, pEnd, p; 12fad22124SMatthew G Knepley PetscErrorCode ierr; 1311689aebSJed Brown 1411689aebSJed Brown PetscFunctionBegin; 1511689aebSJed Brown ierr = DMGetDefaultGlobalSection(dm, &gSection);CHKERRQ(ierr); 16fad22124SMatthew G Knepley ierr = PetscSectionGetChart(gSection, &pStart, &pEnd);CHKERRQ(ierr); 1711689aebSJed Brown for (p = pStart; p < pEnd; ++p) { 1811689aebSJed Brown PetscInt dof, cdof; 1911689aebSJed Brown 20fad22124SMatthew G Knepley ierr = PetscSectionGetDof(gSection, p, &dof);CHKERRQ(ierr); 21fad22124SMatthew G Knepley ierr = PetscSectionGetConstraintDof(gSection, p, &cdof);CHKERRQ(ierr); 2211689aebSJed Brown if ((blockSize < 0) && (dof > 0)) blockSize = dof-cdof; 2311689aebSJed Brown if ((dof > 0) && (dof-cdof != blockSize)) { 2411689aebSJed Brown blockSize = 1; 2511689aebSJed Brown break; 2611689aebSJed Brown } 2711689aebSJed Brown } 28cc30b04dSMatthew G Knepley if (blockSize < 0) blockSize = 1; 29*82f516ccSBarry Smith ierr = MPI_Allreduce(&blockSize, &bs, 1, MPIU_INT, MPI_MIN, PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); 30fad22124SMatthew G Knepley ierr = PetscSectionGetConstrainedStorageSize(gSection, &localSize);CHKERRQ(ierr); 31*82f516ccSBarry Smith if (localSize%blockSize) SETERRQ2(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONG, "Mismatch between blocksize %d and local storage size %d", blockSize, localSize); 32*82f516ccSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)dm), vec);CHKERRQ(ierr); 3311689aebSJed Brown ierr = VecSetSizes(*vec, localSize, PETSC_DETERMINE);CHKERRQ(ierr); 34cc30b04dSMatthew G Knepley ierr = VecSetBlockSize(*vec, bs);CHKERRQ(ierr); 3511689aebSJed Brown /* ierr = VecSetType(*vec, dm->vectype);CHKERRQ(ierr); */ 3611689aebSJed Brown ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 3711689aebSJed Brown ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 3811689aebSJed Brown /* ierr = VecSetLocalToGlobalMapping(*vec, dm->ltogmap);CHKERRQ(ierr); */ 3911689aebSJed Brown /* ierr = VecSetLocalToGlobalMappingBlock(*vec, dm->ltogmapb);CHKERRQ(ierr); */ 4011689aebSJed Brown PetscFunctionReturn(0); 4111689aebSJed Brown } 4211689aebSJed Brown 4311689aebSJed Brown #undef __FUNCT__ 4411689aebSJed Brown #define __FUNCT__ "DMCreateLocalVector_Section_Private" 4511689aebSJed Brown PetscErrorCode DMCreateLocalVector_Section_Private(DM dm,Vec *vec) 4611689aebSJed Brown { 47fad22124SMatthew G Knepley PetscSection section; 4811689aebSJed Brown PetscInt localSize, blockSize = -1, pStart, pEnd, p; 49fad22124SMatthew G Knepley PetscErrorCode ierr; 5011689aebSJed Brown 5111689aebSJed Brown PetscFunctionBegin; 52fad22124SMatthew G Knepley ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 53fad22124SMatthew G Knepley ierr = PetscSectionGetChart(section, &pStart, &pEnd);CHKERRQ(ierr); 5411689aebSJed Brown for (p = pStart; p < pEnd; ++p) { 5511689aebSJed Brown PetscInt dof; 5611689aebSJed Brown 57fad22124SMatthew G Knepley ierr = PetscSectionGetDof(section, p, &dof);CHKERRQ(ierr); 5811689aebSJed Brown if ((blockSize < 0) && (dof > 0)) blockSize = dof; 5911689aebSJed Brown if ((dof > 0) && (dof != blockSize)) { 6011689aebSJed Brown blockSize = 1; 6111689aebSJed Brown break; 6211689aebSJed Brown } 6311689aebSJed Brown } 64fad22124SMatthew G Knepley ierr = PetscSectionGetStorageSize(section, &localSize);CHKERRQ(ierr); 6511689aebSJed Brown ierr = VecCreate(PETSC_COMM_SELF, vec);CHKERRQ(ierr); 6611689aebSJed Brown ierr = VecSetSizes(*vec, localSize, localSize);CHKERRQ(ierr); 6711689aebSJed Brown ierr = VecSetBlockSize(*vec, blockSize);CHKERRQ(ierr); 6811689aebSJed Brown ierr = VecSetFromOptions(*vec);CHKERRQ(ierr); 6911689aebSJed Brown ierr = VecSetDM(*vec, dm);CHKERRQ(ierr); 7011689aebSJed Brown PetscFunctionReturn(0); 7111689aebSJed Brown } 72