-
Notifications
You must be signed in to change notification settings - Fork 59
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix coefficients in the diffusion solver #2226
base: master
Are you sure you want to change the base?
Conversation
…pointing to the fact that the diffusion across segments of different radius is still erroneous; see arbor-sim#2145)
…ternal-catalogues
…pointing to the fact that the diffusion across segments of different radius is still erroneous; see arbor-sim#2145)
…de readability improved
…ent_radii' again (for as long as the related fix is not merged)
The functionality seems fine, at least on CPU single-core systems! I've checked this by running several tests. First of all, and most importantly, all tests from #2209 pass, including the previously commented ones (I guess @thorstenhater you checked this as well). Also the tests of my single- and multi-compartment network simulations (which are for a more particular model, but relatively extensive) all pass. The code too looks fine to me, too, as far as I can judge. Regarding GPU systems, I guess #2244 will be needed as well!? What else will be needed here? It's also very nice to have the tutorial! However, I would suggest to split this into a documentation and a tutorial page. I have a draft for a documentation page on the diffusion mechanism that I started to write a while ago - maybe we could create another PR for that and put parts of the tutorial here into that one. |
@@ -436,14 +429,15 @@ fvm_cv_discretize(const cable_cell& cell, const cable_cell_parameter_set& global | |||
cv_length += embedding.integrate_length(cable); | |||
} | |||
|
|||
if (cv_length>0) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should not be 0 in the first place... Would be good to ensure this upstream and otherwise throw a warning.
By careful re-analysis of the diffusion solver we found that the coeffiecients of the LHS need an additional factor of the CV Volume.
Scopes be creeping. During the analysis it became apparent that the during coupling to the cable equation proper raises at lot of potential problems.
Conversion of ionic current densities$i_X$ to mass transfer is $\dot c_X = \frac{i_XA}{q F V}$ with volume, area, Faraday's constant, and charge. Now, people are interested in using neutral species $n$ , ie $q=0$ for which we also should expect $i_n=0$ . Yet we need to special case on this (and assert zero current) to avoid ill-defined division. That's the smaller problem.
The more worrying issue is this:$\dot c_X = \frac{i_XA}{q F V}$ . Yet, there's no backreaction to the cable equation, unless the user explicitly constructs it. How? Well, the way ions should feed back to the voltage is this:
$\sim \ln\frac{X_i}{X_o}$
We construct a coupling term from the cable equation to the ionic diffusion via
iX = g(U-eX)
this is the conductance model and should be found in an NMODL file and
eX
which is the Nernst equation found, again, in a builtin NMODL file. But, for technical reasons we had to invent a special diffusive concentration
Xd
which is not identical toXi
. For proper behaviour, we should have usedXd
instead ofXi
in the Nernst term above. So, a non-standard Nernst module needs to be used.This brings me to the great change in this context: remove the offending term and carefully document how to retrofit it in NMODL and add the proper Nernst model, too.
fixes #2145
requires #2209