11/*
22# =============================================================================
3- # Copyright (c) 2016 - 2021 Blue Brain Project/EPFL
3+ # Copyright (c) 2016 - 2022 Blue Brain Project/EPFL
44#
55# See top-level LICENSE file for details.
66# =============================================================================.
@@ -154,23 +154,9 @@ the USEION statement of any model using this ion\n",
154154 }
155155}
156156
157- #ifndef CORENRN_USE_LEGACY_UNITS
158- #define CORENRN_USE_LEGACY_UNITS 0
159- #endif
160-
161- #if CORENRN_USE_LEGACY_UNITS == 1
162- #define FARADAY 96485.309
163- #define gasconstant 8.3134
164- #else
165- #include " coreneuron/nrnoc/nrnunits_modern.h"
166- #define FARADAY _faraday_codata2018
167- #define gasconstant _gasconstant_codata2018
168- #endif
169-
170- #define ktf (1000 . * gasconstant * (celsius + 273.15 ) / FARADAY)
171-
172- double nrn_nernst (double ci, double co, double z, double celsius) {
173- /* printf("nrn_nernst %g %g %g\n", ci, co, z);*/
157+ // std::log isn't constexpr, but there are argument values for which nrn_nernst
158+ // is a constant expression
159+ constexpr double nrn_nernst (double ci, double co, double z, double celsius) {
174160 if (z == 0 ) {
175161 return 0 .;
176162 }
@@ -179,7 +165,7 @@ double nrn_nernst(double ci, double co, double z, double celsius) {
179165 } else if (co <= 0 .) {
180166 return -1e6 ;
181167 } else {
182- return ktf / z * log (co / ci);
168+ return ktf (celsius) / z * std:: log (co / ci);
183169 }
184170}
185171
@@ -200,24 +186,8 @@ void nrn_wrote_conc(int type,
200186 pe[0 ] = nrn_nernst (pe[1 * _STRIDE], pe[2 * _STRIDE], gimap[type][2 ], celsius);
201187 }
202188}
203-
204- static double efun (double x) {
205- if (fabs (x) < 1e-4 ) {
206- return 1 . - x / 2 .;
207- } else {
208- return x / (exp (x) - 1 );
209- }
210- }
211-
212189nrn_pragma_omp (end declare target)
213190
214- double nrn_ghk (double v, double ci, double co, double z) {
215- double temp = z * v / ktf;
216- double eco = co * efun (temp);
217- double eci = ci * efun (-temp);
218- return (.001 ) * z * FARADAY * (eci - eco);
219- }
220-
221191#if VECTORIZE
222192#define erev pd[0 * _STRIDE] /* From Eion */
223193#define conci pd[1 * _STRIDE]
@@ -257,7 +227,7 @@ ion_style("name_ion", [c_style, e_style, einit, eadvance, cinit])
257227
258228double nrn_nernst_coef(int type) {
259229 /* for computing jacobian element dconc'/dconc */
260- return ktf / charge;
230+ return ktf (celsius) / charge;
261231}
262232
263233/* Must be called prior to any channels which update the currents */
@@ -271,7 +241,8 @@ void nrn_cur_ion(NrnThread* nt, Memb_list* ml, int type) {
271241 pd = ml->data ;
272242 ppd = ml->pdata ;
273243 // clang-format off
274- nrn_pragma_acc (parallel loop present (pd[0 :_cntml_padded * 5 ],
244+ nrn_pragma_acc (parallel loop present (celsius,
245+ pd[0 :_cntml_padded * 5 ],
275246 ppd[0 :_cntml_actual],
276247 nrn_ion_global_map[0 :nrn_ion_global_map_size]
277248 [0 :ion_global_map_member_size])
@@ -311,7 +282,8 @@ void nrn_init_ion(NrnThread* nt, Memb_list* ml, int type) {
311282 // verify if this can be made asynchronous or if there is a strong reason it
312283 // needs to be like this.
313284 // clang-format off
314- nrn_pragma_acc (parallel loop present (pd[0 :_cntml_padded * 5 ],
285+ nrn_pragma_acc (parallel loop present (celsius,
286+ pd[0 :_cntml_padded * 5 ],
315287 ppd[0 :_cntml_actual],
316288 nrn_ion_global_map[0 :nrn_ion_global_map_size]
317289 [0 :ion_global_map_member_size])
0 commit comments