1 #include <../../nrnconf.h>
26 int t1 = ta->
nsize - 1;
27 if (x <= ta->argvec[t0]) {
29 }
else if (x >= ta->
argvec[t1]) {
32 while (t0 < (t1 - 1)) {
47 }
else if (x >= ta->
max) {
50 double d = (ta->
max - ta->
min) / ((
double) (ta->
nsize - 1));
51 double x1 = (x - ta->
min) / d;
53 ta->
frac = x1 - (double)
j;
59 static double inter(
double frac,
double* tab,
int j) {
61 return (1. - frac) * tab[
j] + frac * tab[
j + 1];
67 static double interp(
double frac,
double x1,
double x2) {
69 return (1. - frac) * x1 + frac * x2;
76 auto*
const ft =
static_cast<FuncTable*
>(vpft);
78 hoc_execerror(
"table not specified in hoc_func_table",
nullptr);
80 if (ft->value && ft->targs[0].nsize == 1) {
83 double* tab = ft->table;
87 for (
size_t i = 0;
i <
n; ++
i) {
91 return inter(ft->targs[0].frac, tab,
j);
93 double fy = ft->targs[1].frac;
94 double y1 =
inter(fy, tab,
j);
95 if (ft->targs[0].frac) {
96 int j1 =
j + ft->targs[1].nsize;
97 double y2 =
inter(fy, tab, j1);
98 return interp(ft->targs[0].frac, y1, y2);
108 auto ppt =
reinterpret_cast<FuncTable**
>(vppt);
118 for (
size_t i = 0;
i <
n; ++
i) {
128 hoc_execerror(
"Vector arguments allowed only for functions",
"of one variable");
136 if (ns != ta[0].nsize) {
146 for (
size_t i = 0;
i <
n; ++
i) {
148 if (ta[
i].nsize < 1) {
154 if (ta[
i].max < ta[
i].min) {
static double inter(double frac, double *tab, int j)
static double interp(double frac, double x1, double x2)
static int arg_index(TableArg *ta, double x)
int hoc_is_object_arg(int narg)
double hoc_func_table(void *vpft, int n, double *args)
int vector_arg_px(int, double **)
void hoc_spec_table(void **vppt, int n)
int hoc_is_double_arg(int narg)
void hoc_obj_ref(Object *obj)
double * hoc_pgetarg(int narg)
Object ** hoc_objgetarg(int)
void hoc_execerror(const char *s1, const char *s2)
void * ecalloc(size_t n, size_t size)
int const size_t const size_t n
HOC interpreter function declarations (included by hocdec.h)