1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import re
"""
This file is part of the suite of scripts to use LibEnsemble on top of WarpX
simulations. It provides functions to modify some parameters in a WarpX
input file.
"""
def _set_value(str_text, str_line, val):
"""
This function search for str_line in str_text and overwrites the whole
matching line with <str_line> str(val)
"""
str_text = re.sub('\n' + str_line + '.*',
'\n' + str_line + str(val),
str_text)
return str_text
def write_sim_input(input_file, x_values):
"""
This function modifies input_file to replace the values of some parameters
by values provided in x_values.
Parameters
----------
input_file : WarpX input file.
x_values : Specific value of input x for this run.
"""
# Parameters exposed to optimization
ramp_down_1 = x_values[0][0]
ramp_down_2 = x_values[0][1]
zlens_1 = x_values[0][2]
adjust_factor = x_values[0][3]
# Fixed parameters
ramp_up_1 = 0.02
plateau_1 = 0.297
ramp_up_2 = ramp_up_1
plateau_2 = plateau_1
gap_12 = .0285
end_stage_1 = ramp_up_1 + plateau_1 + ramp_down_1
beg_stage_2 = end_stage_1 + gap_12
end_stage_2 = beg_stage_2 + ramp_up_2 + plateau_2 + ramp_down_2
# End simulation when beam has just escaped the last stage
gamma_b = 30.
zmax_stop_run = end_stage_2 - 55.e-6 * gamma_b**2 * 2.
with open(input_file) as file_handler:
output_text = file_handler.read()
# Set end of stage 1
output_text = _set_value(
output_text, 'electrons.zmax = ', str(end_stage_1))
output_text = _set_value(
output_text, 'ions.zmax = ', str(end_stage_1))
# Set length of final downramp of stage 1
output_text = _set_value(
output_text, 'electrons.predefined_profile_params = ',
'0.0 .02 .297 ' + str(ramp_down_1) + ' 40.e-6 1.7e23')
output_text = _set_value(
output_text, 'ions.predefined_profile_params = ',
'0.0 .02 .297 ' + str(ramp_down_1) + ' 40.e-6 1.7e23')
# Set position of lens
output_text = _set_value(
output_text, 'my_constants.zlen = ', str(end_stage_1 + zlens_1))
# Set beginning of stage 2
output_text = _set_value(
output_text, 'electrons2.zmin = ', str(beg_stage_2))
output_text = _set_value(
output_text, 'ions2.zmin = ', str(beg_stage_2))
# Set end of stage 2
output_text = _set_value(
output_text, 'electrons2.zmax = ', str(end_stage_2))
output_text = _set_value(
output_text, 'ions2.zmax = ', str(end_stage_2))
# Set length of final downramp of stage 2
output_text = _set_value(
output_text, 'electrons2.predefined_profile_params = ',
str(beg_stage_2) + ' .02 .297 ' + str(ramp_down_2) + ' 40.e-6 1.7e23')
output_text = _set_value(
output_text, 'ions2.predefined_profile_params = ',
str(beg_stage_2) + ' .02 .297 ' + str(ramp_down_2) + ' 40.e-6 1.7e23')
# Set adjustment factor on lens strength
output_text = _set_value(
output_text, 'my_constants.adjust_factor = ', str(adjust_factor))
# Set when to stop the run
output_text = _set_value(
output_text, 'warpx.zmax_plasma_to_compute_max_step = ',
str(zmax_stop_run))
# Write new input file
fout = open(input_file, 'w')
fout.write(output_text)
fout.close()
|