Actual source code: ex1f90.F90

      1:       program DMPlexTestField
      2: #include "petsc/finclude/petscdmplex.h"
      3: #include "petsc/finclude/petscdmlabel.h"
      4:       use petscdmplex
      5:       use petscsys
      6:       implicit none

      8:       DM :: dm
      9:       DMLabel :: label
     10:       Vec :: u
     11:       PetscViewer :: viewer
     12:       PetscSection :: section
     13:       PetscInt :: dim,numFields,numBC
     14:       PetscInt :: i,val
     15:       DMLabel, pointer :: nolabel(:) => NULL()
     16:       PetscInt, target, dimension(3) ::  numComp
     17:       PetscInt, pointer :: pNumComp(:)
     18:       PetscInt, target, dimension(12) ::  numDof
     19:       PetscInt, pointer :: pNumDof(:)
     20:       PetscInt, target, dimension(1) ::  bcField
     21:       PetscInt, pointer :: pBcField(:)
     22:       PetscInt, parameter :: zero = 0, one = 1, two = 2, eight = 8
     23:       IS, target, dimension(1) ::   bcCompIS
     24:       IS, target, dimension(1) ::   bcPointIS
     25:       IS, pointer :: pBcCompIS(:)
     26:       IS, pointer :: pBcPointIS(:)
     27:       PetscBool :: interpolate,flg
     28:       PetscErrorCode :: ierr

     30:       call PetscInitialize(PETSC_NULL_CHARACTER, ierr)
     31:       if (ierr .ne. 0) then
     32:         print*,'Unable to initialize PETSc'
     33:         stop
     34:       endif
     35:       dim = 2
     36:       call PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-dim', dim,flg, ierr);CHKERRA(ierr)
     37:       interpolate = PETSC_TRUE
     38: !     Create a mesh
     39:       call DMPlexCreateBoxMesh(PETSC_COMM_WORLD, dim, PETSC_TRUE, PETSC_NULL_INTEGER, PETSC_NULL_REAL, PETSC_NULL_REAL, PETSC_NULL_INTEGER, interpolate, dm, ierr);CHKERRA(ierr)
     40: !     Create a scalar field u, a vector field v, and a surface vector field w
     41:       numFields  = 3
     42:       numComp(1) = 1
     43:       numComp(2) = dim
     44:       numComp(3) = dim-1
     45:       pNumComp => numComp
     46:       do i = 1, numFields*(dim+1)
     47:          numDof(i) = 0
     48:       end do
     49: !     Let u be defined on vertices
     50:       numDof(0*(dim+1)+1)     = 1
     51: !     Let v be defined on cells
     52:       numDof(1*(dim+1)+dim+1) = dim
     53: !     Let v be defined on faces
     54:       numDof(2*(dim+1)+dim)   = dim-1
     55:       pNumDof => numDof
     56: !     Setup boundary conditions
     57:       numBC = 1
     58: !     Test label retrieval
     59:       call DMGetLabel(dm, 'marker', label, ierr);CHKERRA(ierr)
     60:       call DMLabelGetValue(label, zero, val, ierr);CHKERRA(ierr)
     61:       if (val .ne. -1) then
     62:         SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,'Error in library')
     63:       endif
     64:       call DMLabelGetValue(label, eight, val, ierr);CHKERRA(ierr)
     65:       if (val .ne. 1) then
     66:         SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,'Error in library')
     67:       endif
     68: !     Prescribe a Dirichlet condition on u on the boundary
     69: !       Label "marker" is made by the mesh creation routine
     70:       bcField(1) = 0
     71:       pBcField => bcField
     72:       call ISCreateStride(PETSC_COMM_WORLD, one, zero, one, bcCompIS(1), ierr);CHKERRA(ierr)
     73:       pBcCompIS => bcCompIS
     74:       call DMGetStratumIS(dm, 'marker', one, bcPointIS(1),ierr);CHKERRA(ierr)
     75:       pBcPointIS => bcPointIS
     76: !     Create a PetscSection with this data layout
     77:       call DMSetNumFields(dm, numFields,ierr);CHKERRA(ierr)
     78:       call DMPlexCreateSection(dm,nolabel,pNumComp,pNumDof,numBC,pBcField,pBcCompIS,pBcPointIS,PETSC_NULL_IS,section,ierr)
     79:       CHKERRA(ierr)
     80:       call ISDestroy(bcCompIS(1), ierr);CHKERRA(ierr)
     81:       call ISDestroy(bcPointIS(1), ierr);CHKERRA(ierr)
     82: !     Name the Field variables
     83:       call PetscSectionSetFieldName(section, zero, 'u', ierr);CHKERRA(ierr)
     84:       call PetscSectionSetFieldName(section, one,  'v', ierr);CHKERRA(ierr)
     85:       call PetscSectionSetFieldName(section, two,  'w', ierr);CHKERRA(ierr)
     86:       call PetscSectionView(section, PETSC_VIEWER_STDOUT_WORLD, ierr);CHKERRA(ierr)
     87: !     Tell the DM to use this data layout
     88:       call DMSetLocalSection(dm, section, ierr);CHKERRA(ierr)
     89: !     Create a Vec with this layout and view it
     90:       call DMGetGlobalVector(dm, u, ierr);CHKERRA(ierr)
     91:       call PetscViewerCreate(PETSC_COMM_WORLD, viewer, ierr);CHKERRA(ierr)
     92:       call PetscViewerSetType(viewer, PETSCVIEWERVTK, ierr);CHKERRA(ierr)
     93:       call PetscViewerFileSetName(viewer, 'sol.vtu', ierr);CHKERRA(ierr)
     94:       call VecView(u, viewer, ierr);CHKERRA(ierr)
     95:       call PetscViewerDestroy(viewer, ierr);CHKERRA(ierr)
     96:       call DMRestoreGlobalVector(dm, u, ierr);CHKERRA(ierr)
     97: !     Cleanup
     98:       call PetscSectionDestroy(section, ierr);CHKERRA(ierr)
     99:       call DMDestroy(dm, ierr);CHKERRA(ierr)

    101:       call PetscFinalize(ierr)
    102:       end program DMPlexTestField

    104: !/*TEST
    105: !  build:
    106: !    requires: define(PETSC_USING_F90FREEFORM)
    107: !
    108: !  test:
    109: !    suffix: 0
    110: !    requires: triangle
    111: !    args: -info :~sys:
    112: !
    113: !  test:
    114: !    suffix: 1
    115: !    requires: ctetgen
    116: !    args: -dim 3 -info :~sys:
    117: !
    118: !TEST*/