program testDMView implicit none #include 'finclude/petsc.h90' DM :: dm DM :: auxDM PetscErrorCode :: ierr MPI_Comm :: comm PetscBool :: interpolate integer :: ic,tdim,numFields,numBC integer, pointer :: numComp(:),numDof(:) integer, pointer :: bcField(:) IS,pointer :: bcPointIS(:) Vec :: coords PetscSection :: section Vec :: X Vec :: LocalX1, LocalX2 Vec :: globalX1, globalX2 character(len=10) :: fileName PetscViewer :: viewer ! Begin program call PetscInitialize(PETSC_NULL_CHARACTER, ierr) comm = PETSC_COMM_SELF tdim = 2 interpolate = PETSC_TRUE call DMPlexCreateBoxMesh(comm, tdim, interpolate, auxdm,ierr) ! Create a scalar field u, a vector field v, and a surface vector field w numFields = 2 allocate(numComp(numFields),numDof((tdim+1)*numFields)) numComp(1) = 1 numComp(2) = 1 !tdim numDof = 0 ! Let scalar u be defined on cell numDof(0*(tdim+1)+tdim+1) = 1 ! Let vector v be defined on nodes numDof(1*(tdim+1)+1) = tdim ! Setup boundary conditions numBC = 0 ! Create a PetscSection with this data layout !call DMPlexClone(dm,auxDM,ierr) call DMPlexCreateSection(auxdm, tdim, numFields, numComp, & numDof, numBC, bcField, bcPointIS, section,& ierr) !call DMPlexCreateSectionInitial(auxdm, tdim, numFields, numComp, & ! numDof, ierr) CHKERRQ(ierr) ! Name the Field variables call PetscSectionSetFieldName(section, 0, "u", ierr) CHKERRQ(ierr) call PetscSectionSetFieldName(section, 1, "v", ierr) CHKERRQ(ierr) call PetscSectionView(section, PETSC_VIEWER_STDOUT_WORLD, ierr) CHKERRQ(ierr) ! Tell the DM to use this data layout call DMSetDefaultSection(auxdm, section, ierr) CHKERRQ(ierr) ! Cleanup call PetscSectionDestroy(section, ierr) CHKERRQ(ierr) ! Test the Local to Global call DMCreateGlobalVector(auxdm,globalX1,ierr); CHKERRQ(ierr) call VecDuplicate(globalX1,globalX2, ierr); CHKERRQ(ierr) ! set values call VecSet(globalX1,1.0D0, ierr); CHKERRQ(ierr) call VecSet(globalX2,2.0D0, ierr); CHKERRQ(ierr) print*, 'Viewing globalX1 before' call VecView(globalX1,PETSC_VIEWER_STDOUT_WORLD, ierr); CHKERRQ(ierr) print*, 'Viewing globalX2 before' call VecView(globalX2,PETSC_VIEWER_STDOUT_WORLD , ierr); CHKERRQ(ierr) call DMGetLocalVector(auxdm,localX1,ierr); CHKERRQ(ierr) call DMGetLocalVector(auxdm,localX2,ierr); CHKERRQ(ierr) call VecSet(localX1,-1.0D0,ierr) call VecSet(localX2,-2.0D0,ierr) call DMLocalToGlobalBegin(auxdm, LocalX1,INSERT_VALUES, globalX1, ierr); CHKERRQ(ierr) call DMLocalToGlobalBegin(auxdm, LocalX2,INSERT_VALUES, globalX2, ierr); CHKERRQ(ierr) call DMLocalToGlobalEND(auxdm, LocalX1,INSERT_VALUES, globalX1, ierr); CHKERRQ(ierr) call DMLocalToGlobalEND(auxdm, LocalX2,INSERT_VALUES, globalX2, ierr); CHKERRQ(ierr) print*, 'Viewing globalX1 after' call VecView(globalX1,PETSC_VIEWER_STDOUT_WORLD, ierr); CHKERRQ(ierr) print*, 'Viewing globalX2 after' call VecView(globalX2,PETSC_VIEWER_STDOUT_WORLD , ierr); CHKERRQ(ierr) call DMRestoreLocalVector(auxdm,localX1,ierr); CHKERRQ(ierr) call DMRestoreLocalVector(auxdm,localX2,ierr); CHKERRQ(ierr) call PetscFinalize(ierr) end program testDMView