Intel® Fortran Compiler 16.0 User and Reference Guide
Run-Time Function: Lets you specify your own routine to dynamically allocate common blocks. This function is especially useful when you are sharing libraries.
result = FOR__SET_FTN_ALLOC(alloc_routine)
alloc_routine |
(Input) Character. Is the name of a user-defined allocation routine. The routine takes the same arguments as the routine prototype _FTN_ALLOC, which is defined in module IFCORE. For more information on _FTN_ALLOC and its arguments, see Allocating Common Blocks. |
The result has the same type as the type of the argument. The return value is a pointer to the previous allocation routine you specified for allocation of COMMONs, or to a null pointer if you did not specify a previous allocation routine.
The caller of FOR__SET_FTN_ALLOC must include a USE IFCOMMONALLOC statement. The allocation routine should include ISO_C_BINDING so it can correctly declare the arguments.
This function takes precedence over _FTN_ALLOC.
The following shows an example of a user-defined routine that can be used with FOR__SET_FTN_ALLOC.
Note that you must compile the program using option [Q]dyncom to name the commons you want to be dynamically allocated.
! User's allocation routine ! subroutine my_Fortran_alloc_routine (mem, size, name) use, intrinsic :: ISO_C_BINDING implicit none type(C_PTR), intent(OUT) :: mem integer(C_INT), intent(INOUT) :: size character, dimension(*), intent(IN) :: name ! Users would put their allocation code here. This example text ! does not contain code to allocate memory. end subroutine my_Fortran_alloc_routine ! This routine uses module IFCOMMONALLOC to swap allocation ! routines for dynamic COMMONs. ! subroutine swap_alloc_routines( for_old ) use ifcommonalloc use, intrinsic :: ISO_C_BINDING implicit none logical for_old ! The routine to use, defined above. ! procedure(alloc_rtn) :: my_Fortran_alloc_routine ! Where to save the old one. ! type(C_FUNPTR) :: saved_alloc_routine ! Do the swap ! print *, "my_Fortran_alloc_routine" if (for_old) then saved_alloc_routine = set_ftn_alloc( C_FUNLOC(my_Fortran_alloc_routine) ) else saved_alloc_routine = set_ftn_alloc( saved_alloc_routine ) end if end subroutine swap_alloc_routines ! Routines with dynamic commons would go here ! The main program doesn't need to know about module IFCOMMONALLOC. ! program main implicit none ! Dynamic commons in routines first called in this region will use the ! default allocation method. swap_alloc_routines( .true. ) ! Dynamic commons in routines first called in this region will use ! my_Fortran_alloc_routine. swap_alloc_routines( .false. ) ! Dynamic commons in routines first called in this region will use the ! default allocation method. end program main