Esempio n. 1
0
def getGlobalMatrices(order, arch):
    architecture = Arch.getArchitectureByIdentifier(arch)
    stiffnessMatrices = ['kXiDivM', 'kEtaDivM', 'kZetaDivM']
    groups = {'stiffnessTransposed': map(lambda x: x + 'T', stiffnessMatrices)}

    if architecture.name in ['knc', 'knl']:
        blockMerge = 2
        configs = {
            'kXiDivM': [],
            'kEtaDivM': [],
            'kZetaDivM': [],
            'stiffnessTransposed': [],
            'fP1': [],
            'fP2': [],
            'fP3': [],
            'r1DivM': [],
            'r2DivM': [],
            'r3DivM': [],
            'r4DivM': [],
            'rT1': [],
            'rT2': [],
            'rT3': [],
            'rT4': []
        }
    else:
        blockMerge = 1
        configs = {
            'kXiDivM': [True],
            'kEtaDivM': [True],
            'kZetaDivM': [True],
            'stiffnessTransposed': [True],
            'fP1': [True],
            'fP2': [True],
            'fP3': [True],
            'r1DivM': [True],
            'r2DivM': [True],
            'r3DivM': [True],
            'r4DivM': [True],
            'rT1': [True],
            'rT2': [True],
            'rT3': [True],
            'rT4': [True]
        }

    transposedStiffnessBlocks = list()
    for o in range(2, order + 1):
        stoprow = Tools.numberOfBasisFunctions(o - 1)
        startcol = Tools.numberOfBasisFunctions(o - 1)
        stopcol = Tools.numberOfBasisFunctions(o)
        transposedStiffnessBlocks.append((0, stoprow, startcol, stopcol))
    for i in range(blockMerge):
        if len(transposedStiffnessBlocks) >= 2:
            # merge first blocks
            block1 = transposedStiffnessBlocks.pop(0)
            block2 = transposedStiffnessBlocks.pop(0)
            transposedStiffnessBlocks.insert(0, mergeBlock(block1, block2))

    stiffnessBlocks = [(block[2], block[3], block[0], block[1])
                       for block in transposedStiffnessBlocks]
    noMemsetStiffnessBlocks = list()
    for i, block in enumerate(stiffnessBlocks):
        startrow = noMemsetStiffnessBlocks[i - 1][1] if i > 0 else block[0]
        stoprow = architecture.getAlignedIndex(
            block[1]) if i != len(stiffnessBlocks) - 1 else block[1]
        noMemsetStiffnessBlocks.append((startrow, stoprow, block[2], block[3]))

    for matrix in stiffnessMatrices:
        configs[matrix].append(stiffnessBlocks)
        configs[matrix].append(noMemsetStiffnessBlocks)

    if groups.has_key('stiffnessTransposed'):
        configs['stiffnessTransposed'].append(transposedStiffnessBlocks)
    else:
        for matrix in stiffnessMatrices:
            configs[matrix + 'T'].append(transposedStiffnessBlocks)

    # fP matrices
    fPBlocks = list()
    for o in range(1, order + 1):
        start = Tools.numberOfBasisFunctions2D(o - 1)
        stop = Tools.numberOfBasisFunctions2D(o)
        fPBlocks.append((start, stop, start, stop))
    # merge first three blocks
    for i in range(blockMerge + 1):
        if len(fPBlocks) >= 2:
            block1 = fPBlocks.pop(0)
            block2 = fPBlocks.pop(0)
            fPBlocks.insert(0, mergeBlock(block1, block2))
    for i in range(1, 4):
        configs['fP{}'.format(i)].append(fPBlocks)

    # rT matrices
    rTBlocks = list()
    for o in range(1, order + 1):
        stoprow = Tools.numberOfBasisFunctions2D(o)
        startcol = Tools.numberOfBasisFunctions(o - 1)
        stopcol = Tools.numberOfBasisFunctions(o)
        rTBlocks.append((0, stoprow, startcol, stopcol))
    # merge first three blocks
    for i in range(blockMerge + 1):
        if len(rTBlocks) >= 2:
            block1 = rTBlocks.pop(0)
            block2 = rTBlocks.pop(0)
            rTBlocks.insert(0, mergeBlock(block1, block2))
    rBlocks = [(block[2], block[3], block[0], block[1]) for block in rTBlocks]
    noMemsetRBlocks = list()
    for i, block in enumerate(rBlocks):
        startrow = noMemsetRBlocks[i - 1][1] if i > 0 else block[0]
        stoprow = architecture.getAlignedIndex(
            block[1]) if i != len(rBlocks) - 1 else block[1]
        noMemsetRBlocks.append((startrow, stoprow, block[2], block[3]))
    for i in range(1, 5):
        configs['r{}DivM'.format(i)].append(rBlocks)
        configs['r{}DivM'.format(i)].append(noMemsetRBlocks)
        configs['rT{}'.format(i)].append(rTBlocks)

    # fMrT and rT have the same sparsity pattern
    for i in range(1, 5):
        configs['fMrT{}'.format(i)] = copy.deepcopy(configs['rT{}'.format(i)])

    return (groups, configs)