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
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.