I want to calculate a multivariable function func(x) and its gradient dfunc(x),
where x is a vector.  The gradient dfunc(x)  is calculated with finite
difference method. I defined two modules and a calling program as follows:
1. Mod_func: module to calculate the function values at x
2. Mod_dfunc: module to calculate the gradient at x.  Since numerical finite
difference formula are used to obtain dfunc(x), dfunc(x) needs to call func(x).
3. drive: calling program

If dfunc is not included, and correspondingly not called from the calling
program(drive.f90), it works fine.

When dfunc is included, this causes compilation error:
$ gfortran -c func.f90 dfunc.f90 drive.f90
drive.f90:8.14:

  real ::dfunc(ndim)
              1
Error: Cannot change attributes of USE-associated symbol dfunc at (1)

The codes: 

Module mod_func
! Purpose: To calculate multivariable function func(x), x is a vector
Contains
  FUNCTION func(x)
    IMPLICIT NONE
    REAL, DIMENSION(:), INTENT(IN) :: x
    REAL :: func
    integer::i,n
    n=size(x)
    func=0
    do i=1,n  ! a simple multivariable function: func(x) = x1**2 + x2**2 + ... 
       func= func+ x(i)**2
    end do
  END FUNCTION func
End module mod_func

Module mod_dfunc
! Purpose: To calculate gradient at x by finite difference, where x is a vector
Contains
  FUNCTION dfunc(x)
    use mod_func ! To calculate dfunc(x), we need 
                 ! function values func(x) and func(x+äx)
                 ! ä is a small scalar
    implicit none
    REAL, DIMENSION(:), INTENT(IN) :: x
    REAL, DIMENSION(size(x)) :: dfunc
    real, dimension(:),allocatable:: e    ! e is the unit vector 
    real :: del ! del ==> ä
    integer:: i,n
    del=sqrt(epsilon(x(1)))
    n=size(x)
    allocate(e(n))
    do i=1,n
       e=0.
       e(i)=1.
       !central difference formula
       dfunc(i)=(func(x+del*e) - func(x-del*e))/(2.*del)
    end do
    deallocate(e)
  END FUNCTION dfunc
End module mod_dfunc

program drive
  use mod_func
  use mod_dfunc
  implicit none
  integer,parameter::ndim=2
  real :: x(ndim) ! 2 variables, (x1,x2)
  real ::func
  real ::dfunc(ndim)
  x=(/1.0,3./) 
  write(*,*) 'x:',x
  write(*,*) 'function value:',func(x)
  write(*,*) 'function gradiet:',dfunc(x)
end program drive


-- 
           Summary: compilation error with function array
           Product: gcc
           Version: 4.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: yyxt at hotmail dot com
 GCC build triplet: build=x86_64-linux-gnu
  GCC host triplet: host=x86_64-linux-gnu
GCC target triplet: Target: x86_64-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44344

Reply via email to