83 double dt2, b, c, d, w, z, u, va, vv;
84 double cai, ca_last, t_last, dct, cvb;
85 double ct1, ct1_last, ct2, ct2_last, ct3, ct3_last;
86 double ct1i, ct1i_last, ct2i, ct2i_last, ct3i, ct3i_last;
91 if(cpet==NULL)
return 2;
95 if(vb<0.0 || vb>=1.0)
return 4;
96 if(fa<=0.0 || fa>1.0)
return 5;
97 va=fa*vb; vv=(1.0-fa)*vb;
100 t_last=0.0;
if(t[0]<t_last) t_last=t[0];
102 ct1_last=ct2_last=ct3_last=ct1i_last=ct2i_last=ct3i_last=0.0;
103 ct1=ct2=ct3=ct1i=ct2i=ct3i=0.0;
104 for(i=0; i<nr; i++) {
106 dt2=0.5*(t[i]-t_last);
112 cai+=(ca[i]+ca_last)*dt2;
115 z = 1.0 + dt2*(k6 + kLoss);
116 u = k2 + k3 + k5 - k3*k4*dt2/w - k5*k6*dt2/z;
117 b = ct1i_last+dt2*ct1_last;
118 c = ct2i_last+dt2*ct2_last;
119 d = ct3i_last+dt2*ct3_last;
121 ct1 = ( k1*cai - u*b + k4*c/w + k6*d/z ) / ( 1.0 + dt2*u);
122 ct1i = ct1i_last + dt2*(ct1_last+ct1);
124 ct2 = (k3*ct1i - k4*c) / w;
125 ct2i = ct2i_last + dt2*(ct2_last+ct2);
127 ct3 = (k5*ct1i - (k6 + kLoss)*d) / z;
128 ct3i = ct3i_last + dt2*(ct3_last+ct3);
131 if(f>0.) {dct = k1*ca[i] - k2*ct1 - kLoss*ct3; cvb = cb[i] - dct/f;}
134 if(vvm==0) cpet[i]= va*cb[i] + vv*cvb + (1.0-vb)*(ct1+ct2+ct3);
135 else cpet[i]= va*cb[i] + vv*cvb + (ct1+ct2+ct3);
136 if(cta!=NULL) {cta[i]=ct1;
if(vvm==0) cta[i]*=(1.0-vb);}
137 if(ctb!=NULL) {ctb[i]=ct2;
if(vvm==0) ctb[i]*=(1.0-vb);}
138 if(ctc!=NULL) {ctc[i]=ct3;
if(vvm==0) ctc[i]*=(1.0-vb);}
139 if(ctab!=NULL) {ctab[i]=va*cb[i];}
140 if(ctvb!=NULL) {ctvb[i]=vv*cvb;}
142 t_last=t[i]; ca_last=ca[i];
143 ct1_last=ct1; ct1i_last=ct1i;
144 ct2_last=ct2; ct2i_last=ct2i;
145 ct3_last=ct3; ct3i_last=ct3i;
193 double cai, ca_last, t_last;
194 double ct1, ct1_last, ct2, ct2_last;
195 double ct1i, ct1i_last, ct2i, ct2i_last;
200 if(ct==NULL)
return 2;
206 t_last=0.0;
if(t[0]<t_last) t_last=t[0];
208 ct1_last=ct2_last=ct1i_last=ct2i_last=ct1=ct2=ct1i=ct2i=0.0;
209 for(i=0; i<nr; i++) {
211 dt2=0.5*(t[i]-t_last);
217 cai+=(ca[i]+ca_last)*dt2;
219 b=ct1i_last+dt2*ct1_last;
220 c=ct2i_last+dt2*ct2_last;
222 ct1 = (k1*cai - (k2+k3)*b) / (1.0 + (k2+k3)*dt2 );
223 ct1i = ct1i_last + dt2*(ct1_last+ct1);
225 ct2 = (k3*ct1i - kLoss*c) / (1.0 + kLoss*dt2);
226 ct2i = ct2i_last + dt2*(ct2_last+ct2);
230 if(cta!=NULL) cta[i]=ct1;
231 if(ctb!=NULL) ctb[i]=ct2;
233 t_last=t[i]; ca_last=ca[i];
234 ct1_last=ct1; ct1i_last=ct1i;
235 ct2_last=ct2; ct2i_last=ct2i;
300 double dt2, b, c, va, vv;
301 double cai, ca_last, t_last, dct, cvb;
302 double ct1, ct1_last, ct2, ct2_last;
303 double ct1i, ct1i_last, ct2i, ct2i_last;
308 if(cpet==NULL)
return 2;
312 if(vb<0.0 || vb>=1.0)
return 4;
313 if(fa<=0.0 || fa>1.0)
return 5;
314 va=fa*vb; vv=(1.0-fa)*vb;
317 t_last=0.0;
if(t[0]<t_last) t_last=t[0];
319 ct1_last=ct2_last=ct1i_last=ct2i_last=ct1=ct2=ct1i=ct2i=0.0;
320 for(i=0; i<nr; i++) {
322 dt2=0.5*(t[i]-t_last);
328 cai+=(ca[i]+ca_last)*dt2;
330 b=ct1i_last+dt2*ct1_last;
331 c=ct2i_last+dt2*ct2_last;
333 ct1 = (k1*cai - (k2+k3)*b) / (1.0 + (k2+k3)*dt2 );
334 ct1i = ct1i_last + dt2*(ct1_last+ct1);
336 ct2 = (k3*ct1i - kL*c) / (1.0 + kL*dt2);
337 ct2i = ct2i_last + dt2*(ct2_last+ct2);
340 if(f>0.) {dct = k1*ca[i] - k2*ct1 - kL*ct2; cvb = cb[i] - dct/f;}
344 if(vvm==0) cpet[i]= va*cb[i] + vv*cvb + (1.0-vb)*(ct1+ct2);
345 else cpet[i]= va*cb[i] + vv*cvb + (ct1+ct2);
346 if(cta!=NULL) {cta[i]=ct1;
if(vvm==0) cta[i]*=(1.0-vb);}
347 if(ctb!=NULL) {ctb[i]=ct2;
if(vvm==0) ctb[i]*=(1.0-vb);}
348 if(ctab!=NULL) {ctab[i]=va*cb[i];}
349 if(ctvb!=NULL) {ctvb[i]=vv*cvb;}
351 t_last=t[i]; ca_last=ca[i];
352 ct1_last=ct1; ct1i_last=ct1i;
353 ct2_last=ct2; ct2i_last=ct2i;
int simC3vpKLoss(double *t, double *ca, double *cb, const int nr, const double k1, const double k2, const double k3, const double k4, const double k5, const double k6, const double kLoss, const double f, const double vb, const double fa, const int vvm, double *cpet, double *cta, double *ctb, double *ctc, double *ctab, double *ctvb)
int simC2l(double *t, double *ca, const int nr, const double k1, const double k2, const double k3, const double kLoss, double *ct, double *cta, double *ctb)
int simC2vl(double *t, double *ca, double *cb, const int nr, const double k1, const double k2, const double k3, const double kL, const double f, const double vb, const double fa, const int vvm, double *cpet, double *cta, double *ctb, double *ctab, double *ctvb)