Schrodinger

Non linear Schrodinger equation, thanks to G. Sadaka

$$\begin{array}{rcll} i\,\partial_t u+\alpha\, i\, -\Delta u +\lambda\,\nu(u)\cdot u& =&f & \mbox{on } \Omega=B(0,R)\subset \mathbb{C}^2\\ u(x,y,0)&=& u_0 &\mbox{on } \partial \Omega\\ u(x,y,t)&=&0 &\mbox{on } \partial \Omega\quad t>0 \end{array}$$

verbosity=0;
real Dx=.2, R=10.;
border C(t=0.,2.*pi){x=R*cos(t);y=R*sin(t);label=1;};
mesh Th=buildmesh(C(floor(2.*pi*R/Dx)));
fespace Vh(Th,P2);
real dt=0.01,Tf=10., lambda=-1., p=3.,alpha=0.;
Vh<complex> uh, vh, uh0=exp(-x^2-y^2-5.*1i*x), uhk=uh0, TNL, B;
varf a(u,v) = int2d(Th)(u*v*1i/dt + u*v*1i*alpha/2. + (dx(u)*dx(v) + dy(u)*dy(v))/2.) + on(1,u=0);
matrix<complex> A = a(Vh,Vh);
varf b(u,v) = int2d(Th)(uh0*v*1i/dt - uh0*v*1i*alpha/2. - (dx(uh0)*dx(v) + dy(uh0)*dy(v))/2.
- lambda*TNL*(uhk+uh0)*v/2.) + on(1,u=0);
Vh ABSU;
int kk=0;
real[int] NORML2(floor(Tf/dt)+1);
for (real t=0.;t<=Tf;t+=dt){
TNL=abs(uh0)^(p-1);
for (int i=0;i<2;i++){
B[] = b(0,Vh);
set(A,solver=sparsesolver);
uhk[] = A^-1*B[];
}
uh0[]=uhk[];
ABSU=abs(uh0);
NORML2[kk]=sqrt(int2d(Th)(abs(uh0)^2));
if ( !(kk % 10)){
plot(ABSU,cmm="t="+t+"  ;||u||_L^2="+NORML2[kk], fill=true,value=true,dim=2);
{
ofstream gnufile("||u||_L2.gnu");
for (int i=0;i<=kk;i++)
gnufile<<i*dt<<" "<<NORML2(i)<<endl;
}
exec("echo 'plot \"||u||_L2.gnu\" w lp \
pause 5 \
quit' | gnuplot");
}
kk++;
}