Introduction
User subroutine for the definition of a user module. The following example illustrates the creation of user arrays called rwork
and iwork
.
Arrays declaration
The first step is to declare these two arrays at the very beginning of the module. The first one iwork
is an allocatable array of one dimension whereas rwork
is a pointer to a bidimensionnal array.
integer, dimension(:), allocatable :: iwork
double precision, dimension(:,:), pointer :: rwork => null()
Arrays allocation
The init_user_module subroutine allocates rwork
and iwork
if they are not already allocated or associated (for rwork
).
subroutine init_user_module(ncel, ncelet)
integer, intent(in) :: ncel, ncelet
integer :: err = 0
if (.not.allocated(iwork)) then
allocate(iwork(ncelet), stat=err)
endif
if (err .eq. 0 .and. .not.associated(rwork)) then
allocate(rwork(3, ncelet), stat=err)
endif
if (err /= 0) then
write (*, *) "Error allocating array."
call csexit(err)
endif
return
end subroutine init_user_module
Access to arrays in C
It is possible to access the rwork
array in the C part of the code. This can be done by using the get_user_module_rwork subroutine.
function get_user_module_rwork() result(r) &
bind(c, name='get_user_module_rwork')
use, intrinsic :: iso_c_binding
implicit none
type(c_ptr) :: r
if (associated(rwork)) then
r = c_loc(rwork(1,1))
else
r = c_null_ptr
endif
end function get_user_module_rwork
Arrays freeing
Eventually, the finalize_user_module subroutine is used to free iwork
and rwork
.
subroutine finalize_user_module
if (allocated(iwork)) then
deallocate(iwork)
endif
if (associated(rwork)) then
deallocate(rwork)
endif
end subroutine finalize_user_module