Location: Peripheral airways matlab/CellML @ 30e6db7fb82a / Peripheral_matlab_dell_updated / seven_airway.jl

Author:
aram148 <42922407+aram148@users.noreply.github.com>
Date:
2022-07-26 11:49:42+12:00
Desc:
updated documentation and renamed model
Permanent Source URI:
https://models.fieldml.org/workspace/7e5/rawfile/30e6db7fb82a9bb715b0121cdfc131c19e5cb2ff/Peripheral_matlab_dell_updated/seven_airway.jl

# A function that solves the n coupled airway BG model

function seven_airway(t,y,order,parm)

numBr = 2^order - 1;
r = y[1:numBr]'
uv = y[numBr+1: 2*numBr]'
vv = y[2*numBr+1:3*numBr]'
vds = y[3*numBr+1:(
return [NN]
end-4)]'
# RR = y[end-6:end]'
RR = y[end-3:end]'

M = RR[1]; Mp = RR[2]; AMp = RR[3]; AM = RR[4]
# r1 = [y[1] y[2] y[3] y[4] y[5] y[6] y[7]]
# uv1 = [y[8] y[9] y[10] y[11] y[12] y[13] y[14]]
# vv1 = [y[15] y[16] y[17] y[18] y[19] y[20] y[21]]
# vds1 =[y[22] y[23] y[24] y[25]]
## Construct the constant array as a persistent variable

# So that repeated calls to this function doesn't result in repeated
# calculations of C
persistent C

if isempty(C)
    @sprintf("Contrusting the structure array of constants...\n")
    C = createConstSymm[order]
    @sprintf("Finished.\n")
end

## Parameters for MoC model
rho=2
## Define the constants
f = 0.2
A = 5e5; # Used to be 5e5
# Pref = 10+ 10*sin(2*pi*f*t).*(t<=60)+ 120*sin(2*pi*f*t).*(t>60 && t<62)+ 10*sin(2*pi*f*t).*(t>=62)
# Rref = 0.2792
P0 = 10

Pref = 10 + P0*sin(2*pi*f*t)
Rref=0.4140

u_top = Pref


# kappa = 0.25*parm[1,:].*(t<=60) + 0.5*parm[1,:].*(t>60 && t<=120) + 0.75*parm[1,:].*(t>120 && t<=180) + (parm[1,:]).*(t>=180);
kappa = parm[1,:]
# epsilon = 10^(parm[2,:]);  # A parameter that controls sliding between Type II & Type I + II
epsilon = 0
qhat = -50

N = 2^order - 1; # number of branches for symmetric trees
numOrd1 = (N+1)/2
NT = (N-1)/2
E1 = 2.5; #cmH20/ml


## Setting up BG parameters
E = 25;#kPa
rho1 = 1.225
k11 = 0.0057
k22 = 0.2096
k33 = 0.0904
R = zeros(N,1)
Rv = zeros(N,1)
CC = zeros(N,1)
I = zeros(N,1)
pa_bar = zeros(N,1)
alph = zeros(N,1)
u_bot = zeros(N,1)
u=zeros(N,1)

for i=1:N
    air_ord = C.order[i]
    #CC[i] = (2*pi*C.L[air_ord].*r[i]^3)/(E*h1)
    WT[i] = (k11.*(2*r[i])^2)/4 + (k22.*(2.*r[i]))/2 +k33;#wall thickness
    CC[i] = (C.L[air_ord]*(2*r[i])^3)/(4*E*WT[i]);# taken from Yoon et al 2020
    I[i] = rho1*C.L[air_ord]/(pi.*r[i]^2);#airway Inertance
    R[i] = C.alpha(air_ord).*r[i]^(-4); #airway resistance
    Rv[i] = 0.01/CC[i];#air viscoelastic effect
    pa_bar[i] = (P0*E1)./sqrt(E1^2 + (2*pi*f*R[i])^2)
    alph[i] = atan((2*pi*f*R[i])./E1)
    u_bot[i] = 10+pa_bar[i]*sin(2*pi*f*t-alph[i]);#acinar pressure
end



##
for a = numOrd1+1:N
    uv[a] = (vv[a]-vv[2*(a-numOrd1)]-vv[2*(a-numOrd1)-1])/CC[a]
    u[a] = uv[a] +Rv[a]*((2*(a-numOrd1))-vv[2*(a-numOrd1)-1])
