Skip to content

Commit ceb5225

Browse files
committed
Corrected executable and IO; works now.
1 parent de50679 commit ceb5225

File tree

8 files changed

+107
-55
lines changed

8 files changed

+107
-55
lines changed

install_protection_hook.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ then
1818
exit 1
1919
fi
2020
21-
for file in pyproject.toml version.sh LICENSE install_protection_hook.sh pin_xsuite_versions.sh xboinc/general.py 'xboinc/executable/.*'
21+
for file in pyproject.toml version.sh LICENSE install_protection_hook.sh pin_xsuite_versions.sh xboinc/general.py 'xboinc/executable/.*' 'xboinc/simulation_io/.*'
2222
do
2323
git diff --name-only | grep '^'${file}'$' &> /dev/null
2424
if [ $? -eq 0 ]

xboinc/executable/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,3 @@
44
# ######################################### #
55

66
from .generate_executable_source import generate_executable_source, generate_executable
7-
from .default_tracker import get_default_tracker

xboinc/executable/generate_executable_source.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1+
# copyright ############################### #
2+
# This file is part of the Xboinc Package. #
3+
# Copyright (c) CERN, 2023. #
4+
# ######################################### #
5+
16
import xobjects as xo
2-
from .default_tracker import get_default_tracker
3-
from .simulation_io import SimState, SimConfig
4-
from .general import _pkg_root, __version__
7+
from ..simulation_io import SimState, SimConfig, SimVersion, get_default_tracker
8+
from ..general import _pkg_root, __version__
59

610
from pathlib import Path
711
import shutil
812
import subprocess
913

