From 27676c69e1967c647df74f6b62ffdbbdccf9ebc6 Mon Sep 17 00:00:00 2001 From: Giovanni La Mura <giovanni.lamura@inaf.it> Date: Thu, 3 Apr 2025 17:24:30 +0200 Subject: [PATCH] Prepare a random generator script and a test configuration set --- src/scripts/config_gen.yml | 93 +++++++++++++++++++++++++++++++++++++ src/scripts/generator.py | 95 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 src/scripts/config_gen.yml create mode 100644 src/scripts/generator.py diff --git a/src/scripts/config_gen.yml b/src/scripts/config_gen.yml new file mode 100644 index 00000000..f1742a04 --- /dev/null +++ b/src/scripts/config_gen.yml @@ -0,0 +1,93 @@ +system_settings: + max_host_ram : 0 + max_gpu_ram : 0 + +input_settings: + input_folder : "." + spheres_file : "DEDFB" + geometry_file: "DCLU" + +output_settings: + output_folder: "." + output_name : "c_OCLU" + formats : [ "LEGACY", "HDF5" ] + jwtm : 1 + +particle_settings: + application : "CLUSTER" + n_spheres : 8 + n_types : 2 + sph_types : [ 1, 1, 1, 1, 2, 2, 2, 2 ] + n_layers : [ 1, 1 ] + radii : [ 6.000e-08, 4.000e-8 ] + rad_frac : [ [ 1.0 ], [ 1.0 ] ] + dielec_id : [ [ 1 ], [ 1 ] ] + +material_settings: + diel_flag : 0 + extern_diel : 1.00e+00 + dielec_path : "../../ref_data" + dielec_file : [ "eps_ashok_C.csv" ] + dielec_fmt : [ "CSV" ] + match_mode : "GRID" + diel_const : [ ] + +radiation_settings: + polarization: "LINEAR" + scale_start : 1.00e-06 + scale_end : 2.00e-05 + scale_step : 5.00e-09 + wp : 2.99792e+08 + xip : 1.00e+00 + step_flag : 0 + scale_name : "WAVELENGTH" + +geometry_settings: + li : 4 + le : 8 + npnt : 149 + npntts : 300 + iavm : 0 + isam : 0 + in_th_start : 0.0 + in_th_step : 0.0 + in_th_end : 0.0 + in_ph_start : 0.0 + in_ph_step : 0.0 + in_ph_end : 0.0 + sc_th_start : 0.0 + sc_th_step : 0.0 + sc_th_end : 0.0 + sc_ph_start : 0.0 + sc_ph_step : 0.0 + sc_ph_end : 0.0 + x_coords : [ + 8.00e-08, + -8.00e-08, + 0.00e+00, + 0.00e+00, + 0.00e+00, + 0.00e+00, + 0.00e+00, + 0.00e+00 + ] + y_coords : [ + 0.00e+00, + 0.00e+00, + 8.00e-08, + -8.00e-08, + 0.00e+00, + 0.00e+00, + 0.00e+00, + 0.00e+00 + ] + z_coords : [ + 0.00e+00, + 0.00e+00, + 0.00e+00, + 0.00e+00, + 8.00e-08, + -8.00e-08, + 16.00e-08, + -16.00e-08 + ] diff --git a/src/scripts/generator.py b/src/scripts/generator.py new file mode 100644 index 00000000..97491a5f --- /dev/null +++ b/src/scripts/generator.py @@ -0,0 +1,95 @@ +import math +import random +import yaml + +#import pdb + +from pathlib import PurePath +from sys import argv + +seed = int(argv[1]) + +random.seed(seed) + +config = {} +with open('config.yml', 'r') as stream: + config = yaml.safe_load(stream) + +nsph = int(config['particle_settings']['n_spheres']) + +vec_thetas = [0.0 for i in range(nsph)] +vec_phis = [0.0 for i in range(nsph)] +vec_rads = [0.0 for i in range(nsph)] +vec_sph_x = [0.0 for i in range(nsph)] +vec_sph_y = [0.0 for i in range(nsph)] +vec_sph_z = [0.0 for i in range(nsph)] + +sph_type_index = config['particle_settings']['sph_types'][0] - 1 +vec_rads[0] = config['particle_settings']['radii'][sph_type_index] +max_rad = 20.0 * vec_rads[0] +placed_spheres = 1 +attempts = 0 +max_attempts = 100 +for i in range(1, nsph): + sph_type_index = config['particle_settings']['sph_types'][i] - 1 + vec_rads[i] = config['particle_settings']['radii'][sph_type_index] + is_placed = False + #breakpoint() + while (not is_placed): + if (attempts > max_attempts): + print("WARNING: could not place sphere %d in allowed radius!"%i) + break # while(not is_placed) + vec_thetas[i] = math.pi * random.random() + vec_phis[i] = 2.0 * math.pi * random.random() + rho = vec_rads[0] + vec_rads[i] + z = rho * math.cos(vec_thetas[i]) + y = rho * math.sin(vec_thetas[i]) * math.sin(vec_phis[i]) + x = rho * math.sin(vec_thetas[i]) * math.cos(vec_phis[i]) + j = 0 + while (j < i - 1): + j += 1 + dx2 = (x - vec_sph_x[j]) * (x - vec_sph_x[j]) + dy2 = (y - vec_sph_y[j]) * (y - vec_sph_y[j]) + dz2 = (z - vec_sph_z[j]) * (z - vec_sph_z[j]) + dist2 = dx2 + dy2 + dz2 + rr2 = (vec_rads[i] + vec_rads[j]) * (vec_rads[i] + vec_rads[j]) + if (dist2 < rr2): + # Spheres i and j are compenetrating. + # Sphere i is moved out radially until it becomes externally + # tangent to sphere j. Then the check is repeated, to verify + # that no other sphere was penetrated. The process is iterated + # until sphere i is placed or the maximum allowed radius is + # reached. + sinthi = math.sin(vec_thetas[i]) + sinthj = math.sin(vec_thetas[j]) + costhi = math.cos(vec_thetas[i]) + costhj = math.cos(vec_thetas[j]) + sinphi = math.sin(vec_phis[i]) + sinphj = math.sin(vec_phis[j]) + cosphi = math.cos(vec_phis[i]) + cosphj = math.cos(vec_phis[j]) + cosalpha = ( + sinthi * cosphi * sinthj * cosphj + + sinthi * sinphi * sinthj * sinphj + + costhi * costhj + ) + rho += 2.0 * vec_rads[j] * cosalpha + z = rho * math.cos(vec_thetas[i]) + y = rho * math.sin(vec_thetas[i]) * math.sin(vec_phis[i]) + x = rho * math.sin(vec_thetas[i]) * math.cos(vec_phis[i]) + j = 0 + continue # while(j < i - 1) + if (rho + vec_rads[i] > max_rad): + # The current direction is filled. Try another one. + attempts += 1 + continue # while(not is_placed) + vec_sph_x[i] = x + vec_sph_y[i] = y + vec_sph_z[i] = z + is_placed = True + placed_spheres += 1 + attempts = 0 + +print(vec_sph_x) +print(vec_sph_y) +print(vec_sph_z) -- GitLab