end

for b = 1:numOrd1
    uv[b] = (vv[b]-vds[b])/CC[b]
    u[b] = uv[b] + Rv[b]*(vv[b]-vds[b])
    vds[b] = (uv[b]-u_bot[b]-(R[b]/2)*vds[b])/(I[b]/2)
end


for d = 1:N-1
    a[d] =((2*d) - 1)
    aa = a[a<N-1];
    b[d] = 2*d
    bb = b[b<=N-1]
    z = [aa bb]
end

# for i = 1: length(aa)
# #     if (aa[i]) <=numBr && bb[i] <=numBr
#       vv[aa[i]] = (uv[numOrd1+i] - u[aa[i]] - (R[aa[i]]*vv[aa[i]])/2)./(I[aa[i]]/2)
#       vv[bb[i]] = (uv[numOrd1+i] - u[bb[i]] - (R[bb[i]]*vv[bb[i]])/2)./(I[bb[i]]/2)
# #     elseif [aa[i]] > numBr && bb[i] .> numBr
# #         vv[aa[i]] = (uv[numOrd1+i] - u[aa[i]] - (R[aa[i]]*vv[aa[i]]))./(I[aa[i]])
# #         vv[bb[i]] = (uv[numOrd1+i] - u[bb[i]] - (R[bb[i]]*vv[bb[i]]))./(I[bb[i]]);
# #     end
# end
# vv[N] = (Pref - u[N] - R[N]*vv[N])/I[N]

        ## Set up uv1 - uv7
#         uv[1] = (vv[1]-vds[1])/CC[1]
#             u[1] = uv[1]+Rv[1]*(vv[1]-vds[1])
#         uv[2] = (vv[2]-vds[2])/CC[2]
#             u[2] = uv[2]+Rv[2]*(vv[2]-vds[2])
#         uv[3] = (vv[3]-vds[3])/CC[3]
#             u[3] = uv[3]+Rv[3]*(vv[3]-vds[3])
#         uv[4] = (vv[4]-vds[4])/CC[4]
#             u[4] = uv[4]+Rv[4]*(vv[4]-vds[4])
#         uv[5] = (vv[5]-vv[2]-vv[1])/CC[5]
#             u[5] = uv[5]+Rv[5]*(vv[5]-vv[2]-vv[1])
#         uv[6] = (vv[6]-vv[4]-vv[3])/CC[6]
#             u[6] = uv[6]+Rv[6]*(vv[6]-vv[4]-vv[3])
#         uv[7] = (vv[7]-vv[6]-vv[5])/CC[5]
#             u[7] = uv[7]+Rv[7]*(vv[7]-vv[6]-vv[5])
        ## Set up v1 - v7
#         vv[1] = (u[5] - u[1] - (vv[1]*R[1])/2)/(I[1]/2)
#         vv[2] = (u[5] - u[2] - (vv[2]*R[2])/2)/(I[2]/2)
#         vv[3] = (u[6] - u[3] - (vv[3]*R[3])/2)/(I[3]/2)
#         vv[4] = (u[6] - u[4] - (vv[4]*R[4])/2)/(I[4]/2)

        for i = 1: (numOrd1/2)
          vv[aa[i]] = (u[numOrd1+i] - u[aa[i]] - (R[aa[i]]*vv[aa[i]])/2)./(I[aa[i]]/2)
          vv[bb[i]] = (u[numOrd1+i] - u[bb[i]] - (R[bb[i]]*vv[bb[i]])/2)./(I[bb[i]]/2)
        end

        for i = (numOrd1/2)+1 : length(aa)
        vv[aa[i]] = (u[numOrd1+i] - u[aa[i]] - (vv[aa[i]]*R[aa[i]]))/(I[aa[i]])
        vv[bb[i]] = (u[numOrd1+i] - u[bb[i]] - (vv[bb[i]]*R[bb[i]]))/(I[bb[i]])
        end
       # vv[7] = (ptop - u[7] - (vv[7]*R[7]))/(I[7])
        vv[N] = (Pref - u[N] - R[N]*vv[N])/I[N]


