Skip to content

Commit 2683d5a

Browse files
authored
Update length scale measurement scripts to use new imageruler (#64)
* Use new imageruler (#1) * Use new imageruler * Fix eof errors * Manually install deps * Fix typo * Add slow_light_waveguide test * binarize * Rename * Fix binarization * Report feature size in nm * Fix eof
1 parent c94e6bc commit 2683d5a

File tree

6 files changed

+92
-24
lines changed

6 files changed

+92
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: CI
2+
3+
on:
4+
pull_request:
5+
push:
6+
branches:
7+
- main
8+
schedule:
9+
- cron: "0 13 * * 1" # Every Monday at 9AM EST
10+
11+
jobs:
12+
measure-length-scales:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- name: Checkout repository
16+
uses: actions/checkout@v4
17+
18+
- name: Setup environment
19+
run: |
20+
python -m pip install --upgrade pip
21+
pip install numpy
22+
pip install imageruler
23+
pip install ceviche-challenges
24+
25+
- name: cavity_design
26+
run: |
27+
cd cavity_design
28+
python minimum_lengthscales_run.py
29+
cd ..
30+
31+
- name: Metagrating3D
32+
run: |
33+
cd Metagrating3D
34+
python minimum_lengthscales_run.py
35+
cd ..
36+
37+
- name: RGB_metalens
38+
run: |
39+
cd RGB_metalens
40+
python minimum_lengthscales_run.py
41+
cd ..
42+
43+
- name: slow_light_waveguide
44+
run: |
45+
cd slow_light_waveguide
46+
python minimum_lengthscales_run.py
47+
cd ..
48+
49+
- name: waveguide_mode_converter
50+
run: |
51+
cd waveguide_mode_converter
52+
python run.py designs/converter_generator_circle_6_x47530832_w1_s796.csv
53+
cd ..

Metagrating3D/minimum_lengthscales_run.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
file_name = str(file)
1717
if file_name[-3:] == 'csv':
1818
design_pattern = np.loadtxt(path+file_name, delimiter=',')
19-
design_dimension = np.ndim(design_pattern)
19+
if design_pattern.ndim == 1:
20+
design_pattern = design_pattern[:, np.newaxis]
21+
pixel_size = px / design_pattern.shape[0]
2022

21-
if design_dimension == 2: design_size = (px, py)
22-
elif design_dimension == 1: design_size = px
23-
else: AssertionError("Invalid dimension of the design pattern.")
24-
25-
solid_mls, void_mls = imageruler.minimum_length_solid_void(design_pattern, design_size, periodic_axes=(0,1))
26-
print(file_name, solid_mls, void_mls, min(solid_mls, void_mls))
23+
binary_design_pattern = design_pattern > 0.5
24+
solid_mls_pixels, void_mls_pixels = imageruler.minimum_length_scale(
25+
binary_design_pattern, periodic=(True, True)
26+
)
27+
solid_mls = solid_mls_pixels * pixel_size
28+
void_mls = void_mls_pixels * pixel_size
29+
print(path+file_name, solid_mls, void_mls, min(solid_mls, void_mls))

RGB_metalens/minimum_lengthscales_run.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,15 @@
1313
if file_name[-3:] == 'csv':
1414
design_pattern = np.genfromtxt(path+file_name, delimiter=',')
1515

16-
if file_name[0].upper() == 'M': design_size = 20*np.array(design_pattern.shape)
17-
elif file_name[0].upper() in ('R', 'W'): design_size = 10*np.array(design_pattern.shape)
18-
else: AssertionError("Unknown file name.")
16+
if file_name[0].upper() == 'M':
17+
pixel_size = 20
18+
elif file_name[0].upper() in ('R', 'W'):
19+
pixel_size = 10
20+
else:
21+
raise AssertionError("Unknown file name.")
1922

20-
solid_mls, void_mls = imageruler.minimum_length_solid_void(design_pattern, design_size)
23+
binary_design_pattern = design_pattern > 0.5
24+
solid_mls_pixels, void_mls_pixels = imageruler.minimum_length_scale(binary_design_pattern)
25+
solid_mls = solid_mls_pixels * pixel_size
26+
void_mls = void_mls_pixels * pixel_size
2127
print(path+file_name, solid_mls, void_mls, min(solid_mls, void_mls))

cavity_design/minimum_lengthscales_run.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import imageruler
44

55
print('Design file, solid minimum lengthscale (nm), void minimum lengthscale (nm), minimum lengthscale (nm)')
6-
design_size = (2000, 2000)
6+
pixel_size = 5
77

88
for path in ['Mo/', 'Göktuğ/']:
99
files = os.listdir(path)
@@ -13,5 +13,9 @@
1313
file_name = str(file)
1414
if file_name[-3:] == 'csv':
1515
design_pattern = np.genfromtxt(path+file_name, delimiter=',')
16-
solid_mls, void_mls = imageruler.minimum_length_solid_void(design_pattern, design_size)
16+
17+
binary_design_pattern = design_pattern > 0.5
18+
solid_mls_pixels, void_mls_pixels = imageruler.minimum_length_scale(binary_design_pattern)
19+
solid_mls = solid_mls_pixels * pixel_size
20+
void_mls = void_mls_pixels * pixel_size
1721
print(path+file_name, solid_mls, void_mls, min(solid_mls, void_mls))

slow_light_waveguide/minimum_lengthscales_run.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
files.sort()
88
print('Design file, solid minimum lengthscale (a), void minimum lengthscale (a), minimum lengthscale (a)')
99

10-
design_size = (1, 10.2)
11-
1210
for file_name in ['Design_Dnum_2.csv', 'HigRes_DesMatch_Opt_Dnum_2.csv']:
13-
design_pattern = np.loadtxt(path+file_name, delimiter=',')
14-
design_dimension = np.ndim(design_pattern)
11+
design_permittivity = np.loadtxt(path+file_name, delimiter=',')
1512

16-
solid_mls, void_mls = imageruler.minimum_length_solid_void(design_pattern, design_size, periodic_axes=(0,1))
17-
print(file_name, solid_mls, void_mls, min(solid_mls, void_mls))
13+
midpoint = (np.amax(design_permittivity) + np.amin(design_permittivity)) / 2
14+
binary_design_pattern = design_permittivity > midpoint
15+
solid_mls, void_mls = imageruler.minimum_length_scale(binary_design_pattern, periodic=(True, True))
16+
print(file_name, solid_mls, void_mls, min(solid_mls, void_mls))

waveguide_mode_converter/run.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
INPUT_PORT_IDX = 0
1919
OUTPUT_PORT_IDX = 1
2020

21+
pixel_size = 10
22+
2123
parser = argparse.ArgumentParser()
2224
parser.add_argument(
2325
'file',
@@ -58,10 +60,11 @@
5860
reflection_dB_worst = np.max(s_params_dB[:, INPUT_PORT_IDX])
5961
transmission_dB_worst = np.min(s_params_dB[:, OUTPUT_PORT_IDX])
6062

61-
length_scale = imageruler.minimum_length(
62-
model.density(design),
63-
tuple(v * params.resolution.to_value(u.nm) for v in model.shape))
64-
63+
binary_design_pattern = model.density(design) > 0.5
64+
solid_mls_pixels, void_mls_pixels = imageruler.minimum_length_scale(binary_design_pattern)
65+
solid_mls = solid_mls_pixels * pixel_size
66+
void_mls = void_mls_pixels * pixel_size
6567
print(
66-
f'{os.path.basename(filepath)}, {length_scale}, {reflection_dB_worst:.2f}, {transmission_dB_worst:.2f}'
68+
f'{os.path.basename(filepath)}, ({solid_mls}, {void_mls}), '
69+
f'{reflection_dB_worst:.2f}, {transmission_dB_worst:.2f}'
6770
)

0 commit comments

Comments
 (0)