David Leal Valmana <[log in to unmask]> wrote:
[...]
> I my case I use the following compilation:
> f90 -c optimization.f90
> f90 -c specific_funcions.f90
> f90 -o test_prob test_prob.f90 optimization.o specific_funcions.o
Since optimization_mod is using specific_function_mod, most (all?)
compilers will need to see specific_funcions.f90 first in order to
create the module information neccessary for the compilation of
optimization.f90.
> where
> optimization and speficif_functions are the file containing the modules
> optimization_mod and specific_function_mod respectively.
>
> So if I want to solve only one problem is inmidiatly, but what about to
> solve a lot of test problem in the same way?
>
> prob_1 : specific_function1_mod
> prob_2 : specific_function2_mod
> prob_3 : specific_function3_mod
> .
> .
> .
> prob_n :specific_functionn_mod
>
>
> Because We have to place the USE statement only at the begining of the
> program is not posible to use a kind of bucle for loading each time the
> specific module for each problem.
>
> Has someone any idea about how to solve this case?
As you point out, you can't use fortran modules like variables or
arguments, their relations are run time invariant. However, this does
not apply to their content. So you can use procedure parameters in
order to feed your optimization algorithms with various functions.
I would do it similar to this example:
MODULE definitions_mod
IMPLICIT NONE
! Put things that are needed for the definition of your
! specific functions in here. Like kind parameters, derived
! types, etc..
INTEGER, PARAMETER:: sp = SELECTED_REAL_KIND(6)
END MODULE definitions_mod
MODULE specific_functions_mod
USE definitions_mod
! This module is used by the main program but not by the
! optimization module. It may as well be splitted into
! several modules, if you like.
IMPLICIT NONE
CONTAINS
FUNCTION specfun1(x)
REAL(sp), INTENT(IN):: x
REAL(sp) :: specfun1
[...]
END FUNCTION specfun1
FUNCTION specfun2(x)
REAL(sp), INTENT(IN):: x
REAL(sp) :: specfun2
[...]
END FUNCTION specfun2
END MODULE specific_functions_mod
MODULE optimization_mod
USE definitions_mod ! This use is for the declaration of function
! optimize itself. It is invisible to the
! interface below...
IMPLICIT NONE
CONTAINS
FUNCTION optimize(f, ...)
INTERFACE
FUNCTION f(x)
USE definitions_mod ! ... therefore it has to be used here again.
REAL(sp), INTENT(IN):: x
REAL(sp) :: f
END FUNCTION f
END INTERFACE
REAL(sp):: optimize
[...]
END FUNCTION optimize
END MODULE optimization_mod
PROGRAM test_prob
USE definitions_mod
USE specific_functions_mod
USE optimization_mod
IMPLICIT NONE
WRITE(*, *) optimize(specfun1, ...)
WRITE(*, *) optimize(specfun2, ...)
END PROGRAM test_prob
If you want to split specific_functions_mod into separate modules for
each function and don't want to care about choosing distinct names for
functions and other entities across these modules, you can use local
renaming in the main program:
MODULE specific_function1_mod
USE definitions_mod
IMPLICIT NONE
CONTAINS
FUNCTION specfun(x)
REAL(sp), INTENT(IN):: x
REAL(sp) :: specfun
specfun = 1 + x
END FUNCTION specfun
END MODULE specific_function1_mod
MODULE specific_function2_mod
USE definitions_mod
IMPLICIT NONE
CONTAINS
FUNCTION specfun(x)
REAL(sp), INTENT(IN):: x
REAL(sp) :: specfun
specfun = 1 + x + x ** 2
END FUNCTION specfun
END MODULE specific_function2_mod
PROGRAM test_prob
USE definitions_mod
USE specific_function1_mod, ONLY: specfun1 => specfun
USE specific_function2_mod, ONLY: specfun2 => specfun
USE optimization_mod
IMPLICIT NONE
WRITE(*, *) optimize(specfun1)
WRITE(*, *) optimize(specfun2)
END PROGRAM test_prob
Hope this helps
Michael
--
*****************************************************************************
Michael Steffens Institut f. Meteorologie u. Klimatologie
Tel.: +49-511-7624413 Universitaet Hannover
email: [log in to unmask] Herrenhaeuser Str. 2
[log in to unmask] D-30419 Hannover
PGP fingerprint = FA BE 6C 1C F6 C3 EC 33 DD 42 6B 7F DE CF 84 B8
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|