## Set up vds1 - vds4
# vds[1] = (u[1]-pbot[1]-(R[1]/2)*vds[1])/(I[1]/2)
# vds[2] = (u[2]-pbot[2]-(R[2]/2)*vds[2])/(I[2]/2)
# vds[3] = (u[3]-pbot[3]-(R[3]/2)*vds[3])/(I[3]/2)
# vds[4] = (u[4]-pbot[4]-(R[4]/2)*vds[4])/(I[4]/2)
## Determine what R is (airway radius)

RDOT=zeros(N,1)

## Find expressions for the pressure & flows

Ci = C.Ciplus - C.Ciminus1 - C.Ciminus2
# size(C.alpha^(-1))
# size(r')
Dalphar = diag(C.alpha^(-1).*r'^4)
# size(Dalphar)
# Dalphar1 = diag(R)
# return

W = Ci*Dalphar*(C.Cjplus - C.Cjminus)
# size(W)
# return
lambda = dot(C.alpha^(-1).*r'^4, C.vbot)

temp = (W\(Ci*Dalphar*(C.vbot*C.vbot')*Dalphar*C.Cjplus))/lambda; #optimising code
Lambda = eye(size(temp)) - temp
p = Lambda\(W\(Ci*Dalphar*(-u_top*C.vtop - 1/lambda*qhat*C.vbot))); #optimising code

gammajplus = C.Cjplus*p + u_top.*C.vtop
gammajminus = C.Cjminus*p + u_bot.*C.vbot
deltap = gammajplus - gammajminus

#
T = C.T;    # The transformation matrix that will map mu_hat to mu
#
# ## Determine what mu is (parenchymal shear modulus)
#
mu = zeros(N,1)
#
for i = 1:numOrd1  # Wanting to loop through only the order 1 airways

    # Add the Type 1 coupling by putting in the dependence on the
    # neighbours.
    if i .== 1
        mu[i] = abs(A/3*(deltap[i]*r[i]^4 + epsilon*(deltap[numOrd1]*r[numOrd1]^4 + deltap[i+1]*r[i+1]^4)))/2
    elseif i .== numOrd1
        mu[i] = abs(A/3*(deltap[i]*r[i]^4 + epsilon*(deltap[i-1]*r[i-1]^4 + deltap[1]*r[1]^4)))/2
    else()
        mu[i] = abs(A/3*(deltap[i]*r[i]^4 + epsilon*(deltap[i-1]*r[i-1]^4 + deltap[i+1]*r[i+1]^4)))/2
    end

end
#
# # Use the transformation matrix; T; to create the full mu vector
mu = T*mu


#
# ## Determine what tau is (parenchymal tethering pressure)
tau = 2*mu.*(((Rref - r")/Rref) + 1.5*((Rref - r")/Rref)^2)




k2 = 0.5; k5 = 0.5; k3 = 0.4; k4 = 0.1; k7 = 0.01; k1 = 0.55.*(t<=5)+0.06.*(t>5); k6 =k1

# dt=0.5*t
# force=kappa*(rr[2]+rr[5])
force = kappa*(AMp+AM)
#
pmid = 0.5*(gammajplus + gammajminus)

# Ptm = zeros(N,1)
Ptm = pmid - (force*Rref./r')+ tau
for i=1:N
    air_ord = C.order[i];  # Determine the order of the current airway

# Ptm[i] = pmid[i] - (force*Rref/r[i])+ tau[i]


    if Ptm[i] <= 0
        R[i] = sqrt((C.Ri[air_ord]^2)*(1 - Ptm[i]./C.P1[air_ord])^(-C.n1[air_ord]))
    elseif Ptm[i] >= 0
        R[i] = sqrt(C.rimax[air_ord]^2 - (C.rimax[air_ord]^2 - C.Ri[air_ord]^2)*(1 - Ptm[i]/C.P2[air_ord])^(-C.n2[air_ord]))
    end

    RDOT=rho*((R)-r')
end

F = [-k1*M+k2*Mp+k7*AM k4*AMp+k1*M-(k2+k3)*Mp k3*Mp+k6*AM-(k5+k4)*AMp k5*AMp-(k6+k7)*AM]'
RRDOT=RDOT
# size(RRDOT)
UVDOT = uv'
# size(UVDOT)
VVDOT = vv'
# size(VVDOT)
VDSDOT = vds'
# size(VDSDOT)
NN = [RRDOT UVDOT VVDOT VDSDOT F]'

end