anchor.diff:  
     subroutine vd_bin(this)
       ! Update virtual detector counts
  +    !
  +    ! This method is not publicly exposed, and is only called by `vd_update`
  +    !
  +    ! this :: vd_obj instance
       class(vd_obj), intent(inout) :: this
   
       integer(ip) :: i_x_vd
  
positive.code:     this%xr_max = nx - nxr_ext
      this%xr_min = this%xr_max - nxr_vd + 1
  
      ! Allocate internal work arrays, including the points on the sides of the
      ! detectors (because we need to compute derivatives).
      ! These are 0-based so that the virtual detector points start at index 1,
      ! which aligns with Fortran's default array indexing.
      allocate(this%phi_arr_l(0 : nxl_vd + 1), this%phi_arr_r(0 : nxr_vd + 1))
      allocate(this%p_arr_l(0 : nxl_vd + 1), this%p_arr_r(0 : nxr_vd + 1))
      allocate(this%p_var_arr_l(0 : nxl_vd + 1), &
           this%p_var_arr_r(0 : nxr_vd + 1))
      allocate(this%mag_arr_l(0 : nxl_vd + 1), this%mag_arr_r(0 : nxr_vd + 1))
      allocate(this%j_arr_l(0 : nxl_vd + 1), this%j_arr_r(0 : nxr_vd + 1))
  
    end subroutine vd_init
  
    subroutine vd_cleanup(this)
      ! Deallocate all object arrays
      class(vd_obj), intent(inout) :: this
  
      deallocate(this%phi_arr_l, this%phi_arr_r)
  
negative.code: 
    public :: vd_obj
    type vd_obj
       ! One-dimensional virtual detector object
  
       ! Virtual detector result; array of momentum "counts"
       real(fp), allocatable :: vd_p_arr(:)
  
       ! Semi-classical method flag
       logical :: semi_classical
  
       ! Spatial grid parameters
       real(fp) :: dx
       integer(ip) :: nxl, nxr
       integer(ip) :: xl_min, xl_max
       integer(ip) :: xr_min, xr_max
  
       ! Momentum grid parameters
       integer(ip) :: np
       real(fp) :: p_min, p_max
       real(fp) :: dp
       ! Momentum grid
       real(fp), allocatable :: p_range(:)
  
       ! Temporal grid / integration parameters
       real(fp) :: dt
  
       ! Units and particle parameters
       real(fp) :: hbar
       real(fp) :: m
  
       ! Internal work arrays
       real(fp), allocatable :: phi_arr_l(:), phi_arr_r(:)
       real(fp), allocatable :: p_arr_l(:), p_arr_r(:)
       real(fp), allocatable :: p_var_arr_l(:), p_var_arr_r(:)
  