14+
# ===============================================================================================
15+
# IMPORTANT
16+
# ===============================================================================================
17+
# Only make changes to this file just before a minor version bump (need a separate commit though)
18+
# to avoid having multiple xboinc versions with out-of-sync executables.
19+
# ===============================================================================================
20+
1021
insert_in_all_files = """
1122
#include <stdio.h>
1223
#ifndef NULL
@@ -21,6 +32,8 @@ def generate_executable_source(write_source_files=True,
2132

2233
sim_config_sources = [
2334
insert_in_all_files,
35+
xo.specialize_source(SimVersion._XoStruct._gen_c_api().source,
36+
specialize_for='cpu_serial'),
2437
xo.specialize_source(SimState._XoStruct._gen_c_api().source,
2538
specialize_for='cpu_serial'),
2639
xo.specialize_source(SimConfig._gen_c_api().source,
@@ -34,7 +47,7 @@ def generate_executable_source(write_source_files=True,
3447
xtrack_tracker_h = (
3548
insert_in_all_files + track_kernel.specialized_source)
3649

37-
with open(_pkg_root.joinpath('executable_src/main.c'), 'r') as fid:
50+
with open(_pkg_root.joinpath('executable/main.c'), 'r') as fid:
3851
main_c = insert_in_all_files + fid.read()
3952

4053
dct_sources = {
@@ -44,7 +57,8 @@ def generate_executable_source(write_source_files=True,
4457
}
4558

4659
for nn, vv in dct_sources.items():
47-
with open(nn, 'w') as fid:
60+
file = Path.cwd() / nn
61+
with file.open('w') as fid:
4862
fid.write(vv)
4963

5064
return dct_sources
@@ -64,17 +78,22 @@ def generate_executable(keep_source=False):
6478
else:
6579
raise RuntimeError("Neither clang or gcc are found. Install a C compiler.")
6680

67-
tag = '.'.join(__version__.split('.')[:2])
81+
tag = '_'
82+
tag += '.'.join(__version__.split('.')[:2])
6883
cmd = subprocess.run(['uname', '-ps'], stdout=subprocess.PIPE)
6984
if cmd.returncode == 0:
7085
tag += '-' + cmd.stdout.decode('UTF-8').strip().lower().replace(' ','-')
71-
cmd = subprocess.run([compiler, 'main.c', '-o', f'xboinc_{tag}', '-lm'],
86+
cmd = subprocess.run([compiler, 'main.c', '-o', f'xboinc{tag}', '-lm'],
7287
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
7388
if cmd.returncode != 0:
7489
stderr = cmd.stderr.decode('UTF-8').strip().split('\n')
7590
raise RuntimeError(f"Compilation failed. Stderr:\n {stderr}")
7691

77-
if not keep_source:
92+
if keep_source:
93+
main.rename(main.parent / f'{main.stem}{tag}{main.suffix}')
94+
config.rename(config.parent / f'{config.stem}{tag}{config.suffix}')
95+
tracker.rename(tracker.parent / f'{tracker.stem}{tag}{tracker.suffix}')
96+
else:
7897
main.unlink()
7998
config.unlink()
8099
tracker.unlink()

xboinc/executable/main.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ int main(){
6363

6464
// Get sim config
6565
SimConfig sim_config = (SimConfig) sim_buffer;
66-
SimVersion sim_ver = SimConfig_getp_sim_state_version(sim_config);
67-
int64_t input_version = SimVersionData_get_xboinc_version(sim_ver);
66+
int64_t input_version = SimConfig_get_sim_state_version_xboinc_version(sim_config);
6867
// Compatible if major and minor versions match (no new executables are made at patches)
6968
input_version = input_version/1000;
7069
if (input_version != xboinc_exec_version){
@@ -84,8 +83,9 @@ int main(){
8483
// Check if checkpoint exists
8584
printf("sim_state: %p\n", (int8_t*) sim_state);
8685
int8_t* loaded = file_to_buffer("./checkpoint.bin", (int8_t*) sim_state);
86+
int64_t current_turn = SimStateData_get_i_turn(sim_state);
8787
if (loaded){
88-
printf("Loaded checkpoint\n");
88+
printf("Loaded checkpoint, continuing from turn %d\n", (int) current_turn);
8989
}
9090
else{
9191
printf("No checkpoint found\n");
@@ -98,7 +98,6 @@ int main(){
9898
step_turns = num_elements;
9999
}
100100

101-
int64_t current_turn = SimStateData_get_i_turn(sim_state);
102101
while (current_turn < num_turns){
103102
if (current_turn > num_turns - checkpoint_every){
104103
step_turns = num_turns - checkpoint_every;
@@ -121,16 +120,21 @@ int main(){
121120
);
122121
SimStateData_set_i_turn(sim_state, SimStateData_get_i_turn(sim_state) + step_turns);
123122

123+
current_turn = SimStateData_get_i_turn(sim_state);
124124
if (checkpoint_every>0){
125-
printf("Checkpointing turn %d!\n", (int) SimStateData_get_i_turn(sim_state));
126-
FILE *chkp_fid;
127-
chkp_fid = fopen("./checkpoint.bin", "wb");
128-
fwrite(SimConfig_getp_sim_state(sim_config), sizeof(int8_t),
129-
SimConfig_get_sim_state_size(sim_config), chkp_fid);
130-
fclose(chkp_fid);
125+
if (current_turn < num_turns){
126+
printf("Checkpointing turn %d\n", (int) current_turn);
127+
FILE *chkp_fid;
128+
chkp_fid = fopen("./checkpoint.bin", "wb");
129+
fwrite(SimConfig_getp_sim_state(sim_config), sizeof(int8_t),
130+
SimConfig_get_sim_state_size(sim_config), chkp_fid);
131+
fclose(chkp_fid);
132+
}
131133
}
132134
}
133135

136+
printf("Finished tracking\n");
137+
134138
// Quick check
135139
//for (int ii=0; ii<ParticlesData_get__capacity(particles); ii++){
136140
//printf("s[%d] = %e\n", ii, ParticlesData_get_s(particles, (int64_t) ii));
@@ -148,9 +152,6 @@ int main(){
148152
printf("Error: could not remove checkpoint file\n");
149153
return -1; // error
150154
}
151-
else{
152-
printf("Checkpoint file removed\n");
153-
}
154155

155156
return 0;
156157
}

xboinc/simulation_io/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
# Copyright (c) CERN, 2023. #
44
# ######################################### #
55

6-
from .output import SimState
6+
from .default_tracker import get_default_tracker
7+
from .output import SimState, SimVersion
78
from .input import SimConfig

xboinc/executable/default_tracker.py renamed to xboinc/simulation_io/default_tracker.py

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,51 +23,80 @@ def get_default_tracker():
2323

2424
# Dummy line containing all supported element types
2525
default_line = xt.Line(elements=[
26-
xt.Drift(length=1.0),
27-
xt.Multipole(knl=[0]),
26+
xt.Marker(),
27+
xt.Drift(),
28+
xt.Bend(length=1.0),
29+
xt.Multipole(),
30+
xt.CombinedFunctionMagnet(length=1.0),
31+
xt.Quadrupole(length=1.0),
32+
xt.Sextupole(length=1.0),
2833
xt.SimpleThinBend(),
2934
xt.SimpleThinQuadrupole(),
3035
xt.ReferenceEnergyIncrease(),
3136
xt.Cavity(),
37+
xt.Solenoid(length=1.0),
3238
xt.XYShift(),
3339
xt.Elens(),
40+
xt.NonLinearLens(),
3441
xt.Wire(),
3542
xt.SRotation(),
3643
xt.XRotation(),
3744
xt.YRotation(),
3845
xt.ZetaShift(),
3946
xt.RFMultipole(knl=[0], pn=[0]),
47+
# xt.Fringe(),
48+
# xt.Wedge(),
4049
xt.DipoleEdge(),
4150
xt.Exciter(nsamples=1),
4251
xt.LineSegmentMap(),
43-
# xt.EnergyChange(), # not working!!!
52+
xt.FirstOrderTaylorMap(),
4453
xf.BeamBeamBiGaussian2D(
4554
other_beam_Sigma_11=1.,
4655
other_beam_Sigma_33=1.,
4756
other_beam_num_particles=0.,
4857
other_beam_q0=1.,
4958
other_beam_beta0=1.,
5059
),
51-
xf.BeamBeamBiGaussian3D(
52-
slices_other_beam_zeta_center=[0],
53-
slices_other_beam_num_particles=[0],
54-
phi=0.,
55-
alpha=0,
56-
other_beam_q0=1.,
57-
slices_other_beam_Sigma_11=[1],
58-
slices_other_beam_Sigma_12=[0],
59-
slices_other_beam_Sigma_22=[0],
60-
slices_other_beam_Sigma_33=[1],
61-
slices_other_beam_Sigma_34=[0],
62-
slices_other_beam_Sigma_44=[0],
63-
),
60+
# # Doesn't work because issue with definition of atomicAdd when generating executable
61+
# xf.BeamBeamBiGaussian3D(
62+
# slices_other_beam_zeta_center=[0],
63+
# slices_other_beam_num_particles=[0],
64+
# phi=0.,
65+
# alpha=0,
66+
# other_beam_q0=1.,
67+
# slices_other_beam_Sigma_11=[1],
68+
# slices_other_beam_Sigma_12=[0],
69+
# slices_other_beam_Sigma_22=[0],
70+
# slices_other_beam_Sigma_33=[1],
71+
# slices_other_beam_Sigma_34=[0],
72+
# slices_other_beam_Sigma_44=[0],
73+
# ),
74+
# # Doesn't work because fieldmap in different buffer
75+
# xf.ElectronCloud(fieldmap=xf.TriCubicInterpolatedFieldMap(
76+
# x_range=(0.,1.), nx=10,
77+
# y_range=(0.,1.), ny=10,
78+
# z_range=(0.,1.), nz=10
79+
# )),
80+
# # Doesn't work because issue with definition of atomicAdd when generating executable
81+
# xf.ElectronLensInterpolated(
82+
# x_range=(0.,1.), nx=10,
83+
# y_range=(0.,1.), ny=10
84+
# ),
85+
# # Doesn't work because issue with definition of atomicAdd when generating executable
86+
# xf.SpaceCharge3D(
87+
# x_range=(0.,1.), nx=10,
88+
# y_range=(0.,1.), ny=10,
89+
# z_range=(0.,1.), nz=10
90+
# ),
6491
xc.BlackAbsorber(length=1),
6592
xc.EverestCollimator(length=1, material=xc.materials.Silicon),
66-
xc.EverestCrystal(length=1, material=xc.materials.SiliconCrystal)
67-
#xf.SpaceChargeBiGaussian( # Not working!
68-
# longitudinal_profile=xf.LongitudinalProfileQGaussian(
69-
# number_of_particles=0, sigma_z=1)
70-
#),
93+
xc.EverestCrystal(length=1, material=xc.materials.SiliconCrystal),
94+
xt.LimitRect(),
95+
xt.LimitRacetrack(),
96+
xt.LimitEllipse(),
97+
xt.LimitPolygon(x_vertices=[0.,1.], y_vertices=[0.,1.]),
98+
xt.LimitRectEllipse(),
99+
xt.LongitudinalLimitRect()
71100
])
72101

73102
_context = xo.ContextCpu()

xboinc/simulation_io/input.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
# ######################################### #
55

66
import numpy as np
7+
from pathlib import Path
78

89
import xobjects as xo
910
import xpart as xp
1011
import xtrack as xt
1112

12-
from ..executable import get_default_tracker
13+
from .default_tracker import get_default_tracker
1314
from .output import SimState
1415

1516
_default_tracker, _default_config_hash = get_default_tracker()
@@ -24,7 +25,7 @@ class SimConfig(xo.Struct):
2425
sim_state = xo.Ref(SimState)
2526

2627
@classmethod
27-
def build(name, num_turns, line, particles, checkpoint_every=-1):
28+
def build(cls, *, num_turns, line, particles, checkpoint_every=-1, filename=None):
2829
# Assemble data structure
2930
simbuf = xo.ContextCpu().new_buffer()
3031
sim_config = cls(_buffer=simbuf)
@@ -34,18 +35,19 @@ def build(name, num_turns, line, particles, checkpoint_every=-1):
3435
if _default_config_hash not in line.tracker._tracker_data_cache:
3536
raise RuntimeError('Tracker data for default config not found')
3637
tracker_data = line.tracker._tracker_data_cache[_default_config_hash]
37-
version, part = get_boinc_particles_from_particles(particles)
38-
sim_state = build_simulation_state(version=version, _buffer=simbuf,
39-
particles=part, i_turn=0)
38+
sim_state = SimState(particles=particles, i_turn=0, _buffer=simbuf)
4039
sim_config.line_metadata = tracker_data._element_ref_data
4140
sim_config.num_turns = num_turns
4241
sim_config.num_elements = len(line.element_names)
4342
sim_config.checkpoint_every = checkpoint_every
4443
sim_config.sim_state = sim_state._xobject
44+
# TODO: can we set size at construction?
4545
sim_state.size = sim_state._xobject._size # store size of sim_state
4646
assert sim_config._offset == 0
4747
assert sim_config._fields[0].offset == 0
4848
# Write sim buffer to file
49-
with open(name, 'wb') as fid:
50-
fid.write(simbuf.buffer.tobytes())
49+
if filename is not None:
50+
filename = Path(filename).expanduser().resolve()
51+
with filename.open('wb') as fid:
52+
fid.write(simbuf.buffer.tobytes())
5153
return sim_config

xboinc/simulation_io/output.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ class SimVersion(xo.HybridClass):
3535

3636
def __init__(self, **kwargs):
3737
if '_xobject' not in kwargs:
38-
kwargs['xboinc'] = _version_to_int(version)
38+
kwargs['xboinc_version'] = _version_to_int(__version__)
3939
super().__init__(**kwargs)
4040

4141
def assert_version(self):
42-
if _version_to_int(__version__) != self.xboinc_version:
42+
if int(_version_to_int(__version__)/1000) != int(self.xboinc_version/1000):
4343
error += f"Incompatible xboinc version! Output file needs "
4444
error + f"{_int_to_version(self.xboinc_version)}, "
4545
error + f"but current version is {__version__}.\n"
@@ -57,10 +57,11 @@ class SimState(xo.HybridClass):
5757
def __init__(self, **kwargs):
5858
if '_xobject' not in kwargs:
5959
kwargs['version'] = SimVersion()
60+
# TODO: can we set size at construction?
6061
super().__init__(**kwargs)
6162

6263
@classmethod
63-
def from_binary(filename, offset=0):
64+
def from_binary(cls, filename, offset=0):
6465
# Read binary
6566
filename = Path(filename)
6667
with filename.open('rb') as fid:

0 commit comments

Comments
 (0)