I had the same initial thought, but you're not adding new information by doing that. You can see this by looking at the matrix stencil that results from these equations:
X X C1 X C2 XX C3 = 0 XXX Phi That bottom right sector of the matrix is empty and so the matrix solvers cannot find a solution because you're now trying to solve for four unknowns with what are really only three equations. Things to consider: In the solution you posted from West, Phi does not have zero gradient at either end of the domain. Why? What boundary condition is driving that? Phi is curved, which implies that there is net charge in the system, but you assert zero charge throughout. How does West reconcile that inconsistency? > On Jun 13, 2019, at 11:25 AM, Scott Calabrese Barton <[email protected]> wrote: > > That’s true, so we can make C3 explicit (full code at http://bit.ly/2F7UQgR): > > # Variables > C1= CellVariable(mesh = mesh, value = 1.0) > C2= CellVariable(mesh = mesh, value = 4.0/3.0) > Phi = CellVariable(mesh = mesh, value = 0) > > C30 = -1/z3 * (z1*1.0 + z2*C20) # Electroneutrality > C3= CellVariable(mesh = mesh, value = C30) > > # Boundary Conditions > C1.constrain(1.0, mesh.facesRight) > C2.constrain(C20, mesh.facesRight) > C3.constrain(C30, mesh.facesRight) > Phi.constrain(-0.2, mesh.facesRight) > C1.constrain(0.0, mesh.facesLeft) > > # Governing Equations > Eq1 = + DiffusionTerm(coeff=z1*C1, var=Phi) + DiffusionTerm(coeff=1.0, var=C1) > Eq2 = + DiffusionTerm(coeff=z2*C2, var=Phi) + DiffusionTerm(coeff=1.0, var=C2) > Eq3 = + DiffusionTerm(coeff=z3*C3, var=Phi) + DiffusionTerm(coeff=1.0, var=C3) > > Eq4 = ImplicitSourceTerm(coeff=z1, var=C1) + \ > ImplicitSourceTerm(coeff=z2, var=C2) + \ > ImplicitSourceTerm(coeff=z3, var=C3) > > Eqns = Eq1 & Eq2 & Eq3 & Eq4 > > > However, this set of equations does not converge. I’m fairly certain that I > am mismanaging the boundary conditions. > > >> On Jun 12, 2019, at 5:02 PM, Guyer, Jonathan E. Dr. (Fed) via fipy >> <[email protected]> wrote: >> >> There's no zero-flux BC on C3 because there's no such thing as C3 as far as >> FiPy is concerned. The boundary conditions on C3 are entirely determined by >> the boundary conditions on C1 and C2 (Dirichlet on the right and Robin on >> the left). The solution obtained satisfies the equations and boundary >> conditions given to FiPy. >> >>> On Jun 12, 2019, at 2:19 PM, Scott Calabrese Barton <[email protected]> wrote: >>> >>> Jon, thanks for catching that typo. I wish it were the problem! >>> >>> The solution with grad phi=0 does not satisfy the zero-flux boundary >>> condition on species 3. In the absence of a potential gradient, that >>> species would need to also have zero gradient (like species 2 in the >>> current solution). >>> >>> So the question becomes how to enforce that zero-flux BC. Any suggestions? >>> I could drop the conservation equation and replace it with something that >>> enforces zero-flux everywhere, but I’d prefer to use a boundary condition >>> as that would be more applicable in higher dimensions. >>> >>> ☘ >>> >>> >>>> On Jun 12, 2019, at 1:36 PM, Guyer, Jonathan E. Dr. (Fed) via fipy >>>> <[email protected]> wrote: >>>> >>>> Scott - >>>> >>>> Eq2 appears to have a typo: >>>> >>>> -Eq2 = DiffusionTerm(coeff=z2*C1, var=Phi) + DiffusionTerm(coeff=1.0, >>>> var=C2) >>>> +Eq2 = DiffusionTerm(coeff=z2*C2, var=Phi) + DiffusionTerm(coeff=1.0, >>>> var=C2) >>>> >>>> Eq3 has (much) better coupling if written like this: >>>> >>>> -Eq3 = DiffusionTerm(coeff=z3*C3, var=Phi) + (C3.faceGrad).divergence >>>> +Eq3 = DiffusionTerm(coeff=z3*C3, var=Phi) - DiffusionTerm(coeff=-z1/z3, >>>> var=C1) - DiffusionTerm(coeff=-z2/z3, var=C2) >>>> >>>> [Note that this way you don't need to evaluate .faceGrad at the >>>> boundaries, so your issue #650 doesn't come up. We don't upwind at the >>>> boundaries because it's complicated and expensive to do right and it's >>>> unusual to care.] >>>> >>>> With these changes, the solution converges in one sweep, but does not >>>> agree with the Analytical Solution you give from West. >>>> >>>> I don't understand a couple of things though. As posed, what governs \Phi? >>>> I get \Phi = 0 and see no reason why it would be otherwise. Typically, I >>>> would expect Poisson's equation to be obeyed. Since you assert charge >>>> electroneutrality, this reduces to Laplace's equation, but in that case, >>>> the slope of \Phi should be constant (unless the permittivity is >>>> non-uniform, but you don't have a permittivity). In the Analytical plot, >>>> \Phi has definite curvature. >>>> >>>> My guess is you don't need Eq3 (it'll get taken care of automatically) and >>>> you need some form of Poisson's equation. >>>> >>>> - Jon >>>> >>>>> On Jun 11, 2019, at 4:48 PM, Scott Calabrese Barton <[email protected]> wrote: >>>>> >>>>> I’ve had some trouble using fipy for the 1D, steady-state ternary >>>>> electrolyte problem, which involves coupled, nonlinear migration and >>>>> diffusion. >>>>> >>>>> A text version of the model is listed below. A more complete development >>>>> is at http://bit.ly/2wJDXob= >>>>> >>>>> from fipy import * >>>>> >>>>> # Parameters >>>>> nx=50 >>>>> C20=4.0/3.0 >>>>> z1, z2, z3= 2.0, -2.0, 1.0 >>>>> >>>>> # Mesh >>>>> mesh = Grid1D(nx=nx, dx=1.0/nx) >>>>> >>>>> # Variables >>>>> C1= CellVariable(mesh = mesh, value = 1.0) >>>>> C2= CellVariable(mesh = mesh, value = 4.0/3.0) >>>>> Phi = CellVariable(mesh = mesh, value = -0.5) >>>>> >>>>> # Electroneutrality >>>>> C3 = -1/z3 * (z1*C1 + z2*C2) >>>>> >>>>> # Boundary Conditions >>>>> C1.constrain(1.0, mesh.facesRight) >>>>> C1.constrain(0.0, mesh.facesLeft) >>>>> C2.constrain(C20, mesh.facesRight) >>>>> Phi.constrain(0, mesh.facesRight) >>>>> >>>>> # Governing Equations >>>>> Eq1 = DiffusionTerm(coeff=z1*C1, var=Phi) + DiffusionTerm(coeff=1.0, >>>>> var=C1) >>>>> Eq2 = DiffusionTerm(coeff=z2*C1, var=Phi) + DiffusionTerm(coeff=1.0, >>>>> var=C2) >>>>> Eq3 = DiffusionTerm(coeff=z3*C3, var=Phi) + (C3.faceGrad).divergence >>>>> >>>>> Eqns = Eq1 & Eq2 & Eq3 >>>>> >>>>> # Solution >>>>> res = 1e+10 >>>>> restol= 1e-3 >>>>> >>>>> while res > restol: >>>>> res = Eqns.sweep() >>>>> print(res) >>>>> >>>>> >>>>> However, this system does not converge. I suspect the issue is with >>>>> boundary conditions. I’ve tried zeroing out the diffusion coefficients at >>>>> the boundary, but that does not seem to make a difference here. I am able >>>>> to use this approach for the analogous binary problem: >>>>> http://bit.ly/2wOzxfK= >>>>> >>>>> Any insights or suggestions would be welcome. >>>>> >>>>> Cheers, >>>>> Scott☘ >>>>> >>>>> >>>>> _______________________________________________ >>>>> 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= ] >>>> >>> >>> >>> _______________________________________________ >>> 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= ] >> > _______________________________________________ fipy mailing list [email protected] http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]
