Source code for model_package.Filter.single_macroscale

#!python
import argparse
import pathlib
import sys

import numpy
import pandas

import file_io.xdmf


[docs] def single_domain(X1, X2, Y1, Y2, Z1, Z2, output_file): ''' Creates an XDMF file containing a single hexahedral element :param float X1: The minimum X value :param float X2: The maximum X value :param float Y1: The minimum Y value :param float Y2: The maximum Y value :param float Z1: The minimum Z value :param float Z2: The maximum Z value :param str output_file: The output filename for the h5 + XDMF file pair :returns: ``{output_file}.h5`` and ``{output_file}.xdmf`` ''' filter_points = numpy.array([[X1, Y1, Z1], [X2, Y1, Z1], [X2, Y2, Z1], [X1, Y2, Z1], [X1, Y1, Z2], [X2, Y1, Z2], [X2, Y2, Z2], [X1, Y2, Z2]]) filter_connectivity = numpy.array([0, 1, 2, 3, 4, 5, 6, 7,]) filter_connectivity = filter_connectivity.reshape((1,-1)).astype(int) # Write the filter to a file xdmf = file_io.xdmf.XDMF(output_filename=output_file) grid = xdmf.addGrid(xdmf.output_timegrid, {}) xdmf.addPoints(grid, filter_points) xdmf.addConnectivity(grid, "HEXAHEDRON", filter_connectivity) print("Writing single filter domain file!") xdmf.write() print("filter domain file written!") return 0
[docs] def single_quad_domain(X1, X2, Y1, Y2, output_file): ''' Creates an XDMF file containing a single quadrilateral element :param float X1: The minimum X value :param float X2: The maximum X value :param float Y1: The minimum Y value :param float Y2: The maximum Y value :param str output_file: The output filename for the h5 + XDMF file pair :returns: ``{output_file}.h5`` and ``{output_file}.xdmf`` quadrilateral filter files ''' filter_points = numpy.array([[X1, Y1], [X2, Y1], [X2, Y2], [X1, Y2]]) filter_connectivity = numpy.array([0, 1, 2, 3,]) filter_connectivity = filter_connectivity.reshape((1,-1)).astype(int) # Write the filter to a file xdmf = file_io.xdmf.XDMF(output_filename=output_file) grid = xdmf.addGrid(xdmf.output_timegrid, {}) xdmf.addPoints(grid, filter_points) xdmf.addConnectivity(grid, "QUADRILATERAL", filter_connectivity) print("Writing single filter domain file!") xdmf.write() print("filter domain file written!") return 0
[docs] def write_filter_domain(output_file, single_points=None, csv_file=None, dimension=3): '''Write a single macroscale domain file for the Micromorphic Filter :param str output_file: The output filename for the h5 + XDMF file pair :param list single_points: The X, Y, and Z extens for a single element filter domain :param str csv_file: CSV filename containing the bounds of a DNS file Calls single_domain function to generate XDMF file ''' if single_points: X1, X2, Y1, Y2, Z1, Z2 = (float(item) for item in args.single_points) single_domain(X1, X2, Y1, Y2, Z1, Z2, output_file) if dimension == 3: single_domain(X1, X2, Y1, Y2, Z1, Z2, output_file) elif dimension == 2: single_quad_domain(X1, X2, Y1, Y2, output_file) elif csv_file: csv_data = pandas.read_csv(csv_file, sep=",") X1, X2 = csv_data['xmin'][0], csv_data['xmax'][0] Y1, Y2 = csv_data['ymin'][0], csv_data['ymax'][0] Z1, Z2 = csv_data['zmin'][0], csv_data['zmax'][0] if dimension == 3: single_domain(X1, X2, Y1, Y2, Z1, Z2, output_file) elif dimension == 2: single_quad_domain(X1, X2, Y1, Y2, output_file) else: print('Specify either "single_points" or "csv_file" argument!') print('No macro domain file will be written') return 0
def get_parser(): script_name = pathlib.Path(__file__) prog = f"python {script_name.name} " cli_description = "Write a single macroscale domain file for the\ Micromorphic Filter" parser = argparse.ArgumentParser(description=cli_description, prog=prog) parser.add_argument('-o', '--output-file', type=str, required=True, help='Specify the output filename for the h5 + XDMF file pair') parser.add_argument('--single-points', nargs=6, help='Specify the X, Y, and Z extents for the a single element\ macro domain') parser.add_argument('--csv-file', type=str, help='Specify a csv file containing the bounds of a DNS file') parser.add_argument('--dimension', type=int, required=False, default=3, help='The spatial dimension of the macroscale') return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() sys.exit(write_filter_domain(output_file=args.output_file, single_points=args.single_points, csv_file=args.csv_file, dimension=args.dimension, ))