0
$\begingroup$

I am trying to solve a PDE with NDSolve, but it turns out that it uses a lot of RAM memory. In fact my PC stalled serveral times. I tried with two different computers and with Mathematica versions v11.0 and v11.1, with the same results. The memory used goes up till filling all the RAM. I think it is because I am trying to use a large resolution and over a large period of time.

As a solution I tried to reinitialize the code, with the hope of freeing some memory. My simplifyied code (the real one is more complex) is

    a = 10;
    xl = yl = -a; 
    xr = yr = a;
    tmax = 1;
    ClearAll[vortex];
    vortex[x_, y_] := (1/Sqrt[6 π ] ) Exp[-(x^2 + y^2)/(6)];
    eqn = I*Derivative[0, 0, 1][ψ][x,y,t] == -0.5 Laplacian[ψ[x,y,t],{x,y}] + 
    (Abs[ψ[x, y, t]]^2 + (x^2 + y^2)/2)*ψ[x,y,t]; 
    bcs ={ψ[xl,y,t]==vortex[xl, y], ψ[xr,y,t] == vortex[xr, y], 
    ψ[x,yl,t] ==vortex[x,yl], ψ[x,yr,t] == vortex[x,yr]};
    ics = ψ[x,y,0] == vortex[x,y];
    nxy = 200;
    ndssdata = 
    First[NDSolve`ProcessEquations[{eqn,ics,bcs}, ψ, {x,xl,xr}, {y,yl,yr}, 
    {t,0,tmax}, 
    Method -> {"MethodOfLines", 
    "SpatialDiscretization" -> {"TensorProductGrid", 
    "MinPoints" -> nxy, "MaxPoints" -> 2 nxy}}]];

and

    NDSolve`Iterate[ndssdata, 0.1];
    ndsol = NDSolve`ProcessSolutions[ndssdata, "Forward"]

Then I want to reinitialize the code using the solution at time t=0.1, I got:

   newstate = First[NDSolve`Reinitialize[ndssdata, {ics=ψ[x, y, 0]== 
   Evaluate[ψ[x,y,0.1]/.ndsol]}]] 
   (* {NDSolve`StateData["<" 0. ">"]} *)

and now I want to iterate another 0.1 timestep:

   NDSolve`Iterate[newstate, 0.1] 

The problem is that the original code use too much memory when I set a large resolution -nxy large or spatial resolution better than 0.01-. The procedure above seems to bound the total memory used if I reinitialize every small timestep. There is some other way to solve this issue? I mean to keep the memory bounded, or a more elegant way of reinitializing the code automatically. I also find different solutions depending on the method. The pseudoespectal method, I think is the method to use in my case, is the one which approach the correct solution. Thankx.

$\endgroup$
4
  • 1
    $\begingroup$ Is the current b.c. an approximation for infinite domain? If so, there exists example where improper approximation for infinity causes trouble: mathematica.stackexchange.com/q/145478/1871 $\endgroup$
    – xzczd
    Commented Jun 22, 2018 at 13:31
  • $\begingroup$ @xzczd it is possible, I thought about that. Excellent method you suggested me, I will implement it and tell you. Thank you very much. $\endgroup$
    – Gluoncito
    Commented Jun 22, 2018 at 13:47
  • $\begingroup$ @xzczd I gave a try to the Scrinzi method, and modified your code but it didn't work with this equation. The "neweq" is really awfull, and not a surprise that Mathematica didn't integrate it -without any warnings-. However, I liked the methods and the subroutines involved. I wonder if I must post another question with the full PDE's (which is frustrating because I know I'm close to the solution and do not want other's peoples to waste time). $\endgroup$
    – Gluoncito
    Commented Jun 23, 2018 at 23:28
  • $\begingroup$ If the problem can't be reproduced with this simplified example, it's definitely OK to add a new example to your question. (Of course the new example should be as simple as possible. ) $\endgroup$
    – xzczd
    Commented Jun 24, 2018 at 9:27

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.