1 #include <../../nmodlconf.h> 12 #define P(arg) fputs(arg, fcout) 38 extern Symbol* cvode_nrn_cur_solve_;
39 extern Symbol* cvode_nrn_current_solve_;
40 extern List* state_discon_list_;
47 static List *vectorize_replacements;
48 extern char* cray_pragma();
53 #if __TURBOC__ || SYSV || VMS 63 P(
"#if EXTRACELLULAR\n");
64 P(
" _nd = _ml->_nodelist[_iml];\n");
65 P(
" if (_nd->_extnode) {\n");
66 P(
" _v = NODEV(_nd) +_nd->_extnode->_v[0];\n");
71 P(
" _v = NODEV(_nd);\n");
74 P(
" if (use_cachevec) {\n");
75 P(
" _v = VEC_V(_ni[_iml]);\n");
79 P(
" _nd = _ml->_nodelist[_iml];\n");
80 P(
" _v = NODEV(_nd);\n");
87 P(
" _nd = _ml->_nodelist[_iml];\n");
88 P(
" _v = NODEV(_nd);\n");
91 P(
" if (use_cachevec) {\n");
92 P(
" _v = VEC_V(_ni[_iml]);\n");
96 P(
" _nd = _ml->_nodelist[_iml];\n");
97 P(
" _v = NODEV(_nd);\n");
123 P(
"/* NOT VECTORIZED */\n#define NRN_VECTORIZED 0\n");
128 P(
"#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include \"mathlib.h\"\n");
129 P(
"#include \"common.h\"\n#include \"softbus.h\"\n");
130 P(
"#include \"sbtypes.h\"\n#include \"Solver.h\"\n");
132 P(
"#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include \"scoplib.h\"\n");
134 P(
"#define nil 0\n");
135 P(
"#include \"md1redef.h\"\n");
136 P(
"#include \"section.h\"\n");
137 P(
"#include \"nrniv_mf.h\"\n");
138 P(
"#include \"md2redef.h\"\n");
143 P(
"static int _reset;\n");
154 P(
"static int error;\n");
158 P(
"int _ninits = 0;\n");
159 P(
"static int _match_recurse=1;\n");
163 P(
"_modl_cleanup(){ _match_recurse=1;}\n");
172 #if SIMSYS || HMODL || NMODL 174 P(
"static double *_p;\n\n");
188 P(
"\nstatic void initmodel() {\n int _i; double _save;");
191 P(
"\ninitmodel() {\n int _i; double _save;");
193 #if (!(SIMSYS || HMODL || NMODL)) 194 P(
"\ninitmodel(_pp) double _pp[]; {\n int _i; double _save; _p = _pp;");
197 P(
"_initlists();\n");
205 P(
"\n_init_match(_save);");
213 P(
"\nstatic void nrn_init(NrnThread* _nt, _Memb_list* _ml, int _type){\n");
214 P(
"Node *_nd; double _v; int* _ni; int _iml, _cntml;\n");
216 P(
" _ni = _ml->_nodeindices;\n");
218 P(
"_cntml = _ml->_nodecount;\n");
219 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
220 P(
" _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml];\n");
222 P(
"\nstatic nrn_init(_prop, _v) Prop *_prop; double _v; {\n");
223 P(
" _p = _prop->param; _ppvar = _prop->dparam;\n");
226 P(
" _tsav = -1e20;\n");
231 P(
" initmodel();\n");
240 P(
"\nstatic double _nrn_current(double _v){double _current=0.;v=_v;");
242 if (cvode_nrn_current_solve_) {
243 fprintf(
fcout,
"if (cvode_active_) { %s(); }\n", cvode_nrn_current_solve_->
name);
247 if (currents->
next != currents) {
254 P(
"\n} return _current;\n}\n");
260 P(
"\nstatic void nrn_cur(NrnThread* _nt, _Memb_list* _ml, int _type){\n");
261 P(
"Node *_nd; int* _ni; double _rhs, _v; int _iml, _cntml;\n");
263 P(
" _ni = _ml->_nodeindices;\n");
265 P(
"_cntml = _ml->_nodecount;\n");
266 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
267 P(
" _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml];\n");
269 if (currents->
next != currents) {
275 if (cvode_nrn_cur_solve_) {
276 fprintf(
fcout,
"if (cvode_active_) { %s(); }\n", cvode_nrn_cur_solve_->
name);
278 if (currents->
next != currents) {
280 P(
" _g = _nrn_current(_v + .001);\n");
282 if (state_discon_list_) {
283 P(
" state_discon_flag_ = 1; _rhs = _nrn_current(_v); state_discon_flag_ = 0;\n");
285 P(
" _rhs = _nrn_current(_v);\n");
288 P(
" _g = (_g - _rhs)/.001;\n");
292 P(
" _g *= 1.e2/(_nd_area);\n");
293 P(
" _rhs *= 1.e2/(_nd_area);\n");
297 P(
" NODERHS(_nd) += _rhs;\n");
300 P(
" if (use_cachevec) {\n");
301 P(
" VEC_RHS(_ni[_iml]) += _rhs;\n");
305 P(
" NODERHS(_nd) += _rhs;\n");
307 P(
" if (_nt->_nrn_fast_imem) { _nt->_nrn_fast_imem->_nrn_sav_rhs[_ni[_iml]] += _rhs; }\n");
309 P(
"#if EXTRACELLULAR\n");
310 P(
" if (_nd->_extnode) {\n");
311 P(
" *_nd->_extnode->_rhs[0] += _rhs;\n");
316 P(
" NODERHS(_nd) -= _rhs;\n");
319 P(
" if (use_cachevec) {\n");
320 P(
" VEC_RHS(_ni[_iml]) -= _rhs;\n");
324 P(
" NODERHS(_nd) -= _rhs;\n");
333 P(
"\nstatic void nrn_jacob(NrnThread* _nt, _Memb_list* _ml, int _type){\n");
334 P(
"Node *_nd; int* _ni; int _iml, _cntml;\n");
336 P(
" _ni = _ml->_nodeindices;\n");
338 P(
"_cntml = _ml->_nodecount;\n");
339 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
340 P(
" _p = _ml->_data[_iml];\n");
342 P(
" _nd = _ml->_nodelist[_iml];\n");
344 P(
" NODED(_nd) -= _g;\n");
347 P(
" if (use_cachevec) {\n");
348 P(
" VEC_D(_ni[_iml]) -= _g;\n");
352 P(
" NODED(_nd) -= _g;\n");
354 P(
" if (_nt->_nrn_fast_imem) { _nt->_nrn_fast_imem->_nrn_sav_d[_ni[_iml]] -= _g; }\n");
356 P(
"#if EXTRACELLULAR\n");
357 P(
" if (_nd->_extnode) {\n");
358 P(
" *_nd->_extnode->_d[0] += _g;\n");
363 P(
" NODED(_nd) += _g;\n");
366 P(
" if (use_cachevec) {\n");
367 P(
" VEC_D(_ni[_iml]) += _g;\n");
371 P(
" _nd = _ml->_nodelist[_iml];\n");
372 P(
" NODED(_nd) += _g;\n");
382 P(
"\nstatic void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type){\n");
384 P(
"\nstatic nrn_state(_prop, _v) Prop *_prop; double _v; {\n");
386 if (nrnstate || currents->
next == currents) {
388 P(
"Node *_nd; double _v = 0.0; int* _ni; int _iml, _cntml;\n");
390 P(
"double _dtsav = dt;\n" 391 "if (secondorder) { dt *= 0.5; }\n");
394 P(
" _ni = _ml->_nodeindices;\n");
396 P(
"_cntml = _ml->_nodecount;\n");
397 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
398 P(
" _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml];\n");
399 P(
" _nd = _ml->_nodelist[_iml];\n");
402 P(
" _p = _prop->param; _ppvar = _prop->dparam;\n");
409 if (currents->
next == currents) {
427 P(
"double _break, _save;\n{\n");
429 P(
"\nmodel(_pp, _indepindex) double _pp[]; int _indepindex; {\n");
430 P(
"double _break, _save;");
443 P(
"\nstatic void terminal(){}\n");
450 P(
"\nterminal(_pp) double _pp[];{");
459 #if NMODL || SIMSYS || HMODL 460 P(
"\nstatic void _initlists() {\n");
462 P(
"\n_initlists() {\n");
464 P(
" int _i; static int _first = 1;\n");
465 P(
" if (!_first) return;\n");
467 P(
"_first = 0;\n}\n");
485 #define IONCONC 010000 499 " for (_i=0; _i<%d; _i++) %s[_i] = %s0;\n",
535 }
else if (q->
itemtype == VERBATIM) {
547 }
else if (q->
itemtype == VERBATIM) {
561 for (q = q1; q != q2; q = q->
next) {
562 if (
buf[0] !=
'\0') {
593 for (i = 0; i <
indent; i++) {
612 #if GLOBFUNCT && NMODL 633 for (j=1; j <
narg; ++
j) {
648 P(
"/* VECTORIZED */\n#define NRN_VECTORIZED 1\n");
649 P(
"#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include \"scoplib.h\"\n");
651 P(
"#define nil 0\n");
652 P(
"#include \"md1redef.h\"\n");
653 P(
"#include \"section.h\"\n");
654 P(
"#include \"nrniv_mf.h\"\n");
655 P(
"#include \"md2redef.h\"\n");
658 P(
"static int _reset;\n");
666 P(
"static int error;\n");
667 P(
"static int _ninits = 0;\n");
668 P(
"static int _match_recurse=1;\n");
669 P(
"static void _modl_cleanup(){ _match_recurse=1;}\n");
683 P(
"\nstatic void initmodel(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt) {\n int _i; double _save;");
689 P(
"\n_init_match(_save);");
695 P(
"\nstatic void nrn_init(NrnThread* _nt, _Memb_list* _ml, int _type){\n");
696 P(
"double* _p; Datum* _ppvar; Datum* _thread;\n");
697 P(
"Node *_nd; double _v; int* _ni; int _iml, _cntml;\n");
699 P(
" _ni = _ml->_nodeindices;\n");
701 P(
"_cntml = _ml->_nodecount;\n");
702 P(
"_thread = _ml->_thread;\n");
704 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
705 P(
" _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml];\n");
708 P(
" _tsav = -1e20;\n");
713 P(
" initmodel(_p, _ppvar, _thread, _nt);\n");
720 P(
"\nstatic double _nrn_current(double* _p, Datum* _ppvar, Datum* _thread, NrnThread* _nt, double _v){double _current=0.;v=_v;");
722 if (cvode_nrn_current_solve_) {
723 fprintf(
fcout,
"if (cvode_active_) { %s(_p, _ppvar, _thread, _nt); }\n", cvode_nrn_current_solve_->
name);
727 if (currents->
next != currents) {
732 diag(
"current can only be LOCAL in a BREAKPOINT if CONDUCTANCE statements are used. ",
SYM(q)->
name);
737 P(
"\n} return _current;\n}\n");
744 P(
"\nstatic void nrn_cur(NrnThread* _nt, _Memb_list* _ml, int _type) {\n");
745 P(
"double* _p; Datum* _ppvar; Datum* _thread;\n");
746 P(
"Node *_nd; int* _ni; double _rhs, _v; int _iml, _cntml;\n");
748 P(
" _ni = _ml->_nodeindices;\n");
750 P(
"_cntml = _ml->_nodecount;\n");
751 P(
"_thread = _ml->_thread;\n");
752 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
753 P(
" _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml];\n");
755 if (currents->
next != currents) {
761 if (cvode_nrn_cur_solve_) {
762 fprintf(
fcout,
"if (cvode_active_) { %s(_p, _ppvar, _thread, _nt); }\n", cvode_nrn_cur_solve_->
name);
764 if (currents->
next != currents) {
772 P(
" _g = _nrn_current(_p, _ppvar, _thread, _nt, _v + .001);\n");
774 if (state_discon_list_) {
775 P(
" state_discon_flag_ = 1; _rhs = _nrn_current(_v); state_discon_flag_ = 0;\n");
777 P(
" _rhs = _nrn_current(_p, _ppvar, _thread, _nt, _v);\n");
780 P(
" _g = (_g - _rhs)/.001;\n");
785 P(
" _g *= 1.e2/(_nd_area);\n");
786 P(
" _rhs *= 1.e2/(_nd_area);\n");
790 P(
" NODERHS(_nd) += _rhs;\n");
793 P(
" if (use_cachevec) {\n");
794 P(
" VEC_RHS(_ni[_iml]) += _rhs;\n");
798 P(
" NODERHS(_nd) += _rhs;\n");
800 P(
" if (_nt->_nrn_fast_imem) { _nt->_nrn_fast_imem->_nrn_sav_rhs[_ni[_iml]] += _rhs; }\n");
802 P(
"#if EXTRACELLULAR\n");
803 P(
" if (_nd->_extnode) {\n");
804 P(
" *_nd->_extnode->_rhs[0] += _rhs;\n");
809 P(
" NODERHS(_nd) -= _rhs;\n");
812 P(
" if (use_cachevec) {\n");
813 P(
" VEC_RHS(_ni[_iml]) -= _rhs;\n");
817 P(
" NODERHS(_nd) -= _rhs;\n");
826 P(
"\nstatic void nrn_jacob(NrnThread* _nt, _Memb_list* _ml, int _type) {\n");
827 P(
"double* _p; Datum* _ppvar; Datum* _thread;\n");
828 P(
"Node *_nd; int* _ni; int _iml, _cntml;\n");
830 P(
" _ni = _ml->_nodeindices;\n");
832 P(
"_cntml = _ml->_nodecount;\n");
833 P(
"_thread = _ml->_thread;\n");
834 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
835 P(
" _p = _ml->_data[_iml];\n");
837 P(
" _nd = _ml->_nodelist[_iml];\n");
839 P(
" NODED(_nd) -= _g;\n");
842 P(
" if (use_cachevec) {\n");
843 P(
" VEC_D(_ni[_iml]) -= _g;\n");
847 P(
" NODED(_nd) -= _g;\n");
849 P(
" if (_nt->_nrn_fast_imem) { _nt->_nrn_fast_imem->_nrn_sav_d[_ni[_iml]] -= _g; }\n");
851 P(
"#if EXTRACELLULAR\n");
852 P(
" if (_nd->_extnode) {\n");
853 P(
" *_nd->_extnode->_d[0] += _g;\n");
858 P(
" NODED(_nd) += _g;\n");
861 P(
" if (use_cachevec) {\n");
862 P(
" VEC_D(_ni[_iml]) += _g;\n");
866 P(
" _nd = _ml->_nodelist[_iml];\n");
867 P(
" NODED(_nd) += _g;\n");
877 P(
"\nstatic void nrn_state(NrnThread* _nt, _Memb_list* _ml, int _type) {\n");
878 if (nrnstate || currents->
next == currents) {
879 P(
"double* _p; Datum* _ppvar; Datum* _thread;\n");
880 P(
"Node *_nd; double _v = 0.0; int* _ni; int _iml, _cntml;\n");
882 P(
"double _dtsav = dt;\n" 883 "if (secondorder) { dt *= 0.5; }\n");
886 P(
" _ni = _ml->_nodeindices;\n");
888 P(
"_cntml = _ml->_nodecount;\n");
889 P(
"_thread = _ml->_thread;\n");
890 P(
"for (_iml = 0; _iml < _cntml; ++_iml) {\n");
891 P(
" _p = _ml->_data[_iml]; _ppvar = _ml->_pdata[_iml];\n");
892 P(
" _nd = _ml->_nodelist[_iml];\n");
899 if (currents->
next == currents) {
910 P(
"\nstatic void terminal(){}\n");
918 P(
"\nstatic void _initlists(){\n");
919 P(
" double _x; double* _p = &_x;\n");
920 P(
" int _i; static int _first = 1;\n");
921 P(
" if (!_first) return;\n");
923 P(
"_first = 0;\n}\n");
924 P(
"\n#if defined(__cplusplus)\n} /* extern \"C\" */\n#endif\n");
929 if (!vectorize_replacements) {
930 vectorize_replacements =
newlist();
938 if (vectorize_replacements) {
939 ITERATE(q1, vectorize_replacements) {
950 if (vectorize_replacements) {
951 ITERATE(q, vectorize_replacements) {
959 char* cray_pragma() {
960 static char buf[] =
"\ 962 \n#pragma _CRI ivdep\ 979 if (strcmp(
SYM(q)->
name,
"v") == 0) {
987 diag(
"modelfunc contains item which is not a SYMBOL or STRING", (
char*)0);
993 if (strcmp(
SYM(q)->
name,
"{") == 0) {
1000 for (q = m->
prev; q != m; q = q->
prev) {
1002 if (strcmp(
SYM(q)->
name,
"}") == 0) {
1044 P(
"* 1.e2/(_nd_area)");
List * get_ion_variables(int)
void c_out_vectorize(const char *)
void vectorize_do_substitute()
char * items_as_string(Item *q1, Item *q2)
#define ITERATE(itm, lst)
Item * lappendsym(List *list, Symbol *sym)
List * set_ion_variables(int)
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
static void conductance_cout()
Symbol * breakpoint_current(Symbol *s)
void debugprintitem(Item *q)
Item * lappendstr(List *list, char *str)
void vectorize_substitute(Item *q, char *str)
fprintf(stderr, "Don't know the location of params at %p\, pp)
NMODL parser global flags / functions.
Item * lappenditem(List *list, Item *item)
void verbatim_adjust(char *q)
void replacstr(Item *q, char *s)
void cvode_rw_cur(char *)
List * end_dion_stmt(char *strdel)
Item * vectorize_replacement_item(Item *)