If I replace the var**3 with h**3 the system seems stable, but uninteresting.
##eq = TransientTerm() == -DiffusionTerm((var**3, 1)) +
DiffusionTerm(-exp(-var) * var**3 + 3 * b / var)
eq = TransientTerm() == -DiffusionTerm((h**3, 1)) +
DiffusionTerm(-exp(-var) * h**3 + 3 * b * h**3 / var**4)
In the email you wrote above you have:
\partial_t \phi=-\nabla\{\phi^3\nabla[\triangle \phi
-\partial_\phi f(\phi)]\}
where f(\phi) = \frac{b}{2\phi^2}-e^{-\phi}
Why did you replace the phi^3 with a constant?
On Mon, Feb 9, 2009 at 1:00 PM, Daniel Wheeler
<[email protected]> wrote:
>
> The following script runs without exploding. The results are not
> interesting as the field seems to equilibrate to .5. If the variance
> is increased the solution diverges. Do we know what the stable
> parameter choices are?
>
> #!/usr/bin/env python
>
> from fipy import *
>
> nx = ny = 100
> dx = dy = 0.5
> mesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy)
>
> var = CellVariable(name="variable", mesh=mesh)
> var.setValue(GaussianNoiseVariable(mesh=mesh,
> mean=0.5,
> variance=0.01))
>
> if __name__ == "__main__":
> viewer = Viewer(vars=(var,), datamin=0., datamax=1.)
>
> b = 0.5
> h = 5.0
> steps = 1000
>
> eq = TransientTerm() == -DiffusionTerm((var**3, 1)) +
> DiffusionTerm(-exp(-var) * var**3 + 3 * b / var)
>
> dexp = -1
> for step in range(steps):
> dt = min(100, exp(dexp))
> dexp += 0.01
> eq.solve(var, dt = dt, solver=LinearLUSolver())
>
> print
> print 'max(var)',max(var),'min(var)',min(var)
> print
>
> if __name__ == '__main__':
> viewer.plot(filename="output_%d.png" %step)
> print 'step',step,'dt',dt
>
>
> On Sun, Feb 8, 2009 at 4:17 PM, Ionut Vancea <[email protected]> wrote:
>>
>> Hello,
>>
>> On Mon, Feb 2, 2009 at 5:48 PM, <[email protected]> wrote:
>>
>>> OK, this is the problem. fDerivative is a FaceVariable. To get the proper
>>> order for the discretization, you want the second derivative of f(\phi) to
>>> be a FaceVariable, so fDerivative needs to be a CellVariable. So, either
>>>
>>> fDerivative = exp(-var) - (b / var**3)
>>> (h**3 * fDerivative.getFaceGrad()).getDivergence()
>>>
>>> or, better,
>>>
>>> fSecondDerivative = -exp(-faceVar) + (3 * b / faceVar**4)
>>> DiffusionTerm(coeff=fSecondDerivative)
>>>
>>>
>>
>>
>> Thank you for your help, but I still have a "small" problem with my
>> script. Here is the complete script:
>>
>> ======
>> #!/usr/bin/env python
>>
>> from fipy import *
>>
>> nx = ny = 300
>> mesh = Grid2D(nx=nx, ny=ny, dx=0.25, dy=0.25)
>>
>> var = CellVariable(name="variable", mesh=mesh)
>> var.setValue(GaussianNoiseVariable(mesh=mesh,
>> mean=0.5,
>> variance=0.01))
>>
>> #faceVar = var.getArithmeticFaceValue()
>>
>> if __name__ == "__main__":
>> viewer = Viewer(vars=(var,), datamin=0., datamax=1.)
>>
>> b = 0.5
>> h = 5.0
>> steps = 1000
>>
>> fDerivative = exp(-var)-(b / var**3)
>> #fSecondDerivative = -exp(-faceVar) + (3 * b / faceVar**4)
>>
>> diffTerm4 = - DiffusionTerm((h**3, 1))
>> eq = TransientTerm() == -DiffusionTerm((h**3, 1)) +
>> (fDerivative.getFaceGrad() * h**3).getDivergence()
>> #eq = TransientTerm() == -DiffusionTerm((h**3, 1)) +
>> DiffusionTerm(coeff=fSecondDerivative)
>>
>> dexp = -5
>> for step in range(steps):
>> dt = min(100, exp(dexp))
>> dexp += 0.01
>> eq.solve(var, dt = dt)
>>
>> if __name__ == '__main__':
>> viewer.plot(filename="output_%d.png" %step)
>> print 'step',step,'dt',dt
>>
>> ======
>> but when I am trying to run it, I obtain the following: (after 2 steps
>> I can see something useful but nothing after step 3, 4, ...)
>> ..
>> /fipy/solvers/pysparse/linearPCGSolver.py:70: DeprecationWarning:
>> PyArray_As1D: use PyArray_AsCArray.
>> info, iter, relres = itsolvers.pcg(A, b, x, self.tolerance,
>> self.iterations, Assor)
>> /fipy/solvers/pysparse/linearPCGSolver.py:70: DeprecationWarning:
>> PyArray_FromDimsAndDataAndDescr: use PyArray_NewFromDescr.
>> info, iter, relres = itsolvers.pcg(A, b, x, self.tolerance,
>> self.iterations, Assor)
>> step 0 dt 0.00673794699909
>> step 1 dt 0.00680566449223
>> thinfilm3.py:33: StagnatedSolverWarning: The solver stagnated.
>> Iterations: 1. Relative error: nan
>> eq.solve(var, dt = dt)
>> step 2 dt 0.0068740625575
>> step 3 dt 0.00694314803475
>> step 4 dt 0.00701292783259
>> .......
>>
>> I saw in mail archives that some people obtained the same error and I
>> tried to decrese/increase the time step, or to consider
>> bigger/smaller lattice, but the error still persist.
>> Maybe I did something wrong, but I can no spot the mistake.
>>
>> Thank you again,
>> Ionut
>>
>>
>
>
>
> --
> Daniel Wheeler
>
>
--
Daniel Wheeler