Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • giacomo.mulas/np_tmcode
1 result
Select Git revision
Show changes
Commits on Source (14)
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
# 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
# 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
# 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 : [ ]