def SPPostProcessResults(self, time): DemFem.DemStructuresCouplingUtilities().MarkBrokenSpheres( self.ring_submodelpart) center = Kratos.Array3() center[0] = self.sp_parameters["problem_data"]["center"][0].GetDouble() center[1] = self.sp_parameters["problem_data"]["center"][1].GetDouble() center[2] = self.sp_parameters["problem_data"]["center"][2].GetDouble() axis = Kratos.Array3() axis[0] = self.sp_parameters["problem_data"]["axis"][0].GetDouble() axis[1] = self.sp_parameters["problem_data"]["axis"][1].GetDouble() axis[2] = self.sp_parameters["problem_data"]["axis"][2].GetDouble() radius = 0 if self.test_number == 1: radius = 0.0036195 #95% of the real hole. CTW16 specimen elif self.test_number == 2: radius = 0.012065 #95% of the real hole. CTW10 specimen elif self.test_number == 3: radius = 0.036195 #95% of the real hole. Blind Test self.dem_solution.creator_destructor.MarkParticlesForErasingGivenCylinder( self.ring_submodelpart, center, axis, radius) if self.test_number == 1 or self.test_number == 2: if self.structural_solution._GetSolver( ).main_model_part.ProcessInfo[Kratos.DOMAIN_SIZE] == 2: self.outer_walls_model_part = self.model[ "Structure.LinePressure2D_Outer_line"] else: self.outer_walls_model_part = self.model[ "Structure.SurfacePressure3D_lateral_pressure"] DemFem.DemStructuresCouplingUtilities( ).ComputeSandProductionWithDepthFirstSearchNonRecursiveImplementation( self.ring_submodelpart, self.outer_walls_model_part, time) DemFem.DemStructuresCouplingUtilities().ComputeSandProduction( self.ring_submodelpart, self.outer_walls_model_part, time) elif self.test_number == 3: if self.structural_solution._GetSolver( ).main_model_part.ProcessInfo[Kratos.DOMAIN_SIZE] == 2: self.outer_walls_model_part_1 = self.model[ "Structure.LinePressure2D_Left_line"] # self.outer_walls_model_part_2 = self.model["Structure.LinePressure2D_Bot_line"] else: self.outer_walls_model_part_1 = self.model[ "Structure.SurfacePressure3D_sigmaXpos"] # self.outer_walls_model_part_2 = self.model["Structure.SurfacePressure3D_sigmaYpos"] # NOTE: The stress printed in this case will also be the SigmaZ, but probably SigmaX is more appropriate DemFem.DemStructuresCouplingUtilities( ).ComputeSandProductionWithDepthFirstSearchNonRecursiveImplementation( self.ring_submodelpart, self.outer_walls_model_part_1, time) DemFem.DemStructuresCouplingUtilities().ComputeSandProduction( self.ring_submodelpart, self.outer_walls_model_part_1, time)
def PrintResultsForGid(self, time): super(DEMAnalysisStage2DSpRigidFem, self).PrintResultsForGid(time) DemFem.DemStructuresCouplingUtilities().MarkBrokenSpheres( self.ring_submodelpart) self.creator_destructor.MarkParticlesForErasingGivenCylinder( self.ring_submodelpart, self.center, self.axis, self.radius_to_delete_sp) DemFem.DemStructuresCouplingUtilities( ).ComputeSandProductionWithDepthFirstSearchNonRecursiveImplementation( self.ring_submodelpart, self.rigid_face_model_part, self.time) DemFem.DemStructuresCouplingUtilities().ComputeSandProduction( self.ring_submodelpart, self.rigid_face_model_part, self.time)
def __init__(self, model_part, test_number): if not test_number: return self.model_part = model_part if test_number == 1: # CTW16 minimum_radius = 0.00381 maximum_radius = 0.00501 elif test_number == 2: # CTW10 minimum_radius = 0.0127 maximum_radius = 0.0139 else: # Blind test minimum_radius = 0.0381 maximum_radius = 0.0393 self.settings = KratosMultiphysics.Parameters(""" { "cylinder_center": [0.0,0.0,0.0] } """) self.settings.AddEmptyValue("min_radius") self.settings["min_radius"].SetDouble(minimum_radius) self.settings.AddEmptyValue("max_radius") self.settings["max_radius"].SetDouble(maximum_radius) self.utility = DemFem.StressFailureCheckUtilities( self.model_part, self.settings)
def _TransferStructuresSkinToDem(self): self.structural_mp = self.structural_solution._GetSolver( ).GetComputingModelPart() self.skin_mp = self.structural_mp.GetSubModelPart( "DetectedByProcessSkinModelPart") dem_walls_mp = self.dem_solution.rigid_face_model_part.CreateSubModelPart( "SkinTransferredFromStructure") max_prop_id = 0 for prop in dem_walls_mp.Properties: if prop.Id > max_prop_id: max_prop_id = prop.Id props = Kratos.Properties(max_prop_id + 1) # NOTE: this should be more general props[Dem.STATIC_FRICTION] = 0.2 props[Dem.DYNAMIC_FRICTION] = 0.2 props[Dem.WALL_COHESION] = 0.0 props[Dem.COMPUTE_WEAR] = False props[Dem.SEVERITY_OF_WEAR] = 0.001 props[Dem.IMPACT_WEAR_SEVERITY] = 0.001 props[Dem.BRINELL_HARDNESS] = 200.0 props[Kratos.YOUNG_MODULUS] = 7e9 props[Kratos.POISSON_RATIO] = 0.16 dem_walls_mp.AddProperties(props) DemFem.DemStructuresCouplingUtilities().TransferStructuresSkinToDem( self.skin_mp, dem_walls_mp, props)
def __init__(self, fem_model_part, dem_model_part, test_number): if not test_number: return self.parameters = Kratos.Parameters(""" { "file_name": "sp_data.hdf5", "target_porosity" : 0.3, "probe_height" : 0.2032 } """) if test_number == 1: # CTW16 test_id = "CTW16" elif test_number == 2: # CTW10 test_id = "CTW10" else: # Blind test test_id = "BlindTest" self.parameters.AddEmptyValue("test_id") self.parameters["test_id"].SetString(test_id) self.dem_model_part = dem_model_part self.fem_model_part = fem_model_part self.post_process_utility = DemFem.PostProcessUtilities( self.dem_model_part) self.internal_radius, self.external_radius, self.interface_radius, self.thickness, self.volume, self.average_radius = self.GetProbeDimensions( ) for elem in self.dem_model_part.Elements: self.density = elem.Properties[Dem.PARTICLE_DENSITY] break self.porosity = self.CalculatePorosity() self.problem_path = os.getcwd() self.file_path = os.path.join(str(self.problem_path), self.parameters["file_name"].GetString()) self.target_porosity = self.parameters["target_porosity"].GetDouble() self.real_probe_height = self.parameters["probe_height"].GetDouble() self.dtype = np.float64 self.compression_type = 'gzip' self.number_of_readings = 0 self.last_time = -float('inf') # This assumes annulus centered at the origin with h5py.File(self.file_path, 'w') as f: f.attrs['test_id'] = self.parameters["test_id"].GetString() f.attrs['internal_radius'] = self.internal_radius f.attrs['external_radius'] = self.external_radius f.attrs['interface_radius'] = self.interface_radius f.attrs['thickness'] = self.thickness f.attrs['volume'] = self.volume f.attrs['real_probe_height'] = self.real_probe_height f.attrs['target_porosity'] = self.target_porosity f.attrs['porosity'] = self.porosity f.attrs['density'] = self.density
def __init__(self, Model, settings): KratosMultiphysics.Process.__init__(self) # Control module process acting on the imposed direction: 0 (X), 1 (Y), 2 (Z) or 3 (radial) # The radial direction is valid only for the vertical walls of a right cylinder with the base # on the 'X-Y' plane centered on (0,0). Negative target_stress means compression. self.model_part = Model[settings["model_part_name"].GetString()] self.control_module_process = DemFem.ControlModuleProcess( self.model_part, settings)
def TransferFEMSkinToDEM(self): fem_skin_mp = self.FEM_Solution.main_model_part.GetSubModelPart( "SkinDEMModelPart") if self.DEM_Solution.rigid_face_model_part.HasSubModelPart( "SkinTransferredFromStructure"): self.EraseConditionsAndNodesSubModelPart() dem_walls_mp = self.DEM_Solution.rigid_face_model_part.GetSubModelPart( "SkinTransferredFromStructure") dem_walls_mp.SetValue(KratosDEM.RIGID_BODY_OPTION, False) props = self.DEM_Solution.spheres_model_part.GetProperties()[2] DemFem.DemStructuresCouplingUtilities( ).TransferStructuresSkinToDem(fem_skin_mp, dem_walls_mp, props) else: # have to create it # props = self.CreateFEMPropertiesForDEFEContact() props = self.DEM_Solution.spheres_model_part.GetProperties()[2] dem_walls_mp = self.DEM_Solution.rigid_face_model_part.CreateSubModelPart( "SkinTransferredFromStructure") dem_walls_mp.SetValue(KratosDEM.RIGID_BODY_OPTION, False) # dem_walls_mp.AddProperties(props) DemFem.DemStructuresCouplingUtilities( ).TransferStructuresSkinToDem(fem_skin_mp, dem_walls_mp, props)
def __init__(self, Model, settings): #NOTE: Negative target_stress means compression self.spheres_model_part = Model["SpheresPart"] self.fem_model_part = Model["Structure"] self.parameters = settings["multiaxial_control_module_fem_dem_generalized_2d_utility"] self.cm_step = 0 self.output_interval = self.parameters["Parameters"]["output_interval"].GetInt() self.cm_utility = DemFem.MultiaxialControlModuleFEMDEMGeneralized2DUtilities(self.spheres_model_part, self.fem_model_part, self.parameters)
def _TransferStructuresSkinToDem(self): self.structural_mp = self.structural_solution._GetSolver( ).GetComputingModelPart() self.skin_mp = self.structural_mp.GetSubModelPart( "DetectedByProcessSkinModelPart") dem_walls_mp = self.dem_solution.rigid_face_model_part props = Kratos.Properties(0) props[Dem.WALL_FRICTION] = 0.5773502691896257 props[Dem.WALL_COHESION] = 0.0 props[Dem.COMPUTE_WEAR] = False props[Dem.SEVERITY_OF_WEAR] = 0.001 props[Dem.IMPACT_WEAR_SEVERITY] = 0.001 props[Dem.BRINELL_HARDNESS] = 200.0 props[Kratos.YOUNG_MODULUS] = 1e20 props[Kratos.POISSON_RATIO] = 0.25 dem_walls_mp.AddProperties(props) DemFem.DemStructuresCouplingUtilities().TransferStructuresSkinToDem( self.skin_mp, dem_walls_mp, props)
def RunSolutionLoop(self): self.dem_solution.step = 0 self.dem_solution.time = 0.0 self.dem_solution.time_old_print = 0.0 self.time_dem = 0.0 self.Dt_structural = self.structural_solution._GetSolver( ).settings["time_stepping"]["time_step"].GetDouble() while self.structural_solution.time < self.structural_solution.end_time: portion_of_the_force_which_is_new = 0.4 DemFem.DemStructuresCouplingUtilities().SmoothLoadTrasferredToFem( self.dem_solution.rigid_face_model_part, portion_of_the_force_which_is_new) self.structural_solution.time = self.structural_solution._GetSolver( ).AdvanceInTime(self.structural_solution.time) self.structural_solution.InitializeSolutionStep() if self.test_number: self.control_module_fem_dem_utility.ExecuteInitializeSolutionStep( ) self.structural_solution._GetSolver().Predict() self.structural_solution._GetSolver().SolveSolutionStep() self.structural_solution.FinalizeSolutionStep() self.structural_solution.OutputSolutionStep() time_final_DEM_substepping = self.structural_solution.time self.Dt_DEM = self.dem_solution.spheres_model_part.ProcessInfo.GetValue( Kratos.DELTA_TIME) DemFem.InterpolateStructuralSolutionForDEM( ).SaveStructuralSolution(self.structural_mp) DemFem.ComputeDEMFaceLoadUtility().ClearDEMFaceLoads(self.skin_mp) if self.test_number == 1 or self.test_number == 2: self.outer_walls_model_part = self.model[ "Structure.SurfacePressure3D_lateral_pressure"] DemFem.DemStructuresCouplingUtilities( ).ComputeSandProductionWithDepthFirstSearch( self.dem_solution.spheres_model_part, self.outer_walls_model_part, self.structural_solution.time) DemFem.DemStructuresCouplingUtilities().ComputeSandProduction( self.dem_solution.spheres_model_part, self.outer_walls_model_part, self.structural_solution.time) elif self.test_number == 3: self.outer_walls_model_part_1 = self.model[ "Structure.SurfacePressure3D_sigmaXpos"] self.outer_walls_model_part_2 = self.model[ "Structure.SurfacePressure3D_sigmaYpos"] DemFem.DemStructuresCouplingUtilities( ).ComputeTriaxialSandProduction( self.dem_solution.spheres_model_part, self.outer_walls_model_part_1, self.outer_walls_model_part_2, self.structural_solution.time) for self.dem_solution.time_dem in self.yield_DEM_time( self.dem_solution.time, time_final_DEM_substepping, self.Dt_DEM): self.dem_solution.time = self.dem_solution.time + self.dem_solution._GetSolver( ).dt self.dem_solution.step += 1 self.dem_solution.DEMFEMProcedures.UpdateTimeInModelParts( self.dem_solution.all_model_parts, self.dem_solution.time, self.dem_solution._GetSolver().dt, self.dem_solution.step) self.dem_solution.InitializeSolutionStep() self.dem_solution._GetSolver().Predict() DemFem.InterpolateStructuralSolutionForDEM( ).InterpolateStructuralSolution( self.structural_mp, self.Dt_structural, self.structural_solution.time, self.dem_solution._GetSolver().dt, self.dem_solution.time) self.dem_solution.SolverSolve() DemFem.DemStructuresCouplingUtilities().MarkBrokenSpheres( self.dem_solution.spheres_model_part) center = Kratos.Array3() center[0] = self.sp_parameters["problem_data"]["center"][ 0].GetDouble() center[1] = self.sp_parameters["problem_data"]["center"][ 1].GetDouble() center[2] = self.sp_parameters["problem_data"]["center"][ 2].GetDouble() axis = Kratos.Array3() axis[0] = self.sp_parameters["problem_data"]["axis"][ 0].GetDouble() axis[1] = self.sp_parameters["problem_data"]["axis"][ 1].GetDouble() axis[2] = self.sp_parameters["problem_data"]["axis"][ 2].GetDouble() radius = 0 if self.test_number == 1: radius = 0.0036195 #95% of the real hole. CTW16 specimen elif self.test_number == 2: radius = 0.012065 #95% of the real hole. CTW10 specimen elif self.test_number == 3: radius = 0.036195 #95% of the real hole. Blind Test self.dem_solution.creator_destructor.MarkParticlesForErasingGivenCylinder( self.dem_solution.spheres_model_part, center, axis, radius) self.dem_solution.FinalizeSolutionStep() DemFem.ComputeDEMFaceLoadUtility().CalculateDEMFaceLoads( self.skin_mp, self.dem_solution._GetSolver().dt, self.Dt_structural) #### PRINTING GRAPHS #### os.chdir(self.dem_solution.graphs_path) self.dem_solution.post_utils.ComputeMeanVelocitiesInTrap( "Average_Velocity.txt", self.dem_solution.time, self.dem_solution.graphs_path) self.dem_solution.materialTest.MeasureForcesAndPressure() self.dem_solution.materialTest.PrintGraph( self.dem_solution.time) self.dem_solution.DEMFEMProcedures.PrintGraph( self.dem_solution.time) self.dem_solution.DEMFEMProcedures.PrintBallsGraph( self.dem_solution.time) self.dem_solution.DEMEnergyCalculator.CalculateEnergyAndPlot( self.dem_solution.time) self.dem_solution.BeforePrintingOperations( self.dem_solution.time) #### GiD IO ########################################## if self.dem_solution.IsTimeToPrintPostProcess(): self.dem_solution._GetSolver().PrepareElementsForPrinting() if self.dem_solution.DEM_parameters[ "ContactMeshOption"].GetBool(): self.dem_solution._GetSolver( ).PrepareContactElementsForPrinting() self.dem_solution.PrintResultsForGid( self.dem_solution.time) self.dem_solution.demio.PrintMultifileLists( self.dem_solution.time, self.dem_solution.post_path) self.dem_solution.time_old_print = self.dem_solution.time if self.test_number: self.stress_failure_check_utility.ExecuteFinalizeSolutionStep( ) self.dem_solution.FinalizeTimeStep(self.dem_solution.time) DemFem.InterpolateStructuralSolutionForDEM( ).RestoreStructuralSolution(self.structural_mp) if self.test_number: self.control_module_fem_dem_utility.ExecuteFinalizeSolutionStep( ) # Write SP data if self.IsPostProcessWriteStep(): self.sp_post_process_tool.WriteData()
def __init__(self, Model, spheres_model_part, test_number): fem_main_model_part = Model["Structure"] self.dem_main_model_part = spheres_model_part self.components_utility_list = [] if not test_number: return if test_number == 1: # CTW16 compression_length = 0.00381 # face_area = 0.008062 alternate_axis_loading = False limit_velocity = -50.0 elif test_number == 2: # CTW10 compression_length = 0.00381 # face_area = 0.007601 alternate_axis_loading = False limit_velocity = -50.0 else: # Blind test compression_length = 0.009144 # face_area = 0.088343 alternate_axis_loading = True limit_velocity = -15.0 if fem_main_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE] == 2: self.fem_submodel_part = Model["Structure.Parts_Solid_part"] settings = KratosMultiphysics.Parameters( """ { "target_stress_table_id" : 1, "initial_velocity" : 0.0, "velocity_factor" : 1.0, "compression_length" : 1.0, "young_modulus" : 7.0e9, "stress_increment_tolerance": 1.0e-3, "update_stiffness": true, "start_time" : 0.0, "stress_averaging_time": 1.0e-5 } """ ) settings.AddEmptyValue("alternate_axis_loading") settings["alternate_axis_loading"].SetBool(alternate_axis_loading) settings.AddEmptyValue("limit_velocity") settings["limit_velocity"].SetDouble(limit_velocity) self.components_utility_list.append(DemFem.ControlModuleFemDem2DUtilities(self.fem_submodel_part, self.dem_main_model_part, settings)) else: self.top_fem_model_part = Model["Structure.SurfacePressure3D_top_pressure"] #self.top_fem_model_part = Model["Structure.SurfacePressure3D_sigmaZpos"] self.top_dem_model_part = self.dem_main_model_part.GetSubModelPart("topdem") top_settings = KratosMultiphysics.Parameters( """ { "imposed_direction" : 2, "alternate_axis_loading": false, "target_stress_table_id" : 1, "initial_velocity" : 0.0, "limit_velocity" : -0.1, "velocity_factor" : 0.5, "young_modulus" : 7.0e9, "stress_increment_tolerance": 100.0, "update_stiffness": true, "start_time" : 0.0, "stress_averaging_time": 1.0e-5 } """ ) top_settings.AddEmptyValue("compression_length") top_settings["compression_length"].SetDouble(compression_length) self.components_utility_list.append(DemFem.ControlModuleFemDemUtilities(self.top_fem_model_part, self.top_dem_model_part, top_settings)) self.bot_fem_model_part = Model["Structure.SurfacePressure3D_bottom_pressure"] #self.bot_fem_model_part = Model["Structure.SurfacePressure3D_sigmaZneg"] self.bot_dem_model_part = self.dem_main_model_part.GetSubModelPart("botdem") bot_settings = KratosMultiphysics.Parameters( """ { "imposed_direction" : 2, "alternate_axis_loading": false, "target_stress_table_id" : 2, "initial_velocity" : 0.0, "limit_velocity" : 0.1, "velocity_factor" : 0.5, "young_modulus" : 7.0e9, "stress_increment_tolerance": 100.0, "update_stiffness": true, "start_time" : 0.0, "stress_averaging_time": 1.0e-5 } """ ) bot_settings.AddEmptyValue("compression_length") bot_settings["compression_length"].SetDouble(compression_length) self.components_utility_list.append(DemFem.ControlModuleFemDemUtilities(self.bot_fem_model_part, self.bot_dem_model_part, bot_settings))
def RunSolutionLoop(self): self.dem_solution.step = 0 self.dem_solution.time = 0.0 self.dem_solution.time_old_print = 0.0 self.time_dem = 0.0 self.Dt_structural = self.structural_solution._GetSolver( ).settings["time_stepping"]["time_step"].GetDouble() while self.structural_solution.time < self.structural_solution.end_time: portion_of_the_force_which_is_new = 0.4 DemFem.DemStructuresCouplingUtilities().SmoothLoadTrasferredToFem( self.dem_solution.rigid_face_model_part, portion_of_the_force_which_is_new) self.structural_solution.time = self.structural_solution._GetSolver( ).AdvanceInTime(self.structural_solution.time) self.structural_solution.InitializeSolutionStep() self.structural_solution._GetSolver().Predict() self.structural_solution._GetSolver().SolveSolutionStep() self.structural_solution.FinalizeSolutionStep() self.structural_solution.OutputSolutionStep() time_final_DEM_substepping = self.structural_solution.time self.Dt_DEM = self.dem_solution.spheres_model_part.ProcessInfo.GetValue( Kratos.DELTA_TIME) DemFem.InterpolateStructuralSolutionForDEM( ).SaveStructuralSolution(self.structural_mp) DemFem.ComputeDEMFaceLoadUtility().ClearDEMFaceLoads(self.skin_mp) for self.dem_solution.time_dem in self.yield_DEM_time( self.dem_solution.time, time_final_DEM_substepping, self.Dt_DEM): self.dem_solution.time = self.dem_solution.time + self.dem_solution._GetSolver( ).dt self.dem_solution.step += 1 self.dem_solution.DEMFEMProcedures.UpdateTimeInModelParts( self.dem_solution.all_model_parts, self.dem_solution.time, self.dem_solution._GetSolver().dt, self.dem_solution.step) self.dem_solution.InitializeSolutionStep() DemFem.InterpolateStructuralSolutionForDEM( ).InterpolateStructuralSolution( self.structural_mp, self.Dt_structural, self.structural_solution.time, self.dem_solution._GetSolver().dt, self.dem_solution.time) self.dem_solution.SolverSolve() self.dem_solution.FinalizeSolutionStep() DemFem.ComputeDEMFaceLoadUtility().CalculateDEMFaceLoads( self.skin_mp, self.dem_solution._GetSolver().dt, self.Dt_structural) self.dem_solution.DEMFEMProcedures.MoveAllMeshes( self.dem_solution.all_model_parts, self.dem_solution.time, self.dem_solution._GetSolver().dt) #DEMFEMProcedures.MoveAllMeshesUsingATable(rigid_face_model_part, time, dt) #### PRINTING GRAPHS #### os.chdir(self.dem_solution.graphs_path) self.dem_solution.post_utils.ComputeMeanVelocitiesInTrap( "Average_Velocity.txt", self.dem_solution.time, self.dem_solution.graphs_path) self.dem_solution.materialTest.MeasureForcesAndPressure() self.dem_solution.materialTest.PrintGraph( self.dem_solution.time) self.dem_solution.DEMFEMProcedures.PrintGraph( self.dem_solution.time) self.dem_solution.DEMFEMProcedures.PrintBallsGraph( self.dem_solution.time) self.dem_solution.DEMEnergyCalculator.CalculateEnergyAndPlot( self.dem_solution.time) self.dem_solution.BeforePrintingOperations( self.dem_solution.time) #### GiD IO ########################################## if self.dem_solution.IsTimeToPrintPostProcess(): self.dem_solution._GetSolver().PrepareElementsForPrinting() if self.dem_solution.DEM_parameters[ "ContactMeshOption"].GetBool(): self.dem_solution._GetSolver( ).PrepareContactElementsForPrinting() self.dem_solution.PrintResultsForGid( self.dem_solution.time) self.dem_solution.demio.PrintMultifileLists( self.dem_solution.time, self.dem_solution.post_path) self.dem_solution.time_old_print = self.dem_solution.time self.dem_solution.FinalizeTimeStep(self.dem_solution.time) DemFem.InterpolateStructuralSolutionForDEM( ).RestoreStructuralSolution(self.structural_mp)
def RunSolutionLoop(self): self.dem_solution.step = 0 self.dem_solution.time = 0.0 self.dem_solution.time_old_print = 0.0 self.time_dem = 0.0 self.Dt_structural = self.structural_solution._GetSolver( ).settings["time_stepping"]["time_step"].GetDouble() while self.structural_solution.time < self.structural_solution.end_time: self.structural_solution.time = self.structural_solution._GetSolver( ).AdvanceInTime(self.structural_solution.time) self.structural_solution.InitializeSolutionStep() self.structural_solution._GetSolver().Predict() self.structural_solution._GetSolver().SolveSolutionStep() self.structural_solution.FinalizeSolutionStep() self.structural_solution.OutputSolutionStep() time_final_DEM_substepping = self.structural_solution.time self.Dt_DEM = self.dem_solution.spheres_model_part.ProcessInfo.GetValue( Kratos.DELTA_TIME) DemFem.InterpolateStructuralSolutionForDEM( ).SaveStructuralSolution(self.structural_mp) DemFem.ComputeDEMFaceLoadUtility().ClearDEMFaceLoads(self.skin_mp) for self.dem_solution.time_dem in self.yield_DEM_time( self.dem_solution.time, time_final_DEM_substepping, self.Dt_DEM): self.dem_solution.InitializeTimeStep() self.dem_solution.time = self.dem_solution.time + self.dem_solution.solver.dt self.dem_solution.step += 1 self.dem_solution.DEMFEMProcedures.UpdateTimeInModelParts( self.dem_solution.all_model_parts, self.dem_solution.time, self.dem_solution.solver.dt, self.dem_solution.step) self.dem_solution._BeforeSolveOperations( self.dem_solution.time) DemFem.InterpolateStructuralSolutionForDEM( ).InterpolateStructuralSolution(self.structural_mp, self.Dt_structural, self.structural_solution.time, self.dem_solution.time) self.dem_solution.SolverSolve() self.dem_solution.AfterSolveOperations() DemFem.ComputeDEMFaceLoadUtility().CalculateDEMFaceLoads( self.skin_mp, self.dem_solution.solver.dt, self.Dt_structural) self.dem_solution.DEMFEMProcedures.MoveAllMeshes( self.dem_solution.all_model_parts, self.dem_solution.time, self.dem_solution.solver.dt) #DEMFEMProcedures.MoveAllMeshesUsingATable(rigid_face_model_part, time, dt) ##### adding DEM elements by the inlet ###### if self.dem_solution.DEM_parameters[ "dem_inlet_option"].GetBool(): self.dem_solution.DEM_inlet.CreateElementsFromInletMesh( self.dem_solution.spheres_model_part, self.dem_solution.cluster_model_part, self.dem_solution.creator_destructor ) # After solving, to make sure that neighbours are already set. stepinfo = self.dem_solution.report.StepiReport( timer, self.dem_solution.time, self.dem_solution.step) if stepinfo: self.dem_solution.KRATOSprint(stepinfo) #### PRINTING GRAPHS #### os.chdir(self.dem_solution.graphs_path) self.dem_solution.post_utils.ComputeMeanVelocitiesInTrap( "Average_Velocity.txt", self.dem_solution.time, self.dem_solution.graphs_path) self.dem_solution.materialTest.MeasureForcesAndPressure() self.dem_solution.materialTest.PrintGraph( self.dem_solution.time) self.dem_solution.DEMFEMProcedures.PrintGraph( self.dem_solution.time) self.dem_solution.DEMFEMProcedures.PrintBallsGraph( self.dem_solution.time) self.dem_solution.DEMEnergyCalculator.CalculateEnergyAndPlot( self.dem_solution.time) self.dem_solution.BeforePrintingOperations( self.dem_solution.time) #### GiD IO ########################################## if self.dem_solution.IsTimeToPrintPostProcess(): self.dem_solution.PrintResultsForGid( self.dem_solution.time) self.dem_solution.demio.PrintMultifileLists( self.dem_solution.time, self.dem_solution.post_path) self.dem_solution.time_old_print = self.dem_solution.time self.dem_solution.FinalizeTimeStep(self.dem_solution.time) DemFem.InterpolateStructuralSolutionForDEM( ).RestoreStructuralSolution(self.structural_mp)
def __init__(self, Model, spheres_model_part, test_number): fem_main_model_part = Model["Structure"] self.dem_main_model_part = spheres_model_part self.components_utility_list = [] if not test_number: return compression_length = 0.00381 if test_number == 1: # CTW16 face_area = 0.008062 elif test_number == 2: # CTW10 face_area = 0.007601 else: # Blind test compression_length = 0.009144 face_area = 0.088343 if fem_main_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE] == 2: self.fem_submodel_part = Model["Structure.Parts_Solid_part"] settings = KratosMultiphysics.Parameters( """ { "target_stress_table_id" : 1, "initial_velocity" : 0.0, "limit_velocity" : -10.0, "velocity_factor" : 0.5, "compression_length" : 1.0, "young_modulus" : 7.0e9, "stress_increment_tolerance": 100.0, "update_stiffness": true, "start_time" : 0.0 } """ ) settings.AddEmptyValue("face_area") settings["face_area"].SetDouble(face_area) self.components_utility_list.append(DemFem.ControlModuleFemDem2DUtilities(self.fem_submodel_part, self.dem_main_model_part, settings)) else: self.top_fem_model_part = Model["Structure.SurfacePressure3D_top_pressure"] #self.top_fem_model_part = Model["Structure.SurfacePressure3D_sigmaZpos"] self.top_dem_model_part = self.dem_main_model_part.GetSubModelPart("topdem") top_settings = KratosMultiphysics.Parameters( """ { "variable_name": "DISPLACEMENT", "reaction_variable_name": "REACTION", "dem_force_variable_name": "TOTAL_FORCES", "target_stress_variable_name": "TARGET_STRESS", "reaction_stress_variable_name": "REACTION_STRESS", "loading_velocity_variable_name": "LOADING_VELOCITY", "imposed_direction" : 2, "target_stress_table_id" : 1, "initial_velocity" : 0.0, "limit_velocity" : -0.1, "velocity_factor" : 0.5, "young_modulus" : 7.0e9, "stress_increment_tolerance": 100.0, "update_stiffness": true, "start_time" : 0.0 } """ ) top_settings.AddEmptyValue("compression_length") top_settings["compression_length"].SetDouble(compression_length) top_settings.AddEmptyValue("face_area") top_settings["face_area"].SetDouble(face_area) self.components_utility_list.append(DemFem.ControlModuleFemDemUtilities(self.top_fem_model_part, self.top_dem_model_part, top_settings)) self.bot_fem_model_part = Model["Structure.SurfacePressure3D_bottom_pressure"] #self.bot_fem_model_part = Model["Structure.SurfacePressure3D_sigmaZneg"] self.bot_dem_model_part = self.dem_main_model_part.GetSubModelPart("botdem") bot_settings = KratosMultiphysics.Parameters( """ { "variable_name": "DISPLACEMENT", "reaction_variable_name": "REACTION", "dem_force_variable_name": "TOTAL_FORCES", "target_stress_variable_name": "TARGET_STRESS", "reaction_stress_variable_name": "REACTION_STRESS", "loading_velocity_variable_name": "LOADING_VELOCITY", "imposed_direction" : 2, "target_stress_table_id" : 2, "initial_velocity" : 0.0, "limit_velocity" : 0.1, "velocity_factor" : 0.5, "young_modulus" : 7.0e9, "stress_increment_tolerance": 100.0, "update_stiffness": true, "start_time" : 0.0 } """ ) bot_settings.AddEmptyValue("compression_length") bot_settings["compression_length"].SetDouble(compression_length) bot_settings.AddEmptyValue("face_area") bot_settings["face_area"].SetDouble(face_area) self.components_utility_list.append(DemFem.ControlModuleFemDemUtilities(self.bot_fem_model_part, self.bot_dem_model_part, bot_settings))
def __init__(self, Model, settings): KratosMultiphysics.Process.__init__(self) model_part = Model[settings["model_part_name"].GetString()] variable_name = settings["variable_name"].GetString() reaction_variable_name = settings["reaction_variable_name"].GetString() target_stress_variable_name = settings[ "target_stress_variable_name"].GetString() reaction_stress_variable_name = settings[ "reaction_stress_variable_name"].GetString() loading_velocity_variable_name = settings[ "loading_velocity_variable_name"].GetString() self.components_process_list = [] if settings["fixed"][0].GetBool() == True: x_params = KratosMultiphysics.Parameters("{}") x_params.AddValue("model_part_name", settings["model_part_name"]) x_params.AddEmptyValue("variable_name").SetString(variable_name + "_X") x_params.AddEmptyValue("reaction_variable_name").SetString( reaction_variable_name + "_X") x_params.AddEmptyValue("target_stress_variable_name").SetString( target_stress_variable_name + "_X") x_params.AddEmptyValue("reaction_stress_variable_name").SetString( reaction_stress_variable_name + "_X") x_params.AddEmptyValue("loading_velocity_variable_name").SetString( loading_velocity_variable_name + "_X") x_params.AddValue("target_stress_table_id", settings["target_stress_table_id"][0]) x_params.AddValue("initial_velocity", settings["initial_velocity"][0]) x_params.AddValue("limit_velocity", settings["limit_velocity"][0]) x_params.AddValue("velocity_factor", settings["velocity_factor"]) x_params.AddValue("compression_length", settings["compression_length"]) x_params.AddValue("young_modulus", settings["young_modulus"]) x_params.AddValue("stress_increment_tolerance", settings["stress_increment_tolerance"]) x_params.AddValue("update_stiffness", settings["update_stiffness"]) x_params.AddValue("start_time", settings["start_time"]) self.components_process_list.append( DemFem.ControlModuleProcess(model_part, x_params)) if settings["fixed"][1].GetBool() == True: y_params = KratosMultiphysics.Parameters("{}") y_params.AddValue("model_part_name", settings["model_part_name"]) y_params.AddEmptyValue("variable_name").SetString(variable_name + "_Y") y_params.AddEmptyValue("reaction_variable_name").SetString( reaction_variable_name + "_Y") y_params.AddEmptyValue("target_stress_variable_name").SetString( target_stress_variable_name + "_Y") y_params.AddEmptyValue("reaction_stress_variable_name").SetString( reaction_stress_variable_name + "_Y") y_params.AddEmptyValue("loading_velocity_variable_name").SetString( loading_velocity_variable_name + "_Y") y_params.AddValue("target_stress_table_id", settings["target_stress_table_id"][1]) y_params.AddValue("initial_velocity", settings["initial_velocity"][1]) y_params.AddValue("limit_velocity", settings["limit_velocity"][1]) y_params.AddValue("velocity_factor", settings["velocity_factor"]) y_params.AddValue("compression_length", settings["compression_length"]) y_params.AddValue("young_modulus", settings["young_modulus"]) y_params.AddValue("stress_increment_tolerance", settings["stress_increment_tolerance"]) y_params.AddValue("update_stiffness", settings["update_stiffness"]) y_params.AddValue("start_time", settings["start_time"]) self.components_process_list.append( DemFem.ControlModuleProcess(model_part, y_params)) if settings["fixed"][2].GetBool() == True: z_params = KratosMultiphysics.Parameters("{}") z_params.AddValue("model_part_name", settings["model_part_name"]) z_params.AddEmptyValue("variable_name").SetString(variable_name + "_Z") z_params.AddEmptyValue("reaction_variable_name").SetString( reaction_variable_name + "_Z") z_params.AddEmptyValue("target_stress_variable_name").SetString( target_stress_variable_name + "_Z") z_params.AddEmptyValue("reaction_stress_variable_name").SetString( reaction_stress_variable_name + "_Z") z_params.AddEmptyValue("loading_velocity_variable_name").SetString( loading_velocity_variable_name + "_Z") z_params.AddValue("target_stress_table_id", settings["target_stress_table_id"][2]) z_params.AddValue("initial_velocity", settings["initial_velocity"][2]) z_params.AddValue("limit_velocity", settings["limit_velocity"][2]) z_params.AddValue("velocity_factor", settings["velocity_factor"]) z_params.AddValue("compression_length", settings["compression_length"]) z_params.AddValue("young_modulus", settings["young_modulus"]) z_params.AddValue("stress_increment_tolerance", settings["stress_increment_tolerance"]) z_params.AddValue("update_stiffness", settings["update_stiffness"]) z_params.AddValue("start_time", settings["start_time"]) self.components_process_list.append( DemFem.ControlModuleProcess(model_part, z_params))
def __init__(self, Model, settings ): KratosMultiphysics.Process.__init__(self) self.model_part = Model[settings["model_part_name"].GetString()] variable_name = settings["variable_name"].GetString() reaction_variable_name = settings["reaction_variable_name"].GetString() target_stress_variable_name = settings["target_stress_variable_name"].GetString() reaction_stress_variable_name = settings["reaction_stress_variable_name"].GetString() loading_velocity_variable_name = settings["loading_velocity_variable_name"].GetString() self.components_process_list = [] if settings.Has("radial_displacement") and settings["radial_displacement"].GetBool(): # Control module on the vertical walls of a right cylinder with the base on the 'X-Y' plane centered on (0,0). # Negative target_stress means compression. self.params = KratosMultiphysics.Parameters("{}") self.params.AddValue("model_part_name",settings["model_part_name"]) self.params.AddValue("variable_name",settings["variable_name"]) self.params.AddValue("reaction_variable_name",settings["reaction_variable_name"]) self.params.AddValue("target_stress_variable_name",settings["target_stress_variable_name"]) self.params.AddValue("reaction_stress_variable_name",settings["reaction_stress_variable_name"]) self.params.AddValue("loading_velocity_variable_name",settings["loading_velocity_variable_name"]) self.params.AddValue("radial_displacement",settings["radial_displacement"]) self.params.AddValue("target_stress_table_id",settings["target_stress_table_id"]) self.params.AddValue("initial_velocity",settings["initial_velocity"]) self.params.AddValue("limit_velocity",settings["limit_velocity"]) self.params.AddValue("velocity_factor",settings["velocity_factor"]) self.params.AddValue("compression_length",settings["compression_length"]) self.params.AddValue("young_modulus",settings["young_modulus"]) self.params.AddValue("stress_increment_tolerance",settings["stress_increment_tolerance"]) self.params.AddValue("update_stiffness",settings["update_stiffness"]) self.params.AddValue("start_time",settings["start_time"]) self.components_process_list.append(DemFem.ControlModuleProcess(self.model_part, self.params)) else: if settings["fixed"][0].GetBool() == True: self.x_params = KratosMultiphysics.Parameters("{}") self.x_params.AddValue("model_part_name",settings["model_part_name"]) self.x_params.AddEmptyValue("variable_name").SetString(variable_name+"_X") self.x_params.AddEmptyValue("reaction_variable_name").SetString(reaction_variable_name+"_X") self.x_params.AddEmptyValue("target_stress_variable_name").SetString(target_stress_variable_name+"_X") self.x_params.AddEmptyValue("reaction_stress_variable_name").SetString(reaction_stress_variable_name+"_X") self.x_params.AddEmptyValue("loading_velocity_variable_name").SetString(loading_velocity_variable_name+"_X") self.x_params.AddValue("target_stress_table_id",settings["target_stress_table_id"][0]) self.x_params.AddValue("initial_velocity",settings["initial_velocity"][0]) self.x_params.AddValue("limit_velocity",settings["limit_velocity"][0]) self.x_params.AddValue("velocity_factor",settings["velocity_factor"]) self.x_params.AddValue("compression_length",settings["compression_length"]) self.x_params.AddValue("young_modulus",settings["young_modulus"]) self.x_params.AddValue("stress_increment_tolerance",settings["stress_increment_tolerance"]) self.x_params.AddValue("update_stiffness",settings["update_stiffness"]) self.x_params.AddValue("start_time",settings["start_time"]) self.components_process_list.append(DemFem.ControlModuleProcess(self.model_part, self.x_params)) if settings["fixed"][1].GetBool() == True: self.y_params = KratosMultiphysics.Parameters("{}") self.y_params.AddValue("model_part_name",settings["model_part_name"]) self.y_params.AddEmptyValue("variable_name").SetString(variable_name+"_Y") self.y_params.AddEmptyValue("reaction_variable_name").SetString(reaction_variable_name+"_Y") self.y_params.AddEmptyValue("target_stress_variable_name").SetString(target_stress_variable_name+"_Y") self.y_params.AddEmptyValue("reaction_stress_variable_name").SetString(reaction_stress_variable_name+"_Y") self.y_params.AddEmptyValue("loading_velocity_variable_name").SetString(loading_velocity_variable_name+"_Y") self.y_params.AddValue("target_stress_table_id",settings["target_stress_table_id"][1]) self.y_params.AddValue("initial_velocity",settings["initial_velocity"][1]) self.y_params.AddValue("limit_velocity",settings["limit_velocity"][1]) self.y_params.AddValue("velocity_factor",settings["velocity_factor"]) self.y_params.AddValue("compression_length",settings["compression_length"]) self.y_params.AddValue("young_modulus",settings["young_modulus"]) self.y_params.AddValue("stress_increment_tolerance",settings["stress_increment_tolerance"]) self.y_params.AddValue("update_stiffness",settings["update_stiffness"]) self.y_params.AddValue("start_time",settings["start_time"]) self.components_process_list.append(DemFem.ControlModuleProcess(self.model_part, self.y_params)) if settings["fixed"][2].GetBool() == True: self.z_params = KratosMultiphysics.Parameters("{}") self.z_params.AddValue("model_part_name",settings["model_part_name"]) self.z_params.AddEmptyValue("variable_name").SetString(variable_name+"_Z") self.z_params.AddEmptyValue("reaction_variable_name").SetString(reaction_variable_name+"_Z") self.z_params.AddEmptyValue("target_stress_variable_name").SetString(target_stress_variable_name+"_Z") self.z_params.AddEmptyValue("reaction_stress_variable_name").SetString(reaction_stress_variable_name+"_Z") self.z_params.AddEmptyValue("loading_velocity_variable_name").SetString(loading_velocity_variable_name+"_Z") self.z_params.AddValue("target_stress_table_id",settings["target_stress_table_id"][2]) self.z_params.AddValue("initial_velocity",settings["initial_velocity"][2]) self.z_params.AddValue("limit_velocity",settings["limit_velocity"][2]) self.z_params.AddValue("velocity_factor",settings["velocity_factor"]) self.z_params.AddValue("compression_length",settings["compression_length"]) self.z_params.AddValue("young_modulus",settings["young_modulus"]) self.z_params.AddValue("stress_increment_tolerance",settings["stress_increment_tolerance"]) self.z_params.AddValue("update_stiffness",settings["update_stiffness"]) self.z_params.AddValue("start_time",settings["start_time"]) self.components_process_list.append(DemFem.ControlModuleProcess(self.model_part, self.z_params))