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...
}