Source code for vampy.automatedPreprocessing.NetworkBoundaryConditions
#!/usr/bin/env python
# Program: AneuTool
# Module: NetworkBoundaryConditions.py
# Language: Python
# Date: $Date: 2016/17/04 00:00:00 $
# Version: $Revision: 0.0.1 $
# Author: Christophe Chnafa
# Copyright (c) Christophe Chnafa. All rights reserved.
[docs]class FlowSplitting(object):
"""This class computes the flow splitting for a network according to
[ADD REF AJRN] and [VALIDATION PAPER]"""
def __init__(self):
self.hasComputedAlphas = False
self.hasComputedBetas = False
self.hasComputedGammas = False
[docs] def ComputeAlphas(self, network, verboseprint):
"""Compute the segments alpha coefficient.
Compute for each blanked segment of a network its attributed alpha
coefficient. For a network division with N daughter segments
(N can be superior to two), the alpha coefficient of each segment i
is computed as:
alpha_i = S / sumSurfaces = S_i / sum_1^N(segment area_j)
That means that alpha is the percentage of flow from the datum
(the supplier) segment going though the i-th segment of the considered
division. Segments that are not blanked are left with an alpha
coefficient of 1.0 since there is no flow division.
"""
if network.GetNumberOfOutlet() < 2:
raise RuntimeError('The network has only one outlet.')
# For each element of the network,
for element in network.elements:
if not (element.IsBlanked()):
continue
# find the adjacent blanked branches.
adjacentBranchFound = False
S = network.elements[element.GetFrontSegment()].GetMeanArea()
sumSurfaces = S
for otherElement in network.elements:
if otherElement.GetId() == element.GetId():
continue
if not (otherElement.IsBlanked()):
continue
if otherElement.GetInPointsx0Id() == element.GetInPointsx0Id():
adjacentBranchFound = True
sumSurfaces += network.elements[
otherElement.GetFrontSegment()].GetMeanArea()
# At least one adjacent blanked branch should be found.
if not (adjacentBranchFound):
raise RuntimeError('Unexpected error, '
'adjacent branch not found. Check the connectivity.')
alpha = S / sumSurfaces
element.SetAlpha(alpha)
self.hasComputedAlphas = True
[docs] def ComputeBetas(self, network, verboseprint):
"""Compute the outlets beta coefficient.
Compute for each outlet segment of a network its attributed beta
coefficient. This coefficient correspond to the percentage of
flow going out of this segment from the inlet flow. It is the actual
flow division at the outlets. Segments that are not outlets are left
with a beta coefficient of 0.0. The algorithm compute the beta
coefficients as the multiplications of the alpha coefficient from the
considered outlet to the root of the network where the inlet is
applied.
"""
if not (self.hasComputedAlphas):
raise RuntimeError('Alpha coefficients need to be computed first.')
# For each element of the network, ...
for element in network.elements:
if not (element.IsAnOutlet()):
continue
foundNetworkRoot = False
beta = 1.0
currentElement = element
# ... gather alpha coefficients at each division by scanning
# the network in direction of the flow inlet.
while not (foundNetworkRoot):
if currentElement.GetBehindSegment() is None:
raise RuntimeError('The network is constitued of one segment '
'or the input centerlines have a hanging segment.')
behindElement = network.elements[currentElement.GetBehindSegment()]
if behindElement.IsBlanked():
beta *= behindElement.GetAlpha()
if behindElement.IsAnInlet():
foundNetworkRoot = True
else:
currentElement = behindElement
element.SetBeta(beta)
self.hasComputedBetas = True
[docs] def ComputeGammas(self, network, verboseprint):
"""Compute the outlets gamma coefficient.
Compute for each outlet segment of a network its attributed beta
coefficient. This coefficient correspond to the percentage of
flow going out of this segment from the inlet flow. The Gamma
coefficient of each outlet i is computed as:
gamma_i = S_i / sumOutletAreas
"""
sumAreas = 0.0
for element in network.elements:
if not (element.IsAnOutlet()):
continue
sumAreas += element.GetMeanArea()
for element in network.elements:
if not (element.IsAnOutlet()):
continue
gamma = element.GetMeanArea() / sumAreas
element.SetGamma(gamma)
self.hasComputedGammas = True
[docs] def CheckTotalFlowRate(self, network, verboseprint):
"""Check if the sum of the outflows is 100%. """
tol = 0.000001 # Flow balance error tolerance.
if self.hasComputedBetas:
sumBeta = 0.0
for element in network.elements:
if element.IsAnOutlet():
sumBeta += element.GetBeta()
if abs(sumBeta - 1.0) > tol:
raise RuntimeError('Unexpected error, sum(Beta) coefficients != 1.0')
if self.hasComputedGammas:
sumGamma = 0.0
for element in network.elements:
if element.IsAnOutlet():
sumGamma += element.GetGamma()
if abs(sumGamma - 1.0) > tol:
raise RuntimeError('Unexpected error, sum(Gamma) coefficients != 1.0')