Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
529067f
add split method to techniques
nglaser3 Apr 2, 2026
023cbbe
add split method to simulation
nglaser3 Apr 2, 2026
1ce5146
remove initial split, add weight window mockup
nglaser3 Apr 2, 2026
3d3e239
add notion of active for weight windows, fully removed initial split …
nglaser3 Apr 2, 2026
520986d
switch to 1darray from nested, fix mesh get
nglaser3 Apr 13, 2026
f9d6940
generate mcdc_get and mcdc_set
nglaser3 Apr 13, 2026
3035737
switch to tracking different arrays of lower, target, upper
nglaser3 Apr 13, 2026
5707fe1
add checks for weight window validity
nglaser3 Apr 13, 2026
e9a6afa
add test for instantiation
nglaser3 Apr 13, 2026
28d9f2c
add test for ww roulette method
nglaser3 Apr 13, 2026
e832317
Add split test
nglaser3 Apr 13, 2026
eb037e9
Add query of weight windows test
nglaser3 Apr 13, 2026
8c2e626
Clean up tests a bit, removed needless setup
nglaser3 Apr 13, 2026
d919499
Merge remote-tracking branch 'origin/dev' into readd-ww
nglaser3 Apr 13, 2026
4933873
integrate the changed names into ww tests
nglaser3 Apr 13, 2026
6e8cb5b
black format
nglaser3 Apr 13, 2026
a57e72e
add oneliner on how to add weight windows to a simulation
nglaser3 Apr 13, 2026
4bc9c77
add docstrings and some comments for clarity
nglaser3 Apr 13, 2026
33438fe
clean up imports, a few more comments for clarity
nglaser3 Apr 13, 2026
481e27d
Merge branch 'dev' into readd-ww
nglaser3 Apr 14, 2026
c01de00
add ww numba type
nglaser3 Apr 14, 2026
b8a769b
properly initialize weight_windows singleton
nglaser3 Apr 14, 2026
e7aa22a
add energy bins and indexing to technique for ww
nglaser3 Apr 14, 2026
38e4e21
correct unit tests for ww
nglaser3 Apr 14, 2026
6bc20f3
add code factory gen for ww
nglaser3 Apr 14, 2026
b2ebd3c
back in black
nglaser3 Apr 14, 2026
dd8929e
add docstring on ww index
nglaser3 Apr 14, 2026
93b2c27
add none defaults to mesh and energy for ww
nglaser3 Apr 14, 2026
dcb9c8d
reformat with black
nglaser3 Apr 14, 2026
a21ef70
Update mcdc/transport/simulation.py
nglaser3 Apr 16, 2026
1d039eb
Switch from simulation to program for split call
nglaser3 Apr 16, 2026
3800480
add 4d accessor
nglaser3 Apr 16, 2026
b403037
use annotate for indexing
nglaser3 Apr 16, 2026
481737a
change up indices getter
nglaser3 Apr 16, 2026
2ca86ca
generalize weight roullete to use helper
nglaser3 Apr 16, 2026
bbc8ef0
add pincell regression test with weight windows
nglaser3 Apr 16, 2026
a45e858
back in black
nglaser3 Apr 16, 2026
c3b70c7
change lower bound and add comment explanations for choices
nglaser3 Apr 16, 2026
344a6fd
fix typo on weight_roulette method call in simulation
nglaser3 Apr 16, 2026
c4598b1
create forced collision object
nglaser3 Apr 17, 2026
2b924d3
add notion for forced_collision_distance
nglaser3 Apr 17, 2026
9367217
first pass at implementation of forced-collisions
nglaser3 Apr 17, 2026
4255ec6
Merge branch 'readd-ww' into forced-collisions
nglaser3 Apr 17, 2026
f2e7817
rely on roulette to kill particles instead of tracking only surface c…
nglaser3 Apr 17, 2026
05cc1b1
error throwing on the object for forced collisions
nglaser3 Apr 17, 2026
36ae825
attempt at forced collision cell test
nglaser3 Apr 17, 2026
4517cf9
set active to be true when called...
nglaser3 Apr 18, 2026
83dd219
add copy particle runtime state to particle module
nglaser3 Apr 18, 2026
d92ce79
update forced collision to generate collided and transmitted properly
nglaser3 Apr 18, 2026
d4cc65f
factor out tracklength score procedure in simulation, score transmitt…
nglaser3 Apr 18, 2026
3190953
add regression test for forced collisions
nglaser3 Apr 18, 2026
388d564
remove unit test for in cell check for forced collisions
nglaser3 Apr 18, 2026
f64c85d
add docstrings to all added methods
nglaser3 Apr 18, 2026
41ff45a
back in black
nglaser3 Apr 18, 2026
4c4ccdc
add python api line for forced collisions
nglaser3 Apr 18, 2026
575f1e2
fix various typos and bugs causing tests to fail
nglaser3 Apr 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/source/pythonapi/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,10 @@ Defining techniques
Techniques are enabled by calling methods on the ``mcdc.simulation`` singleton:

