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