TPCCLIB
Loading...
Searching...
No Matches
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/*****************************************************************************/
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/*****************************************************************************/
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/*****************************************************************************/
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
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
Header file for libtpccm.