TPCCLIB
Loading...
Searching...
No Matches
sim3cms.c
Go to the documentation of this file.
1
4/*****************************************************************************/
5#include "tpcclibConfig.h"
6/*****************************************************************************/
7#include <stdio.h>
8#include <stdlib.h>
9#include <math.h>
10#include <time.h>
11#include <string.h>
12/*****************************************************************************/
13#include "tpccm.h"
14/*****************************************************************************/
15
16/*****************************************************************************/
34 double *t,
36 double *ca,
38 const int nr,
40 double k1,
42 double k2,
44 double k3,
46 double k4,
48 double k5,
50 double k6,
52 double *ct,
54 double *cta,
56 double *ctb,
58 double *ctc
59) {
60 int i;
61 double b, c, d, w, z, dt2;
62 double cai, ca_last, t_last;
63 double ct1, ct1_last, ct2, ct2_last, ct3, ct3_last;
64 double ct1i, ct1i_last, ct2i, ct2i_last, ct3i, ct3i_last;
65
66
67 /* Check for data */
68 if(nr<2) return 1;
69 if(ct==NULL) return 2;
70
71 /* Check actual parameter number */
72 if(k1<0.0) return 3;
73 if(k3<=0.0) {k3=0.0; if(k2<=0.0) k2=0.0;}
74 else if(k5<=0.0) {k5=0.0; if(k4<=0.0) k4=0.0;}
75 else {if(k6<=0.0) k6=0.0;}
76
77 /* Calculate curves */
78 t_last=0.0; if(t[0]<t_last) t_last=t[0];
79 cai=ca_last=0.0;
80 ct1_last=ct2_last=ct3_last=ct1i_last=ct2i_last=ct3i_last=0.0;
81 ct1=ct2=ct3=ct1i=ct2i=ct3i=0.0;
82 for(i=0; i<nr; i++) {
83 /* delta time / 2 */
84 dt2=0.5*(t[i]-t_last);
85 /* calculate values */
86 if(dt2<0.0) {
87 return 5;
88 } else if(dt2>0.0) {
89 /* arterial integral */
90 cai+=(ca[i]+ca_last)*dt2;
91 /* partial results */
92 b=ct1i_last+dt2*ct1_last;
93 c=ct2i_last+dt2*ct2_last;
94 d=ct3i_last+dt2*ct3_last;
95 w=k4 + k5 - (k5*k6*dt2)/(1.0+k6*dt2);
96 z=1.0+w*dt2;
97 /* 1st tissue compartment and its integral */
98 ct1 = (
99 + k1*z*cai + (k3*k4*dt2 - (k2+k3)*z)*b
100 + k4*c + k4*k6*dt2*d/(1.0+k6*dt2)
101 ) / ( z*(1.0 + dt2*(k2+k3)) - k3*k4*dt2*dt2 );
102 ct1i = ct1i_last + dt2*(ct1_last+ct1);
103 /* 2nd tissue compartment and its integral */
104 ct2 = (k3*ct1i - w*c + k6*d/(1.0+k6*dt2)) / z;
105 ct2i = ct2i_last + dt2*(ct2_last+ct2);
106 /* 3rd tissue compartment and its integral */
107 ct3 = (k5*ct2i - k6*d) / (1.0 + k6*dt2);
108 ct3i = ct3i_last + dt2*(ct3_last+ct3);
109 }
110 /* copy values to argument arrays */
111 ct[i]=ct1+ct2+ct3;
112 if(cta!=NULL) cta[i]=ct1;
113 if(ctb!=NULL) ctb[i]=ct2;
114 if(ctc!=NULL) ctc[i]=ct3;
115 /* prepare to the next loop */
116 t_last=t[i]; ca_last=ca[i];
117 ct1_last=ct1; ct1i_last=ct1i;
118 ct2_last=ct2; ct2i_last=ct2i;
119 ct3_last=ct3; ct3i_last=ct3i;
120 }
121
122 return 0;
123}
124/*****************************************************************************/
125
126/*****************************************************************************/
145 double *t,
147 double *ca,
149 double *cb,
151 const int nr,
153 const double k1,
155 const double k2,
157 const double k3,
159 const double k4,
161 const double k5,
163 const double k6,
165 const double f,
167 const double vb,
169 const double fa,
173 const int vvm,
175 double *cpet,
177 double *cta,
179 double *ctb,
181 double *ctc,
183 double *ctab,
185 double *ctvb
186) {
187 int i;
188 double b, c, d, w, z, dt2, va, vv;
189 double cai, ca_last, t_last, dct, cvb;
190 double ct1, ct1_last, ct2, ct2_last, ct3, ct3_last;
191 double ct1i, ct1i_last, ct2i, ct2i_last, ct3i, ct3i_last;
192
193
194 /* Check for data */
195 if(nr<2) return 1;
196 if(cpet==NULL) return 2;
197
198 /* Check parameters */
199 if(k1<0.0) return 3;
200 if(vb<0.0 || vb>=1.0) return 4;
201 if(fa<=0.0 || fa>1.0) return 5;
202 va=fa*vb; vv=(1.0-fa)*vb;
203
204 /* Calculate curves */
205 t_last=0.0; if(t[0]<t_last) t_last=t[0];
206 cai=ca_last=0.0;
207 ct1_last=ct2_last=ct3_last=ct1i_last=ct2i_last=ct3i_last=0.0;
208 ct1=ct2=ct3=ct1i=ct2i=ct3i=0.0;
209 for(i=0; i<nr; i++) {
210 /* delta time / 2 */
211 dt2=0.5*(t[i]-t_last);
212 /* calculate values */
213 if(dt2<0.0) {
214 return 5;
215 } else if(dt2>0.0) {
216 /* arterial integral */
217 cai+=(ca[i]+ca_last)*dt2;
218 /* partial results */
219 b=ct1i_last+dt2*ct1_last;
220 c=ct2i_last+dt2*ct2_last;
221 d=ct3i_last+dt2*ct3_last;
222 w=k4 + k5 - (k5*k6*dt2)/(1.0+k6*dt2);
223 z=1.0+w*dt2;
224 /* 1st tissue compartment and its integral */
225 ct1 = (
226 + k1*z*cai + (k3*k4*dt2 - (k2+k3)*z)*b
227 + k4*c + k4*k6*dt2*d/(1.0+k6*dt2)
228 ) / ( z*(1.0 + dt2*(k2+k3)) - k3*k4*dt2*dt2 );
229 ct1i = ct1i_last + dt2*(ct1_last+ct1);
230 /* 2nd tissue compartment and its integral */
231 ct2 = (k3*ct1i - w*c + k6*d/(1.0+k6*dt2)) / z;
232 ct2i = ct2i_last + dt2*(ct2_last+ct2);
233 /* 3rd tissue compartment and its integral */
234 ct3 = (k5*ct2i - k6*d) / (1.0 + k6*dt2);
235 ct3i = ct3i_last + dt2*(ct3_last+ct3);
236 }
237 /* Venous curve */
238 if(f>0.) {dct = k1*ca[i] - k2*ct1; cvb = cb[i] - dct/f;} else cvb=cb[i];
239 /* copy values to argument arrays */
240 if(vvm==0) cpet[i]= va*cb[i] + vv*cvb + (1.0-vb)*(ct1+ct2+ct3);
241 else cpet[i]= va*cb[i] + vv*cvb + (ct1+ct2+ct3);
242 if(cta!=NULL) {cta[i]=ct1; if(vvm==0) cta[i]*=(1.0-vb);}
243 if(ctb!=NULL) {ctb[i]=ct2; if(vvm==0) ctb[i]*=(1.0-vb);}
244 if(ctc!=NULL) {ctc[i]=ct3; if(vvm==0) ctc[i]*=(1.0-vb);}
245 if(ctab!=NULL) {ctab[i]=va*cb[i];}
246 if(ctvb!=NULL) {ctvb[i]=vv*cvb;}
247 /* prepare to the next loop */
248 t_last=t[i]; ca_last=ca[i];
249 ct1_last=ct1; ct1i_last=ct1i;
250 ct2_last=ct2; ct2i_last=ct2i;
251 ct3_last=ct3; ct3i_last=ct3i;
252 }
253
254 return 0;
255}
256/*****************************************************************************/
257
258/*****************************************************************************/
int simC3vs(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 f, const double vb, const double fa, const int vvm, double *cpet, double *cta, double *ctb, double *ctc, double *ctab, double *ctvb)
Definition sim3cms.c:143
int simC3s(double *t, double *ca, const int nr, double k1, double k2, double k3, double k4, double k5, double k6, double *ct, double *cta, double *ctb, double *ctc)
Definition sim3cms.c:32
Header file for libtpccm.