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