xref: /petsc/src/dm/interface/dmi.c (revision 9895aa37ac365bac650f6bd8bf977519f7222510)
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, &section);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