'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} T_final = 5.0 # Is there nonzero flow? u0_file, p0_file = 'mesh/u_init000000.vtu', 'mesh/p_init000000.vtu' if os.path.exists(u0_file) and os.path.exists(p0_file):
from msh_convert import convert from dolfin import (Measure, assemble, File, SubsetIterator, sqrt, avg, TestFunction, FunctionSpace) import matplotlib.pyplot as plt import subprocess, os import numpy as np ratios = [] exponents = [2, 3, 3.5, 4.0, 4.5, 5.0, 5.5] for hein in exponents[-1:]: subprocess.call( ['gmsh -3 -clscale 0.075 -setnumber Hein %d tile_1_hein.geo' % hein], shell=True) outputs = convert('tile_1_hein.msh', 'tile_1_hein.h5') mesh, surfaces, volumes = outputs dx = Measure('dx', domain=mesh, subdomain_data=volumes) intra = assemble(1 * dx(1)) extra = assemble(1 * dx(0)) ratios.append(extra / (intra + extra)) print('Extracellular volume %.2f' % ratios[-1]) # Now want to get ratio of cell surface area to its volume # Want to keep track of port areas - these are boundary integrals ds = Measure('ds', domain=mesh, subdomain_data=surfaces) dS = Measure('dS', domain=mesh, subdomain_data=surfaces) area_no_port = assemble(1 * dS(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
positions = [0, 60, 120, 180, 240, 300] geometry_params = { 'jet_positions': positions, 'output': '.'.join([root, 'geo']), 'jet_width': 10, 'clscale': 0.25 } h5_file = '.'.join([root, 'h5']) # Regenerate mesh? if True: generate_mesh(geometry_params, template='./geometry_2d.template_geo') msh_file = '.'.join([root, 'msh']) assert os.path.exists(msh_file) convert(msh_file, h5_file) assert os.path.exists(h5_file) comm = mpi_comm_world() h5 = HDF5File(comm, h5_file, 'r') mesh = Mesh() h5.read(mesh, 'mesh', False) surfaces = MeshFunction('size_t', mesh, mesh.topology().dim() - 1) h5.read(surfaces, 'facet') positions = [0, 60, 120, 180, 240, 300] cylinder_noslip_tag = 4 first_jet = cylinder_noslip_tag + 1 njets = len(positions)
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