program vtk_fortran_write_pvts
!< VTK_Fortran test for Parallel (partioned) Structured Grid.
use penf
use vtk_fortran, only : vtk_file, pvtk_file
implicit none
!< The mesh is a simple prism partitioned into two pieces along x direction at ordinate i=nx2_p(1).
!<```
!< y ^
!< | ny2 +-----------------+--------------+
!< | | | |
!< | | | |
!< | | | |
!< | | | |
!< o--------> ny1 +-----------------+--------------+
!< x nx1 i=nx2_p(1) nx2
!<```
integer(I4P), parameter :: nx1=0_I4P, nx2=9_I4P, ny1=0_I4P, ny2=5_I4P, nz1=0_I4P, nz2=5_I4P !< Whole extents.
integer(I4P), parameter :: nx1_p(1:2)=[nx1, 4_I4P] !< Lower x extents.
integer(I4P), parameter :: nx2_p(1:2)=[4_I4P, nx2] !< Upper x extents.
integer(I4P), parameter :: nn = (nx2 -nx1 +1)*(ny2-ny1+1)*(nz2-nz1+1) !< Whole number of points.
integer(I4P), parameter :: nn_p(1:2)=[(nx2_p(1)-nx1 +1)*(ny2-ny1+1)*(nz2-nz1+1),&
(nx2_p(2)-nx2_p(1)+1)*(ny2-ny1+1)*(nz2-nz1+1)] !< Partinoned number of points.
real(R8P), dimension(nx1:nx2,ny1:ny2,nz1:nz2) :: x, y, z !< Mesh coordinates.
integer(I4P), dimension(nx1:nx2,ny1:ny2,nz1:nz2) :: v !< Noces-centered value.
integer(I4P) :: i !< Counter.
integer(I4P) :: j !< Counter.
integer(I4P) :: k !< Counter.
! inizialize data
do k=nz1, nz2
do j=ny1, ny2
do i=nx1, nx2
x(i, j, k) = i*1._R8P
y(i, j, k) = j*1._R8P
z(i, j, k) = k*1._R8P
v(i, j, k) = i*j*k
enddo
enddo
enddo
call write_vts(part=1, filename='vtkfortran_write_pvts_01.vts')
call write_vts(part=2, filename='vtkfortran_write_pvts_02.vts')
call write_pvts(filename='vtkfortran_write_pvts.pvts', parts_filename=['vtkfortran_write_pvts_01.vts', &
'vtkfortran_write_pvts_02.vts'])
contains
subroutine write_vts(part, filename)
!< Write VTS parts.
integer(I4P), intent(in) :: part !< Part to be saved [1,2].
character(*), intent(in) :: filename !< Output file name.
type(vtk_file) :: a_vtk_file !< A VTK file.
integer(I4P) :: error !< Status error.
error = a_vtk_file%initialize(format='binary', filename=filename, mesh_topology='StructuredGrid', &
nx1=nx1_p(part), nx2=nx2_p(part), ny1=ny1, ny2=ny2, nz1=nz1, nz2=nz2)
error = a_vtk_file%xml_writer%write_piece(nx1=nx1_p(part), nx2=nx2_p(part), ny1=ny1, ny2=ny2, nz1=nz1, nz2=nz2)
error = a_vtk_file%xml_writer%write_geo(n=nn_p(part), x=x(nx1_p(part):nx2_p(part),:,:), &
y=y(nx1_p(part):nx2_p(part),:,:), &
z=z(nx1_p(part):nx2_p(part),:,:))
error = a_vtk_file%xml_writer%write_dataarray(location='node', action='open')
error = a_vtk_file%xml_writer%write_dataarray(data_name='int32_scalar', x=v(nx1_p(part):nx2_p(part),:,:), &
one_component=.true.)
error = a_vtk_file%xml_writer%write_dataarray(location='node', action='close')
error = a_vtk_file%xml_writer%write_piece()
error = a_vtk_file%finalize()
endsubroutine write_vts
subroutine write_pvts(filename, parts_filename)
!< Write PVTS.
character(*), intent(in) :: filename !< Output file name.
character(*), intent(in) :: parts_filename(:) !< Parts file name.
type(pvtk_file) :: a_pvtk_file !< A parallel (partioned) VTK file.
integer(I4P) :: error !< Status error.
error = a_pvtk_file%initialize(filename=filename, mesh_topology='PStructuredGrid', mesh_kind="Float64", &
nx1=nx1, nx2=nx2, ny1=ny1, ny2=ny2, nz1=nz1, nz2=nz2)
error = a_pvtk_file%xml_writer%write_dataarray(location='node', action='open')
error = a_pvtk_file%xml_writer%write_parallel_dataarray(data_name='int32_scalar', &
data_type='Int32', &
number_of_components=1)
error = a_pvtk_file%xml_writer%write_dataarray(location='node', action='close')
error = a_pvtk_file%xml_writer%write_parallel_geo(source=parts_filename(1), &
nx1=nx1, nx2=nx2_p(1), ny1=ny1, ny2=ny2, nz1=nz1, nz2=nz2)
error = a_pvtk_file%xml_writer%write_parallel_geo(source=parts_filename(2), &
nx1=nx2_p(1), nx2=nx2_p(2), ny1=ny1, ny2=ny2, nz1=nz1, nz2=nz2)
error = a_pvtk_file%finalize()
endsubroutine write_pvts
endprogram vtk_fortran_write_pvts