def setUp(self): # Create a complete model part to retrieve an interface from it self.model = KratosMultiphysics.Model() model_part = self.model.CreateModelPart("MainModelPart") model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE] = 2 model_part.AddNodalSolutionStepVariable( KratosMultiphysics.DISPLACEMENT) # Import model part from mdpa file. work_folder = "FSIProblemEmulatorTest" input_filename = 'test_FSI_emulator_Structural' with UnitTest.WorkFolderScope(work_folder, __file__): KratosMultiphysics.ModelPartIO(input_filename).ReadModelPart( model_part) # Create the convergence accelerator conv_acc_factory = KratosMultiphysics.Parameters(""" { "solver_type": "constant_relaxation", "w": 0.5 }""") self.convergence_accelerator = convergence_accelerator_factory.CreateConvergenceAccelerator( conv_acc_factory) # Create the FSI coupling interface fsi_coupling_int_settings = KratosMultiphysics.Parameters(""" { "model_part_name": "FSICouplingInterfaceStructure", "parent_model_part_name": "MainModelPart.StructureInterface2D_Solid_interface", "input_variable_list": ["POSITIVE_FACE_PRESSURE"], "output_variable_list": ["DISPLACEMENT"] }""") self.fsi_coupling_interface = fsi_coupling_interface.FSICouplingInterface( self.model, fsi_coupling_int_settings, self.convergence_accelerator)
def __CreateFSICouplingInterfaceFluid(self): # Set auxiliary settings # Note that in the embedded case, the fluid interface is identical to the structure one # This is intentionally done, since this copy will be used in the level set computation if (self.level_set_type == "continuous"): aux_settings = KratosMultiphysics.Parameters("""{ "model_part_name": "FSICouplingInterfaceFluid", "parent_model_part_name": "", "input_variable_list": ["DISPLACEMENT"], "output_variable_list": ["PRESSURE"] }""") elif (self.level_set_type == "discontinuous"): aux_settings = KratosMultiphysics.Parameters("""{ "model_part_name": "FSICouplingInterfaceFluid", "parent_model_part_name": "", "input_variable_list": ["DISPLACEMENT"], "output_variable_list": ["POSITIVE_FACE_PRESSURE","NEGATIVE_FACE_PRESSURE"] }""") else: err_msg = 'Level set type is: \'' + self.level_set_type + '\'. Expected \'continuous\' or \'discontinuous\'.' raise Exception(err_msg) aux_settings["parent_model_part_name"].SetString( self.structure_interface_submodelpart_name) # Construct the FSI coupling interface fsi_coupling_interface_fluid = fsi_coupling_interface.FSICouplingInterface( self.model, aux_settings) KratosMultiphysics.Logger.PrintInfo( 'PartitionedEmbeddedFSIBaseSolver', 'Fluid FSI coupling interface created') return fsi_coupling_interface_fluid
def __CreateFSICouplingInterfaceStructure(self): # Set auxiliary settings if (self.level_set_type == "continuous"): aux_settings = KratosMultiphysics.Parameters("""{ "model_part_name": "FSICouplingInterfaceStructure", "parent_model_part_name": "", "input_variable_list": ["POSITIVE_FACE_PRESSURE"], "output_variable_list": ["DISPLACEMENT"] }""") elif (self.level_set_type == "discontinuous"): aux_settings = KratosMultiphysics.Parameters("""{ "model_part_name": "FSICouplingInterfaceStructure", "parent_model_part_name": "", "input_variable_list": ["POSITIVE_FACE_PRESSURE","NEGATIVE_FACE_PRESSURE"], "output_variable_list": ["DISPLACEMENT"] }""") else: err_msg = 'Level set type is: \'' + self.level_set_type + '\'. Expected \'continuous\' or \'discontinuous\'.' raise Exception(err_msg) aux_settings["parent_model_part_name"].SetString( self.structure_interface_submodelpart_name) # Construct the FSI coupling interface fsi_coupling_interface_structure = fsi_coupling_interface.FSICouplingInterface( self.model, aux_settings, self.__GetConvergenceAccelerator()) KratosMultiphysics.Logger.PrintInfo( 'PartitionedEmbeddedFSIBaseSolver', 'Structure FSI coupling interface created') return fsi_coupling_interface_structure
def _CreateFSICouplingInterfaceStructure(self): """Create the structure FSI coupling interface Create the structure FSI coupling interface with a default MPI convergence accelerator The final convergence accelerator will be assigned to the structure FSI coupling interface in the _CreateConvergenceAccelerator This is required since the MPI parallel convergence accelerators require the residual minimization model part to be instantiated """ # Set auxiliary settings aux_settings = KratosMultiphysics.Parameters("""{ "model_part_name": "FSICouplingInterfaceStructure", "parent_model_part_name": "", "input_variable_list": ["SURFACE_LOAD"], "output_variable_list": ["DISPLACEMENT"] }""") aux_settings["parent_model_part_name"].SetString( self.interfaces_dict['structure']) # Construct the FSI coupling interface fsi_coupling_interface_structure = fsi_coupling_interface.FSICouplingInterface( self.model, aux_settings, KratosTrilinos.TrilinosConvergenceAccelerator()) KratosMultiphysics.Logger.PrintInfo( 'PartitionedEmbeddedFSIBaseSolver', 'Structure FSI coupling interface created') return fsi_coupling_interface_structure
def __CreateFSICouplingInterfaceFluid(self, fluid_interface_side): # Set auxiliary settings aux_settings = KratosMultiphysics.Parameters("""{ "model_part_name": "", "parent_model_part_name": "", "input_variable_list": ["MESH_DISPLACEMENT"], "output_variable_list": [] }""") aux_settings["model_part_name"].SetString( "FSICouplingInterface{}".format(fluid_interface_side.capitalize())) aux_settings["parent_model_part_name"].SetString( self.interfaces_dict[fluid_interface_side]) aux_settings["output_variable_list"].Append( "{}_MAPPED_VECTOR_VARIABLE".format( "POSITIVE" if fluid_interface_side == 'fluid_positive' else "NEGATIVE")) # Construct the FSI coupling interface # Note that no convergence accelerator is created in the fluid side fsi_coupling_interface_fluid = fsi_coupling_interface.FSICouplingInterface( self.model, aux_settings) KratosMultiphysics.Logger.PrintInfo( 'PartitionedEmbeddedFSIBaseSolver', 'Fluid {} FSI coupling interface created'.format( fluid_interface_side)) return fsi_coupling_interface_fluid
def _CreateFSICouplingInterfaceStructure(self): # Set auxiliary settings aux_settings = KratosMultiphysics.Parameters( """{ "model_part_name": "FSICouplingInterfaceStructure", "parent_model_part_name": "", "input_variable_list": ["SURFACE_LOAD"], "output_variable_list": ["DISPLACEMENT"] }""") aux_settings["parent_model_part_name"].SetString(self.interfaces_dict['structure']) # Get the convergence accelerator instance (note that it is created in this call) convergence_accelerator = self._GetConvergenceAccelerator() # Construct the FSI coupling interface fsi_coupling_interface_structure = fsi_coupling_interface.FSICouplingInterface( self.model, aux_settings, convergence_accelerator) KratosMultiphysics.Logger.PrintInfo('PartitionedFSIBaseSolver', 'Structure FSI coupling interface created') return fsi_coupling_interface_structure