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://bit.ly/32fIA8a <https://bit.ly/32fIA8a>
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 ]