Valid for version 0.1.1.
Here, we start doing a few more complex things, such as setting up multidimensional grids, composing operators, and using the Chebychev propagator.
The following code snipplet is taken from Demos/HarmonicOscillator/Gaussian2D/1/demo.cpp minus the comments:
#include <boost/math/constants/constants.hpp> // definition of pi
#include <wavepacket.hpp>
using namespace wavepacket;
using namespace tensor;
using namespace boost::math::double_constants;
int main() {
auto xgrid = std::make_shared<FFTGrid>(-15, 15, 128);
auto ygrid = std::make_shared<FFTGrid>(-15, 15, 128);
auto rep = Representation::create( {xgrid, ygrid} );
auto hamiltPrimitive = std::make_shared<CartesianKineticEnergy>(rep, 0, 1)
+ std::make_shared<CartesianKineticEnergy>(rep, 1, 1)
+ std::make_shared<HarmonicPotential>(rep, 0, 1, 1)
+ std::make_shared<HarmonicPotential>(rep, 1, 1, 1);
auto hamiltonian = std::make_shared<SchroedingerOperator>(hamiltPrimitive);
auto builder = std::make_shared<StateBuilder>(rep);
CTensor psi0 = builder->buildProductWavefunction({
Gaussian(-5, 0, 1),
Gaussian(-5, -5, 1) });
auto propaPrimitive = std::make_shared<ChebychevPrimitive>(hamiltonian,
hamiltPrimitive->getSpectralMin(), hamiltPrimitive->getSpectralMax());
auto propagator = std::make_shared<Propagator>(propaPrimitive, pi/20);
propagator->addObserver(std::make_shared<LoggingOutput>(hamiltPrimitive), 1);
propagator->propagate(psi0, 0, 40);
return 0;
}