plot_write_xyz Subroutine

private subroutine plot_write_xyz(translate_home_cell, num_wann, wannier_centres, real_lattice, atom_data, print_output, error, comm, stdout, seedname)

Uses

  • proc~~plot_write_xyz~~UsesGraph proc~plot_write_xyz plot_write_xyz module~w90_constants w90_constants proc~plot_write_xyz->module~w90_constants module~w90_error w90_error proc~plot_write_xyz->module~w90_error module~w90_io w90_io proc~plot_write_xyz->module~w90_io module~w90_types w90_types proc~plot_write_xyz->module~w90_types module~w90_utility w90_utility proc~plot_write_xyz->module~w90_utility module~w90_comms w90_comms module~w90_error->module~w90_comms module~w90_error_base w90_error_base module~w90_error->module~w90_error_base module~w90_io->module~w90_constants module~w90_types->module~w90_constants module~w90_utility->module~w90_constants module~w90_utility->module~w90_comms module~w90_comms->module~w90_constants module~w90_comms->module~w90_error_base

Arguments

Type IntentOptional Attributes Name
logical, intent(in) :: translate_home_cell
integer, intent(in) :: num_wann
real(kind=dp), intent(in) :: wannier_centres(:,:)
real(kind=dp), intent(in) :: real_lattice(3,3)
type(atom_data_type), intent(in) :: atom_data
type(print_output_type), intent(in) :: print_output
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm
integer, intent(in) :: stdout
character(len=50), intent(in) :: seedname

Calls

proc~~plot_write_xyz~~CallsGraph proc~plot_write_xyz plot_write_xyz proc~io_date io_date proc~plot_write_xyz->proc~io_date proc~set_error_file set_error_file proc~plot_write_xyz->proc~set_error_file proc~utility_translate_home utility_translate_home proc~plot_write_xyz->proc~utility_translate_home proc~comms_sync_error comms_sync_error proc~set_error_file->proc~comms_sync_error proc~set_base_error set_base_error proc~set_error_file->proc~set_base_error proc~utility_cart_to_frac utility_cart_to_frac proc~utility_translate_home->proc~utility_cart_to_frac proc~utility_frac_to_cart utility_frac_to_cart proc~utility_translate_home->proc~utility_frac_to_cart proc~utility_recip_lattice_base utility_recip_lattice_base proc~utility_translate_home->proc~utility_recip_lattice_base proc~utility_inv3 utility_inv3 proc~utility_recip_lattice_base->proc~utility_inv3

Called by

proc~~plot_write_xyz~~CalledByGraph proc~plot_write_xyz plot_write_xyz proc~plot_main plot_main proc~plot_main->proc~plot_write_xyz proc~w90_plot w90_plot proc~w90_plot->proc~plot_main program~wannier wannier program~wannier->proc~w90_plot

Source Code

  subroutine plot_write_xyz(translate_home_cell, num_wann, wannier_centres, real_lattice, &
                            atom_data, print_output, error, comm, stdout, seedname)
    !================================================!
    !
    ! Write xyz file with Wannier centres
    !
    !================================================!

    use w90_io, only: io_date
    use w90_constants, only: dp
    use w90_utility, only: utility_translate_home
    use w90_error, only: w90_error_type, set_error_file
    use w90_types, only: atom_data_type, print_output_type

    implicit none

    type(atom_data_type), intent(in) :: atom_data
    type(print_output_type), intent(in) :: print_output
    type(w90_error_type), allocatable, intent(out) :: error
    type(w90_comm_type), intent(in) :: comm

    logical, intent(in) :: translate_home_cell
    integer, intent(in) :: num_wann
    real(kind=dp), intent(in) :: wannier_centres(:, :)
    real(kind=dp), intent(in) :: real_lattice(3, 3)
    integer, intent(in) :: stdout
    character(len=50), intent(in)  :: seedname

    integer :: iw, ind, xyz_unit, nsp, nat, ierr
    character(len=9) :: cdate, ctime
    real(kind=dp) :: wc(3, num_wann)

    wc = wannier_centres

    if (translate_home_cell) then
      do iw = 1, num_wann
        call utility_translate_home(wc(:, iw), real_lattice)
      end do
    end if

    if (print_output%iprint > 2) then
      write (stdout, '(1x,a)') 'Final centres (translated to home cell for writing xyz file)'
      do iw = 1, num_wann
        write (stdout, '(2x, "WF centre", i5, 2x, "(", f10.6, ",", f10.6, ",", f10.6, " )")') &
          iw, (wc(ind, iw)*print_output%lenconfac, ind=1, 3)
      end do
      write (stdout, '(1x,a78)') repeat('-', 78)
      write (stdout, *)
    end if

    open (newunit=xyz_unit, file=trim(seedname)//'_centres.xyz', form='formatted', iostat=ierr)
    if (ierr /= 0) then
      call set_error_file(error, 'Error opening file '//trim(seedname)//'_centres.xyz in wann_write_xyz', comm)
      return
    end if
    write (xyz_unit, '(i6)') num_wann + atom_data%num_atoms
    call io_date(cdate, ctime)
    write (xyz_unit, *) 'Wannier centres, written by Wannier90 on'//cdate//' at '//ctime
    do iw = 1, num_wann
      write (xyz_unit, '("X",6x,3(f14.8,3x))') (wc(ind, iw), ind=1, 3)
    end do
    do nsp = 1, atom_data%num_species
      do nat = 1, atom_data%species_num(nsp)
        write (xyz_unit, '(a2,5x,3(f14.8,3x))') atom_data%label(nsp), atom_data%pos_cart(:, nat, nsp)
      end do
    end do
    close (xyz_unit)

    write (stdout, '(/a)') ' Wannier centres written to file '//trim(seedname)//'_centres.xyz'

    return

  end subroutine plot_write_xyz