subroutine write_genformat(mol, unit)
class(structure_type), intent(in) :: mol
integer, intent(in) :: unit
integer :: iat, izp
real(wp), parameter :: zero3(3) = 0.0_wp
real(wp), allocatable :: inv_lat(:, :)
real(wp), allocatable :: abc(:, :)
logical :: helical
helical = .false.
write(unit, "(i0, 1x)", advance="no") mol%nat
if (.not.any(mol%periodic)) then
write(unit, '("C")') ! cluster
else
helical = count(mol%periodic) == 1 .and. mol%periodic(3) .and. size(mol%lattice, 2) == 1
if (helical) then
write(unit, '("H")') ! helical
else
if (mol%info%cartesian) then
write(unit, '("S")') ! supercell
else
write(unit, '("F")') ! fractional
end if
end if
end if
do izp = 1, mol%nid
write(unit, "(1x, a)", advance="no") trim(mol%sym(izp))
end do
write(unit, "(a)")
if (.not.any(mol%periodic) .or. mol%info%cartesian) then
! now write the cartesian coordinates
do iat = 1, mol%nat
write(unit, "(2i5, 3es24.14)") iat, mol%id(iat), mol%xyz(:, iat)*autoaa
end do
else
inv_lat = matinv_3x3(mol%lattice)
abc = matmul(inv_lat, mol%xyz)
! now write the fractional coordinates
do iat = 1, mol%nat
write(unit, "(2i5, 3es24.15)") iat, mol%id(iat), abc(:, iat)
end do
end if
if (any(mol%periodic)) then
write(unit, "(3f20.14)") zero3
! write the lattice parameters
if (helical) then
write(unit, "(2f20.14,1x,i0)") &
& mol%lattice(1, 1)*autoaa, mol%lattice(2, 1)*180.0_wp/pi, nint(mol%lattice(3, 1))
else
write(unit, "(3f20.14)") mol%lattice(:, :)*autoaa
end if
end if
end subroutine write_genformat