I had something similar happen with an Eigenvalue problem I was working on. Two things affected the stability of my convergence. The first was which solver I was using, turns out that the PCG solvers worked best for me. The second was limiting the number of iterations in each sweep. I am no expert in nonlinear diffusion but these may help.

Best of luck,
-mike waters

On 10/27/15 9:11 AM, Dan Brunner wrote:
I'm working on a nonlinear diffusion problem (specifically finding how long a spatially-dependent heat flux can be held on a surface before it reaches the melting point, 'simple' example at the end) and I am seeking assistance in setting up the sweeping. I've looked through all of the FiPy examples to learn what I can. If I set it up to sweep until a certain residual threshold is reached, each iteration on the time loop takes longer and longer because the initial residual keeps increasing and the residual decrease between sweeps keeps decreasing. This usually goes on until the residual bounces up and down in a sweep loop. If I try some logic to decrease the sweep dt, the sweep residuals blow up.

Does anyone have guidance on what to do here and/or can refer me to a resource where I may learn how to do this better?

Thanks
~Dan

from fipy import *
import numpy as np

q0=5e8
qLambda=1e-2
Lx=qLambda*4.0
dx=qLambda/20.0
Ly=0.02
dy=Ly/2.0
T0=300.0
peakTemp=3695.0
resMin=1e-2

mesh=Gmsh2D('''
            Lx=%(Lx)g;
            Ly=%(Ly)g;
            dx=%(dx)g;
            dy=%(dy)g;
            Point(1) = { 0,  0, 0, dx};
            Point(2) = {Lx,  0, 0, dx};
            Point(3) = {Lx, Ly, 0, dy};
            Point(4) = { 0, Ly, 0, dy};
            Line(1) = {1, 2};
            Line(2) = {2, 3};
            Line(3) = {3, 4};
            Line(4) = {4, 1};
            Line Loop(5) = {1, 2, 3, 4};
            Plane Surface(6) = {5};
            ''' % locals())
X, Y = mesh.faceCenters
time = Variable()
temperature = CellVariable(name = "temperature",
                           mesh = mesh,
                           value = T0,
                           hasOld=1)
# thermal properties of tungsten
rho = 19300.0
cp = (5.33e+01*temperature**0.0+
      4.50e-01*temperature**1.0-
      8.30e-04*temperature**2.0+
      7.07e-07*temperature**3.0-
      2.73e-10*temperature**4.0+
      3.91e-14*temperature**5.0)
kappa = (2.32e+02*temperature**0.0-
         2.67e-01*temperature**1.0+
         2.42e-04*temperature**2.0-
         1.13e-07*temperature**3.0+
         2.50e-11*temperature**4.0-
         1.99e-15*temperature**5.0)
eq = TransientTerm(coeff=rho*cp) == DiffusionTerm(coeff=kappa)

dTime = 0.9*dx**2.0/(2.0*5e-5)

if __name__ == '__main__':
    viewer = Viewer(vars=temperature, datamin=0., datamax=4000.)
    viewer.plot()

while temperature().max() < peakTemp:
    time.setValue(time()+dTime)
    temperature.updateOld()

    facesDecayBottom = (mesh.facesBottom & (X>=(qLambda)))
valueDecayBottom = -q0*np.exp(-(X-qLambda)/qLambda)/kappa.getFaceValue()

    temperature.faceGrad.constrain(0.0, mesh.facesBottom)
    temperature.faceGrad.constrain(valueDecayBottom, facesDecayBottom)
    temperature.faceGrad.constrain(0.0, mesh.facesTop)

    res=1e9
    while res>resMin:
        res = eq.sweep(var=temperature,dt=dTime)
        print res

    print time, temperature().max()
    if __name__ == '__main__':
        viewer.plot()


_______________________________________________
fipy mailing list
[email protected]
http://www.ctcms.nist.gov/fipy
   [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

_______________________________________________
fipy mailing list
[email protected]
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]

Reply via email to