def _SynchronizeOutputData(self, solver_name): from_solver = self.solver_wrappers[solver_name] output_data_list = self.coupling_sequence[solver_name][ "output_data_list"] if self.echo_level > 2: cs_tools.cs_print_info( self._ClassName(), 'Start Synchronizing Output for "{}"'.format( colors.blue(solver_name))) for i in range(output_data_list.size()): i_output_data = output_data_list[i] data_name = i_output_data["data"].GetString() to_solver_name = i_output_data["to_solver"].GetString() to_solver_data_name = i_output_data["to_solver_data"].GetString() if self.echo_level > 2: cs_tools.cs_print_info( " Data", '"{}" | to solver: "{}": "{}"'.format( colors.magenta(data_name), colors.blue(to_solver_name), colors.magenta(to_solver_data_name))) # check if data-exchange is specified for current time if not KM.IntervalUtility(i_output_data).IsInInterval(self.time): if self.echo_level > 2: cs_tools.cs_print_info(" Skipped", 'not in interval') continue # from solver from_solver_data = from_solver.GetInterfaceData(data_name) # to solver to_solver = self.solver_wrappers[to_solver_name] to_solver_data = to_solver.GetInterfaceData(to_solver_data_name) # perform the data transfer self.__ExecuteCouplingOperations( i_output_data["before_data_transfer_operations"]) data_transfer_operator_name = i_output_data[ "data_transfer_operator"].GetString() # TODO check the order of solvers! self.__GetDataTransferOperator( data_transfer_operator_name).TransferData( from_solver_data, to_solver_data, i_output_data["data_transfer_operator_options"]) self.__ExecuteCouplingOperations( i_output_data["after_data_transfer_operations"]) self.__ApplyScaling(to_solver_data, i_output_data) # Exporting data to external solvers from_solver.ExportCouplingInterfaceData(from_solver_data) if self.echo_level > 2: cs_tools.cs_print_info( self._ClassName(), 'End Synchronizing Output for "{}"'.format( colors.blue(solver_name)))
def ExportCouplingInterface(self, interface_config): if self.echo_level > 2: cs_tools.cs_print_info( "CoSimulationSolverWrapper", 'Exporting coupling interface "{}" of solver: "{}"'.format( colors.magenta(interface_config["model_part_name"]), colors.blue(self.name))) self.__GetIO().ExportCouplingInterface(interface_config)
def Run(self): num_coupling_interfaces = self.settings["coupling_interfaces"].size() self.__CustomPrint( 1, colors.cyan("Starting export") + " of CouplingInterfaces ...") for i in range(num_coupling_interfaces): coupling_interface_settings = self.settings["coupling_interfaces"][ i] sub_model_part_name = coupling_interface_settings[ "sub_model_part_name"].GetString() comm_name = coupling_interface_settings["comm_name"].GetString() receive_interface = False operation = "Exporting" if coupling_interface_settings.Has("receive_interface"): receive_interface = coupling_interface_settings[ "receive_interface"].GetBool() operation = "Importing" self.__CustomPrint( 2, colors.cyan(operation) + ' coupling-interface "{}" on ModelPart "{}"'.format( comm_name, sub_model_part_name)) if not self.dry_run: if receive_interface: # use an aux-modelpart, which will not be used again KratosCoSim.EMPIRE_API.EMPIRE_API_recvMesh( self.model.CreateModelPart(sub_model_part_name), comm_name) # TODO maybe restructure and do all receives after all sends else: KratosCoSim.EMPIRE_API.EMPIRE_API_sendMesh( self.model["ExtSolver." + sub_model_part_name], comm_name) else: self.__CustomPrint(2, colors.magenta('... skipped')) self.__CustomPrint( 1, colors.cyan("Finished " + operation) + " of CouplingInterfaces") # time loop self.__CustomPrint(1, "Starting Solution Loop") for i in range(self.settings["num_steps"].GetInt()): if self.echo_level > 0: print() # newline self.__CustomPrint( 1, colors.bold('Step: {}/{}'.format( i + 1, self.settings["num_steps"].GetInt()))) self.SolveSolutionStep() self.__CustomPrint(1, "Finished")
def _SynchronizeOutputData(self, solver_name): from_solver = self.solver_wrappers[solver_name] data_list = self.coupling_sequence[solver_name]["output_data_list"] if self.echo_level > 2: cs_tools.cs_print_info( self._ClassName(), 'Start Synchronizing Output for solver "{}"'.format( colors.blue(solver_name))) for i in range(data_list.size()): i_data = data_list[i] from_data_name = i_data["data"].GetString() to_solver_name = i_data["to_solver"].GetString() to_solver_data_name = i_data["to_solver_data"].GetString() if self.echo_level > 2: cs_tools.cs_print_info( " Data", '"{}" | to solver: "{}": "{}"'.format( colors.magenta(from_data_name), colors.blue(to_solver_name), colors.magenta(to_solver_data_name))) # from solver from_solver_data = from_solver.GetInterfaceData(from_data_name) # to solver to_solver = self.solver_wrappers[to_solver_name] to_solver_data = to_solver.GetInterfaceData(to_solver_data_name) self.__SynchronizeData(i_data, from_solver, from_solver_data, to_solver, to_solver_data) if self.echo_level > 2: cs_tools.cs_print_info( self._ClassName(), 'End Synchronizing Output for solver "{}"'.format( colors.blue(solver_name)))
def SolveSolutionStep(self): num_coupling_interfaces = self.settings["coupling_interfaces"].size() self.__CustomPrint( 1, colors.green("Starting import") + " of CouplingInterfaceData ...") for i in range(num_coupling_interfaces): coupling_interface_settings = self.settings["coupling_interfaces"][ i] if not coupling_interface_settings.Has("data_field_recv"): continue sub_model_part_name = coupling_interface_settings[ "sub_model_part_name"].GetString() data_field_settings = coupling_interface_settings[ "data_field_recv"] data_field_name = data_field_settings["data_field_name"].GetString( ) self.__CustomPrint( 2, colors.green('Importing') + ' data-field "{}" on ModelPart "{}"'.format( data_field_name, sub_model_part_name)) variables = GenerateVariableListFromInput( data_field_settings["variables"]) if not self.dry_run: KratosCoSim.EMPIRE_API.EMPIRE_API_recvDataField( self.model["ExtSolver." + sub_model_part_name], data_field_name, *variables) # passing all varibales from the list else: self.__CustomPrint(2, colors.magenta('... skipped')) self.__CustomPrint( 1, colors.green("Finished import") + " of CouplingInterfaceData") if self.echo_level > 0: print() # newline self.__CustomPrint(1, colors.blue("Solving ...")) time.sleep(self.solving_time) self.__CustomPrint(2, "Solving took {} [sec]".format(self.solving_time)) if self.echo_level > 0: print() # newline # TODO implement random values ... ? self.__CustomPrint( 1, colors.cyan("Starting export") + " of CouplingInterfaceData ...") for i in range(num_coupling_interfaces): coupling_interface_settings = self.settings["coupling_interfaces"][ i] if not coupling_interface_settings.Has("data_field_send"): continue sub_model_part_name = coupling_interface_settings[ "sub_model_part_name"].GetString() data_field_settings = coupling_interface_settings[ "data_field_send"] data_field_name = data_field_settings["data_field_name"].GetString( ) self.__CustomPrint( 2, colors.cyan('Exporting') + ' data-field "{}" on ModelPart "{}"'.format( data_field_name, sub_model_part_name)) variables = GenerateVariableListFromInput( data_field_settings["variables"]) if not self.dry_run: KratosCoSim.EMPIRE_API.EMPIRE_API_sendDataField( self.model["ExtSolver." + sub_model_part_name], data_field_name, *variables) # passing all varibales from the list else: self.__CustomPrint(2, colors.magenta('... skipped')) self.__CustomPrint( 1, colors.cyan("Finished export") + " of CouplingInterfaceData")