[docs]
def strip_base(base):
if base is None:
base = ''
elif len(base) > 0 and base[-1] != '.':
base = base + '.'
return base
[docs]
def build_heart(self, base=None, options=None):
_options = {
'chamber_type': None,
'triseg_type': None,
'patch_type': None,
'valve_type': None,
'PuArt': 'PuArt',
'SyVen': 'SyVen',
'PuVen': 'PuVen',
'SyArt': 'SyArt',
}
if options is not None:
_options.update(options)
options = _options
# defaults
if options['patch_type'] is None:
options['patch_type'] = 'Patch2022'
if options['valve_type'] is None:
options['valve_type'] = 'Valve2022'
# Todo: remove Chamber2022
if options['chamber_type'] is None and options['patch_type'] == 'Patch2022':
options['chamber_type'] = 'Chamber2022'
elif options['chamber_type'] is None:
options['chamber_type'] = 'Chamber'
# Todo: remove TriSeg
if options['triseg_type'] is None and options['patch_type'] == 'Patch2022':
options['triseg_type'] = 'TriSeg2022'
elif options['triseg_type'] is None:
options['triseg_type'] = 'TriSeg'
base = strip_base(base)
# Create components
self.add_component('Bag', 'Peri', base[:-1])
# add atria
self.add_component(options['chamber_type'], 'La', base+'Peri')
self.add_component(options['patch_type'], 'pLa0', base+'Peri.La.wLa')
self.add_component(options['chamber_type'], 'Ra', base+'Peri')
self.add_component(options['patch_type'], 'pRa0', base+'Peri.Ra.wRa')
# add ventricles
self.add_component(options['triseg_type'], 'TriSeg', base+'Peri')
self.add_component(options['patch_type'], 'pLv0', base+'Peri.TriSeg.wLv')
self.add_component(options['patch_type'], 'pSv0', base+'Peri.TriSeg.wSv')
self.add_component(options['patch_type'], 'pRv0', base+'Peri.TriSeg.wRv')
# add valves
self.add_component(options['valve_type'], 'SyVenRa', base+'Peri')
self.add_component(options['valve_type'], 'RaRv', base+'Peri')
self.add_component(options['valve_type'], 'RvPuArt', base+'Peri')
self.add_component(options['valve_type'], 'PuVenLa', base+'Peri')
self.add_component(options['valve_type'], 'LaLv', base+'Peri')
self.add_component(options['valve_type'], 'LvSyArt', base+'Peri')
# Link components
self.set_component('Peri.SyVenRa.prox', options['SyVen'])
self.set_component('Peri.SyVenRa.dist', 'Peri.Ra')
self.set_component('Peri.RaRv.prox', 'Peri.Ra')
self.set_component('Peri.RaRv.dist', 'Peri.TriSeg.cRv')
self.set_component('Peri.RvPuArt.prox', 'Peri.TriSeg.cRv')
self.set_component('Peri.RvPuArt.dist', options['PuArt'])
self.set_component('Peri.PuVenLa.prox', options['PuVen'])
self.set_component('Peri.PuVenLa.dist', 'Peri.La')
self.set_component('Peri.LaLv.prox', 'Peri.La')
self.set_component('Peri.LaLv.dist', 'Peri.TriSeg.cLv')
self.set_component('Peri.LvSyArt.prox', 'Peri.TriSeg.cLv')
self.set_component('Peri.LvSyArt.dist', options['SyArt'])
self.set_component('Peri.SyVenRa.adaptation_cavity', 'SyVen')
self.set_component('Peri.RaRv.adaptation_cavity', 'PuArt')
self.set_component('Peri.RvPuArt.adaptation_cavity', 'PuArt')
self.set_component('Peri.PuVenLa.adaptation_cavity', 'PuVen')
self.set_component('Peri.LaLv.adaptation_cavity', 'SyArt')
self.set_component('Peri.LvSyArt.adaptation_cavity', 'SyArt')
# Parameterize components
self.set('Model.'+base+'Peri.TriSeg.V', 44e-6)
self.set('Model.'+base+'Peri.TriSeg.Y', 34.6e-3)
self.set('Model.'+base+'Peri.TriSeg.cLv.V', 100e-6)
self.set('Model.'+base+'Peri.TriSeg.cRv.V', 100e-6)
self.set('Model.'+base+'Peri.La.V', 50e-6)
self.set('Model.'+base+'Peri.Ra.V', 50e-6)
set_parameters_walmsley2015_heart(self, base)
[docs]
def set_parameters_walmsley2015_heart(self, base):
# all wall parameters
locs = ['Peri.TriSeg.wLv.pLv0',
'Peri.TriSeg.wSv.pSv0',
'Peri.TriSeg.wRv.pRv0',
'Peri.La.wLa.pLa0',
'Peri.Ra.wRa.pRa0',
]
for loc in locs:
self.set('Model.'+base+loc+'.l_se0', 0.04)
self.set('Model.'+base+loc+'.l_s0', 2.0)
self.set('Model.'+base+loc+'.l_s0', 1.8)
self.set('Model.'+base+loc+'.dl_s_pas', 0.6)
self.set('Model.'+base+loc+'.k1', 10)
self.set('Model.'+base+loc+'.dt', 0)
self.set('Model.'+base+loc+'.C_rest', 0)
self.set('Model.'+base+loc+'.l_si0', 1.51)
self.set('Model.'+base+loc+'.LDAD', 1.057)
self.set('Model.'+base+loc+'.ADO', 0.65)
self.set('Model.'+base+loc+'.LDCC', 4)
# wall specific
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.Am_ref', 0.009805314057621018)
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.V_wall', 9.60080108859341e-05)
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.v_max', 7.0)
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.Sf_pas', 500)
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.tr', 0.25)
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.td', 0.25)
self.set('Model.'+base+'Peri.TriSeg.wLv.pLv0.Sf_act', 100000)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.Am_ref', 0.004884229725474014)
# self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.Am_ref', 0.0045)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.V_wall', 3.23553932981624e-05)
# self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.V_wall', 4e-05)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.v_max', 7.0)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.Sf_pas', 500)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.tr', 0.25)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.td', 0.25)
self.set('Model.'+base+'Peri.TriSeg.wSv.pSv0.Sf_act', 100000)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.Am_ref', 0.012970820071535782)
# self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.Am_ref', 0.01)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.V_wall', 6.29708653593736e-05)
# self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.V_wall', 8e-05)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.v_max', 7.0)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.Sf_pas', 500)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.tr', 0.25)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.td', 0.25)
self.set('Model.'+base+'Peri.TriSeg.wRv.pRv0.Sf_act', 100000)
self.set('Model.'+base+'Peri.La.wLa.pLa0.Am_ref', 0.006921646911242356)
self.set('Model.'+base+'Peri.La.wLa.pLa0.Am_ref', 0.007)
self.set('Model.'+base+'Peri.La.wLa.pLa0.V_wall', 1.5582632867621123e-05)
self.set('Model.'+base+'Peri.La.wLa.pLa0.V_wall', 1.6e-05)
self.set('Model.'+base+'Peri.La.wLa.pLa0.v_max', 14.0)
self.set('Model.'+base+'Peri.La.wLa.pLa0.Sf_pas', 4000)
self.set('Model.'+base+'Peri.La.wLa.pLa0.tr', 0.4)
self.set('Model.'+base+'Peri.La.wLa.pLa0.td', 0.4)
self.set('Model.'+base+'Peri.La.wLa.pLa0.Sf_act', 84000)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.Am_ref', 0.0059862195992063825)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.Am_ref', 0.008)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.V_wall', 6.389451836068464e-05)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.V_wall', 1e-05)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.v_max', 14.0)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.Sf_pas', 4000)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.tr', 0.4)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.td', 0.4)
self.set('Model.'+base+'Peri.Ra.wRa.pRa0.Sf_act', 84000)
[docs]
def build_timings(self, base=None, options=None):
_options = {'build': 'Walmsley2015',
}
if options is not None:
_options.update(options)
options = _options
base = strip_base(base)
if options['build'] == 'Walmsley2015':
self.add_component('Timings', 'Timings', base[:-1]+'')
self.set_component('Timings.wLa', 'Peri.La.wLa')
self.set_component('Timings.wRa', 'Peri.Ra.wRa')
self.set_component('Timings.wLv', 'Peri.TriSeg.wLv')
self.set_component('Timings.wSv', 'Peri.TriSeg.wSv')
self.set_component('Timings.wRv', 'Peri.TriSeg.wRv')
[docs]
def build_pfc(self, base=None, options=None):
_options = {'build': 'Walmsley2015',
}
if options is not None:
_options.update(options)
options = _options
base = strip_base(base)
if options['build'] == 'Walmsley2015':
self.add_component('PressureFlowControl', 'PFC', base[:-1]+'')
self.set_component('PFC.node_pressure', 'SyArt')
self.set_component('PFC.connector_return', 'Peri.SyVenRa')
self.set_component('PFC.artven_resistance', 'CiSy')
self.set_component('PFC.valve_flow_vec', 'Peri.SyVenRa')
self.set_component('PFC.valve_flow_vec', 'Peri.RaRv')
self.set_component('PFC.valve_flow_vec', 'Peri.RvPuArt')
self.set_component('PFC.valve_flow_vec', 'Peri.PuVenLa')
self.set_component('PFC.valve_flow_vec', 'Peri.LaLv')
self.set_component('PFC.valve_flow_vec', 'Peri.LvSyArt')
self.set_component('PFC.link_fac_pfc', 'CiSy')
self.set_component('PFC.link_fac_pfc', 'CiPu')