Listing 3: An application where a cast is necessary.
#include <complex>
#include <valarray>
#include <integrators.h>
using namespace std;
namespace discretization_data
{
const complex<double> i(0,1);
unsigned int nmesh = 10;
}
void discretized_odes(const valarray<complex<double> > &psi,
const double t, valarray<complex<double> > &dpsidt)
{
using namespace discretization_data;
dpsidt[0] = i*(psi[1]-2.0*psi[0]);
dpsidt[nmesh-1] = i*(psi[nmesh-2]-2.0*psi[nmesh-1]);
for (int loop=1; loop<nmesh-1; loop++)
dpsidt[loop] = i*(psi[loop+1] - 2.0*psi[loop]
+ psi[loop-1]);
}
int main()
{
using namespace discretization_data;
// Initial conditions
valarray<complex<double> >
psi(complex<double>(1.0/nmesh), nmesh);
Euler<valarray<complex<double> >, double, complex<double> >
dSchrodinger(psi, 0.0, 0.01, discretized_odes );
while (dSchrodinger.current_time() < 50)
dSchrodinger.step();
//Some output statements would be added to a real program...
}