def AddBoundaryNodesToFluidDomains(self, model_part): exist_fluid_domain = False for part in model_part.SubModelParts: if part.Is(KratosMultiphysics.FLUID): exist_fluid_domain = True break if (exist_fluid_domain): print( "::[--Domain Utilities-]:: Add boundary nodes to fluid domains " ) transfer_flags = [ KratosMultiphysics.BOUNDARY, KratosMultiphysics.NOT_FLUID ] entity_type = "Nodes" for fluid_part in model_part.SubModelParts: if (fluid_part.IsNot(KratosMultiphysics.ACTIVE) and fluid_part.Is(KratosMultiphysics.FLUID)): for part in model_part.SubModelParts: if part.IsNot(KratosMultiphysics.ACTIVE): if (part.Is(KratosMultiphysics.SOLID) or part.Is(KratosMultiphysics.RIGID)): transfer_process = KratosDelaunay.TransferEntitiesProcess( fluid_part, part, entity_type, transfer_flags) transfer_process.Execute()
def Execute(self): """This function executes the process """ print("Execute check_and_prepare_model_process_fluid") #construct body model parts: fluid_body_model_parts = [] solid_body_model_parts = [] rigid_body_model_parts = [] void_flags = [] if self.bodies_list == True: for i in range(self.bodies_parts_list.size()): #create body model part body_model_part_name = self.bodies_parts_list[i][ "body_name"].GetString() self.main_model_part.CreateSubModelPart(body_model_part_name) body_model_part = self.main_model_part.GetSubModelPart( body_model_part_name) print("[Model_Prepare]::Body Creation", body_model_part_name) body_model_part.ProcessInfo = self.main_model_part.ProcessInfo body_model_part.Properties = self.main_model_part.Properties #build body from their parts body_parts_name_list = self.bodies_parts_list[i]["parts_list"] body_parts_list = [] for j in range(body_parts_name_list.size()): body_parts_list.append( self.main_model_part.GetSubModelPart( body_parts_name_list[j].GetString())) body_model_part_type = self.bodies_parts_list[i][ "body_type"].GetString() for part in body_parts_list: entity_type = "Nodes" clock_time = StartTimeMeasuring() if (body_model_part_type == "Fluid"): assign_flags = [KratosMultiphysics.FLUID] transfer_process = KratosDelaunay.TransferEntitiesProcess( body_model_part, part, entity_type, void_flags, assign_flags) transfer_process.Execute() elif (body_model_part_type == "Solid"): assign_flags = [KratosMultiphysics.SOLID] transfer_process = KratosDelaunay.TransferEntitiesProcess( body_model_part, part, entity_type, void_flags, assign_flags) transfer_process.Execute() elif (body_model_part_type == "Rigid"): assign_flags = [ KratosMultiphysics.RIGID, KratosMultiphysics.BOUNDARY ] transfer_process = KratosDelaunay.TransferEntitiesProcess( body_model_part, part, entity_type, void_flags, assign_flags) transfer_process.Execute() StopTimeMeasuring(clock_time, "1. for node in part.Nodes", True) clock_time = StartTimeMeasuring() entity_type = "Elements" transfer_process = KratosDelaunay.TransferEntitiesProcess( body_model_part, part, entity_type) transfer_process.Execute() StopTimeMeasuring(clock_time, "1. part.Elements", True) clock_time = StartTimeMeasuring() entity_type = "Conditions" transfer_process = KratosDelaunay.TransferEntitiesProcess( body_model_part, part, entity_type) StopTimeMeasuring(clock_time, "1. part.Conditions", True) print(" Bodies Appended ") if body_model_part_type == "Fluid": body_model_part.Set(KratosMultiphysics.FLUID) fluid_body_model_parts.append( self.main_model_part.GetSubModelPart( body_model_part_name)) if body_model_part_type == "Solid": body_model_part.Set(KratosMultiphysics.FLUID) body_model_part.Set(KratosMultiphysics.SOLID) solid_body_model_parts.append( self.main_model_part.GetSubModelPart( body_model_part_name)) if body_model_part_type == "Rigid": body_model_part.Set(KratosMultiphysics.RIGID) rigid_body_model_parts.append( self.main_model_part.GetSubModelPart( body_model_part_name)) clock_time = StartTimeMeasuring() #add walls in fluid domains: transfer_flags = [ KratosMultiphysics.RIGID, KratosMultiphysics.NOT_FLUID ] for solid_part in solid_body_model_parts: set_solid_material_process = KratosPfemFluid.SetMaterialPropertiesToSolidNodes( solid_part) set_solid_material_process.Execute() entity_type = "Nodes" for fluid_part in fluid_body_model_parts: set_fluid_material_process = KratosPfemFluid.SetMaterialPropertiesToFluidNodes( fluid_part) set_fluid_material_process.Execute() for rigid_part in rigid_body_model_parts: set_rigid_material_process = KratosPfemFluid.SetMaterialPropertiesFromFluidToRigidNodes( rigid_part, fluid_part) set_rigid_material_process.Execute() transfer_process = KratosDelaunay.TransferEntitiesProcess( fluid_part, rigid_part, entity_type, transfer_flags) transfer_process.Execute() StopTimeMeasuring(clock_time, "1.rigid_body_model_parts part.Nodes", True) #construct the computing model part: domain_parts = [] for i in range(self.sub_model_part_names.size()): domain_parts.append( self.main_model_part.GetSubModelPart( self.sub_model_part_names[i].GetString())) processes_parts = [] for i in range(self.processes_model_part_names.size()): processes_parts.append( self.main_model_part.GetSubModelPart( self.processes_model_part_names[i].GetString())) #construct a model part which contains the mesh to compute self.main_model_part.CreateSubModelPart(self.computing_model_part_name) fluid_computing_model_part = self.main_model_part.GetSubModelPart( self.computing_model_part_name) fluid_computing_model_part.ProcessInfo = self.main_model_part.ProcessInfo fluid_computing_model_part.Properties = self.main_model_part.Properties #set flag to identify the fluid model part fluid_computing_model_part.Set(KratosMultiphysics.FLUID) #set flag to identify the computing model part fluid_computing_model_part.Set(KratosMultiphysics.ACTIVE) entity_type = "Nodes" transfer_process = KratosDelaunay.TransferEntitiesProcess( fluid_computing_model_part, self.main_model_part, entity_type) transfer_process.Execute() for part in domain_parts: entity_type = "Elements" transfer_process = KratosDelaunay.TransferEntitiesProcess( fluid_computing_model_part, part, entity_type) transfer_process.Execute() for part in processes_parts: part.Set(KratosMultiphysics.BOUNDARY) entity_type = "Conditions" #condition flags as BOUNDARY or CONTACT are reserved to composite or contact conditions (do not set it here) transfer_process = KratosDelaunay.TransferEntitiesProcess( fluid_computing_model_part, part, entity_type) transfer_process.Execute() #delete body parts: (materials have to be already assigned) if self.bodies_list == True: for i in range(self.bodies_parts_list.size()): #get body parts body_parts_name_list = self.bodies_parts_list[i]["parts_list"] for j in range(body_parts_name_list.size()): self.main_model_part.RemoveSubModelPart( body_parts_name_list[j].GetString()) print("::[Model_Prepare]::Body Part Removed:", body_parts_name_list[j].GetString()) print(" Main Model Part", self.main_model_part)
def Execute(self): """This function executes the process """ print("Execute check_and_prepare_model_process_fluid") #construct body model parts: fluid_body_model_parts = [] solid_body_model_parts = [] rigid_body_model_parts = [] void_flags = [] if self.bodies_list == True: max_property_id = 0 for prop in self.main_model_part.Properties: if prop.Id > max_property_id: max_property_id = prop.Id for i in range(self.bodies_parts_list.size()): #create body model part body_model_part_name = self.bodies_parts_list[i]["body_name"].GetString() self.main_model_part.CreateSubModelPart(body_model_part_name) body_model_part = self.main_model_part.GetSubModelPart(body_model_part_name) print("[Model_Prepare]::Body Creation", body_model_part_name) body_model_part.ProcessInfo = self.main_model_part.ProcessInfo with open(self.material_import_settings["materials_filename"].GetString(), 'r') as parameter_file: materials = KratosMultiphysics.Parameters(parameter_file.read()) #build body from their parts body_parts_name_list = self.bodies_parts_list[i]["parts_list"] body_parts_list = [] for j in range(body_parts_name_list.size()): body_parts_list.append(self.main_model_part.GetSubModelPart(body_parts_name_list[j].GetString())) # Add to the fluid and solid domains only the properties that belongs to their native SubModelParts is_solid_or_fluid = False for k in range(materials["properties"].size()): if materials["properties"][k]["model_part_name"].GetString() == self.main_model_part.Name + "." + body_parts_name_list[j].GetString(): property_id = self.main_model_part.GetProperties()[materials["properties"][k]["properties_id"].GetInt()] body_model_part.AddProperties(property_id) is_solid_or_fluid = True # Assign a new dummy property to the rigid boundaries to keep them separated in the GiD post process if not is_solid_or_fluid: max_property_id += 1 new_dummy_property = KratosMultiphysics.Properties(max_property_id) self.main_model_part.GetSubModelPart(body_parts_name_list[j].GetString()).AddProperties(new_dummy_property) KratosPfemFluid.SetDummyPropertyForRigidElementsProcess( \ self.main_model_part.GetSubModelPart(body_parts_name_list[j].GetString()), \ max_property_id).Execute() body_model_part_type = self.bodies_parts_list[i]["body_type"].GetString() for part in body_parts_list: entity_type = "Nodes" clock_time = StartTimeMeasuring() if (body_model_part_type=="Fluid"): assign_flags = [KratosMultiphysics.FLUID] transfer_process = KratosDelaunay.TransferEntitiesProcess(body_model_part,part,entity_type,void_flags,assign_flags) transfer_process.Execute() elif (body_model_part_type=="Solid"): assign_flags = [KratosMultiphysics.SOLID] transfer_process = KratosDelaunay.TransferEntitiesProcess(body_model_part,part,entity_type,void_flags,assign_flags) transfer_process.Execute() elif (body_model_part_type=="Rigid" or body_model_part_type=="Interface"): assign_flags = [KratosMultiphysics.RIGID,KratosMultiphysics.BOUNDARY] transfer_process = KratosDelaunay.TransferEntitiesProcess(body_model_part,part,entity_type,void_flags,assign_flags) transfer_process.Execute() StopTimeMeasuring(clock_time,"1. for node in part.Nodes", True); clock_time = StartTimeMeasuring() entity_type = "Elements" transfer_process = KratosDelaunay.TransferEntitiesProcess(body_model_part,part,entity_type) transfer_process.Execute() StopTimeMeasuring(clock_time,"1. part.Elements", True); clock_time = StartTimeMeasuring() entity_type = "Conditions" transfer_process = KratosDelaunay.TransferEntitiesProcess(body_model_part,part,entity_type) StopTimeMeasuring(clock_time,"1. part.Conditions", True); print(" Bodies Appended ") if body_model_part_type == "Fluid": body_model_part.Set(KratosMultiphysics.FLUID) fluid_body_model_parts.append(self.main_model_part.GetSubModelPart(body_model_part_name)) if body_model_part_type == "Solid": body_model_part.Set(KratosMultiphysics.FLUID) body_model_part.Set(KratosMultiphysics.SOLID) solid_body_model_parts.append(self.main_model_part.GetSubModelPart(body_model_part_name)) if (body_model_part_type == "Rigid" or body_model_part_type == "Interface"): body_model_part.Set(KratosMultiphysics.RIGID) rigid_body_model_parts.append(self.main_model_part.GetSubModelPart(body_model_part_name)) clock_time = StartTimeMeasuring() #add walls in fluid domains: transfer_flags = [KratosMultiphysics.RIGID, (KratosMultiphysics.FLUID).AsFalse()] for solid_part in solid_body_model_parts: set_solid_material_process=KratosPfemFluid.SetMaterialPropertiesToSolidNodes(solid_part) set_solid_material_process.Execute() entity_type = "Nodes" for fluid_part in fluid_body_model_parts: set_fluid_material_process=KratosPfemFluid.SetMaterialPropertiesToFluidNodes(fluid_part) set_fluid_material_process.Execute() for rigid_part in rigid_body_model_parts: set_rigid_material_process=KratosPfemFluid.SetMaterialPropertiesFromFluidToRigidNodes(rigid_part,fluid_part) set_rigid_material_process.Execute() transfer_process = KratosDelaunay.TransferEntitiesProcess(fluid_part,rigid_part,entity_type,transfer_flags) transfer_process.Execute() StopTimeMeasuring(clock_time,"1.rigid_body_model_parts part.Nodes", True); #construct the computing model part: domain_parts = [] for i in range(self.sub_model_part_names.size()): domain_parts.append(self.main_model_part.GetSubModelPart(self.sub_model_part_names[i].GetString())) processes_parts = [] for i in range(self.processes_model_part_names.size()): processes_parts.append(self.main_model_part.GetSubModelPart(self.processes_model_part_names[i].GetString())) #construct a model part which contains the mesh to compute self.main_model_part.CreateSubModelPart(self.computing_model_part_name) fluid_computing_model_part = self.main_model_part.GetSubModelPart(self.computing_model_part_name) fluid_computing_model_part.ProcessInfo = self.main_model_part.ProcessInfo fluid_computing_model_part.Properties = self.main_model_part.Properties #set flag to identify the fluid model part fluid_computing_model_part.Set(KratosMultiphysics.FLUID) #set flag to identify the computing model part fluid_computing_model_part.Set(KratosMultiphysics.ACTIVE) entity_type = "Nodes" transfer_process = KratosDelaunay.TransferEntitiesProcess(fluid_computing_model_part,self.main_model_part,entity_type) transfer_process.Execute() for part in domain_parts: entity_type = "Elements" transfer_process = KratosDelaunay.TransferEntitiesProcess(fluid_computing_model_part,part,entity_type) transfer_process.Execute() for part in processes_parts: part.Set(KratosMultiphysics.BOUNDARY) entity_type = "Conditions" #condition flags as BOUNDARY or CONTACT are reserved to composite or contact conditions (do not set it here) transfer_process = KratosDelaunay.TransferEntitiesProcess(fluid_computing_model_part,part,entity_type) transfer_process.Execute() #delete body parts: (materials have to be already assigned) if self.bodies_list == True: for i in range(self.bodies_parts_list.size()): #get body parts body_parts_name_list = self.bodies_parts_list[i]["parts_list"] for j in range(body_parts_name_list.size()): self.main_model_part.RemoveSubModelPart(body_parts_name_list[j].GetString()) print("::[Model_Prepare]::Body Part Removed:", body_parts_name_list[j].GetString()) print(" Main Model Part", self.main_model_part )