Skip to content
Snippets Groups Projects
Commit 25477404 authored by Giovanni La Mura's avatar Giovanni La Mura
Browse files

Merge branch 'random_generator' into 'master'

Random model generator

See merge request giacomo.mulas/np_tmcode!92
parents 3fcc1996 167ae6d5
Branches
No related tags found
No related merge requests found
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
]
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)
This diff is collapsed.
#!/bin/python3 #!/usr/bin/env python3
# Copyright (C) 2024 INAF - Osservatorio Astronomico di Cagliari # Copyright (C) 2025 INAF - Osservatorio Astronomico di Cagliari
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
......
#!/bin/python3 #!/usr/bin/env python3
# Copyright (C) 2024 INAF - Osservatorio Astronomico di Cagliari # Copyright (C) 2025 INAF - Osservatorio Astronomico di Cagliari
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
......
#!/bin/python3 #!/usr/bin/env python3
# Copyright (C) 2024 INAF - Osservatorio Astronomico di Cagliari # Copyright (C) 2025 INAF - Osservatorio Astronomico di Cagliari
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
......
# EXAMPLE CONFIGURATION FILE TO BUILD A RANDOM CLUSTER WITH 100 SPHERES.
system_settings:
# Limit on host RAM use in Gb (0 for no configuration limit)
max_host_ram : 24
# Limit on GPU RAM use in Gb (0 for no configuration limit)
max_gpu_ram : 8
# Random seed (a positive integer number)
rnd_seed : 105
# Random engine (COMPACT or LOOSE)
rnd_engine : "COMPACT"
# OBJ model export flag (requires pyvista; 0 is FALSE)
make_3D : 0
input_settings:
# Folder to write the code input configuration files
input_folder : "."
# Name of the scatterer description file
spheres_file : "DEDFB_comp"
# Name of the geometry description file
geometry_file: "DCLU_comp"
output_settings:
# Folder for the code output storage
output_folder: "."
# Name of the main output file
output_name : "c_OCLU"
# Requested output formats
formats : [ "LEGACY", "HDF5" ]
# Index of the scale for transition matrix output
jwtm : 1
particle_settings:
# What application to use (SPHERE | CLUSTER | INCLUSION)
application : "CLUSTER"
# Number of spheres
n_spheres : 100
# Number of sphere types
n_types : 2
# Vector of sphere type identifiers (what type is each sphere)
# For random genration it can be empty (random sphere types),
# or contain "n_spheres" elements (random position with assigned
# types).
sph_types : [ ]
# Vector of layers in types (how many layers in each type)
n_layers : [ 1, 1 ]
# Spherical monomer radii in m (one size for each type)
radii : [ 4.000e-8, 4.000e-8 ]
# Layer fractional radii (one per layer in each type)
rad_frac : [ [ 1.0 ], [ 1.0 ] ]
# Index of the dielectric constants (one per layer in each type)
#
# 1 is first file in `dielec_file`, 2 is second ...
dielec_id : [ [ 1 ], [ 1 ] ]
# Maximum radius for random particle size in m
max_rad : 3.0e-7
material_settings:
# Dielectric properties definition (-1 = scaled, 0 = tabulated)
diel_flag : 0
# External medium dielectric constant
extern_diel : 1.00e+00
# Dielectric constant files folder
dielec_path : "../../ref_data"
# List of dielectric constant files (used if diel_flag = 0)
dielec_file : [ "eps_ashok_C.csv" ]
# Dielectric constant files format (same for all files)
dielec_fmt : [ "CSV" ]
# Matching method between optical constants and radiation wavelengths
#
# INTERPOLATE: the constants are interpolated on wavelengths
# GRID: only the wavelengths with defined constants are computed
#
match_mode : "GRID"
# Reference dielectric constants (used if diel_flag = -1)
#
# One real and one imaginary part for each layer in each type.
diel_const : [ ]
radiation_settings:
# Radiation field polarization (LINEAR | CIRCULAR)
polarization: "LINEAR"
# First scale to be used
scale_start : 1.00e-06
# Last scale to be used
scale_end : 2.00e-05
# Calculation step (overridden if `match_mode` is GRID)
scale_step : 5.00e-09
# Peak Omega
wp : 2.99792e+08
# Peak scale
xip : 1.00e+00
# Define scale explicitly (0) or in equal steps (1)
step_flag : 0
# Type of scaling variable
scale_name : "WAVELENGTH"
geometry_settings:
# Maximum internal field expansion
li : 6
# Maximum external field expansion (not used by SPHERE)
le : 8
# Number of transition layer integration points
npnt : 149
# Number of non transition layer integration points
npntts : 300
# Averaging mode
iavm : 0
# Meridional plane flag
isam : 0
# Starting incidence azimuth angle
in_th_start : 0.0
# Incidence azimuth angle incremental step
in_th_step : 0.0
# Ending incidence azimuth angle
in_th_end : 0.0
# Starting incidence elevation angle
in_ph_start : 0.0
# Incidence elevation angle incremental step
in_ph_step : 0.0
# Ending incidence elevation angle
in_ph_end : 0.0
# Starting scattered azimuth angle
sc_th_start : 0.0
# Scattered azimuth angle incremental step
sc_th_step : 0.0
# Ending scattered azimuth angle
sc_th_end : 0.0
# Starting scattered elevation angle
sc_ph_start : 0.0
# Scattered elevation angle incremental step
sc_ph_step : 0.0
# Ending scattered elevation angle
sc_ph_end : 0.0
# Vector of sphere X coordinates (one per sphere or empty for random)
x_coords : [ ]
# Vector of sphere Y coordinates (one per sphere or empty for random)
y_coords : [ ]
# Vector of sphere Z coordinates (one per sphere or empty for random)
z_coords : [ ]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment