trrio

November 18, 2022 ยท View on GitHub

Gromacs portable binary trajectory format. File contains all the coordinates, velocities, forces and energies.

NOTE: xrdfile read is same as write. He he he.


trnheader

type trnheader
  integer :: ir_size, e_size, vir_size, pres_size, top_size, sym_size, nre
  integer :: box_size, x_size, v_size, v_size 
  logical :: is_double
  integer :: natoms, step
  real :: time, lambda
end type trnheader

trr_open

Open file for reading and check for errors. Frame offset table is constructed (byte position where frame starts). Move to selected frame with xdr_seek. If the function fails stat is a positive number, otherwise it is set to zero. If stat is not present end error occurs error stop is raised.

call trr_open (file, xd, nframes, offset, stat, errmsg)

Parameters

character(*), intent(IN) :: file

Input file name.

type(XDRFILE), pointer, intent(INOUT) :: xd

XDR file pointer.

integer, intent(OUT) :: nframes

Number of frames in file.

integer(INT64), allocatable, dimension(:), intent(INOUT) :: offset

Frame offset table. Array size same as nframes.

integer, intent(OUT), optional :: stat

Error status code. Returns zero if no error.

character(*), intent(OUT), optional :: errmsg

Error status message. Empty if no error.


trr_close

Close opened file.

call trr_close (xd, stat, errmsg)

Parameters

type(XDRFILE), pointer, intent(INOUT) :: xd

XDR file pointer.

integer, intent(OUT), optional :: stat

Error status code. Returns zero if no error.

character(*), intent(OUT), optional :: errmsg

Error status message. Empty if no error.


trr_do_header

Read/write file header information in TRR format.

call trr_do_header (xd, bRead, sh, stat, errmsg)

type(XDRFILE), pointer, intent(IN) :: xd

XDR file pointer.

logical, intent(IN) :: bRead

Read header information? Else write header.

type(TRNHEADER), intent(INOUT) :: sh

TRR file header information.

character(*), intent(OUT), optional :: errmsg

Error status message. Empty if no error.


trr_do_data

Read/write data in TRR format. Wrapper for trr_do_real and trr_do_double.

call trr_do_data (xd, sh, coor, box, stat, errmsg)

Parameters

type(XDRFILE), pointer, intent(IN) :: xd

XDR file pointer.

type(TRNHEADER), intent(INOUT) :: sh

TRR file header information.

real, dimension(DIM,natoms), intent(OUT) :: coor

Atom cartesian coordinates in nm.

real, dimension(DIM,DIM), intent(OUT) :: box

Simulation box dimensions in nm.

integer, intent(OUT), optional :: stat

Error status code. Returns zero if no error.

character(*), intent(OUT), optional :: errmsg

Error status message. Empty if no error.

Notes

Loss of data if used on double precision trajectory. Use trr_do_double. To get velocity, and force information use trr_do_real and trr_do_double.


trr_do_skip

Read through file (skip) in TRR format but do not store any data.

call trr_do_skip (xd, sh, stat, errmsg)

Parameters

type(XDRFILE), pointer, intent(IN) :: xd

XDR file pointer.

type(TRNHEADER), intent(INOUT) :: sh

TRR file header information.

integer, intent(OUT), optional :: stat

Error status code. Returns zero if no error.

character(*), intent(OUT), optional :: errmsg

Error status message. Empty if no error.


Example

program main
  use xdrfor
  use atomlib_trrio
  use iso_fortran_env, only: INT64
  implicit none
  integer, paramete
  type(xdrfile), pointer :: xd => null()
  integer(INT64), allocatable :: offset(:)
  type(trnheader) :: sh
  real, allocatable :: coor(:,:)
  real :: box(DIM,DIM)
  integer :: nframes, status

  ! Read
  call trr_open ("traj.trr", xd, nframes, offset, STAT=status, ERRMSG=message)
  if (status /= 0) error stop message

  call trr_do_header (xd, .True., sh, STAT=status, ERRMSG=message)
  if (status /= 0) error stop message

  allocate (coor(DIM,sh%natoms), STAT=status, ERRMSG=message)
  if (status /= 0) error stop message

  call trr_do_data (xd, sh, coor, box, STAT=status, ERRMSG=message)
  if (status /= 0) error stop message

  call trr_close (unit, STAT=status, ERRMSG=message)
  if (status /= 0) error stop message  

  ! Write
  call xdr_open (xd, "out.trr", .False., STAT=status, ERRMSG=message)
  if (status /= 0) error stop message

  call trr_do_header (xd, .False., sh, STAT=status, ERRMSG=message)
  if (status /= 0) error stop message

  call trr_do_data (xd, sh, coor, box, STAT=status, ERRMSG=message)
  if (status /= 0) error stop messa

  call xdr_close (xd, STAT=status, ERRMSG=message)
  if (status /= 0) error stop messa

end program main