integer(c_int) function beach_zero_mode_eval(handle, ntarget, z_ptr, trace, phi_ptr, ez_ptr) &
bind(C, name='beach_zero_mode_eval') result(status)
type(c_ptr), value :: handle
integer(c_int), value :: ntarget
type(c_ptr), value :: z_ptr
integer(c_int), value :: trace
type(c_ptr), value :: phi_ptr, ez_ptr
type(periodic_zero_mode_handle), pointer :: zero
real(c_double), pointer :: z(:), phi(:), ez(:)
real(dp) :: phi_value, field_value
integer(i32) :: i
status = require_charged_zero_mode(handle, zero)
if (status /= beach_zero_mode_ok) return
if (.not. count_is_addressable(ntarget, 3_i64, 0_i64) .or. &
.not. c_associated(z_ptr) .or. .not. c_associated(phi_ptr) .or. .not. c_associated(ez_ptr) .or. &
.not. trace_is_valid(trace)) then
status = beach_zero_mode_invalid_argument
return
end if
if (ntarget == 0_c_int) return
call c_f_pointer(z_ptr, z, [int(ntarget)])
call c_f_pointer(phi_ptr, phi, [int(ntarget)])
call c_f_pointer(ez_ptr, ez, [int(ntarget)])
if (any(.not. ieee_is_finite(z))) then
status = beach_zero_mode_invalid_argument
return
end if
do i = 1_i32, int(ntarget, i32)
call eval_periodic_zero_mode( &
zero%plan, zero%state, real(z(i), dp), int(trace, i32), phi_value, field_value &
)
phi(i) = real(phi_value, c_double)
ez(i) = real(field_value, c_double)
end do
status = beach_zero_mode_ok
end function beach_zero_mode_eval