Is it OK to have subroutines contained in a function? I have never seen this kind of style.
There are several reasons why that kind of subprogram is troublesome and inelegant, but it is possible. Here is a contrived example.
program pfib
implicit none
integer fib
Print *,fib (25)
end program
recursive integer function fib (n) ! "recursive" attribute not employed, in reality
integer, intent (in)::n
if (n == 0) then
fib = 0
elseif (n == 1) then
fib = 1
else
call fibsub (n, fib)
endif
contains
subroutine fibsub (n, ifib)
integer, intent (in) :: n
integer, intent (out) :: ifib
integer, save :: sfib(0:30)
logical :: begin = .true.
integer i
if(begin)then
sfib(0:1) = [0,1]
do i = 2, 30
sfib(i) = sfib(i-2) + sfib(i-1)
end do
begin = .false.
endif
ifib = sfib(n)
return
end subroutine fibsub
end function fib
Try to modify this program to make the function pure, and you may note several of the demerits that I alluded to.
Correct me if I am wrong but the only reason the subroutine fibsub (and as a consequence, also the function fib) is not pure is the presence of local variables with save attribute (sfib (explicit) and begin (implicit, as initialized)). And this does not have anything with it being a subroutine. If I understand the OP, the question was whether it is OK for a function to contain a subroutine.
Here it is affirmed that you can nest subroutines in order to increase the chances that this part of the code gets inlined.
I use this programming style from time to time, when a function is only called in a particular point of my code (for trivial tasks such as counting the number of lines in an input file or the number of lines in the header of a data file), and I have never encountered any problem at all with that. Maybe, problems arise with more “esoteric” things to be done.
If this is not an advised style, I will try to avoid it the future.