|
[Date Index]
[Thread Index]
[Author Index]
Re: Compiled Functions and Mathgroup Archive
- To: mathgroup at smc.vnet.net
- Subject: [mg8935] Re: Compiled Functions and Mathgroup Archive
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Sat, 4 Oct 1997 22:08:12 -0400
- Organization: University of Western Australia
- Sender: owner-wri-mathgroup at wolfram.com
Peter Jay Salzman wrote:
> 1
> -
> I'm writing a numerical Schroedinger equation solver and stumbled on the
> 'Compiled' function. The MMA book mentioned that sometimes functions run
> faster when you don't compile them.
It can be a lot faster to use MathLink to link to external compiled
code. See, e.g., our second year quantum mechanics courseware at
http://www.pd.uwa.edu.au/Physics/Courses/Second_Year/Quantum.html
In addition you can use the InterCall Mathematica package to easily link
in compiled code without needing to write MathLink template files. On
MathSource <http://www.wolfram.com/mathsource/> you will find the
following two listings:
0204-657: Schroedinger's Equation (March 1993)
Author: Terry Robb
Schroedinger's equation is numerically solved by calling an
external subroutine from within Mathematica. By importing the
Fortran subroutine (named SCHROED, which implements a
Crank-Nicholson scheme) using InterCall, it is possible to do
various experiments -- for example shooting a wave-packet at a
potential barrier and watching an animation of the packet
being
mostly reflected but also partially tunnelling through the
wall.
The potential function V[x,t], required by the Fortran SCHROED
routine, can be written as a Mathematica function which gives
a
lot of flexibility for interactive experimentation. This
notebook
demonstrates one such experiment.
0011: schroed.ma (772 Kb)
0204-679: Animating Schroedinger's Equation in Two Dimensions (April
1993)
Author: Terry Robb
An efficient method for solving parabolic partial differential
equations is implemented in Mathematica using InterCall and an
external C routine. As an application, the two-dimensional
time-dependent Schroedinger's equation is solved for various
initial conditions and potential functions. Four different
numerical experiments are given: scattering of a particle from
a
cylindrical potential barrier; a double slit experiment;
interaction of wave-packets; and stirring a wave-packet with a
potential "stick". The resulting animations make excellant
demonstrations of the properties of Schroedinger's equation.
The
technique used can also be applied to other similar parabolic
partial differential equations.
0011: Schroed2D.ma (1.7 Mb)
> I know that people must have asked this question before, but when should
> I use Compile to generate faster code? My program obviously involes a
> tremendous number of repetitive arithmetic operations, so it seems like I
> should compile things like
>
> wavefunction[r_] = (alpha/Pi)^.75 E^(-.5 alpha r^2)
>
> or
>
> norm[wave] = Sqrt[ (4 Pi (dr)^3 Sum[ (Abs[ wave[[i+1]] ]*i)^2,
> {i, 0, arsize-1} ]
>
> where arsize is the gridsize and will be on the order of thousands.
I assume that you can use matrix (or vector) method instead of
element-by-element computation? Using version 3.0 you can get very
considerable speed-ups by compiling matrix operations.
> 2
> -
> Also, is there an archive of Mathgroup questions so I can look up
> questions like this in the future? It's only useful if it's searchable.
See http://smc.vnet.net/MathGroup.html and
http://www.wolfram.com/cgi-bin/mathgroup/ However it is not
searchable. I have Cc:d this to suggestions at wolfram.com so that they
can consider making the archive searchable (which I agree would be
_very_ useful).
> 3
> -
> How can I have MMA print something like:
> The gridsize is arsize
> but replace arsize with the contents of the variable arsize
You can, of course, use Print. A better way is to use the built-in
message command. After defining a string such as
In[1]:= GridSize::size = "The gridsize is `1`.";
then, for
In[2]:= arsize = 0.2;
get your code to call message, e.g.,
In[2]:= Message[GridSize::size,arsize]
GridSize::"size": "The gridsize is 0.2."
Have a look at Messages.m in
SystemFiles
Kernel
TextResources
English
to complete see a list of the built-in messages.
> 4
> -
> I print a bunch of parameters for the current 'run', and would like to
> prompt myself "If this is OK, press enter to continue but if it's not OK,
> press any other key to end the program".
You can use Input to do this:
In[3]:= ?Input
"Input[ ] interactively reads in one Mathematica expression.
Input["prompt"] requests input, using the specified string as a
prompt."
Cheers,
Paul
____________________________________________________________________
Paul Abbott Phone: +61-8-9380-2734
Department of Physics Fax: +61-8-9380-1014
The University of Western Australia
Nedlands WA 6907 mailto:paul at physics.uwa.edu.au
AUSTRALIA http://www.pd.uwa.edu.au/~paul
God IS a weakly left-handed dice player
____________________________________________________________________
Prev by Date:
Re: NIntegrate where terms of integrand have unknown constant coefficients
Next by Date:
Beware of Simplify[] bottlenecks in v 3.0
Previous by thread:
Re: Compiled Functions and Mathgroup Archive
Next by thread:
Re:
|