Source code for model_package.Tardigrade_MOOSE.build_Tardigrade_input_deck

import os
import sys
import argparse
import yaml
import inspect

import pandas


[docs] def build_input(output_file, mesh_file, BCs, disp, duration, parameter_sets=None, calibration_map=None, disp_point=None): '''Write a Tardigrade-MOOSE input file :param str output_file: The name of Tardigrade-MOOSE file to write :param str mesh_file: The name of the mesh file :param str BCs: The type of boundary conditions, either "slip" or "clamp" :param float disp: The compressive displacement to be applied :param float duration: The duration of the simulation :param list parameter_sets: The list of yaml files containing calibration results, required if calibration-map is not provided :param str calibration_map: Optional yaml file containing names of calibration files :param str disp_point: Optional string of coordinates to query x-displacement :returns: ``output_file`` ''' # TODO: Write test to make sure the mesh_file exists # unpack parameter set files if calibration map is provided if calibration_map: stream = open(calibration_map, 'r') calibrations = yaml.load(stream, Loader=yaml.FullLoader) stream.close() # Get number of elements and assign the default parameter set num_elements = len(calibrations.keys()) - 2 parameter_sets = [calibrations['ignore_boundary_yml'] for i in range(0, num_elements)] # Override defaults for the elements not located on the boundary summary_file = calibrations['ignore_boundary_summary_file'] if os.path.exists(summary_file): df = pandas.read_csv(summary_file, sep=',') for element in df['element']: parameter_sets[element] = calibrations[str(element)] else: assert parameter_sets is not None # Write input file with open(output_file, 'w') as f: f.write('###############################################################################\n') f.write('[Mesh]\n') f.write(' type = FileMesh\n') f.write(' displacements = "disp_x disp_y disp_z"\n') f.write(' dim = 3\n') f.write(f' file = "{mesh_file}"\n') f.write('[]\n') f.write('\n') f.write('[Variables]\n') f.write(' [./disp_x]\n') f.write(' [../]\n') f.write(' [./disp_y]\n') f.write(' [../]\n') f.write(' [./disp_z]\n') f.write(' [../]\n') f.write(' [./phi_xx]\n') f.write(' [../]\n') f.write(' [./phi_yy]\n') f.write(' [../]\n') f.write(' [./phi_zz]\n') f.write(' [../]\n') f.write(' [./phi_yz]\n') f.write(' [../]\n') f.write(' [./phi_xz]\n') f.write(' [../]\n') f.write(' [./phi_xy]\n') f.write(' [../]\n') f.write(' [./phi_zy]\n') f.write(' [../]\n') f.write(' [./phi_zx]\n') f.write(' [../]\n') f.write(' [./phi_yx]\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[Kernels]\n') f.write(' #Define the internal force balance equations\n') f.write(' [./force_1]\n') f.write(' type = InternalForce\n') f.write(' component = 0\n') f.write(' dof_num = 0\n') f.write(' variable = disp_x\n') f.write(' save_in = force_x\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./force_2]\n') f.write(' type = InternalForce\n') f.write(' component = 1\n') f.write(' dof_num = 1\n') f.write(' variable = disp_y\n') f.write(' save_in = force_y\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./force_3]\n') f.write(' type = InternalForce\n') f.write(' component = 2\n') f.write(' dof_num = 2\n') f.write(' variable = disp_z\n') f.write(' save_in = force_z\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' #Define the internal couple balance equations\n') f.write(' [./couple_11]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 0\n') f.write(' component_j = 0\n') f.write(' dof_num = 3\n') f.write(' variable = phi_xx\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_12]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 0\n') f.write(' component_j = 1\n') f.write(' dof_num = 4\n') f.write(' variable = phi_xy\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_13]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 0\n') f.write(' component_j = 2\n') f.write(' dof_num = 5\n') f.write(' variable = phi_xz\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_21]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 1\n') f.write(' component_j = 0\n') f.write(' dof_num = 6\n') f.write(' variable = phi_yx\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_22]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 1\n') f.write(' component_j = 1\n') f.write(' dof_num = 7\n') f.write(' variable = phi_yy\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_23]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 1\n') f.write(' component_j = 2\n') f.write(' dof_num = 8\n') f.write(' variable = phi_yz\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_31]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 2\n') f.write(' component_j = 0\n') f.write(' dof_num = 9\n') f.write(' variable = phi_zx\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_32]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 2\n') f.write(' component_j = 1\n') f.write(' dof_num = 10\n') f.write(' variable = phi_zy\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write(' [./couple_33]\n') f.write(' type = InternalCouple\n') f.write(' component_i = 2\n') f.write(' component_j = 2\n') f.write(' dof_num = 11\n') f.write(' variable = phi_zz\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = disp_x\n') f.write(' u2 = disp_y\n') f.write(' u3 = disp_z\n') f.write(' phi_11 = phi_xx\n') f.write(' phi_22 = phi_yy\n') f.write(' phi_33 = phi_zz\n') f.write(' phi_23 = phi_yz\n') f.write(' phi_13 = phi_xz\n') f.write(' phi_12 = phi_xy\n') f.write(' phi_32 = phi_zy\n') f.write(' phi_31 = phi_zx\n') f.write(' phi_21 = phi_yx\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('\n') f.write('[AuxVariables]\n') f.write(' [force_x][]\n') f.write(' [force_y][]\n') f.write(' [force_z][]\n') f.write(' [./pk2_11]\n') f.write(' order = CONSTANT\n') f.write(' family = MONOMIAL\n') f.write(' [../]\n') f.write(' [./pk2_22]\n') f.write(' order = CONSTANT\n') f.write(' family = MONOMIAL\n') f.write(' [../]\n') f.write(' [./pk2_33]\n') f.write(' order = CONSTANT\n') f.write(' family = MONOMIAL\n') f.write(' [../]\n') f.write(' [./sigma_11]\n') f.write(' order = CONSTANT\n') f.write(' family = MONOMIAL\n') f.write(' [../]\n') f.write(' [./sigma_22]\n') f.write(' order = CONSTANT\n') f.write(' family = MONOMIAL\n') f.write(' [../]\n') f.write(' [./sigma_33]\n') f.write(' order = CONSTANT\n') f.write(' family = MONOMIAL\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[AuxKernels]\n') f.write(' [./pk2_11]\n') f.write(' type = MaterialStdVectorAux\n') f.write(' property = PK2\n') f.write(' index = 0\n') f.write(' variable = pk2_11\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[AuxKernels]\n') f.write(' [./pk2_22]\n') f.write(' type = MaterialStdVectorAux\n') f.write(' property = PK2\n') f.write(' index = 4\n') f.write(' variable = pk2_22\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[AuxKernels]\n') f.write(' [./pk2_33]\n') f.write(' type = MaterialStdVectorAux\n') f.write(' property = PK2\n') f.write(' index = 8\n') f.write(' variable = pk2_33\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[AuxKernels]\n') f.write(' [./sigma_11]\n') f.write(' type = MaterialStdVectorAux\n') f.write(' property = SIGMA\n') f.write(' index = 0\n') f.write(' variable = sigma_11\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[AuxKernels]\n') f.write(' [./sigma_22]\n') f.write(' type = MaterialStdVectorAux\n') f.write(' property = SIGMA\n') f.write(' index = 4\n') f.write(' variable = sigma_22\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[AuxKernels]\n') f.write(' [./sigma_33]\n') f.write(' type = MaterialStdVectorAux\n') f.write(' property = SIGMA\n') f.write(' index = 8\n') f.write(' variable = sigma_33\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') # Postprocessor(s) f.write('# Get the reaction force\n') f.write('[Postprocessors]\n') f.write(' [bot_react_z]\n') f.write(' type = NodalSum\n') f.write(' variable = force_z\n') f.write(' boundary = "top"\n') f.write(' []\n') # Custom displacement query for disp_x if disp_point: f.write(' [lateral_disp]\n') f.write(' type = PointValue\n') f.write(f' point = "{disp_point}"\n') f.write(' variable = disp_x\n') f.write(' []\n') f.write('[]\n') f.write('\n') if BCs == 'slip': f.write('[BCs]\n') f.write(' active = "x_symm y_symm bottom_z top_z"\n') f.write(' [./x_symm]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_x\n') f.write(' boundary = "x_plane"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./y_symm]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_y\n') f.write(' boundary = "y_plane"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./bottom_z]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_z\n') f.write(' boundary = "bottom"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./top_z]\n') f.write(' type = FunctionDirichletBC\n') f.write(' variable = disp_z\n') f.write(' boundary = "top"\n') f.write(' preset = true\n') f.write(' function = top_bc\n') f.write(' [../]\n') f.write('[]\n') elif BCs == 'clamp': f.write('[BCs]\n') f.write(' active = "bottom_x bottom_y bottom_z top_x top_y top_z"\n') f.write(' [./bottom_x]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_x\n') f.write(' boundary = "bottom"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./bottom_y]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_y\n') f.write(' boundary = "bottom"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./bottom_z]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_z\n') f.write(' boundary = "bottom"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./top_x]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_x\n') f.write(' boundary = "top"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./top_y]\n') f.write(' type = DirichletBC\n') f.write(' variable = disp_y\n') f.write(' boundary = "top"\n') f.write(' preset = true\n') f.write(' value = 0\n') f.write(' [../]\n') f.write(' [./top_z]\n') f.write(' type = FunctionDirichletBC\n') f.write(' variable = disp_z\n') f.write(' boundary = "top"\n') f.write(' preset = true\n') f.write(' function = top_bc\n') f.write(' [../]\n') f.write('[]\n') else: print('Specify a valid BC type!') f.write('\n') f.write('[Functions]\n') f.write(' [./top_bc]\n') f.write(' type = ParsedFunction\n') f.write(f' expression = -{disp}*t\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[Materials]\n') # Load in parameter data for each filter domain / element if len(parameter_sets) > 1: for i, set in enumerate(parameter_sets): # Load yaml file stream = open(set, 'r') UI = yaml.load(stream, Loader=yaml.FullLoader) stream.close() mat_line_1 = UI['line 1'] mat_line_2 = UI['line 2'] mat_line_3 = UI['line 3'] mat_line_4 = UI['line 4'] # Write in material info f.write(f' [./linear_elastic_{i}]\n') f.write(' type = MicromorphicMaterial\n') f.write(f' material_fparameters = "{mat_line_1}\n') f.write(f' {mat_line_2}\n') f.write(f' {mat_line_3}\n') f.write(f' {mat_line_4}"\n') f.write(f' model_name = "LinearElasticity"\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = "disp_x"\n') f.write(' u2 = "disp_y"\n') f.write(' u3 = "disp_z"\n') f.write(' phi_11 = "phi_xx"\n') f.write(' phi_22 = "phi_yy"\n') f.write(' phi_33 = "phi_zz"\n') f.write(' phi_23 = "phi_yz"\n') f.write(' phi_13 = "phi_xz"\n') f.write(' phi_12 = "phi_xy"\n') f.write(' phi_32 = "phi_zy"\n') f.write(' phi_31 = "phi_zx"\n') f.write(' phi_21 = "phi_yx"\n') f.write(f' block = "element_{i}"\n') f.write(' [../]\n') else: # Load yaml file set = parameter_sets[0] stream = open(set, 'r') UI = yaml.load(stream, Loader=yaml.FullLoader) stream.close() mat_line_1 = UI['line 1'] mat_line_2 = UI['line 2'] mat_line_3 = UI['line 3'] mat_line_4 = UI['line 4'] # Write in material info f.write(f' [./linear_elastic]\n') f.write(' type = MicromorphicMaterial \n') f.write(f' material_fparameters = "{mat_line_1}\n') f.write(f' {mat_line_2}\n') f.write(f' {mat_line_3}\n') f.write(f' {mat_line_4}"\n') f.write(f' model_name = "LinearElasticity"\n') f.write('\n') f.write(' #Coupled variables\n') f.write(' u1 = "disp_x"\n') f.write(' u2 = "disp_y"\n') f.write(' u3 = "disp_z"\n') f.write(' phi_11 = "phi_xx"\n') f.write(' phi_22 = "phi_yy"\n') f.write(' phi_33 = "phi_zz"\n') f.write(' phi_23 = "phi_yz"\n') f.write(' phi_13 = "phi_xz"\n') f.write(' phi_12 = "phi_xy"\n') f.write(' phi_32 = "phi_zy"\n') f.write(' phi_31 = "phi_zx"\n') f.write(' phi_21 = "phi_yx"\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[Preconditioning]\n') f.write(' [./SMP]\n') f.write(' type = SMP\n') f.write('# type = FDP\n') f.write(' full = true\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') f.write('[Executioner]\n') f.write('# type = Steady\n') f.write(' type = Transient\n') dt = duration / 10 f.write(' num_steps = 10\n') f.write(f' dt = {dt}\n') f.write('# solve_type = "PJFNK"\n') f.write(' solve_type = "NEWTON"\n') f.write(' nl_rel_tol = 1e-8\n') f.write(' nl_abs_tol = 1e-8\n') f.write(' nl_max_its = 100\n') f.write('[]\n') f.write('\n') f.write('[Outputs]\n') f.write(' exodus = true\n') f.write(' perf_graph = true\n') f.write(' csv = true\n') f.write(' [./console]\n') f.write(' type = Console\n') f.write(' [../]\n') f.write('[]\n') f.write('\n') return 0
def get_parser(): filename = inspect.getfile(lambda: None) basename = os.path.basename(filename) basename_without_extension, extension = os.path.splitext(basename) cli_description = "Write Tardigrade-MOOSE input file" parser = argparse.ArgumentParser(description=cli_description, prog=os.path.basename(filename)) parser.add_argument('-o', '--output-file', type=str, required=True, help="The name of Tardigrade-MOOSE file to write") parser.add_argument('--mesh', type=str, required=True, help='The mesh file') parser.add_argument('--parameter-sets', nargs="+", required=False, default=None, help='List of yaml files containing calibration results, required if calibration-map is not provided') parser.add_argument('--calibration-map', type=str, required=False, default=None, help='Optional yaml file containing names of calibration files') parser.add_argument('--BCs', type=str, required=True, help='The type of boundary conditions, either "slip" or "clamp"') parser.add_argument('--disp', type=float, required=True, help='The compressive displacement to be applied') parser.add_argument('--duration', type=float, required=True, help='The duration of the simulation') parser.add_argument('--disp-point', type=str, required=False, default=None, help='Optional string of coordinates to query x-displacement') return parser if __name__ == '__main__': parser = get_parser() args, unknown = parser.parse_known_args() sys.exit(build_input(output_file=args.output_file, mesh_file=args.mesh, BCs=args.BCs, disp=args.disp, duration=args.duration, parameter_sets=args.parameter_sets, calibration_map=args.calibration_map, disp_point=args.disp_point, ))