TPCCLIB
Toggle main menu visibility
Loading...
Searching...
No Matches
libtpccm
sim2cm.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
/*****************************************************************************/
31
int
simC2
(
33
double
*t,
35
double
*ca,
37
const
int
nr,
39
const
double
k1,
41
const
double
k2,
43
const
double
k3,
45
const
double
k4,
47
double
*ct,
49
double
*cta,
51
double
*ctb
52
) {
53
int
i;
54
double
dt2, r, u, v;
55
double
cai, ca_last, t_last;
56
double
ct1, ct1_last, ct2, ct2_last;
57
double
ct1i, ct1i_last, ct2i, ct2i_last;
58
59
60
/* Check for data */
61
if
(nr<2)
return
1;
62
if
(t==NULL || ca==NULL || ct==NULL)
return
2;
63
64
/* Check parameters */
65
if
(k1<0.0)
return
3;
66
67
/* Calculate curves */
68
t_last=0.0;
if
(t[0]<t_last) t_last=t[0];
69
cai=ca_last=0.0;
70
ct1_last=ct2_last=ct1i_last=ct2i_last=0.0;
71
ct1=ct2=ct1i=ct2i=0.0;
72
for
(i=0; i<nr; i++) {
73
/* delta time / 2 */
74
dt2=0.5*(t[i]-t_last);
75
/* calculate values */
76
if
(dt2<0.0) {
77
return
5;
78
}
else
if
(dt2>0.0) {
79
/* arterial integral */
80
cai+=(ca[i]+ca_last)*dt2;
81
/* Calculate partial results */
82
r=1.0+k4*dt2;
83
u=ct1i_last+dt2*ct1_last;
84
v=ct2i_last+dt2*ct2_last;
85
/* 1st tissue compartment and its integral */
86
ct1 = ( k1*cai - (k2 + (k3/r))*u + (k4/r)*v ) / ( 1.0 + dt2*(k2 + (k3/r)) );
87
ct1i = ct1i_last + dt2*(ct1_last+ct1);
88
/* 2nd tissue compartment and its integral */
89
ct2 = (k3*ct1i - k4*v) / r;
90
ct2i = ct2i_last + dt2*(ct2_last+ct2);
91
}
92
/* copy values to argument arrays */
93
ct[i]=ct1+ct2;
94
if
(cta!=NULL) cta[i]=ct1;
95
if
(ctb!=NULL) ctb[i]=ct2;
96
/* prepare to the next loop */
97
t_last=t[i]; ca_last=ca[i];
98
ct1_last=ct1; ct1i_last=ct1i;
99
ct2_last=ct2; ct2i_last=ct2i;
100
}
101
102
return
0;
103
}
104
/*****************************************************************************/
105
106
/*****************************************************************************/
124
int
simC2_i
(
126
double
*t,
128
double
*cai,
130
const
int
nr,
132
const
double
k1,
134
const
double
k2,
136
const
double
k3,
138
const
double
k4,
140
double
*ct,
142
double
*cta,
144
double
*ctb
145
) {
146
int
i;
147
double
dt2, r, u, v;
148
double
t_last;
149
double
ct1, ct1_last, ct2, ct2_last;
150
double
ct1i, ct1i_last, ct2i, ct2i_last;
151
152
153
/* Check for data */
154
if
(nr<2)
return
1;
155
if
(t==NULL || cai==NULL || ct==NULL)
return
2;
156
157
/* Check parameters */
158
if
(k1<0.0)
return
3;
159
160
/* Calculate curves */
161
t_last=0.0;
if
(t[0]<t_last) t_last=t[0];
162
ct1_last=ct2_last=ct1i_last=ct2i_last=0.0;
163
ct1=ct2=ct1i=ct2i=0.0;
164
for
(i=0; i<nr; i++) {
165
/* delta time / 2 */
166
dt2=0.5*(t[i]-t_last);
167
/* calculate values */
168
if
(dt2<0.0) {
169
return
5;
170
}
else
if
(dt2>0.0) {
171
/* Calculate partial results */
172
r=1.0+k4*dt2;
173
u=ct1i_last+dt2*ct1_last;
174
v=ct2i_last+dt2*ct2_last;
175
/* 1st tissue compartment and its integral */
176
ct1 = ( k1*cai[i] - (k2 + (k3/r))*u + (k4/r)*v ) / ( 1.0 + dt2*(k2 + (k3/r)) );
177
ct1i = ct1i_last + dt2*(ct1_last+ct1);
178
/* 2nd tissue compartment and its integral */
179
ct2 = (k3*ct1i - k4*v) / r;
180
ct2i = ct2i_last + dt2*(ct2_last+ct2);
181
}
182
/* copy values to argument arrays */
183
ct[i]=ct1+ct2;
184
if
(cta!=NULL) cta[i]=ct1;
185
if
(ctb!=NULL) ctb[i]=ct2;
186
/* prepare to the next loop */
187
t_last=t[i];
188
ct1_last=ct1; ct1i_last=ct1i;
189
ct2_last=ct2; ct2i_last=ct2i;
190
}
191
192
return
0;
193
}
194
/*****************************************************************************/
195
196
/*****************************************************************************/
simC2
int simC2(double *t, double *ca, const int nr, const double k1, const double k2, const double k3, const double k4, double *ct, double *cta, double *ctb)
Definition
sim2cm.c:31
simC2_i
int simC2_i(double *t, double *cai, const int nr, const double k1, const double k2, const double k3, const double k4, double *ct, double *cta, double *ctb)
Definition
sim2cm.c:124
tpccm.h
Header file for libtpccm.
Generated on
for TPCCLIB by
1.17.0