TPCCLIB
Loading...
Searching...
No Matches
sim3cmp.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/*****************************************************************************/
35 double *t,
37 double *ca,
39 const int nr,
41 const double k1,
43 const double k2,
45 const double k3,
47 const double k4,
49 const double k5,
51 const double k6,
53 double *ct,
55 double *cta,
57 double *ctb,
59 double *ctc
60) {
61 int i;
62 double dt2, r, s, u, v, w;
63 double cai, ca_last, t_last;
64 double ct1, ct1_last, ct2, ct2_last, ct3, ct3_last;
65 double ct1i, ct1i_last, ct2i, ct2i_last, ct3i, ct3i_last;
66
67
68 /* Check for data */
69 if(nr<2) return 1;
70 if(ct==NULL) return 2;
71
72 /* Check parameters */
73 if(k1<0.0) return 3;
74
75 /* Calculate curves */
76 t_last=0.0; if(t[0]<t_last) t_last=t[0];
77 cai=ca_last=0.0;
78 ct1_last=ct2_last=ct3_last=ct1i_last=ct2i_last=ct3i_last=0.0;
79 ct1=ct2=ct3=ct1i=ct2i=ct3i=0.0;
80 for(i=0; i<nr; i++) {
81 /* delta time / 2 */
82 dt2=0.5*(t[i]-t_last);
83 /* calculate values */
84 if(dt2<0.0) {
85 return 5;
86 } else if(dt2>0.0) {
87 /* arterial integral */
88 cai+=(ca[i]+ca_last)*dt2;
89 /* Calculate partial results */
90 r=1.0+k4*dt2;
91 s=1.0+k6*dt2;
92 u=ct1i_last+dt2*ct1_last;
93 v=ct2i_last+dt2*ct2_last;
94 w=ct3i_last+dt2*ct3_last;
95 /* 1st tissue compartment and its integral */
96 ct1 = ( k1*cai - (k2 + (k3/r) + (k5/s))*u + (k4/r)*v + (k6/s)*w )
97 / ( 1.0 + dt2*(k2 + (k3/r) + (k5/s)) );
98 ct1i = ct1i_last + dt2*(ct1_last+ct1);
99 /* 2nd tissue compartment and its integral */
100 ct2 = (k3*ct1i - k4*v) / r;
101 ct2i = ct2i_last + dt2*(ct2_last+ct2);
102 /* 3rd tissue compartment and its integral */
103 ct3 = (k5*ct1i - k6*w) / s;
104 ct3i = ct3i_last + dt2*(ct3_last+ct3);
105 }
106 /* copy values to argument arrays; set very small values to zero */
107 ct[i]=ct1+ct2+ct3;
108 if(cta!=NULL) cta[i]=ct1;
109 if(ctb!=NULL) ctb[i]=ct2;
110 if(ctc!=NULL) ctc[i]=ct3;
111 /* prepare to the next loop */
112 t_last=t[i]; ca_last=ca[i];
113 ct1_last=ct1; ct1i_last=ct1i;
114 ct2_last=ct2; ct2i_last=ct2i;
115 ct3_last=ct3; ct3i_last=ct3i;
116 }
117
118 return 0;
119}
120/*****************************************************************************/
121
122/*****************************************************************************/
142 double *t,
144 double *ca,
146 double *cb,
148 const int nr,
150 const double k1,
152 const double k2,
154 const double k3,
156 const double k4,
158 const double k5,
160 const double k6,
162 const double f,
164 const double vb,
166 const double fa,
170 const int vvm,
172 double *cpet,
174 double *cta,
176 double *ctb,
178 double *ctc,
180 double *ctab,
182 double *ctvb
183) {
184 int i;
185 double dt2, r, s, u, v, w, va, vv;
186 double cai, ca_last, t_last, dct, cvb;
187 double ct1, ct1_last, ct2, ct2_last, ct3, ct3_last;
188 double ct1i, ct1i_last, ct2i, ct2i_last, ct3i, ct3i_last;
189
190
191 /* Check for data */
192 if(nr<2) return 1;
193 if(cpet==NULL) return 2;
194
195 /* Check parameters */
196 if(k1<0.0) return 3;
197 if(vb<0.0 || vb>=1.0) return 4;
198 if(fa<=0.0 || fa>1.0) return 5;
199 va=fa*vb; vv=(1.0-fa)*vb;
200
201 /* Calculate curves */
202 t_last=0.0; if(t[0]<t_last) t_last=t[0];
203 cai=ca_last=0.0;
204 ct1_last=ct2_last=ct3_last=ct1i_last=ct2i_last=ct3i_last=0.0;
205 ct1=ct2=ct3=ct1i=ct2i=ct3i=0.0;
206 for(i=0; i<nr; i++) {
207 /* delta time / 2 */
208 dt2=0.5*(t[i]-t_last);
209 /* calculate values */
210 if(dt2<0.0) {
211 return 5;
212 } else if(dt2>0.0) {
213 /* arterial integral */
214 cai+=(ca[i]+ca_last)*dt2;
215 /* Calculate partial results */
216 r=1.0+k4*dt2;
217 s=1.0+k6*dt2;
218 u=ct1i_last+dt2*ct1_last;
219 v=ct2i_last+dt2*ct2_last;
220 w=ct3i_last+dt2*ct3_last;
221 /* 1st tissue compartment and its integral */
222 ct1 = ( k1*cai - (k2 + (k3/r) + (k5/s))*u + (k4/r)*v + (k6/s)*w )
223 / ( 1.0 + dt2*(k2 + (k3/r) + (k5/s)) );
224 ct1i = ct1i_last + dt2*(ct1_last+ct1);
225 /* 2nd tissue compartment and its integral */
226 ct2 = (k3*ct1i - k4*v) / r;
227 ct2i = ct2i_last + dt2*(ct2_last+ct2);
228 /* 3rd tissue compartment and its integral */
229 ct3 = (k5*ct1i - k6*w) / s;
230 ct3i = ct3i_last + dt2*(ct3_last+ct3);
231 }
232 /* Venous curve */
233 if(f>0.) {dct = k1*ca[i] - k2*ct1; cvb = cb[i] - dct/f;} else cvb=cb[i];
234 /* copy values to argument arrays */
235 if(vvm==0) cpet[i]= va*cb[i] + vv*cvb + (1.0-vb)*(ct1+ct2+ct3);
236 else cpet[i]= va*cb[i] + vv*cvb + (ct1+ct2+ct3);
237 if(cta!=NULL) {cta[i]=ct1; if(vvm==0) cta[i]*=(1.0-vb);}
238 if(ctb!=NULL) {ctb[i]=ct2; if(vvm==0) ctb[i]*=(1.0-vb);}
239 if(ctc!=NULL) {ctc[i]=ct3; if(vvm==0) ctc[i]*=(1.0-vb);}
240 if(ctab!=NULL) {ctab[i]=va*cb[i];}
241 if(ctvb!=NULL) {ctvb[i]=vv*cvb;}
242 /* prepare to the next loop */
243 t_last=t[i]; ca_last=ca[i];
244 ct1_last=ct1; ct1i_last=ct1i;
245 ct2_last=ct2; ct2i_last=ct2i;
246 ct3_last=ct3; ct3i_last=ct3i;
247 }
248
249 return 0;
250}
251/*****************************************************************************/
252
253/*****************************************************************************/
int simC3p(double *t, double *ca, const int nr, const double k1, const double k2, const double k3, const double k4, const double k5, const double k6, double *ct, double *cta, double *ctb, double *ctc)
Definition sim3cmp.c:33
int simC3vp(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 sim3cmp.c:140
Header file for libtpccm.