def setGeometry(self, geometricField):
     decomposition = iron.Decomposition()
     geometricField.MeshDecompositionGet(decomposition)
     geometricInterpolation = self.interpolations[0]
     compNodeNumber = iron.ComputationalNodeNumberGet()
     geometricMeshComponent = 1
     # Set the geometric field parameters from the prolate spheroid geometry
     for nodeNum, values in enumerate(self.nodeValues(), 1):
         if decomposition.NodeDomainGet(
                 nodeNum, geometricMeshComponent) == compNodeNumber:
             versionNumber = 1
             for component in range(3):
                 componentValues = values[component]
                 if geometricInterpolation != 'cubic_hermite':
                     componentValues = componentValues[:1]
                 for derivativeNumber, value in componentValues:
                     # Note: Python uses 0-based indexing, OpenCMISS uses 1-based
                     geometricField.ParameterSetUpdateNode(
                         iron.FieldVariableTypes.U,
                         iron.FieldParameterSetTypes.VALUES, versionNumber,
                         derivativeNumber, nodeNum, component + 1, value)
     # After modifying the geometric field, ParameterSetUpdateStart/Finish
     # must be called so that the field data at ghost nodes is synchronised
     # across all processes. The UpdateFinish routine could be called later
     # on just before the geometric values are actually needed, to avoid
     # blocking.
     geometricField.ParameterSetUpdateStart(
         iron.FieldVariableTypes.U, iron.FieldParameterSetTypes.VALUES)
     geometricField.ParameterSetUpdateFinish(
         iron.FieldVariableTypes.U, iron.FieldParameterSetTypes.VALUES)
def getDomainNodes(geometry, decomposition, component):
    component_name = interpolations[component - 1]
    computationalNodeNumber = iron.ComputationalNodeNumberGet()
    nodes = geometry.componentNodes(component_name)
    meshComponent = geometry.meshComponent(component_name)
    return set(node for node in nodes
        if decomposition.NodeDomainGet(node, meshComponent) == computationalNodeNumber)
    def setFibres(self, fibreField):
        endocardiumFibreAngle = self.endocardiumFibreAngle
        epicardiumFibreAngle = self.epicardiumFibreAngle
        sheetAngle = self.sheetAngle
        geometricMeshComponent = 1
        compNodeNumber = iron.ComputationalNodeNumberGet()

        hasQuadratic = self.interpolations[0] == 'quadratic'
        if hasQuadratic:
            elFactor = 2
        else:
            elFactor = 1

        # fibre, imbrication, sheet
        epiAngles = np.array([epicardiumFibreAngle, 0.0, sheetAngle])
        endoAngles = np.array([endocardiumFibreAngle, 0.0, sheetAngle])
        lmbdaDerivs = (epiAngles - endoAngles) / self.numElements[2]

        decomposition = iron.Decomposition()
        fibreField.MeshDecompositionGet(decomposition)

        # Set fibre angles at nodes
        def setAngles(pos, angles):
            nodeNumber = self.nodeAtPosition(pos)
            if decomposition.NodeDomainGet(
                    nodeNumber, geometricMeshComponent) == compNodeNumber:
                version = 1
                for component, angle in enumerate(angles, 1):
                    derivative = 1
                    fibreField.ParameterSetUpdateNode(
                        iron.FieldVariableTypes.U,
                        iron.FieldParameterSetTypes.VALUES, version,
                        derivative, nodeNumber, component, angle)

        # Only loop over linear component nodes
        for k in range(0, self.numElements[2] * elFactor + 1, elFactor):
            transmuralPos = float(k) / float(self.numElements[2] * elFactor)
            fibreAngle = endocardiumFibreAngle + transmuralPos * (
                epicardiumFibreAngle - endocardiumFibreAngle)
            for j in range(0, self.numElements[1] * elFactor + 1, elFactor):
                for i in range(0, self.numElements[0] * elFactor, elFactor):
                    if j == 0:
                        setAngles((i, j, k), [0.0, 0.0, 0.0])
                    else:
                        setAngles((i, j, k), [fibreAngle, 0.0, sheetAngle])

        fibreField.ParameterSetUpdateStart(iron.FieldVariableTypes.U,
                                           iron.FieldParameterSetTypes.VALUES)
        fibreField.ParameterSetUpdateFinish(iron.FieldVariableTypes.U,
                                            iron.FieldParameterSetTypes.VALUES)
CellMLModelsFieldUserNumber = 4
CellMLParametersFieldUserNumber = 5
CellMLIntermediateFieldUserNumber = 6
equationsSetFieldUserNumber = 7

# Set all diganostic levels on for testing
#iron.DiagnosticsSetOn(iron.DiagnosticTypes.ALL,[1,2,3,4,5],"Diagnostics",["DOMAIN_MAPPINGS_LOCAL_FROM_GLOBAL_CALCULATE"])

if (UsePressureBasis):
    numberOfMeshComponents = 2
else:
    numberOfMeshComponents = 1

# Get the number of computational nodes and this computational node number
numberOfComputationalNodes = iron.ComputationalNumberOfNodesGet()
computationalNodeNumber = iron.ComputationalNodeNumberGet()

# Create a 3D rectangular cartesian coordinate system
coordinateSystem = iron.CoordinateSystem()
coordinateSystem.CreateStart(coordinateSystemUserNumber)
coordinateSystem.DimensionSet(3)
coordinateSystem.CreateFinish()

# Create a region and assign the coordinate system to the region
region = iron.Region()
region.CreateStart(regionUserNumber, iron.WorldRegion)
region.LabelSet("Region")
region.coordinateSystem = coordinateSystem
region.CreateFinish()

# Define basis