Introduction

The simva package is an R implementation of the algorithm for a three compartment model to simulate volatile anaesthetic uptake proposed in Cowles, Borgstedt, and Gillies (1973).

Here we reproduce the calulations presented in their article for diethyl ether.

Definition of the compartments

First we have to define the partition coefficients for the given anaesthetic (diethyl ether) for all compartments.

part_coefs <- partition_coefficients("diethyl-ether")
lung vrg mus fat
12.1 12.1 12.1 44.1

We have to define the caridac output and the proportion of cardiac output each compartment recieves.

blood_flow <- cardiac_output(total = 6.3)
lung vrg mus fat
6.3 5.0274 0.9891 0.2772

Each compartment has a tissue and a blood volume.

tissue_volume <- c(
    lung_air = 2.68, lung_tissue = 1.0,
    vrg = 8.83, mus = 36.25, fat = 11.5 #, not_perfused = 7.02
)
blood_volume <- c(lung = 1.4, vrg = 3.2, mus = 0.63, fat = 0.18)

Conductances and capacitances

The uptake of the volatile anaesthetic for a given compartment depends on the properties of the anaesthetic, the air/blood flow and the volume of the compartment.

conductances <- c(
    lung = conductance(
        flow = 4.0,                     # alveolar minute ventilation
        partition_coefficient = 1.0     # gas:gas partition coefficient
    ),
    vrg = conductance(blood_flow["vrg"], part_coefs["lung"]),
    mus = conductance(blood_flow["mus"], part_coefs["lung"]),
    fat = conductance(blood_flow["fat"], part_coefs["lung"])
)
capacitances <- c(
    lung = lung_capacitance(
        tissue_volume["lung_air"],
        ## blood volume and tissue:gas == blood:gas in that gase part_coefs
        tissue_volume["lung_tissue"],
        tissue_coefficient = part_coefs["lung"],
        ## blood volume and blood:gas part_coefs
        blood_volume["lung"], part_coefs["lung"]
    ),
    vrg = capacitance(
        tissue_volume["vrg"], part_coefs["vrg"],
        blood_volume["vrg"], part_coefs["lung"]
    ),
    mus = capacitance(
        tissue_volume["mus"], part_coefs["mus"],
        blood_volume["mus"], part_coefs["lung"]
    ),
    fat = capacitance(
        tissue_volume["fat"], part_coefs["fat"],
        blood_volume["fat"], part_coefs["lung"]
    )
)

Simulations

Normal

normal <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances, capacitances = capacitances
)

knitr::kable(head(normal))
time pinsp palv part pvrg pmus pfat pcv
0.1 12 0.1513241 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
0.2 12 0.2644098 0.1513241 0.0063239 0.0004058 0.0000997 0.0051197
0.3 12 0.3501489 0.2644098 0.0171095 0.0011139 0.0002737 0.0138541
0.4 12 0.4163194 0.3501489 0.0310274 0.0020500 0.0005041 0.0251290
0.5 12 0.4684761 0.4163194 0.0471289 0.0031610 0.0007779 0.0381776
0.6 12 0.5105859 0.4684761 0.0647372 0.0044090 0.0010859 0.0524528
cols <- palette.colors(ncol(normal) - 1)
matplot(
    normal[, -1],
    col = cols,
    type = "l",
    lty = 1,
    ylab = "partial pressure [%]",
    xlab = "time [min]",
    xaxt = "n"
)
axis(1, 1:10 * 10, labels = 1:10)
legend(
    "topleft",
    title = "compartments",
    legend = colnames(normal)[-1],
    lty = 1,
    bty = "n",
    col = cols
)

Doubled alveolar minute ventilation

dav <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances * c(2, 1, 1, 1),
    capacitances = capacitances
)

Halved cardiac output

hco <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances * c(1, 0.5, 0.5, 0.5),
    capacitances = capacitances
)

Humidification

hum <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances,
    capacitances = capacitances,
    use_humidification = TRUE
)

Concentration effect

con <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances,
    capacitances = capacitances,
    use_concentration_effect = TRUE
)

Pulmonary shunt

psh <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances,
    capacitances = capacitances,
    shunt_frac = 0.1
)

Metabolism

met <- sim_anaesthetic_uptake(
    pinsp = 12, delta_time = 0.1, total_time = 10,
    conductances = conductances,
    capacitances = capacitances,
    metabolism_frac = 0.05
)

Summary

Summary of different simulation experiments. Results are comparable to Table 4 in Cowles, Borgstedt, and Gillies (1973).
time pinsp palv part pvrg pmus pfat pcv
Normal 10 12.0 1.74 1.73 1.49 0.28 0.07 1.23
Increased ventilation 10 12.0 3.11 3.10 2.70 0.51 0.14 2.24
Decreased cardiac output 10 12.0 2.24 2.23 1.60 0.20 0.05 1.31
Humidification 10 11.3 1.64 1.63 1.40 0.26 0.07 1.16
Concentration effect 10 12.0 1.91 1.90 1.64 0.31 0.08 1.36
Pulmonary shunt 10 12.0 1.78 1.72 1.48 0.28 0.07 1.23
Metabolism 10 12.0 1.73 1.72 1.48 0.28 0.07 1.23

(There is a small difference in the numbers for the metabolism scenario.)

References

Cowles, Alan L., Harold H. Borgstedt, and Alastair J. Gillies. 1973. “A Simplified Digital Method for Predicting Anesthetic Uptake and Distribution.” Computers in Biology and Medicine 3 (4): 385–95. https://doi.org/10.1016/0010-4825(73)90004-8.