utility_translate_home Subroutine

public subroutine utility_translate_home(vec, real_lat)

Translate a vector to the home unit cell

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(inout) :: vec(3)
real(kind=dp), intent(in) :: real_lat(3,3)

Calls

proc~~utility_translate_home~~CallsGraph proc~utility_translate_home utility_translate_home 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~~utility_translate_home~~CalledByGraph proc~utility_translate_home utility_translate_home proc~plot_write_vdw_data plot_write_vdw_data proc~plot_write_vdw_data->proc~utility_translate_home proc~plot_write_xyz plot_write_xyz proc~plot_write_xyz->proc~utility_translate_home proc~plot_main plot_main proc~plot_main->proc~plot_write_vdw_data 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 utility_translate_home(vec, real_lat)
    !================================================!
    !
    !! Translate a vector to the home unit cell
    !
    !================================================!

    implicit none

    real(kind=dp), intent(inout) :: vec(3)
    real(kind=dp), intent(in)    :: real_lat(3, 3)

    ! <<<local variables>>>
    real(kind=dp) :: recip_lat(3, 3), volume
    integer       :: ind
    real(kind=dp) :: r_home(3), r_frac(3)
    real(kind=dp) :: shift

    r_home = 0.0_dp; r_frac = 0.0_dp

    ! Cartesian --> fractional
    call utility_recip_lattice_base(real_lat, recip_lat, volume)
    call utility_cart_to_frac(vec, r_frac, recip_lat)
    ! Rationalise to interval [0,1]
    do ind = 1, 3
      if (r_frac(ind) .lt. 0.0_dp) then
        shift = real(ceiling(abs(r_frac(ind))), kind=dp)
        r_frac(ind) = r_frac(ind) + shift
      end if
      if (r_frac(ind) .gt. 1.0_dp) then
        shift = -real(int(r_frac(ind)), kind=dp)
        r_frac(ind) = r_frac(ind) + shift
      end if
    end do
    ! Fractional --> Cartesian
    call utility_frac_to_cart(r_frac, r_home, real_lat)

    vec = r_home

    return
  end subroutine utility_translate_home