glen herrmannsfeldt <gah@[EMAIL PROTECTED]
> writes:
> Ron Shepard wrote:
>> deltaquattro <deltaquattro@[EMAIL PROTECTED]
> wrote:
>
>>>However, the function to be integrated depends on many parameters, not
>>>only on x. How can I pass it to quad? Is it better to modify the
>>>interface in quad (and all the subroutines called by quad), or to
>>>create a module containing func and all the modules needed by it? Have
>>>you ever met a similar problem? Thanks
>
>> This is the standard interface problem. Do not modify your quad()
>> subroutine. If you do that, then you might as well not even use the
>> dummy subroutine, you could just hardwire the call to your specific
>> code, eliminating all advantages of having a modular reusable quad()
>> routine for numerical integration.
>
> (Snip on the use of COMMON or MODULE to pass static data
> between routines.)
>
> Note, though, that neither COMMON or MODULE allows for reentrant
> calls. If, for example, one wanted to integrate a function inside
> a recursive routine one would have to be very careful.
>
> Even more, some have done double integrals through calling routines
> like quad from inside the called function. The Fortran 66 solution
> to such problems was more than one copy of quad, each with a different
> name. (quad1, quad2, etc.) and more variables in COMMON.
>
> Quoting Richard Maine from a thread on Fortran templates:
>
> "I agree that something like templates can be useful in
> some situations. But note that, depending on details,
> the particular scenario described above can usually be
> handled better in other ways. Typically, all you need
> is an equivalent of a C void pointer, along with the data
> size. Then you can do it all in a single procedure, with
> no need for templates. I've done this exact thing for a
> long time, as I also have Fortran code that p***** data
> via sockets. So have other people. This one is done a lot."
>
> In a method related to the one Richard mentions, quad
> could be written to accept a single variable, either a
> C void pointer or unlimited polymorphic,
> and pass this variable onto the called routine.
That would be called a "thunk" or "continuation" in other programming
languages ....
Chip
--
Charles M. "Chip" Coldwell
"Turn on, log in, tune out"
GPG Key ID: 852E052F
GPG Key Fingerprint: 77E5 2B51 4907 F08A 7E92 DE80 AFA9 9A8F 852E 052F


|