Sorry. I never said what the few things were.

FiPy has no-flux boundary conditions by default. It's a characteristic of the 
finite-volume method. So, your Eqs. (3) are satisfied without applying any 
constraints. 

Eqs. (4) and (5) are a [Robin 
condition](https://www.ctcms.nist.gov/fipy/documentation/USAGE.html#applying-robin-boundary-conditions).
 I've modified your notebook to apply a Robin condition on \phi.

The singular matrix arises because \rho is initialized to zero, which means the 
coefficient matrix for DiffusionTerm(coeff=Drho, var=phi) is initially zero. 
The total matrix is still block diagonal, so I don't really understand why this 
gives a singular matrix, but initializing \rho to something other than zero 
seems to solve that problem. Unfortunately, as I said before, it still diverges.

- Jon

> On Feb 25, 2020, at 10:04 AM, Guyer, Jonathan E. Dr. (Fed) via fipy 
> <fipy@nist.gov> wrote:
> 
> Yuranan -
> 
> There are a few things going on here.
> 
> I've modified your notebook and posted it at 
> https://github.com/guyer/sharing-github/blob/master/ion-transport-diagnosis.ipynb.
> 
> The singular matrix has gone away, but the solution diverges. In general, I 
> find the drift-diffusion equations pretty challenging to solve. 
> Newton-Raphson iterations are almost always called for and under-relaxation 
> or other damping can be needed, too.
> 
> - Jon
> 
>> On Feb 24, 2020, at 7:11 PM, Yuranan Hanlumyuang <yurana...@ku.th> wrote:
>> 
>> Dear the FiPy Team,
>> 
>> We are trying to solve the coupled equations in the paper titled 
>> "Diffuse-charge dynamics in electrochemical systems" by Bazant, Thornton and 
>> Ajdari using FiPy.  I am posting a copy of the python code and the equations 
>> here 
>> https://gcc01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbit.ly%2F32fIA8a&amp;data=02%7C01%7Cjonathan.guyer%40nist.gov%7C18104f76caae4eec145e08d7ba042d06%7C2ab5d82fd8fa4797a93e054655c61dec%7C1%7C1%7C637182399411065840&amp;sdata=h%2FJN%2BFiGcsAGDTNclX%2FqQImXHUgA3%2Fc5LEb5P0F8PTQ%3D&amp;reserved=0
>> 
>> The example of Binary_Electrolytes posted by Prof. Guyer has been followed 
>> closely. However, we keep encountering the errors of 
>> self.factorizeFnc(*args, **kwargs) with the RuntimeError: Factor is exactly 
>> singular. We were unable to diagnose if there is anything wrong with the way 
>> we set (1) the boundary conditions, or (2) the coupled equations. 
>> 
>> We tried to use “eqns.solve()” as well, but still it didn’t work.  I would 
>> appreciate any guidance that you can offer.   
>> 
>> The code in the text format is listed below: 
>> from fipy import *
>> 
>> m = Grid1D(nx=100,Lx=2.0)
>> 
>> v = 1
>> epsilon= 0.05
>> delta = 0.1
>> x = m.cellCenters[0]
>> 
>> 
>> ##Initial conditions
>> c = CellVariable(name="c", mesh=m , value=1.0, hasOld=True)
>> 
>> rho = CellVariable(name="rho", mesh=m , value=0.0, hasOld=True)
>> 
>> phi = CellVariable(name="phi",mesh=m, hasOld=True)
>> phi.setValue(v*(x-1), where=m.cellCenters)
>> 
>> #vi =Viewer((phi, c, rho),datamin=-1.1, datamax=1.1)
>> #vi.plot()
>> 
>> 
>> ##Boundary conditions
>> c.faceGrad.constrain(-rho.faceValue*phi.faceGrad, where=m.facesLeft)
>> c.faceGrad.constrain(-rho.faceValue*phi.faceGrad, where=m.facesRight)
>> 
>> rho.faceGrad.constrain(-c.faceValue*phi.faceGrad, where=m.facesLeft)
>> rho.faceGrad.constrain(-c.faceValue*phi.faceGrad, where=m.facesRight)
>> 
>> 
>> phi.faceGrad.constrain((phi.faceValue+v)/(epsilon*delta), where=m.facesLeft)
>> phi.faceGrad.constrain((phi.faceValue-v)/(-epsilon*delta), 
>> where=m.facesRight)
>> 
>> 
>> ##Equations
>> 
>> Drho = epsilon*rho
>> Dc   = epsilon*c
>> 
>> eq1 = TransientTerm(var=c) == DiffusionTerm(coeff=epsilon, var=c) 
>> +DiffusionTerm(coeff=Drho, var=phi)
>> eq2 = TransientTerm(var=rho) == DiffusionTerm(coeff=epsilon, var=rho) 
>> +DiffusionTerm(coeff=Dc, var=phi)
>> eq3 = DiffusionTerm(coeff=epsilon*epsilon, 
>> var=phi)+ImplicitSourceTerm(coeff=1.0, var=rho) == 0
>> eqns = eq1 & eq2 & eq3 
>> 
>> 
>> ##Solve
>> #vi =Viewer((phi, c, rho),datamin=-1.1, datamax=1.1)
>> #from builtins import range
>> 
>> res = 1e+10
>> restol= 1e-13
>> 
>> for t in range(100):
>>    c.updateOld()
>>    rho.updateOld()
>>    phi.updateOld()
>>    while res > restol:
>>        res = eqns.sweep(dt=1e-15)
>>        print(res)
>> 
>> Best,
>> Yuranan
>> 
>> 
>> _______________________________________________
>> fipy mailing list
>> fipy@nist.gov
>> http://www.ctcms.nist.gov/fipy
>> [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
> 
> 
> _______________________________________________
> fipy mailing list
> fipy@nist.gov
> http://www.ctcms.nist.gov/fipy
>  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]


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

Reply via email to