Drift-Diffusion PDE Model Benchmark Specification
1. Introduction
The drift-diffusion partial differential equation (PDE) describes the distribution of particles under the influence of diffusion and a drift velocity field. It often appears in physics, for instance in semiconductor device modeling or population dynamics.
2. Mathematical Formulation
The drift-diffusion equation in 2D and 3D is given by:
where \(\rho(\mathbf{x}, t)\) is the density of the particles at position \(\mathbf{x}\) and time \(t\), \(D\) is the diffusion coefficient, and \(\mathbf{v}(\mathbf{x}, t)\) is the drift velocity.
3. Problem Specification
- 
Geometry: A unit square for 2D or a unit cube for 3D. 
- 
Initial condition: A Gaussian distribution centered at the origin, \(\rho(\mathbf{x}, 0) = \exp(-||\mathbf{x}||^2)\). 
- 
Drift velocity: \(\mathbf{v}(\mathbf{x}, t) = -\frac{\mathbf{x}}{||\mathbf{x}||^2} \alpha(t)\), where \(\alpha(t) = \sin(t)\). 
- 
Boundary conditions: Dirichlet boundary conditions, \(\rho = 0\) on the boundary of the square/cube. 
- 
Diffusion coefficient: \(D = 1\). 
4. Numerical Scheme
A finite difference method is used to discretize the PDE.
We discretize our domain into a grid of size \(\Delta x\), and we choose a time step \(\Delta t\). At each time step, we update the density at each grid point \(x_{i,j}\) (in 2D) or \(x_{i,j,k}\) (in 3D).
5. Input Data
For our benchmark, we will consider the following:
- 
Diffusion coefficient: \(D = 1\) 
- 
Domain: a unit square or cube with grid size \(\Delta x = 0.01\). 
- 
Time: from \(t = 0\) to \(t = 1\) with a time step of \(\Delta t = 0.001\). 
- 
Initial density: a Gaussian, \(\rho(\mathbf{x}, 0) = \exp(-||\mathbf{x}||^2)\). 
6. Code Snippet
Below is a basic Feel++ code snippet for the 2D case.
#include <feel/feel.hpp>
using namespace Feel;
int main(int argc, char**argv )
{
    Environment env( _argc=argc, _argv=argv,
                     _desc=makeOptions(),
                     _about=about(_name="myapp",
                                  _author="Your Name",
                                  _email="your.email@domain.com"));
    auto mesh = unitSquare();
    auto Vh = Pch<1>( mesh );
    auto u = Vh->element();
    auto v = Vh->element();
    auto D = 1.0;
    auto rho = exp(-norm2(P()));
    auto alpha = sin(t);
    auto drift_velocity = -P()/norm2(P())*alpha;
    auto l = form1( _test=Vh );
    l = integrate(_range=elements(mesh), _expr= id(v)*rho );
    auto a = form2( _trial=Vh, _test=Vh);
    a = integrate(_range=elements(mesh),
                  _expr=D*gradt(u)*trans(grad(v)) - id(v)*dot(grad(u), drift_velocity) );
    a.solve(_rhs=l, _solution=u);
    // Proceed with the time stepping
}Please note that the code above is a simplified example and it doesn’t cover all the steps of a proper simulation such as the time-stepping loop, updating the right-hand side, and boundary conditions.