I have a time-dependent problem
- dc/dt = d(uc)/dx + f
where d(uc)/dx is an convection term and f is a source/sink forcing. At each timestep, I first solve for u (it is the solution to a nonlinear PDE). I then solve solve for c^{t+1} using an LU solver (very similar to the advection-diffusion demo). The timestepper is basically controlled by two parameters: (i) the step size dt and (ii) \alpha such that \alpha=0 is backward Euler and \alpha=1 is forward Euler.
I'd like to use a fancier time-integration (specifically, one from Sundials). The integrator requires a method that evaluates the right hand side of (1). I was going to create and expression
class Concentration : public dolfin::Expression {
public:
Concentration(shared_ptr<dolfin:Function> u, shared_ptr<dolfin:Function> c) : dolfin::Expression(), u(u), c(c) {}
void eval(dolfin::Array<double>& rhs, dolfin::Array<double> const& point) const {
dolfin::Array<double> cx(1),dcdx(1),ux(1),dcxd(1);
u->eval(ux, point);
u->derivative(dudx, point);
c->eval(cx, point);
c->derivative(dcdx, point);
rhs[0] = dudx[0]*cx[0]+ux[0]*dcdx[0] + f(point);
}
private:
shared_ptr<dolfin::Function> u;
shared_ptr<dolfin::Function> c;
};
But I don't see any function like "derivative" --- does such a thing exist?