eval_periodic_zero_mode Subroutine

public subroutine eval_periodic_zero_mode(plan, state, z, trace, potential, field)

Arguments

Type IntentOptional Attributes Name
type(periodic_zero_mode_plan_type), intent(in) :: plan
type(periodic_zero_mode_state_type), intent(in) :: state
real(kind=dp), intent(in) :: z
integer(kind=i32), intent(in) :: trace
real(kind=dp), intent(out) :: potential
real(kind=dp), intent(out) :: field

Calls

proc~~eval_periodic_zero_mode~~CallsGraph proc~eval_periodic_zero_mode eval_periodic_zero_mode proc~locate_zero_mode_interval locate_zero_mode_interval proc~eval_periodic_zero_mode->proc~locate_zero_mode_interval proc~zero_mode_charge_primitive zero_mode_charge_primitive proc~eval_periodic_zero_mode->proc~zero_mode_charge_primitive proc~zero_mode_interval_origin zero_mode_interval_origin proc~eval_periodic_zero_mode->proc~zero_mode_interval_origin proc~zero_mode_heights_coincide zero_mode_heights_coincide proc~locate_zero_mode_interval->proc~zero_mode_heights_coincide proc~zero_mode_charge_primitive->proc~zero_mode_interval_origin proc~integrate_local_polynomial integrate_local_polynomial proc~zero_mode_charge_primitive->proc~integrate_local_polynomial

Called by

proc~~eval_periodic_zero_mode~~CalledByGraph proc~eval_periodic_zero_mode eval_periodic_zero_mode proc~beach_zero_mode_eval beach_zero_mode_eval proc~beach_zero_mode_eval->proc~eval_periodic_zero_mode proc~core_eval_point_impl core_eval_point_impl proc~core_eval_point_impl->proc~eval_periodic_zero_mode proc~core_eval_points_impl core_eval_points_impl proc~core_eval_points_impl->proc~eval_periodic_zero_mode proc~core_eval_potential_point_impl core_eval_potential_point_impl proc~core_eval_potential_point_impl->proc~eval_periodic_zero_mode proc~core_eval_potential_points_impl core_eval_potential_points_impl proc~core_eval_potential_points_impl->proc~eval_periodic_zero_mode

Source Code

  subroutine eval_periodic_zero_mode(plan, state, z, trace, potential, field)
    type(periodic_zero_mode_plan_type), intent(in) :: plan
    type(periodic_zero_mode_state_type), intent(in) :: state
    real(dp), intent(in) :: z
    integer(i32), intent(in) :: trace
    real(dp), intent(out) :: potential, field
    real(dp) :: cumulative_charge, sheet_correction, primitive
    integer(i32) :: interval, breakpoint

    if (trace < zero_mode_trace_minus .or. trace > zero_mode_trace_plus) then
      error stop 'invalid periodic zero-mode trace.'
    end if
    call locate_zero_mode_interval(plan%break_z, plan%height_tolerance, z, interval, breakpoint)
    cumulative_charge = evaluate_polynomial( &
                        state%cumulative_charge_coeff(:, interval), z - zero_mode_interval_origin(plan%break_z, interval) &
                        )
    if (breakpoint > 0_i32) then
      sheet_correction = 0.5_dp*real(1_i32 - trace, dp)*state%sheet_charge(breakpoint)
      cumulative_charge = cumulative_charge - sheet_correction
    end if
    field = state%e_bottom + cumulative_charge/(eps0*plan%area_xy)
    primitive = zero_mode_charge_primitive(plan, state, z, interval)
    potential = state%phi_gauge - state%e_bottom*(z - state%z_gauge) - &
                (primitive - state%gauge_primitive)/(eps0*plan%area_xy)
  end subroutine eval_periodic_zero_mode