/* Quinidine model */ /* loop for each row */ /* if interval not NA, use steady state model */ /* if dose record and interval missing , conc for serum and abs compartment equations */ /* use C and Ca in *resp */ void nlme_one_comp_open (longint *nrow, double *Resp, double *inmat) { longint i, nn = *nrow; double ke, ka, tl = 0, delta, C, Ca, interval, *Subject, *Time, *Conc, *Dose, *Interval, *V, *Ka, *Ke, sl = DOUBLE_EPS; /* sl is last subject number, usually */ /* an integer but passed as double. */ /* It is started at an unlikely value. */ Subject = inmat; Time = inmat + nn; Conc = inmat + 2 * nn; Dose = inmat + 3 * nn; Interval = inmat + 4 * nn; V = inmat + 5 * nn; Ka = inmat + 6 * nn; Ke = inmat + 7 * nn; for(i = nn; i--; Resp++, Subject++, Time++, Conc++, Dose++, Interval++, V++, Ka++, Ke++) { ke = *Ke; ka = *Ka; if (*Subject != sl) { /* new Subject */ sl = *Subject; tl = *Time; *Resp = 0; if (!is_na_DOUBLE(Interval)) { /* steady-state dosing */ interval = *Interval; C = *Dose * ka * (1/(1 - exp(-ke * interval)) - 1/(1 - exp(-ka * interval)))/ (*V * (ka - ke)); Ca = *Dose / (*V * (1 - exp(-ka * interval))); } else { /* non-steady-state */ C = 0; Ca = *Dose/ *V; } } else { /* same Subject */ if (!is_na_DOUBLE(Dose)) { if (!is_na_DOUBLE(Interval)) { /* steady-state dosing */ interval = *Interval; C = *Dose * ka * (1/(1 - exp(-ke * interval)) - 1/(1 - exp(-ka * interval)))/ (*V * (ka - ke)); Ca = *Dose / (*V * (1 - exp(-ka * interval))); } else { /* non-steady-state */ delta = *Time - tl; C = C*exp(-ke * delta) + Ca*ka*(exp(-ke*delta) - exp(-ka*delta))/(ka -ke); Ca = Ca * exp(-ka*delta) + *Dose / *V; } tl = *Time; *Resp = 0; } else if (!is_na_DOUBLE(Conc)) { delta = *Time - tl; *Resp = C * exp(-ke * delta) + Ca * ka * (exp(-ke * delta) - exp(-ka * delta))/(ka - ke); } else *Resp = 0; } } }