From 0a47fc2564c6a7357fb37321cce943e2e3b498a6 Mon Sep 17 00:00:00 2001 From: marco1410 Date: Tue, 29 Nov 2022 15:16:30 +0100 Subject: [PATCH] Updated compressible examples files --- .../data/density.png | Bin 9712 -> 11427 bytes .../data/pressure.png | Bin 8687 -> 10061 bytes .../data/velocity.png | Bin 11114 -> 13020 bytes .../source/MainKratos.py | 79 ++++---- .../source/ProjectParameters.json | 157 ++++++++-------- .../source/MainKratos.py | 161 ++++++----------- .../source/ProjectParameters.json | 169 +++++++++--------- 7 files changed, 256 insertions(+), 310 deletions(-) mode change 100755 => 100644 fluid_dynamics/validation/compressible_sod_shock_tube/source/MainKratos.py diff --git a/fluid_dynamics/validation/compressible_sod_shock_tube/data/density.png b/fluid_dynamics/validation/compressible_sod_shock_tube/data/density.png index c9605596fd320ce2bea16d30b90858c70e733027..7666ec2888adcb1aa8cd1f51444b8f97efe02ecf 100644 GIT binary patch literal 11427 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 auM5iKGR+h-)|0^=z$sIU<2YltKmP}hx~2aB literal 9712 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 C)JWI> literal 11114 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 L@|!0|g0K89cUhea diff --git a/fluid_dynamics/validation/compressible_sod_shock_tube/source/MainKratos.py b/fluid_dynamics/validation/compressible_sod_shock_tube/source/MainKratos.py old mode 100755 new mode 100644 index 876d32c3..cc21d991 --- a/fluid_dynamics/validation/compressible_sod_shock_tube/source/MainKratos.py +++ b/fluid_dynamics/validation/compressible_sod_shock_tube/source/MainKratos.py @@ -1,58 +1,39 @@ -#!/usr/bin/env python - -import time import sys -import pathlib +import time +import importlib import KratosMultiphysics -import KratosMultiphysics.FluidDynamicsApplication -from KratosMultiphysics.FluidDynamicsApplication.fluid_dynamics_analysis \ - import FluidDynamicsAnalysis - - -def abs_filepath(relative_filepath: str) -> str: - return str(pathlib.Path(__file__).parent.resolve()) + "/" \ - + relative_filepath - -class FluidDynamicsAnalysisCompressible(FluidDynamicsAnalysis): - """ - Modified FluidDynamicsAnalysis in order to: - - Print at the first step - - Force stdout to flush at regular intervals - """ +def CreateAnalysisStageWithFlushInstance(cls, global_model, parameters): + class AnalysisStageWithFlush(cls): + + def __init__(self, model,project_parameters, flush_frequency=10.0): + super().__init__(model,project_parameters) + self.flush_frequency = flush_frequency + self.last_flush = time.time() + sys.stdout.flush() + + def Flush(self): + if self.parallel_type == "OpenMP": + now = time.time() + if now - self.last_flush > self.flush_frequency: + sys.stdout.flush() + self.last_flush = now + + return AnalysisStageWithFlush(global_model, parameters) - def __init__(self, model, parameters, flush_frequency=10.0): - super().__init__(model, parameters) - self.flush_frequency = flush_frequency - self.last_flush = time.time() - sys.stdout.flush() - - def Initialize(self): - super().Initialize() - sys.stdout.flush() - self.OutputSolutionStep() - - def OutputSolutionStep(self): - self.Flush() - super().OutputSolutionStep() - - def Flush(self, force=False): - if not force and self.parallel_type != "OpenMP": - return - - now = time.time() - if not force and (now - self.last_flush < self.flush_frequency): - return +if __name__ == "__main__": - sys.stdout.flush() - self.last_flush = now + with open("ProjectParameters.json", 'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + analysis_stage_module_name = parameters["analysis_stage"].GetString() + analysis_stage_class_name = analysis_stage_module_name.split('.')[-1] + analysis_stage_class_name = ''.join(x.title() for x in analysis_stage_class_name.split('_')) -if __name__ == "__main__": - with open(abs_filepath("ProjectParameters.json"), 'r') as parameter_file: - project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + analysis_stage_module = importlib.import_module(analysis_stage_module_name) + analysis_stage_class = getattr(analysis_stage_module, analysis_stage_class_name) - global_model = KratosMultiphysics.Model() - simulation = FluidDynamicsAnalysisCompressible(global_model, project_parameters) - simulation.Run() + global_model = KratosMultiphysics.Model() + simulation = CreateAnalysisStageWithFlushInstance(analysis_stage_class, global_model, parameters) + simulation.Run() diff --git a/fluid_dynamics/validation/compressible_sod_shock_tube/source/ProjectParameters.json b/fluid_dynamics/validation/compressible_sod_shock_tube/source/ProjectParameters.json index adcb9342..67d03218 100644 --- a/fluid_dynamics/validation/compressible_sod_shock_tube/source/ProjectParameters.json +++ b/fluid_dynamics/validation/compressible_sod_shock_tube/source/ProjectParameters.json @@ -1,76 +1,40 @@ { - "problem_data": { - "problem_name": "sod_triangle", - "parallel_type": "OpenMP", - "echo_level": 5, - "start_time": 0.0, - "end_time": 0.16 - }, - "output_processes": { - "gid_output": [ - { - "python_module": "gid_output_process", - "kratos_module": "KratosMultiphysics", - "process_name": "GiDOutputProcess", - "help": "This process writes postprocessing files for GiD", - "Parameters": { - "model_part_name": "FluidModelPart.fluid_computational_model_part", - "output_name": "sod", - "postprocess_parameters": { - "result_file_configuration": { - "gidpost_flags": { - "GiDPostMode": "GiD_PostBinary", - "WriteDeformedMeshFlag": "WriteDeformed", - "WriteConditionsFlag": "WriteConditions", - "MultiFileFlag": "SingleFile" - }, - "file_label": "time", - "output_control_type": "time", - "output_interval": 0.05, - "body_output": true, - "node_output": false, - "skin_output": false, - "plane_output": [], - "nodal_results": ["MOMENTUM","DENSITY","TOTAL_ENERGY","PRESSURE","TEMPERATURE","VELOCITY", "NUMERICAL_ENTROPY"], - "gauss_point_results": ["SHOCK_SENSOR","THERMAL_SENSOR","SHEAR_SENSOR", "VELOCITY_DIVERGENCE"], - "nodal_nonhistorical_results": ["SOUND_VELOCITY", "ARTIFICIAL_MASS_DIFFUSIVITY", "ARTIFICIAL_BULK_VISCOSITY","ARTIFICIAL_DYNAMIC_VISCOSITY","ARTIFICIAL_CONDUCTIVITY","MACH"] - }, - "point_data_configuration": [] - } - } - } - ] - }, + "analysis_stage": "KratosMultiphysics.FluidDynamicsApplication.fluid_dynamics_analysis", + "problem_data" : { + "problem_name" : "sod_with_triangles", + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 0.1 + }, "solver_settings": { - "model_part_name": "FluidModelPart", - "domain_size": 2, - "solver_type": "CompressibleExplicit", - "model_import_settings": { - "input_type": "mdpa", - "input_filename": "rectangle" - }, - "material_import_settings": { - "materials_filename": "FluidMaterials.json" - }, - "echo_level": 0, - "compute_reactions": false, - "shock_capturing_settings": { - "type" : "physics_based" - }, - "time_scheme" : "RK3-TVD", - "use_oss": false, - "volume_model_part_name": "FluidParts_Fluid", - "skin_parts": ["Slip2D", "Boundaries-Left", "Boundaries-Right"], - "no_skin_parts": [], - "time_stepping": { - "automatic_time_step": true, - "CFL_number": 0.5, - "minimum_delta_time": 1e-8, - "maximum_delta_time": 0.01, - "Viscous_Fourier_number": -1, - "Thermal_Fourier_number": -1 - }, - "reform_dofs_at_each_step": false + "model_part_name" : "FluidModelPart", + "domain_size" : 2, + "solver_type" : "CompressibleExplicit", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "rectangle" + }, + "material_import_settings": { + "materials_filename": "FluidMaterials.json" + }, + "echo_level": 0, + "compute_reactions": false, + "shock_capturing_settings": { + "type" : "physics_based", + "Parameters" : {} + }, + "time_scheme" : "RK4", + "use_oss": false, + "volume_model_part_name": "FluidParts_Fluid", + "skin_parts": ["Slip2D", "Boundaries-Left", "Boundaries-Right"], + "no_skin_parts": [], + "time_stepping": { + "automatic_time_step": true, + "minimum_delta_time" : 1e-8, + "CFL_number": 1.0 + }, + "reform_dofs_at_each_step": false }, "processes": { "initial_conditions_process_list": @@ -141,5 +105,56 @@ } ], "auxiliar_process_list": [] + }, + "output_processes": { + "gid_output": [ + { + "python_module": "gid_output_process", + "kratos_module": "KratosMultiphysics", + "process_name": "GiDOutputProcess", + "help": "This process writes postprocessing files for GiD", + "Parameters": { + "model_part_name": "FluidModelPart.fluid_computational_model_part", + "output_name": "sod", + "postprocess_parameters": { + "result_file_configuration": { + "gidpost_flags": { + "GiDPostMode": "GiD_PostBinary", + "WriteDeformedMeshFlag": "WriteDeformed", + "WriteConditionsFlag": "WriteConditions", + "MultiFileFlag": "SingleFile" + }, + "file_label": "time", + "output_control_type": "time", + "output_interval": 0.01, + "body_output": true, + "node_output": false, + "skin_output": false, + "plane_output": [], + "nodal_results": [ + "MOMENTUM", + "DENSITY", + "TOTAL_ENERGY", + "PRESSURE", + "TEMPERATURE", + "VELOCITY"], + "gauss_point_results": [ + "SHOCK_SENSOR", + "THERMAL_SENSOR", + "SHEAR_SENSOR", + "VELOCITY_DIVERGENCE"], + "nodal_nonhistorical_results": [ + "SOUND_VELOCITY", + "ARTIFICIAL_MASS_DIFFUSIVITY", + "ARTIFICIAL_BULK_VISCOSITY", + "ARTIFICIAL_DYNAMIC_VISCOSITY", + "ARTIFICIAL_CONDUCTIVITY", + "MACH"] + }, + "point_data_configuration": [] + } + } + } + ] } } diff --git a/fluid_dynamics/validation/compressible_step_woodward_colella/source/MainKratos.py b/fluid_dynamics/validation/compressible_step_woodward_colella/source/MainKratos.py index 3f9026db..a1339c57 100644 --- a/fluid_dynamics/validation/compressible_step_woodward_colella/source/MainKratos.py +++ b/fluid_dynamics/validation/compressible_step_woodward_colella/source/MainKratos.py @@ -1,115 +1,64 @@ -import time import sys -import os -import pathlib -import math +import time +import importlib import KratosMultiphysics -import KratosMultiphysics.FluidDynamicsApplication -from KratosMultiphysics.FluidDynamicsApplication.fluid_dynamics_analysis \ - import FluidDynamicsAnalysis - - -def abs_filepath(relative_filepath: str) -> str: - return str(pathlib.Path(__file__).parent.resolve()) + "/" \ - + relative_filepath - - -class FluidDynamicsAnalysisCompressible(FluidDynamicsAnalysis): - """ - Modified FluidDynamicsAnalysis in order to: - - Print at the first step - - Print when T<0 - - Terminate simulation when T<0 - - Force stdout to flush at regular intervals - """ - - def __init__(self, model, parameters, flush_frequency=10.0): - super().__init__(model, parameters) - self.flush_frequency = flush_frequency - self.last_flush = time.time() - sys.stdout.flush() - - self.print_count = 0 - self.negative_temp = False - - @classmethod - def distance_to_corner(cls, u: KratosMultiphysics.Node): - return (u.X - 0.6)**2 + (u.Y - 0.0)**2 + (u.Y - 0.0)**2 - def _find_lower_corner_node(self): - eps_2 = 1e-16 - for node in self._GetSolver().GetComputingModelPart().Nodes: - if self.distance_to_corner(node) < eps_2: - self._lower_corner_node = node.Id - KratosMultiphysics.Logger.Print(f"Lower corner node has ID: {self._lower_corner_node}") - return - raise RuntimeError("Lower corner node not found") +def CreateAnalysisStageWithFlushInstance(cls, global_model, parameters): + class AnalysisStageWithFlush(cls): + + def __init__(self, model,project_parameters, flush_frequency=10.0): + super().__init__(model,project_parameters) + self.flush_frequency = flush_frequency + self.last_flush = time.time() + sys.stdout.flush() + + @classmethod + def distance_to_corner(cls, u: KratosMultiphysics.Node): + return (u.X - 0.6)**2 + (u.Y - 0.0)**2 + (u.Y - 0.0)**2 + + def _find_lower_corner_node(self): + eps_2 = 1e-16 + for node in self._GetSolver().GetComputingModelPart().Nodes: + if self.distance_to_corner(node) < eps_2: + self._lower_corner_node = node.Id + return + raise RuntimeError("Lower corner node not found") + + def Initialize(self): + super().Initialize() + sys.stdout.flush() + self._find_lower_corner_node() + + def InitializeSolutionStep(self): + node = self._GetSolver().GetComputingModelPart().GetNode(self._lower_corner_node) + node.SetSolutionStepValue(KratosMultiphysics.MOMENTUM_X, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.MOMENTUM_Y, 0.0) + node.Fix(KratosMultiphysics.MOMENTUM_X) + node.Fix(KratosMultiphysics.MOMENTUM_Y) + super().InitializeSolutionStep() + + def Flush(self): + if self.parallel_type == "OpenMP": + now = time.time() + if now - self.last_flush > self.flush_frequency: + sys.stdout.flush() + self.last_flush = now + + return AnalysisStageWithFlush(global_model, parameters) - def Initialize(self): - super().Initialize() - sys.stdout.flush() - self._find_lower_corner_node() - - self.OutputSolutionStep() - - def InitializeSolutionStep(self): - node = self._GetSolver().GetComputingModelPart().GetNode(self._lower_corner_node) - node.SetSolutionStepValue(KratosMultiphysics.MOMENTUM_X, 0.0) - node.SetSolutionStepValue(KratosMultiphysics.MOMENTUM_Y, 0.0) - super().InitializeSolutionStep() - - def FinalizeSolutionStep(self): - """This function performs all the required operations that should - be executed (for each step) AFTER solving the solution step. - """ - - super().FinalizeSolutionStep() - self.negative_temp = not self.TemperatureIsPositive() - - def OutputSolutionStep(self): - """This function printes / writes output files after the solution - of a step - """ - self.Flush() - super().OutputSolutionStep() - - def KeepAdvancingSolutionLoop(self): - """This function specifies the stopping criteria for breaking the - solution loop. It can be overridden by derived classes - """ - if self.negative_temp: - return False - - return super().KeepAdvancingSolutionLoop() +if __name__ == "__main__": - def TemperatureIsPositive(self): - "Checks if the temperature is a positive number at every node" - for node in self._GetSolver().GetComputingModelPart().Nodes: - T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) - if T < 0.0: - KratosMultiphysics.Logger.Print("Negative temperature in node with ID: %d" % node.Id) - return False - if math.isnan(T): - KratosMultiphysics.Logger.Print("NaN temperature in node with ID: %d" % node.Id) - return False - if math.isinf(T): - KratosMultiphysics.Logger.Print("Infinite temperature in node with ID: %d" % node.Id) - return False - return True + with open("ProjectParameters.json", 'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) - def Flush(self): - if self.parallel_type == "OpenMP": - now = time.time() - if now - self.last_flush > self.flush_frequency: - KratosMultiphysics.Logger.Flush() - sys.stdout.flush() - self.last_flush = now + analysis_stage_module_name = parameters["analysis_stage"].GetString() + analysis_stage_class_name = analysis_stage_module_name.split('.')[-1] + analysis_stage_class_name = ''.join(x.title() for x in analysis_stage_class_name.split('_')) + analysis_stage_module = importlib.import_module(analysis_stage_module_name) + analysis_stage_class = getattr(analysis_stage_module, analysis_stage_class_name) -if __name__ == "__main__": - with open(abs_filepath("ProjectParameters.json"), 'r') as parameter_file: - project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) - global_model = KratosMultiphysics.Model() - simulation = FluidDynamicsAnalysisCompressible(global_model, project_parameters) - simulation.Run() + global_model = KratosMultiphysics.Model() + simulation = CreateAnalysisStageWithFlushInstance(analysis_stage_class, global_model, parameters) + simulation.Run() diff --git a/fluid_dynamics/validation/compressible_step_woodward_colella/source/ProjectParameters.json b/fluid_dynamics/validation/compressible_step_woodward_colella/source/ProjectParameters.json index 8ccb9fb3..6f4f982d 100644 --- a/fluid_dynamics/validation/compressible_step_woodward_colella/source/ProjectParameters.json +++ b/fluid_dynamics/validation/compressible_step_woodward_colella/source/ProjectParameters.json @@ -1,46 +1,18 @@ { + "analysis_stage" : "KratosMultiphysics.FluidDynamicsApplication.fluid_dynamics_analysis", "problem_data": { - "problem_name": "step_woodward", - "parallel_type": "OpenMP", - "echo_level": 0, - "start_time": 0.0, - "end_time": 5 + "problem_name" : "step_woodward_colella", + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 4.0 }, - "output_processes": { - "gid_output": [ - { - "python_module": "gid_output_process", - "kratos_module": "KratosMultiphysics", - "process_name": "GiDOutputProcess", - "help": "This process writes postprocessing files for GiD", - "Parameters": { - "model_part_name": "FluidModelPart.fluid_computational_model_part", - "output_name": "step_woodward_colella", - "postprocess_parameters": { - "result_file_configuration": { - "gidpost_flags": { - "GiDPostMode": "GiD_PostBinary", - "WriteDeformedMeshFlag": "WriteDeformed", - "WriteConditionsFlag": "WriteConditions", - "MultiFileFlag": "SingleFile" + "restart_options" : { + "SaveRestart" : "False", + "RestartFrequency" : 0, + "LoadRestart" : "False", + "Restart_Step" : 0 }, - "file_label": "time", - "output_control_type": "time", - "output_interval": 0.01, - "body_output": true, - "node_output": false, - "skin_output": false, - "plane_output": [], - "nodal_results": ["MOMENTUM","DENSITY","TOTAL_ENERGY","PRESSURE","TEMPERATURE","VELOCITY"], - "gauss_point_results": ["SHOCK_SENSOR","THERMAL_SENSOR","SHEAR_SENSOR", "DENSITY_GRADIENT"], - "nodal_nonhistorical_results": ["SOUND_VELOCITY", "ARTIFICIAL_MASS_DIFFUSIVITY", "ARTIFICIAL_BULK_VISCOSITY","ARTIFICIAL_DYNAMIC_VISCOSITY","ARTIFICIAL_CONDUCTIVITY","MACH"] - }, - "point_data_configuration": [] - } - } - } - ] - }, "solver_settings": { "model_part_name": "FluidModelPart", "domain_size": 2, @@ -56,21 +28,17 @@ "compute_reactions": false, "shock_capturing_settings": { "type" : "physics_based", - "Parameters" : { - } + "Parameters" : {} }, - "time_scheme" : "bfecc", + "time_scheme" : "RK4", "use_oss": false, "volume_model_part_name": "FluidParts_Fluid", "skin_parts": ["Slip2D"], "no_skin_parts": [], "time_stepping": { "automatic_time_step": true, - "CFL_number": 0.1, - "minimum_delta_time": 1e-7, - "maximum_delta_time": 1e-3, - "Viscous_Fourier_number": 0.1, - "Thermal_Fourier_number": 0.1 + "minimum_delta_time" : 1e-8, + "CFL_number": 0.2 }, "reform_dofs_at_each_step": false }, @@ -87,7 +55,7 @@ "variable_name": "DENSITY", "interval": [0.0, 0.0], "constrained": false, - "value": "1.4" + "value": 1.4 } }, { @@ -100,7 +68,7 @@ "variable_name": "MOMENTUM_X", "interval": [0.0, 0.0], "constrained": false, - "value": "4.2" + "value": 4.2 } }, { @@ -113,7 +81,7 @@ "variable_name": "MOMENTUM_Y", "interval": [0.0, 0.0], "constrained": false, - "value": "0.0" + "value": 0.0 } }, { @@ -126,23 +94,19 @@ "variable_name": "TOTAL_ENERGY", "interval": [0.0, 0.0], "constrained": false, - "value": "8.8" + "value": 8.8 } } ], "boundary_conditions_process_list": [ { - "kratos_module": "KratosMultiphysics", - "process_name": "AssignScalarVariableProcess", - "python_module": "assign_scalar_variable_process", + "kratos_module": "KratosMultiphysics.FluidDynamicsApplication", + "process_name": "ApplySlipProcess", + "python_module": "apply_slip_process", "Parameters": { - "model_part_name": "FluidModelPart.Slip2D.Slip2D_Walls-Bottom", - "variable_name": "MOMENTUM_Y", - "interval": [0.0, 1e+30], - "constrained": true, - "value": "0.0" + "model_part_name": "FluidModelPart.Slip2D" } }, { @@ -151,24 +115,11 @@ "python_module": "assign_scalar_variable_process", "Parameters": { - "model_part_name": "FluidModelPart.Slip2D.Slip2D_Walls-Top", - "variable_name": "MOMENTUM_Y", - "interval": [0.0, 1e+30], - "constrained": true, - "value": "0.0" - } - }, - { - "kratos_module": "KratosMultiphysics", - "process_name": "AssignScalarVariableProcess", - "python_module": "assign_scalar_variable_process", - "Parameters": - { - "model_part_name": "FluidModelPart.Slip2D.Slip2D_Walls-Obstacle", - "variable_name": "MOMENTUM_X", - "interval": [0.0, 1e+30], + "model_part_name": "FluidModelPart.Inlet", + "variable_name": "DENSITY", + "interval": [0.0, "End"], "constrained": true, - "value": "0.0" + "value": 1.4 } }, { @@ -178,10 +129,10 @@ "Parameters": { "model_part_name": "FluidModelPart.Inlet", - "variable_name": "DENSITY", - "interval": [0.0, 1e+30], + "variable_name": "MOMENTUM_X", + "interval": [0.0, "End"], "constrained": true, - "value": "1.4" + "value": 4.2 } }, { @@ -191,10 +142,10 @@ "Parameters": { "model_part_name": "FluidModelPart.Inlet", - "variable_name": "MOMENTUM_X", - "interval": [0.0, 1e+30], + "variable_name": "MOMENTUM_Y", + "interval": [0.0, "End"], "constrained": true, - "value": "4.2" + "value": 0.0 } }, { @@ -205,12 +156,62 @@ { "model_part_name": "FluidModelPart.Inlet", "variable_name": "TOTAL_ENERGY", - "interval": [0.0, 1e+30], + "interval": [0.0, "End"], "constrained": true, - "value": "8.8" + "value": 8.8 } } ], "auxiliar_process_list": [] + }, + "output_processes": { + "gid_output": [ + { + "python_module": "gid_output_process", + "kratos_module": "KratosMultiphysics", + "process_name": "GiDOutputProcess", + "help": "This process writes postprocessing files for GiD", + "Parameters": { + "model_part_name": "FluidModelPart.fluid_computational_model_part", + "output_name": "step_woodward_colella", + "postprocess_parameters": { + "result_file_configuration": { + "gidpost_flags": { + "GiDPostMode": "GiD_PostBinary", + "WriteDeformedMeshFlag": "WriteDeformed", + "WriteConditionsFlag": "WriteConditions", + "MultiFileFlag": "SingleFile" + }, + "file_label": "time", + "output_control_type": "time", + "output_interval": 0.1, + "body_output": true, + "node_output": false, + "skin_output": false, + "plane_output": [], + "nodal_results": [ + "MOMENTUM", + "DENSITY", + "TOTAL_ENERGY", + "PRESSURE", + "TEMPERATURE", + "VELOCITY"], + "gauss_point_results": [ + "SHOCK_SENSOR", + "THERMAL_SENSOR", + "SHEAR_SENSOR", + "DENSITY_GRADIENT"], + "nodal_nonhistorical_results": [ + "SOUND_VELOCITY", + "ARTIFICIAL_BULK_VISCOSITY", + "ARTIFICIAL_DYNAMIC_VISCOSITY", + "ARTIFICIAL_CONDUCTIVITY", + "MACH"] + }, + "point_data_configuration": [] + } + } + } + ] } }