Skip to content

4. Querying the code ​

Before changing a procedure you want to know who calls it; before changing a variable, who writes it. grep finds the text; fobis query answers from the analysis of the code: calls resolved through generics, renames and contained procedures, dummy arguments' intents, directive regions.

console
$ fobis query callers simpson
callers simpson: 6 result(s)
src/integrate.F90:14: integrate [function, unique] -> quad_rules::simpson: print '(I6, 2ES18.4)', n, abs(trapezoid(sine, 0._R8P, pi, n) - 2._R8P), abs(simpson(sine, 0._R8P,...
src/integrate.F90:17: integrate [function, unique] -> quad_rules::simpson: print '(A)', 'Simpson, 64 intervals: '//trim(str(simpson(sine, 0._R8P, pi, 64), no_sign=.true., c...
src/integrate_mpi.F90:20: integrate_mpi [function, unique] -> quad_rules::simpson: piece = simpson(sine, a, b, n)
src/sweep.F90:18: sweep [function, unique] -> quad_rules::simpson: error(2, k) = abs(simpson(sine, 0._R8P, pi, n) - 2._R8P)
test/test_order.F90:12: test_order [function, unique] -> quad_rules::simpson: p_simpson = log(abs(simpson(sine, 0._R8P, pi, 16) - 2._R8P) / abs(simpson(sine, 0._R8P, pi, 32) -...
test/test_order.F90:12: test_order [function, unique] -> quad_rules::simpson: p_simpson = log(abs(simpson(sine, 0._R8P, pi, 16) - 2._R8P) / abs(simpson(sine, 0._R8P, pi, 32) -...
(10 file(s) analysed)
console
$ fobis query defines integrand
defines integrand: 1 result(s)
src/quad_rules.F90:10: abstract interface quad_rules::integrand
(10 file(s) analysed)
console
$ fobis query interface trapezoid
interface trapezoid: 1 result(s)
src/quad_rules.F90:38: quad_rules::trapezoid
    pure function trapezoid(f, a, b, n)
    procedure(integrand) :: f
    real(r8p), intent(in) :: a
    real(r8p), intent(in) :: b
    integer, intent(in) :: n
    result: real(r8p) :: s
(10 file(s) analysed)
console
$ fobis query writers error
writers error: 2 result(s)
src/sweep.F90:17: sweep [local; assignment]: error(1, k) = abs(trapezoid(sine, 0._R8P, pi, n) - 2._R8P)
src/sweep.F90:18: sweep [local; assignment]: error(2, k) = abs(simpson(sine, 0._R8P, pi, n) - 2._R8P)
note: pointer aliasing and accesses under another name (argument association) are not followed
(10 file(s) analysed)

Which directive regions hold a line:

console
$ fobis query region src/sweep.F90:17
region src/sweep.F90:17: 1 result(s)
src/sweep.F90:14-19: sweep: !$omp parallel do private(n)
(10 file(s) analysed)

Every MPI call, by kind:

console
$ fobis query mpi
mpi: 5 result(s)
src/integrate_mpi.F90:15: mpi_init [setup] in integrate_mpi
src/integrate_mpi.F90:16: mpi_comm_rank [setup] in integrate_mpi
src/integrate_mpi.F90:17: mpi_comm_size [setup] in integrate_mpi
src/integrate_mpi.F90:21: mpi_reduce [collective] in integrate_mpi
src/integrate_mpi.F90:23: mpi_finalize [setup] in integrate_mpi
note: calls by kind: collective 1, setup 4
(10 file(s) analysed)

The other questions: callees NAME, uses MODULE, readers VAR, device VAR (where a variable lives on the GPU). --json gives the same answers to scripts and agents.

What you learned

fobis query KIND ARGUMENT. Reference: query.

Next: 5. Verified modernisation.