- ``mcdc.simulation.implicit_capture(active=True)``
- ``mcdc.simulation.forced_collisions(cells=[], weight_thresholds=[], weight_targets=[])``
- ``mcdc.simulation.weighted_emission(active=True, weight_target=1.0)``
- ``mcdc.simulation.weight_roulette(weight_threshold=0.0, weight_target=1.0)``
- ``mcdc.simulation.weight_windows(weight_windows, mesh=None, energy=None)``
- ``mcdc.simulation.population_control(active=True)``

Running
Expand Down
27 changes: 27 additions & 0 deletions mcdc/code_factory/numba_objects_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,14 @@ def generate_mcdc_access(targets):
object_name, attribute_name, shape[1], shape[2], True
)

elif len(shape) == 4:
text_getter += _accessor_4d_element(
object_name, attribute_name, shape[1], shape[2], shape[3]
)

text_setter += _accessor_4d_element(
object_name, attribute_name, shape[1], shape[2], shape[3], True
)
text_getter += _accessor_chunk(object_name, attribute_name)
text_setter += _accessor_chunk(object_name, attribute_name, True)

Expand Down Expand Up @@ -1157,6 +1165,25 @@ def _accessor_3d_element(object_name, attribute_name, stride_2, stride_3, setter
return text


def _accessor_4d_element(
object_name, attribute_name, stride_2, stride_3, stride_4, setter=False
):
text = f"@njit\n"
if setter:
text += f"def {attribute_name}(index_1, index_2, index_3, index_4, {object_name}, data, value):\n"
else:
text += f"def {attribute_name}(index_1, index_2, index_3, index_4, {object_name}, data):\n"
text += f' offset = {object_name}["{attribute_name}_offset"]\n'
text += f' stride_2 = {object_name}["{stride_2}"]\n'
text += f' stride_3 = {object_name}["{stride_3}"]\n'
text += f' stride_4 = {object_name}["{stride_4}"]\n'
if setter:
text += f" data[offset + index_1 * stride_2 * stride_3 * stride_4 + index_2 * stride_3 * stride_4 + index_3 * stride_4 + index_4] = value\n\n\n"
else:
text += f" return data[offset + index_1 * stride_2 * stride_3 * stride_4 + index_2 * stride_3 * stride_4 + index_3 * stride_4 + index_4]\n\n\n"
return text


# ======================================================================================
# Misc.
# ======================================================================================
Expand Down
4 changes: 4 additions & 0 deletions mcdc/mcdc_get/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,16 @@

import mcdc.mcdc_get.settings as settings

import mcdc.mcdc_get.forced_collisions as forced_collisions

import mcdc.mcdc_get.implicit_capture as implicit_capture

import mcdc.mcdc_get.population_control as population_control

import mcdc.mcdc_get.weight_roulette as weight_roulette

import mcdc.mcdc_get.weight_windows as weight_windows

import mcdc.mcdc_get.weighted_emission as weighted_emission

import mcdc.mcdc_get.source as source
Expand Down
90 changes: 90 additions & 0 deletions mcdc/mcdc_get/forced_collisions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# The following is automatically generated by code_factory.py

from numba import njit


@njit
def cell_IDs(index, forced_collisions, data):
offset = forced_collisions["cell_IDs_offset"]
return data[offset + index]


@njit
def cell_IDs_all(forced_collisions, data):
start = forced_collisions["cell_IDs_offset"]
size = forced_collisions["cell_IDs_length"]
end = start + size
return data[start:end]


@njit
def cell_IDs_last(forced_collisions, data):
start = forced_collisions["cell_IDs_offset"]
size = forced_collisions["cell_IDs_length"]
end = start + size
return data[end - 1]


@njit
def cell_IDs_chunk(start, length, forced_collisions, data):
start += forced_collisions["cell_IDs_offset"]
end = start + length
return data[start:end]


@njit
def threshold_weights(index, forced_collisions, data):
offset = forced_collisions["threshold_weights_offset"]
return data[offset + index]


@njit
def threshold_weights_all(forced_collisions, data):
start = forced_collisions["threshold_weights_offset"]
size = forced_collisions["threshold_weights_length"]
end = start + size
return data[start:end]


@njit
def threshold_weights_last(forced_collisions, data):
start = forced_collisions["threshold_weights_offset"]
size = forced_collisions["threshold_weights_length"]
end = start + size
return data[end - 1]


@njit
def threshold_weights_chunk(start, length, forced_collisions, data):
start += forced_collisions["threshold_weights_offset"]
end = start + length
return data[start:end]


@njit
def target_weights(index, forced_collisions, data):
offset = forced_collisions["target_weights_offset"]
return data[offset + index]


@njit
def target_weights_all(forced_collisions, data):
start = forced_collisions["target_weights_offset"]
size = forced_collisions["target_weights_length"]
end = start + size
return data[start:end]


@njit
def target_weights_last(forced_collisions, data):
start = forced_collisions["target_weights_offset"]
size = forced_collisions["target_weights_length"]
end = start + size
return data[end - 1]


@njit
def target_weights_chunk(start, length, forced_collisions, data):
start += forced_collisions["target_weights_offset"]
end = start + length
return data[start:end]
80 changes: 80 additions & 0 deletions mcdc/mcdc_get/weight_windows.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# The following is automatically generated by code_factory.py

from numba import njit


@njit
def energy_bounds(index, weight_windows, data):
offset = weight_windows["energy_bounds_offset"]
return data[offset + index]


@njit
def energy_bounds_all(weight_windows, data):
start = weight_windows["energy_bounds_offset"]
size = weight_windows["energy_bounds_length"]
end = start + size
return data[start:end]


@njit
def energy_bounds_last(weight_windows, data):
start = weight_windows["energy_bounds_offset"]
size = weight_windows["energy_bounds_length"]
end = start + size
return data[end - 1]


@njit
def energy_bounds_chunk(start, length, weight_windows, data):
start += weight_windows["energy_bounds_offset"]
end = start + length
return data[start:end]


@njit
def lower_weights(index_1, index_2, index_3, index_4, weight_windows, data):
offset = weight_windows["lower_weights_offset"]
stride_2 = weight_windows["Nx"]
stride_3 = weight_windows["Ny"]
stride_4 = weight_windows["Nz"]
return data[offset + index_1 * stride_2 * stride_3 * stride_4 + index_2 * stride_3 * stride_4 + index_3 * stride_4 + index_4]


@njit
def lower_weights_chunk(start, length, weight_windows, data):
start += weight_windows["lower_weights_offset"]
end = start + length
return data[start:end]


@njit
def target_weights(index_1, index_2, index_3, index_4, weight_windows, data):
offset = weight_windows["target_weights_offset"]
stride_2 = weight_windows["Nx"]
stride_3 = weight_windows["Ny"]
stride_4 = weight_windows["Nz"]
return data[offset + index_1 * stride_2 * stride_3 * stride_4 + index_2 * stride_3 * stride_4 + index_3 * stride_4 + index_4]


@njit
def target_weights_chunk(start, length, weight_windows, data):
start += weight_windows["target_weights_offset"]
end = start + length
return data[start:end]


@njit
def upper_weights(index_1, index_2, index_3, index_4, weight_windows, data):
offset = weight_windows["upper_weights_offset"]
stride_2 = weight_windows["Nx"]
stride_3 = weight_windows["Ny"]
stride_4 = weight_windows["Nz"]
return data[offset + index_1 * stride_2 * stride_3 * stride_4 + index_2 * stride_3 * stride_4 + index_3 * stride_4 + index_4]


@njit
def upper_weights_chunk(start, length, weight_windows, data):
start += weight_windows["upper_weights_offset"]
end = start + length
return data[start:end]
4 changes: 4 additions & 0 deletions mcdc/mcdc_set/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,16 @@

import mcdc.mcdc_set.settings as settings

import mcdc.mcdc_set.forced_collisions as forced_collisions

import mcdc.mcdc_set.implicit_capture as implicit_capture

import mcdc.mcdc_set.population_control as population_control

import mcdc.mcdc_set.weight_roulette as weight_roulette

import mcdc.mcdc_set.weight_windows as weight_windows

import mcdc.mcdc_set.weighted_emission as weighted_emission

import mcdc.mcdc_set.source as source
Expand Down
90 changes: 90 additions & 0 deletions mcdc/mcdc_set/forced_collisions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# The following is automatically generated by code_factory.py

from numba import njit


@njit
def cell_IDs(index, forced_collisions, data, value):
offset = forced_collisions["cell_IDs_offset"]
data[offset + index] = value


@njit
def cell_IDs_all(forced_collisions, data, value):
start = forced_collisions["cell_IDs_offset"]
size = forced_collisions["cell_IDs_length"]
end = start + size
data[start:end] = value


@njit
def cell_IDs_last(forced_collisions, data, value):
start = forced_collisions["cell_IDs_offset"]
size = forced_collisions["cell_IDs_length"]
end = start + size
data[end - 1] = value


@njit
def cell_IDs_chunk(start, length, forced_collisions, data, value):
start += forced_collisions["cell_IDs_offset"]
end = start + length
data[start:end] = value


@njit
def threshold_weights(index, forced_collisions, data, value):
offset = forced_collisions["threshold_weights_offset"]
data[offset + index] = value


@njit
def threshold_weights_all(forced_collisions, data, value):
start = forced_collisions["threshold_weights_offset"]
size = forced_collisions["threshold_weights_length"]
end = start + size
data[start:end] = value


@njit
def threshold_weights_last(forced_collisions, data, value):
start = forced_collisions["threshold_weights_offset"]
size = forced_collisions["threshold_weights_length"]
end = start + size
data[end - 1] = value


@njit
def threshold_weights_chunk(start, length, forced_collisions, data, value):
start += forced_collisions["threshold_weights_offset"]
end = start + length
data[start:end] = value


@njit
def target_weights(index, forced_collisions, data, value):
offset = forced_collisions["target_weights_offset"]
data[offset + index] = value


@njit
def target_weights_all(forced_collisions, data, value):
start = forced_collisions["target_weights_offset"]
size = forced_collisions["target_weights_length"]
end = start + size
data[start:end] = value


@njit
def target_weights_last(forced_collisions, data, value):
start = forced_collisions["target_weights_offset"]
size = forced_collisions["target_weights_length"]
end = start + size
data[end - 1] = value


@njit
def target_weights_chunk(start, length, forced_collisions, data, value):
start += forced_collisions["target_weights_offset"]
end = start + length
data[start:end] = value
Loading
Loading