xref: /petsc/src/dm/impls/plex/tests/ex98f90.F90 (revision dcb3e68992f1c4897946af7e8406e2b4165e50f2)
1fa58d8a1SBlaise Bourdinprogram ex98f90
2fa58d8a1SBlaise Bourdin#include "petsc/finclude/petsc.h"
3fa58d8a1SBlaise Bourdin    use petsc
4fa58d8a1SBlaise Bourdin    implicit none
5fa58d8a1SBlaise Bourdin
6fa58d8a1SBlaise Bourdin    ! Get the fortran kind associated with PetscInt and PetscReal so that we can use literal constants.
7fa58d8a1SBlaise Bourdin    PetscInt                           :: dummyPetscInt
8fa58d8a1SBlaise Bourdin    PetscReal                          :: dummyPetscreal
9fa58d8a1SBlaise Bourdin    integer,parameter                  :: kPI = kind(dummyPetscInt)
10fa58d8a1SBlaise Bourdin    integer,parameter                  :: kPR = kind(dummyPetscReal)
11fa58d8a1SBlaise Bourdin
12fa58d8a1SBlaise Bourdin    type(tDM)                          :: dm,pdm
13fa58d8a1SBlaise Bourdin    type(tPetscSection)                :: section
14fa58d8a1SBlaise Bourdin    character(len=PETSC_MAX_PATH_LEN)  :: ifilename,iobuffer
15fa58d8a1SBlaise Bourdin    PetscInt                           :: sdim,s,pStart,pEnd,p,numVS,numPoints
16fa58d8a1SBlaise Bourdin    PetscInt,dimension(:),pointer      :: constraints
17fa58d8a1SBlaise Bourdin    type(tIS)                          :: setIS,pointIS
18fa58d8a1SBlaise Bourdin    PetscInt,dimension(:),pointer      :: setID,pointID
19fa58d8a1SBlaise Bourdin    PetscErrorCode                     :: ierr
20fa58d8a1SBlaise Bourdin    PetscBool                          :: flg
21fa58d8a1SBlaise Bourdin    PetscMPIInt                        :: numProc
22fa58d8a1SBlaise Bourdin    MPI_Comm                           :: comm
23fa58d8a1SBlaise Bourdin
24fa58d8a1SBlaise Bourdin    PetscCallA(PetscInitialize(ierr))
25fa58d8a1SBlaise Bourdin    PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD,numProc,ierr))
26fa58d8a1SBlaise Bourdin
27*dcb3e689SBarry Smith    PetscCallA(PetscOptionsGetString(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-i',ifilename,flg,ierr))
28*dcb3e689SBarry Smith    PetscCheckA(flg,PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,'missing input file name -i <input file name>')
29fa58d8a1SBlaise Bourdin
30fa58d8a1SBlaise Bourdin    PetscCallA(DMPlexCreateFromFile(PETSC_COMM_WORLD,ifilename,PETSC_NULL_CHARACTER,PETSC_TRUE,dm,ierr))
31fa58d8a1SBlaise Bourdin    PetscCallA(DMPlexDistributeSetDefault(dm,PETSC_FALSE,ierr))
32fa58d8a1SBlaise Bourdin    PetscCallA(DMSetFromOptions(dm,ierr))
33fa58d8a1SBlaise Bourdin
34fa58d8a1SBlaise Bourdin    if (numproc > 1) then
35fa58d8a1SBlaise Bourdin      PetscCallA(DMPlexDistribute(dm,0_kPI,PETSC_NULL_SF,pdm,ierr))
36fa58d8a1SBlaise Bourdin      PetscCallA(DMDestroy(dm,ierr))
37fa58d8a1SBlaise Bourdin      dm = pdm
38fa58d8a1SBlaise Bourdin    end if
39*dcb3e689SBarry Smith    PetscCallA(DMViewFromOptions(dm,PETSC_NULL_OPTIONS,'-dm_view',ierr))
40fa58d8a1SBlaise Bourdin
41fa58d8a1SBlaise Bourdin    PetscCallA(DMGetDimension(dm,sdim,ierr))
42fa58d8a1SBlaise Bourdin    PetscCallA(PetscObjectGetComm(dm,comm,ierr))
43fa58d8a1SBlaise Bourdin    PetscCallA(PetscSectionCreate(comm,section,ierr))
44fa58d8a1SBlaise Bourdin    PetscCallA(PetscSectionSetNumFields(section,1_kPI,ierr))
45*dcb3e689SBarry Smith    PetscCallA(PetscSectionSetFieldName(section,0_kPI,'U',ierr))
46fa58d8a1SBlaise Bourdin    PetscCallA(PetscSectionSetFieldComponents(section,0_kPI,sdim,ierr))
47fa58d8a1SBlaise Bourdin    PetscCallA(DMPlexGetChart(dm,pStart,pEnd,ierr))
48fa58d8a1SBlaise Bourdin    PetscCallA(PetscSectionSetChart(section,pStart,pEnd,ierr))
49fa58d8a1SBlaise Bourdin
50fa58d8a1SBlaise Bourdin    ! initialize the section storage for a P1 field
51fa58d8a1SBlaise Bourdin    PetscCallA(DMPlexGetDepthStratum(dm,0_kPI,pStart,pEnd,ierr))
52fa58d8a1SBlaise Bourdin    do p = pStart,pEnd-1
53fa58d8a1SBlaise Bourdin      PetscCallA(PetscSectionSetDof(section,p,sdim,ierr))
54fa58d8a1SBlaise Bourdin      PetscCallA(PetscSectionSetFieldDof(section,p,0_kPI,sdim,ierr))
55fa58d8a1SBlaise Bourdin    end do
56fa58d8a1SBlaise Bourdin
57fa58d8a1SBlaise Bourdin    ! add constraints at all vertices belonging to a vertex set:
58fa58d8a1SBlaise Bourdin    ! first pass is to reserve space
59*dcb3e689SBarry Smith    PetscCallA(DMGetLabelSize(dm,'Vertex Sets',numVS,ierr))
60fa58d8a1SBlaise Bourdin    write(iobuffer,'("# Vertex set: ",i3,"\n")' ) numVS
61fa58d8a1SBlaise Bourdin    PetscCallA(PetscPrintf(PETSC_COMM_WORLD,iobuffer,ierr))
62*dcb3e689SBarry Smith    PetscCallA(DMGetLabelIdIS(dm,'Vertex Sets',setIS,ierr))
63fa58d8a1SBlaise Bourdin    PetscCallA(ISGetIndicesF90(setIS,setID,ierr))
64fa58d8a1SBlaise Bourdin    do s = 1,numVS
65*dcb3e689SBarry Smith      PetscCallA(DMGetStratumIS(dm,'Vertex Sets',setID(s),pointIS,ierr))
66*dcb3e689SBarry Smith      PetscCallA(DMGetStratumSize(dm,'Vertex Sets',setID(s),numPoints,ierr))
67fa58d8a1SBlaise Bourdin      write(iobuffer,'("set ",i3," size ",i3,"\n")' ) s,numPoints
68fa58d8a1SBlaise Bourdin      PetscCallA(PetscPrintf(PETSC_COMM_WORLD,iobuffer,ierr))
69fa58d8a1SBlaise Bourdin      PetscCallA(ISGetIndicesF90(pointIS,pointID,ierr))
70fa58d8a1SBlaise Bourdin      do p = 1,numPoints
71fa58d8a1SBlaise Bourdin        write(iobuffer,'("   point ",i3,"\n")' ) pointID(p)
72fa58d8a1SBlaise Bourdin        PetscCallA(PetscPrintf(PETSC_COMM_WORLD,iobuffer,ierr))
73fa58d8a1SBlaise Bourdin        PetscCallA(PetscSectionSetConstraintDof(section,pointID(p),1_kPI,ierr))
74fa58d8a1SBlaise Bourdin        PetscCallA(PetscSectionSetFieldConstraintDof(section,pointID(p),0_kPI,1_kPI,ierr))
75fa58d8a1SBlaise Bourdin      end do
76fa58d8a1SBlaise Bourdin      PetscCallA(ISRestoreIndicesF90(pointIS,pointID,ierr))
77fa58d8a1SBlaise Bourdin      PetscCallA(ISDestroy(pointIS,ierr))
78fa58d8a1SBlaise Bourdin    end do
79fa58d8a1SBlaise Bourdin
80fa58d8a1SBlaise Bourdin    PetscCallA(PetscSectionSetUp(section,ierr))
81fa58d8a1SBlaise Bourdin
82fa58d8a1SBlaise Bourdin    ! add constraints at all vertices belonging to a vertex set:
83fa58d8a1SBlaise Bourdin    ! second pass is to assign constraints to a specific component / dof
84fa58d8a1SBlaise Bourdin    allocate(constraints(1))
85fa58d8a1SBlaise Bourdin    do s = 1,numVS
86*dcb3e689SBarry Smith      PetscCallA(DMGetStratumIS(dm,'Vertex Sets',setID(s),pointIS,ierr))
87*dcb3e689SBarry Smith      PetscCallA(DMGetStratumSize(dm,'Vertex Sets',setID(s),numPoints,ierr))
88fa58d8a1SBlaise Bourdin      PetscCallA(ISGetIndicesF90(pointIS,pointID,ierr))
89fa58d8a1SBlaise Bourdin      do p = 1,numPoints
90fa58d8a1SBlaise Bourdin        constraints(1) = mod(setID(s),sdim)
91fa58d8a1SBlaise Bourdin        PetscCallA(PetscSectionSetConstraintIndicesF90(section,pointID(p),constraints,ierr))
92fa58d8a1SBlaise Bourdin        PetscCallA(PetscSectionSetFieldConstraintIndicesF90(section,pointID(p),0_kPI,constraints,ierr))
93fa58d8a1SBlaise Bourdin      end do
94fa58d8a1SBlaise Bourdin      PetscCallA(ISRestoreIndicesF90(pointIS,pointID,ierr))
95fa58d8a1SBlaise Bourdin      PetscCallA(ISDestroy(pointIS,ierr))
96fa58d8a1SBlaise Bourdin    end do
97fa58d8a1SBlaise Bourdin    deallocate(constraints)
98fa58d8a1SBlaise Bourdin    PetscCallA(ISRestoreIndicesF90(setIS,setID,ierr))
99fa58d8a1SBlaise Bourdin    PetscCallA(ISDestroy(setIS,ierr))
100*dcb3e689SBarry Smith    PetscCallA(PetscObjectViewFromOptions(section,PETSC_NULL_SECTION,'-dm_section_view',ierr))
101fa58d8a1SBlaise Bourdin
102fa58d8a1SBlaise Bourdin    PetscCallA(PetscSectionDestroy(section,ierr))
103fa58d8a1SBlaise Bourdin    PetscCallA(DMDestroy(dm,ierr))
104fa58d8a1SBlaise Bourdin
105fa58d8a1SBlaise Bourdin    PetscCallA(PetscFinalize(ierr))
106fa58d8a1SBlaise Bourdinend program ex98f90
107fa58d8a1SBlaise Bourdin
108fa58d8a1SBlaise Bourdin! /*TEST
109fa58d8a1SBlaise Bourdin!   build:
110fa58d8a1SBlaise Bourdin!     requires: exodusii pnetcdf !complex
111fa58d8a1SBlaise Bourdin!   testset:
112fa58d8a1SBlaise Bourdin!     args: -i ${wPETSC_DIR}/share/petsc/datafiles/meshes/SquareFaceSet.exo -dm_view -dm_section_view
113fa58d8a1SBlaise Bourdin!     nsize: 1
114fa58d8a1SBlaise Bourdin!     test:
115fa58d8a1SBlaise Bourdin!       suffix: 0
116fa58d8a1SBlaise Bourdin!       args:
117fa58d8a1SBlaise Bourdin! TEST*/
118