158 const unsigned int nr,
167 if(nr<2 || t==NULL)
return(1);
168 if(p==NULL || (c_BA==NULL && p->
c_BA==NULL))
return(2);
169 if(!(t[0]>=0.0))
return(3);
173 double km_BV=0.0, km_TS=0.0, km_TF=0.0;
174 for(
unsigned int i=0; i<p->
mNr; i++) {
182 double ic_BA_last=0.0, c_BA_last=0.0;
183 double ic_BV_last=0.0, c_BV_last=0.0;
184 double ic_TS_last=0.0, c_TS_last=0.0;
185 double ic_TF_last=0.0, c_TF_last=0.0;
186 for(
unsigned int i=0; i<nr; i++) {
187 double dt2=0.5*(t[i]-t_last);
188 if(!(dt2>=0.0))
return(3);
190 if(c_BA!=NULL) c_BA[i]=c_BA_last;
194 if(p->
c_BA!=NULL) p->
c_BA[i]=c_BA_last;
195 if(p->
c_BV!=NULL) p->
c_BV[i]=c_BV_last;
196 if(p->
c_TS!=NULL) p->
c_TS[i]=c_TS_last;
197 if(p->
c_TF!=NULL) p->
c_TF[i]=c_TF_last;
203 if(p->
Ti>=0.0 && p->
Tdur>0.0 && t[i]>p->
Ti) {
208 double rTS=1.0/(1.0+dt2*(p->
k_TS_BV+km_TS));
209 double rTF=1.0/(1.0+dt2*(p->
k_TF_BV+km_TF));
210 double eBA=ic_BA_last+dt2*c_BA_last;
211 double eBV=ic_BV_last+dt2*c_BV_last;
212 double eTS=ic_TS_last+dt2*c_TS_last;
213 double eTF=ic_TF_last+dt2*c_TF_last;
215 printf(
"dt2=%g\n", dt2);
216 printf(
"%g %g %g %g %g %g %g\n", rBA, rTS, rTF, eBA, eBV, eTS, eTF);
220 double icp_BV=0.0, icp_TS=0.0, icp_TF=0.0;
229 ic_BV = eBV + dt2*ii - p->
kp_BV*dt2*icp_BV
231 + p->
k_TS_BV*dt2*rTS*(dt2*icp_TS + eTS) + p->
k_TF_BV*dt2*rTF*(dt2*icp_TF + eTF);
234 double ic_BA = rBA * (dt2*p->
k_BV_BA*ic_BV + eBA);
236 double ic_TS = rTS * (dt2*p->
k_BA_TS*ic_BA + dt2*p->
kp_TS*icp_TS + eTS);
237 double ic_TF = rTF * (dt2*p->
k_BA_TF*ic_BA + dt2*p->
kp_TF*icp_TF + eTF);
240 ic_BV_last=ic_BV; c_BV_last=(ic_BV-eBV)/dt2;
241 ic_BA_last=ic_BA; c_BA_last=(ic_BA-eBA)/dt2;
242 ic_TS_last=ic_TS; c_TS_last=(ic_TS-eTS)/dt2;
243 ic_TF_last=ic_TF; c_TF_last=(ic_TF-eTF)/dt2;
245 if(c_BA!=NULL) c_BA[i]=c_BA_last;
251 if(p->
c_BA!=NULL) p->
c_BA[i]=c_BA_last;
252 if(p->
c_BV!=NULL) p->
c_BV[i]=c_BV_last;
253 if(p->
c_TS!=NULL) p->
c_TS[i]=c_TS_last;
254 if(p->
c_TF!=NULL) p->
c_TF[i]=c_TF_last;
289 double cp_last, t_last;
290 double cpi, cpi_last;
295 if(t==NULL || ct==NULL || cp==NULL)
return 2;
298 if(!(k>=0.0))
return 3;
301 t_last=0.0;
if(t[0]<t_last) t_last=t[0];
302 cp_last=0.0; cpi=0.0; cpi_last=0.0; cpi_last=0.0;
303 for(i=0; i<nr; i++) {
305 dt2=0.5*(t[i]-t_last);
310 cp[i] = (ct[i] - k*(cpi_last + dt2*cp_last)) / (1.0 + dt2*k);
311 cpi = cpi_last + dt2*(cp_last+cp[i]);
314 t_last=t[i]; cp_last=cp[i]; cpi_last=cpi;