generic diffusion solver