def exfile_to_OpenCMISS(nodeFilename, elementFilename, coordinateField, region, meshUserNumber, dimension=2, interpolation='linear'): """Convert an exnode and exelem files to a morphic mesh. Only Linear lagrange elements supported. Keyword arguments: nodeFilename -- exnode filename elementFilename -- exelem filename coordinateField -- the field to read in dimension -- dimension of mesh to read in interpolation -- the interpolation of the mesh to read in """ # Load exfiles exnode = exfile.Exnode(nodeFilename) exelem = exfile.Exelem(elementFilename, dimension) totalNumberOfNodes = len(exnode.nodeids) totalNumberOfElements = len(exelem.elements) # Start the creation of a manually generated mesh in the region mesh = iron.Mesh() mesh.CreateStart(meshUserNumber, region, dimension) mesh.NumberOfComponentsSet(1) mesh.NumberOfElementsSet(totalNumberOfElements) # Define nodes for the mesh nodes = iron.Nodes() nodes.CreateStart(region, totalNumberOfNodes) nodes.UserNumbersAllSet(exnode.nodeids) nodes.CreateFinish() elements = iron.MeshElements() meshComponentNumber = 1 elements.CreateStart(mesh, meshComponentNumber, basis) elemNums = [] for elem in exelem.elements: elemNums.append(elem.number) elements.UserNumbersAllSet(elemNums) for elem_idx, elem in enumerate(exelem.elements): elements.NodesSet(elem_idx+1, elem.nodes) elements.CreateFinish() mesh.CreateFinish() coordinates, node_ids = extract_exfile_coordinates(nodeFilename, coordinateField, interpolation) return mesh, coordinates, node_ids
decompositionUserNumber, geometricFieldUserNumber, equationsSetUserNumber, equationsSetFieldUserNumber, independentFieldUserNumber, dependentFieldUserNumber, problemUserNumber, fibreFieldUserNumber, materialFieldUserNumber, deformedFieldUserNumber, strainFieldUserNumber, cellMLUserNumber, cellMLModelsFieldUserNumber, cellMLParametersFieldUserNumber, cellMLIntermediateFieldUserNumber) = range( 1, 22) # longitudinal elements, circumferential elements, transmural elements elems = [8, 8, 2] """ cmd = '. ./matlab_batcher.sh benchmark_ellipse_linear ['+str(elems[0])+','+str(elems[1])+','+str(elems[2])+']' if not os.path.exists("ellipse_benchmark_lin_"+str(elems[2])+"-"+str(elems[1])+"-"+str(elems[0])+".exnode"): os.system(cmd) """ inputNodes = exfile.Exnode("ellipse_benchmark_lin_" + str(elems[2]) + "-" + str(elems[1]) + "-" + str(elems[0]) + ".exnode") inputElems = exfile.Exelem("ellipse_benchmark_lin_" + str(elems[2]) + "-" + str(elems[1]) + "-" + str(elems[0]) + ".exelem") num_apex_elem = elems[1] * elems[2] # Set up region and CS [numOfCompNodes, compNodeNum, CS, region] = BasicSetUp(regionUserNumber, coordinateSystemUserNumber) # Set up tricubic Hermite basis functions [linearBasis, colBasis] = BasisFunction(linearBasisUserNumber, numOfXi, option, collapsed=True) # Set up mesh
def exfile_to_morphic(nodeFilename, elementFilename, coordinateField, dimension=2, interpolation='linear'): """Convert an exnode and exelem files to a morphic mesh. Only Linear lagrange elements supported. Keyword arguments: nodeFilename -- exnode filename elementFilename -- exelem filename coordinateField -- the field to read in dimension -- dimension of mesh to read in """ # Create morphic mesh mesh = morphic.Mesh() # Load exfiles exnode = exfile.Exnode(nodeFilename) exelem = exfile.Exelem(elementFilename, dimension) # Add nodes if interpolation == 'linear': derivatives = [1] elif interpolation == 'hermite': derivatives = range(1,9) for node_num in exnode.nodeids: coordinates = [] for component in range(1, 4): component_name = ["x", "y", "z"][component - 1] componentValues = [] for derivative_idx, derivative in enumerate(derivatives): componentValues.append(exnode.node_value(coordinateField, component_name, node_num, derivative)) coordinates.append(componentValues) mesh.add_stdnode(node_num, coordinates, group='_default') print 'Morhpic node added', node_num, coordinates if dimension == 2: if interpolation == 'linear': element_interpolation = ['L1', 'L1'] if interpolation == 'quadratic': element_interpolation = ['L2', 'L2'] elif dimension == 3: if interpolation == 'linear': element_interpolation = ['L1', 'L1', 'L1'] if interpolation == 'quadratic': element_interpolation = ['L2', 'L2', 'L2'] if interpolation == 'hermite': element_interpolation = ['H3', 'H3', 'H3'] # Add elements for elem in exelem.elements: mesh.add_element(elem.number, element_interpolation, elem.nodes) print 'Morphic element added', elem.number # Generate the mesh mesh.generate(True) return mesh
# The number of data points which are digitised from the heart segments # fix interior nodes so that fitting only applies to surface # If start iteration > 1, read in geometry from a previous fit iteration numberOfDataPoints = 2513 numberOfIterations = 1 fixInterior = True zeroTolerance = 0.00001 hermite = True # Set Sobolev smoothing parameters tau = 0.00005 kappa = 0.00001 iteration = 1 if iteration > 1: exfileMesh = True exnode = exfile.Exnode("DeformedGeometry" + str(iteration - 1) + ".part0.exnode") exelem = exfile.Exelem("UndeformedGeometry.part0.exelem") else: exfileMesh = False print "other parameters setted up " #================================================================= # #================================================================= (coordinateSystemUserNumber, regionUserNumber, basisUserNumber, generatedMeshUserNumber, meshUserNumber, decompositionUserNumber, geometricFieldUserNumber, equationsSetFieldUserNumber, dependentFieldUserNumber, independentFieldUserNumber, dataPointFieldUserNumber, materialFieldUserNumber, analyticFieldUserNumber, dependentDataFieldUserNumber, dataPointsUserNumber, dataProjectionUserNumber, equationsSetUserNumber, problemUserNumber) = range(1, 19)