Not sure if this is something you’ve considered and dismissed, but a programming approach you can consider is to “parametrize” your code with named constants toward the lbound(s) and sizes of your array(s):
program test
implicit none
integer, parameter :: lbd_a = -3
integer, parameter :: size_a = 10
integer :: a( lbd_a : size_a+lbd_a-1 )
print *, lbound(a, 1), ubound(a, 1) ! -3, 6
print *, bnds(a) ! -3, 6 now; default 1, 10
contains
function bnds(x)
integer, intent(in) :: x(lbd_a:)
integer :: bnds(2)
bnds(1) = lbound(x, 1)
bnds(2) = ubound(x, 1)
end function bnds
end program test