surface_path = './mesh/mesh_facet_region.xml' geometry_params = { 'output': 'mesh.geo', 'length': 2.2, 'front_distance': 0.05 + 0.15, 'bottom_distance': 0.05 + 0.15, 'jet_radius': 0.05, 'width': 0.41, 'jet_positions': [90, 270], 'jet_width': 10, 'clscale': 1.0 } if not os.path.exists(mesh_path): generate_mesh(geometry_params, template='geometry_2d.template_geo') # Convert to H5 not os.path.exists(os.path.dirname(mesh_path)) and os.mkdir( os.path.dirname(mesh_path)) convert('mesh.msh', 'mesh.h5') cleanup(exts=('.msh', )) shutil.move('mesh.xml', mesh_path) shutil.move('mesh_facet_region.xml', surface_path) # With same dt and duration as with RL make the base flow dt = 0.0005 solver_params = {'dt': dt} flow_params = {'mu': 1E-3, 'rho': 1}
def start_class(self): ''' Initialise attributes needed by the Environment object: Initialise history buffers, remesh if necessary, load initialization quantities if not remesh, create flow solver object, initialise probes, make converged flow if necessary, simulate to random position if random_start, fill probes buffer if no. probes changed wrt last remesh :return: ''' self.solver_step = 0 # Numerical step self.accumulated_drag = 0 # Sum of step drags so far self.accumulated_lift = 0 self.initialized_vtu= False self.resetted_number_probes = False self.area_probe = None # Create ring buffers to hold recent history of jet values, probe values, lift, drag, area self.history_parameters = {} for crrt_jet in range(2): self.history_parameters["jet_{}".format(crrt_jet)] = RingBuffer(self.size_history) self.history_parameters["number_of_jets"] = 2 for crrt_probe in range(len(self.output_params["locations"])): if self.output_params["probe_type"] == 'pressure': self.history_parameters["probe_{}".format(crrt_probe)] = RingBuffer(self.size_history) elif self.output_params["probe_type"] == 'velocity': self.history_parameters["probe_{}_u".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["probe_{}_v".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["number_of_probes"] = len(self.output_params["locations"]) print("Number of probes: {}".format(self.history_parameters["number_of_probes"])) self.history_parameters["drag"] = RingBuffer(self.size_history) self.history_parameters["lift"] = RingBuffer(self.size_history) self.history_parameters["recirc_area"] = RingBuffer(self.size_history) # ------------------------------------------------------------------------ # Remesh if necessary h5_file = '.'.join([self.path_root, 'h5']) # mesh/turek_2d.h5 msh_file = '.'.join([self.path_root, 'msh']) # mesh/turek_2d.msh self.geometry_params['mesh'] = h5_file # Regenerate mesh? if self.geometry_params['remesh']: if self.verbose > 0: print("Remesh") generate_mesh(self.geometry_params, template=self.geometry_params['template']) if self.verbose > 0: print("Generate .msh done") print(msh_file) assert os.path.exists(msh_file) convert(msh_file, h5_file) if self.verbose > 0: print("Convert to .h5 done") print(h5_file) assert os.path.exists(h5_file) # ------------------------------------------------------------------------ # If no remesh, load initialization fields and buffers if self.n_iter_make_ready is None: if self.verbose > 0: print("Load initial flow state") # Load initial fields self.flow_params['u_init'] = 'mesh/u_init.xdmf' self.flow_params['p_init'] = 'mesh/p_init.xdmf' if self.verbose > 0: print("Load buffer history") # Load ring buffers with open('mesh/dict_history_parameters.pkl', 'rb') as f: self.history_parameters = pickle.load(f) # Check everything is good to go if not "number_of_probes" in self.history_parameters: self.history_parameters["number_of_probes"] = 0 print("Warning!! The number of probes was not set in the loaded hdf5 file") if not "number_of_jets" in self.history_parameters: self.history_parameters["number_of_jets"] = 2 print("Warning!! The number of jets was not set in the loaded hdf5 file") if not "lift" in self.history_parameters: self.history_parameters["lift"] = RingBuffer(self.size_history) print("Warning!! No lift history found in the loaded hdf5 file") if not "drag" in self.history_parameters: self.history_parameters["drag"] = RingBuffer(self.size_history) print("Warning!! No lift history found in the loaded hdf5 file") if not "recirc_area" in self.history_parameters: self.history_parameters["recirc_area"] = RingBuffer(self.size_history) print("Warning!! No recirculation area history found in the loaded hdf5 file") # if not the same number of probes, reset if not self.history_parameters["number_of_probes"] == len(self.output_params["locations"]): for crrt_probe in range(len(self.output_params["locations"])): if self.output_params["probe_type"] == 'pressure': self.history_parameters["probe_{}".format(crrt_probe)] = RingBuffer(self.size_history) elif self.output_params["probe_type"] == 'velocity': self.history_parameters["probe_{}_u".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["probe_{}_v".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["number_of_probes"] = len(self.output_params["locations"]) print("Warning!! Number of probes was changed! Probes buffer content reset") self.resetted_number_probes = True # ------------------------------------------------------------------------ # create the flow simulation object self.flow = FlowSolver(self.flow_params, self.geometry_params, self.solver_params) # ------------------------------------------------------------------------ # Setup probes if self.output_params["probe_type"] == 'pressure': self.ann_probes = PressureProbeANN(self.flow, self.output_params['locations']) elif self.output_params["probe_type"] == 'velocity': self.ann_probes = VelocityProbeANN(self.flow, self.output_params['locations']) else: raise RuntimeError("Unknown probe type") # Setup drag and lift measurement self.drag_probe = PenetratedDragProbeANN(self.flow) self.lift_probe = PenetratedLiftProbeANN(self.flow) # ------------------------------------------------------------------------ # No flux from jets for starting self.Qs = np.zeros(2) self.action = np.zeros(2) # ------------------------------------------------------------------------ # prepare the arrays for plotting positions self.compute_positions_for_plotting() # ------------------------------------------------------------------------ # if necessary, make converge if self.n_iter_make_ready is not None: self.u_, self.p_ = self.flow.evolve(self.Qs) path='' if "dump_vtu" in self.inspection_params: path = 'results/area_out.pvd' self.area_probe = RecirculationAreaProbe(self.u_, 0, store_path=path) if self.verbose > 0: print("Compute initial flow for {} steps".format(self.n_iter_make_ready)) for _ in range(self.n_iter_make_ready): self.u_, self.p_ = self.flow.evolve(self.Qs) self.probes_values = self.ann_probes.sample(self.u_, self.p_).flatten() self.drag = self.drag_probe.sample(self.u_, self.p_) self.lift = self.lift_probe.sample(self.u_, self.p_) self.recirc_area = self.area_probe.sample(self.u_, self.p_) self.write_history_parameters() # Add new step data to history buffers self.visual_inspection() # Create dynamic plots, show step data in command line and save it to saved_models/debug.csv self.output_data() # Extend arrays of episode qtys, generate vtu files for area, u and p self.solver_step += 1 encoding = XDMFFile.Encoding.HDF5 mesh = convert(msh_file, h5_file) comm = mesh.mpi_comm() # save field data XDMFFile(comm, 'mesh/u_init.xdmf').write_checkpoint(self.u_, 'u0', 0, encoding) XDMFFile(comm, 'mesh/p_init.xdmf').write_checkpoint(self.p_, 'p0', 0, encoding) # save buffer dict with open('mesh/dict_history_parameters.pkl', 'wb') as f: pickle.dump(self.history_parameters, f, pickle.HIGHEST_PROTOCOL) # ---------------------------------------------------------------------- # if reading from disk (no remesh), show to check everything ok if self.n_iter_make_ready is None: # If random_start == True, let's start in a random position of the vortex shedding if self.optimization_params["random_start"]: rd_advancement = np.random.randint(1712) # 1712 is the number of steps of a shedding period. Needs to be hardcoded for j in range(rd_advancement): self.flow.evolve(self.Qs) print("Simulated {} iterations before starting the control".format(rd_advancement)) self.u_, self.p_ = self.flow.evolve(self.Qs) # Initial step with Qs = 0 path='' if "dump_vtu" in self.inspection_params: path = 'results/area_out.pvd' self.area_probe = RecirculationAreaProbe(self.u_, 0, store_path=path) self.probes_values = self.ann_probes.sample(self.u_, self.p_).flatten() self.drag = self.drag_probe.sample(self.u_, self.p_) self.lift = self.lift_probe.sample(self.u_, self.p_) self.recirc_area = self.area_probe.sample(self.u_, self.p_) self.write_history_parameters() # ---------------------------------------------------------------------- # if necessary, fill the probes buffer if self.resetted_number_probes: print("Need to fill again the buffer; modified number of probes") # TODO: Execute runs for 1 action step, so we would be running for (T/Nb)*size_history. While it should be just for size_history. In practice, remesh if probes change for _ in range(self.size_history): self.execute() # ---------------------------------------------------------------------- # ready now self.ready_to_use = True
mesh_path = './mesh/mesh.xml' surface_path = './mesh/mesh_facet_region.xml' geometry_params = { 'output': 'mesh.geo', 'length': 2.2, 'front_distance': 0.05 + 0.15, 'bottom_distance': 0.05 + 0.15, 'jet_radius': 0.05, 'width': 0.41, 'jet_width': 10, 'clscale': 1.0 } if not os.path.exists(mesh_path): generate_mesh(geometry_params, template='template_mesh.geo') # Convert to H5 not os.path.exists(os.path.dirname(mesh_path)) and os.mkdir( os.path.dirname(mesh_path)) convert('mesh.msh', 'mesh.h5') cleanup(exts=('.msh', )) shutil.move('mesh.xml', mesh_path) shutil.move('mesh_facet_region.xml', surface_path) # With same dt and duration as with RL make the base flow dt = 0.0005 solver_params = {'dt': dt} flow_params = {'mu': 1E-3, 'rho': 1}
def start_class(self): self.solver_step = 0 self.accumulated_drag = 0 self.accumulated_lift = 0 self.initialized_output = False self.resetted_number_probes = False self.area_probe = None self.history_parameters = {} for crrt_jet in range(len(self.geometry_params["jet_positions"])): self.history_parameters["jet_{}".format(crrt_jet)] = RingBuffer(self.size_history) self.history_parameters["number_of_jets"] = len(self.geometry_params["jet_positions"]) for crrt_probe in range(len(self.output_params["locations"])): if self.output_params["probe_type"] == 'pressure': self.history_parameters["probe_{}".format(crrt_probe)] = RingBuffer(self.size_history) elif self.output_params["probe_type"] == 'velocity': self.history_parameters["probe_{}_u".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["probe_{}_v".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["number_of_probes"] = len(self.output_params["locations"]) self.history_parameters["drag"] = RingBuffer(self.size_history) self.history_parameters["lift"] = RingBuffer(self.size_history) self.history_parameters["recirc_area"] = RingBuffer(self.size_history) # ------------------------------------------------------------------------ # remesh if necessary h5_file = '.'.join([self.path_root, 'h5']) msh_file = '.'.join([self.path_root, 'msh']) self.geometry_params['mesh'] = h5_file # Regenerate mesh? if self.geometry_params['remesh']: if self.verbose > 0: printi("Remesh") printi("generate_mesh start...") generate_mesh(self.geometry_params, template=self.geometry_params['template']) if self.verbose > 0: printi("generate_mesh done!") assert os.path.exists(msh_file) convert(msh_file, h5_file) assert os.path.exists(h5_file) # ------------------------------------------------------------------------ # if necessary, load initialization fields if self.n_iter_make_ready is None: if self.verbose > 0: printi("Load initial flow") self.flow_params['u_init'] = 'mesh/u_init.xdmf' self.flow_params['p_init'] = 'mesh/p_init.xdmf' if self.verbose > 0: printi("Load buffer history") with open('mesh/dict_history_parameters.pkl', 'rb') as f: self.history_parameters = pickle.load(f) if not "number_of_probes" in self.history_parameters: self.history_parameters["number_of_probes"] = 0 if not "number_of_jets" in self.history_parameters: self.history_parameters["number_of_jets"] = len(self.geometry_params["jet_positions"]) printi("Warning!! The number of jets was not set in the loaded hdf5 file") if not "lift" in self.history_parameters: self.history_parameters["lift"] = RingBuffer(self.size_history) printi("Warning!! No value for the lift founded") if not "recirc_area" in self.history_parameters: self.history_parameters["recirc_area"] = RingBuffer(self.size_history) printi("Warning!! No value for the recirculation area founded") # if not the same number of probes, reset if not self.history_parameters["number_of_probes"] == len(self.output_params["locations"]): for crrt_probe in range(len(self.output_params["locations"])): if self.output_params["probe_type"] == 'pressure': self.history_parameters["probe_{}".format(crrt_probe)] = RingBuffer(self.size_history) elif self.output_params["probe_type"] == 'velocity': self.history_parameters["probe_{}_u".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["probe_{}_v".format(crrt_probe)] = RingBuffer(self.size_history) self.history_parameters["number_of_probes"] = len(self.output_params["locations"]) printi("Warning!! Number of probes was changed! Probes buffer content reseted") self.resetted_number_probes = True # ------------------------------------------------------------------------ # create the flow simulation object self.flow = FlowSolver(self.flow_params, self.geometry_params, self.solver_params) # ------------------------------------------------------------------------ # Setup probes if self.output_params["probe_type"] == 'pressure': self.ann_probes = PressureProbeANN(self.flow, self.output_params['locations']) elif self.output_params["probe_type"] == 'velocity': self.ann_probes = VelocityProbeANN(self.flow, self.output_params['locations']) else: raise RuntimeError("unknown probe type") # Setup drag measurement self.drag_probe = PenetratedDragProbeANN(self.flow) self.lift_probe = PenetratedLiftProbeANN(self.flow) # ------------------------------------------------------------------------ # No flux from jets for starting self.Qs = np.zeros(len(self.geometry_params['jet_positions'])) # ------------------------------------------------------------------------ # prepare the arrays for plotting positions self.compute_positions_for_plotting() # ------------------------------------------------------------------------ # if necessary, make converge if self.n_iter_make_ready is not None: self.u_, self.p_ = self.flow.evolve(self.Qs) path='' if "dump" in self.inspection_params: path = 'results/area_out.pvd' self.area_probe = RecirculationAreaProbe(self.u_, 0, store_path=path) if self.verbose > 0: printi("Compute initial flow") printiv(self.n_iter_make_ready) for _ in range(self.n_iter_make_ready): self.u_, self.p_ = self.flow.evolve(self.Qs) self.probes_values = self.ann_probes.sample(self.u_, self.p_).flatten() self.drag = self.drag_probe.sample(self.u_, self.p_) self.lift = self.lift_probe.sample(self.u_, self.p_) self.recirc_area = self.area_probe.sample(self.u_, self.p_) self.write_history_parameters() self.visual_inspection() self.output_data() self.solver_step += 1 if self.n_iter_make_ready is not None: encoding = XDMFFile.Encoding_HDF5 mesh = convert(msh_file, h5_file) comm = mesh.mpi_comm() # save field data XDMFFile(comm, 'mesh/u_init.xdmf').write_checkpoint(self.u_, 'u0', 0, encoding) XDMFFile(comm, 'mesh/p_init.xdmf').write_checkpoint(self.p_, 'p0', 0, encoding) # save buffer dict with open('mesh/dict_history_parameters.pkl', 'wb') as f: pickle.dump(self.history_parameters, f, pickle.HIGHEST_PROTOCOL) # ---------------------------------------------------------------------- # if reading from disk, show to check everything ok if self.n_iter_make_ready is None: #Let's start in a random position of the vortex shading if self.optimization_params["random_start"]: rd_advancement = np.random.randint(650) for j in range(rd_advancement): self.flow.evolve(self.Qs) print("Simulated {} iterations before starting the control".format(rd_advancement)) self.u_, self.p_ = self.flow.evolve(self.Qs) path='' if "dump" in self.inspection_params: path = 'results/area_out.pvd' self.area_probe = RecirculationAreaProbe(self.u_, 0, store_path=path) self.probes_values = self.ann_probes.sample(self.u_, self.p_).flatten() self.drag = self.drag_probe.sample(self.u_, self.p_) self.lift = self.lift_probe.sample(self.u_, self.p_) self.recirc_area = self.area_probe.sample(self.u_, self.p_) self.write_history_parameters() # self.visual_inspection() # self.output_data() # self.solver_step += 1 # time.sleep(10) # ---------------------------------------------------------------------- # if necessary, fill the probes buffer if self.resetted_number_probes: printi("Need to fill again the buffer; modified number of probes") for _ in range(self.size_history): self.execute() # ---------------------------------------------------------------------- # ready now #Initialisation du prob de recirculation area #path='' #if "dump" in self.inspection_params: # path = 'results/area_out.pvd' #self.area_probe = RecirculationAreaProbe(self.u_, 0, store_path=path) self.ready_to_use = True