subroutine read_vtk_structured_points(fname, bc)
character(len=*), intent(in) :: fname
type(read_data_values), intent(out) :: bc
double precision, allocatable :: tmp_data(:, :, :, :)
integer, parameter :: max_variables = 10
character(len=40) :: tmp_names(max_variables)
character(len=256) :: line
character(len=40) :: word, typename
integer, parameter :: my_unit = 123
integer :: n, n_points_total
integer :: n_components
open(my_unit, file=trim(fname), status="old", action="read")
! Header, e.g. # vtk DataFile Version 2.0
read(my_unit, "(A)") line
! Dataset name
read(my_unit, "(A)") line
! ASCII / BINARY
read(my_unit, "(A)") line
if (line /= "ASCII") then
print *, "line: ", trim(line)
error stop "read_vtk: not an ASCII file"
end if
! DATASET STRUCTURED_POINTS
read(my_unit, "(A)") line
if (line /= "DATASET STRUCTURED_POINTS") then
print *, "line: ", trim(line)
error stop "read_vtk must have: DATASET STRUCTURED_POINTS"
end if
! DIMENSIONS NX NY NZ
read(my_unit, "(A)") line
read(line, *) word, bc%n_points
if (word /= "DIMENSIONS") then
print *, "line: ", trim(line)
error stop "read_vtk expects: DIMENSIONS"
end if
! SPACING DX DY DZ
read(my_unit, *) word, bc%dx
if (word /= "SPACING") then
print *, "line: ", trim(line)
error stop "read_vtk expects: SPACING"
end if
! ORIGIN 0 0 0
read(my_unit, *) word, bc%origin
if (word /= "ORIGIN") then
print *, "line: ", trim(line)
error stop "read_vtk expects: ORIGIN"
end if
! POINT_DATA NPOINTS
read(my_unit, *) word, n_points_total
if (word /= "POINT_DATA") then
print *, "line: ", trim(line)
error stop "read_vtk expects: POINT_DATA n_points"
end if
if (n_points_total /= product(bc%n_points)) error stop "read_vtk: n_points not equal to NX*NY*NZ"
allocate(tmp_data(bc%n_points(1), bc%n_points(2), bc%n_points(3),&
max_variables))
! Read all scalar variables
do n = 1, max_variables
! SCALARS name type ncomponents
read(my_unit, *, end=900) word, tmp_names(n), typename, n_components
if (word /= "SCALARS") then
print *, "line: ", trim(line)
error stop "read_vtk expects: SCALARS name type ncomponents"
end if
if (n_components /= 1) error stop "read_vtk: ncomponents should be 1"
! LOOKUP_TABLE default
read(my_unit, *) word, typename
if (word /= "LOOKUP_TABLE") then
print *, "line: ", trim(line)
error stop "read_vtk expects: LOOKUP_TABLE name"
end if
! Read list of data values
read(my_unit, *) tmp_data(:, :, :, n)
end do
! Done reading variables
900 continue
close(my_unit)
if (n == max_variables + 1) error stop "read_vtk: increase max_variables"
! Loop index is one higher than number of variables
bc%n_variables = n-1
bc%values = tmp_data(:, :, :, 1:n-1)
bc%names = tmp_names(1:n-1)
end subroutine read_vtk_structured_points