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