tilupy 0.1.5__py3-none-any.whl → 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of tilupy might be problematic. Click here for more details.
- tilupy/cmd.py +114 -60
- tilupy/models/shaltop/initsimus.py +161 -49
- tilupy/models/shaltop/read.py +319 -164
- tilupy/notations.py +332 -47
- tilupy/plot.py +440 -187
- tilupy/read.py +817 -235
- tilupy/utils.py +99 -71
- {tilupy-0.1.5.dist-info → tilupy-1.0.0.dist-info}/METADATA +1 -1
- {tilupy-0.1.5.dist-info → tilupy-1.0.0.dist-info}/RECORD +13 -13
- {tilupy-0.1.5.dist-info → tilupy-1.0.0.dist-info}/LICENSE +0 -0
- {tilupy-0.1.5.dist-info → tilupy-1.0.0.dist-info}/WHEEL +0 -0
- {tilupy-0.1.5.dist-info → tilupy-1.0.0.dist-info}/entry_points.txt +0 -0
- {tilupy-0.1.5.dist-info → tilupy-1.0.0.dist-info}/top_level.txt +0 -0
tilupy/cmd.py
CHANGED
|
@@ -13,23 +13,29 @@ import argparse
|
|
|
13
13
|
import glob
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
def process_results(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
def process_results(
|
|
17
|
+
fn_name,
|
|
18
|
+
model,
|
|
19
|
+
res_name,
|
|
20
|
+
folder=None,
|
|
21
|
+
param_files=None,
|
|
22
|
+
kwargs_read=None,
|
|
23
|
+
**kwargs_fn
|
|
24
|
+
):
|
|
25
|
+
assert model is not None
|
|
20
26
|
|
|
21
27
|
if folder is None:
|
|
22
28
|
folder = os.getcwd()
|
|
23
29
|
|
|
24
30
|
if param_files is None:
|
|
25
|
-
param_files =
|
|
31
|
+
param_files = "*.txt"
|
|
26
32
|
|
|
27
33
|
print(folder, param_files)
|
|
28
34
|
|
|
29
35
|
param_files = glob.glob(os.path.join(folder, param_files))
|
|
30
36
|
|
|
31
37
|
if len(param_files) == 0:
|
|
32
|
-
print(
|
|
38
|
+
print("No parameter file matching param_files pattern was found")
|
|
33
39
|
return
|
|
34
40
|
|
|
35
41
|
if kwargs_read is None:
|
|
@@ -39,87 +45,135 @@ def process_results(fn_name, model, res_name, folder=None, param_files=None,
|
|
|
39
45
|
kw_read.update(kwargs_read)
|
|
40
46
|
|
|
41
47
|
for param_file in param_files:
|
|
42
|
-
print_str =
|
|
48
|
+
print_str = "Processing simulation {:s}, {:s} {:s} ....."
|
|
43
49
|
print(print_str.format(param_file, fn_name, res_name))
|
|
44
|
-
kw_read[
|
|
50
|
+
kw_read["file_params"] = param_file
|
|
45
51
|
res = tilupy.read.get_results(model, **kw_read)
|
|
46
52
|
getattr(res, fn_name)(res_name, **kwargs_fn)
|
|
47
53
|
|
|
48
54
|
|
|
49
|
-
def to_raster(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
def to_raster(
|
|
56
|
+
model=None,
|
|
57
|
+
res_name="h",
|
|
58
|
+
param_files=None,
|
|
59
|
+
folder=None,
|
|
60
|
+
kwargs_read=None,
|
|
61
|
+
**kwargs
|
|
62
|
+
):
|
|
63
|
+
kw = dict(fmt="asc")
|
|
53
64
|
kw.update(kwargs)
|
|
54
65
|
|
|
55
|
-
process_results(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
process_results(
|
|
67
|
+
"save",
|
|
68
|
+
model,
|
|
69
|
+
res_name,
|
|
70
|
+
folder=folder,
|
|
71
|
+
param_files=param_files,
|
|
72
|
+
kwargs_read=kwargs_read,
|
|
73
|
+
**kw
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def plot_results(
|
|
78
|
+
model=None,
|
|
79
|
+
res_name="h",
|
|
80
|
+
param_files=None,
|
|
81
|
+
folder=None,
|
|
82
|
+
kwargs_read=None,
|
|
83
|
+
**kwargs
|
|
84
|
+
):
|
|
63
85
|
kw = dict(save=True)
|
|
64
86
|
kw.update(kwargs)
|
|
65
87
|
|
|
66
|
-
process_results(
|
|
67
|
-
|
|
68
|
-
|
|
88
|
+
process_results(
|
|
89
|
+
"plot",
|
|
90
|
+
model,
|
|
91
|
+
res_name,
|
|
92
|
+
folder=folder,
|
|
93
|
+
param_files=param_files,
|
|
94
|
+
kwargs_read=kwargs_read,
|
|
95
|
+
**kwargs
|
|
96
|
+
)
|
|
69
97
|
|
|
70
98
|
|
|
71
99
|
def _get_parser(prog, description):
|
|
72
|
-
parser = argparse.ArgumentParser(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
parser.add_argument(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
100
|
+
parser = argparse.ArgumentParser(
|
|
101
|
+
prog=prog,
|
|
102
|
+
description=description,
|
|
103
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
104
|
+
)
|
|
105
|
+
parser.add_argument("model", help="Model name", type=str)
|
|
106
|
+
parser.add_argument(
|
|
107
|
+
"-n",
|
|
108
|
+
"--res_name",
|
|
109
|
+
help="Name of output, only for maps",
|
|
110
|
+
default="h",
|
|
111
|
+
type=str,
|
|
112
|
+
)
|
|
113
|
+
parser.add_argument(
|
|
114
|
+
"-p",
|
|
115
|
+
"--param_files",
|
|
116
|
+
help="Parameter file (globbing)",
|
|
117
|
+
default="*.txt",
|
|
118
|
+
type=str,
|
|
119
|
+
)
|
|
120
|
+
parser.add_argument(
|
|
121
|
+
"-f",
|
|
122
|
+
"--folder",
|
|
123
|
+
help="Root folder, default is current folder",
|
|
124
|
+
default=None,
|
|
125
|
+
type=str,
|
|
126
|
+
)
|
|
84
127
|
return parser
|
|
85
128
|
|
|
86
129
|
|
|
87
130
|
def _tilupy_plot():
|
|
88
|
-
parser = _get_parser(
|
|
89
|
-
parser.add_argument(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
parser.add_argument(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
131
|
+
parser = _get_parser("tilupy_plot", "Plot thin-layer simulation results")
|
|
132
|
+
parser.add_argument(
|
|
133
|
+
"--fmt",
|
|
134
|
+
help=("Plot output format " "(any accepted by matplotlib.savefig)"),
|
|
135
|
+
default="png",
|
|
136
|
+
type=str,
|
|
137
|
+
)
|
|
138
|
+
parser.add_argument(
|
|
139
|
+
"--vmin",
|
|
140
|
+
help=("Minimum plotted value, " "adapted to data by default"),
|
|
141
|
+
default=None,
|
|
142
|
+
type=float,
|
|
143
|
+
)
|
|
144
|
+
parser.add_argument(
|
|
145
|
+
"--vmax",
|
|
146
|
+
help=("Maximum plotted value, " "adapted to data by default"),
|
|
147
|
+
default=None,
|
|
148
|
+
type=float,
|
|
149
|
+
)
|
|
150
|
+
parser.add_argument(
|
|
151
|
+
"--minval_abs",
|
|
152
|
+
help=("Minimum plotted absolute value," " adapted to data by default"),
|
|
153
|
+
default=None,
|
|
154
|
+
type=float,
|
|
155
|
+
)
|
|
105
156
|
args = parser.parse_args()
|
|
106
157
|
plot_results(**vars(args))
|
|
107
158
|
|
|
108
159
|
|
|
109
160
|
def _tilupy_to_raster():
|
|
110
|
-
parser = _get_parser(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
161
|
+
parser = _get_parser(
|
|
162
|
+
"tilupy_to_raster", "Convert simulation results to rasters"
|
|
163
|
+
)
|
|
164
|
+
parser.add_argument(
|
|
165
|
+
"--fmt",
|
|
166
|
+
help=("File output format, " "tif/tiff requires rasterio"),
|
|
167
|
+
default="asc",
|
|
168
|
+
type=str,
|
|
169
|
+
choices=["tif", "tiff", "txt", "asc", "ascii"],
|
|
170
|
+
)
|
|
116
171
|
args = parser.parse_args()
|
|
117
172
|
# plot_results(parser.model, parser.res_name)
|
|
118
173
|
to_raster(**vars(args))
|
|
119
174
|
|
|
120
175
|
|
|
121
|
-
if __name__ ==
|
|
122
|
-
|
|
176
|
+
if __name__ == "__main__":
|
|
123
177
|
# folder = 'd:/Documents/peruzzetto/tmp/test_shaltop/7p30e04_m3/coulomb'
|
|
124
178
|
# plot_results('shaltop', 'h_max', '*18p00.txt', folder=folder)
|
|
125
179
|
_tilupy_plot()
|
|
@@ -7,24 +7,23 @@ Created on Tue May 25 15:18:31 2021
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import os
|
|
10
|
+
import posixpath
|
|
10
11
|
import numpy as np
|
|
11
12
|
|
|
13
|
+
from tilupy.utils import format_path_linux
|
|
14
|
+
|
|
12
15
|
import tilupy.notations
|
|
13
16
|
import tilupy.raster
|
|
14
17
|
|
|
15
|
-
README_PARAM_MATCH = dict(tmax='tmax',
|
|
16
|
-
CFL='cflhyp',
|
|
17
|
-
h_min='eps0',
|
|
18
|
-
dt_im_output='dt_im')
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
README_PARAM_MATCH = dict(
|
|
20
|
+
tmax="tmax", CFL="cflhyp", h_min="eps0", dt_im_output="dt_im"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
SHALTOP_LAW_ID = dict(coulomb=1, voellmy=8, bingham=6, muI=7)
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def write_params_file(params, directory=None,
|
|
27
|
-
file_name='params.txt'):
|
|
26
|
+
def write_params_file(params, directory=None, file_name="params.txt"):
|
|
28
27
|
"""
|
|
29
28
|
Write params file for shaltop simulations
|
|
30
29
|
|
|
@@ -47,33 +46,145 @@ def write_params_file(params, directory=None,
|
|
|
47
46
|
|
|
48
47
|
if directory is None:
|
|
49
48
|
directory = os.getcwd()
|
|
50
|
-
with open(os.path.join(directory, file_name),
|
|
49
|
+
with open(os.path.join(directory, file_name), "w") as file_params:
|
|
51
50
|
for name in params:
|
|
52
51
|
val = params[name]
|
|
53
52
|
if isinstance(val, int) or isinstance(val, np.int64):
|
|
54
|
-
file_params.write(
|
|
53
|
+
file_params.write("{:s} {:d}\n".format(name, val))
|
|
55
54
|
if isinstance(val, float) or isinstance(val, np.float64):
|
|
56
|
-
file_params.write(
|
|
55
|
+
file_params.write("{:s} {:.8G}\n".format(name, val))
|
|
57
56
|
if isinstance(val, str):
|
|
58
|
-
file_params.write(
|
|
57
|
+
file_params.write("{:s} {:s}\n".format(name, val))
|
|
59
58
|
|
|
60
59
|
|
|
61
60
|
def raster_to_shaltop_txtfile(file_in, file_out, folder_out=None):
|
|
62
|
-
|
|
63
61
|
if folder_out is not None:
|
|
64
62
|
file_out = os.path.join(folder_out, file_out)
|
|
65
63
|
|
|
66
64
|
x, y, rast = tilupy.raster.read_raster(file_in)
|
|
67
|
-
np.savetxt(
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
np.savetxt(
|
|
66
|
+
file_out,
|
|
67
|
+
np.reshape(np.flip(rast, axis=0), (rast.size, 1)),
|
|
68
|
+
fmt="%.12G",
|
|
69
|
+
)
|
|
70
70
|
|
|
71
|
-
res = dict(
|
|
72
|
-
|
|
71
|
+
res = dict(
|
|
72
|
+
x0=x[0], y0=y[0], dx=x[1] - x[0], dy=y[1] - y[0], nx=len(x), ny=len(y)
|
|
73
|
+
)
|
|
73
74
|
|
|
74
75
|
return res
|
|
75
76
|
|
|
76
77
|
|
|
78
|
+
def write_job_files(
|
|
79
|
+
dirs,
|
|
80
|
+
param_files,
|
|
81
|
+
file_job,
|
|
82
|
+
job_name,
|
|
83
|
+
max_time_hours=24,
|
|
84
|
+
ncores_per_node=6,
|
|
85
|
+
partitions="cpuall,data,datanew",
|
|
86
|
+
shaltop_file="shaltop",
|
|
87
|
+
folder_conf_in_job=None,
|
|
88
|
+
replace_path=None,
|
|
89
|
+
number_conf_file=True,
|
|
90
|
+
):
|
|
91
|
+
"""
|
|
92
|
+
Write job/conf files for slurm jobs. The conf contains all the commands
|
|
93
|
+
needed to run each simulation (one command per simulation).
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
dirs : list of string
|
|
98
|
+
list of paths where simus will be run.
|
|
99
|
+
param_files : list string
|
|
100
|
+
list of shaltop parameter files.
|
|
101
|
+
file_job : string
|
|
102
|
+
name of job file called by sbatch.
|
|
103
|
+
job_name : string
|
|
104
|
+
name of conf file used by file_job.
|
|
105
|
+
max_time_hours : int, optional
|
|
106
|
+
Maximum job duration in hours before stop. The default is 24.
|
|
107
|
+
ncores_per_node : int, optional
|
|
108
|
+
Number of cores per nodes. Used to know the number of nodes required
|
|
109
|
+
for the job. The default is 6.
|
|
110
|
+
partitions : string, optional
|
|
111
|
+
Names of partitions on which jobs can be launched.
|
|
112
|
+
The default is "cpuall,data,datanew".
|
|
113
|
+
shaltop_file : string, optional
|
|
114
|
+
Bash command used to call shaltop. Can be a path.
|
|
115
|
+
The default is "shaltop".
|
|
116
|
+
folder_conf_in_job : string, optional
|
|
117
|
+
Folder where the conf file is located. The default is the folder
|
|
118
|
+
path of file_job.
|
|
119
|
+
replace_path : list, optional
|
|
120
|
+
replace replace_path[0] by replace_path[1] for every path in dir. This
|
|
121
|
+
is used if simulations are prepared and run on two different machines
|
|
122
|
+
(e.g. laptop and cluster).
|
|
123
|
+
The default is None.
|
|
124
|
+
number_conf_file : bool, optional
|
|
125
|
+
If True, add a number in front of each line of the conf file. Required
|
|
126
|
+
to identify slurm jobs.
|
|
127
|
+
The default is True.
|
|
128
|
+
|
|
129
|
+
Returns
|
|
130
|
+
-------
|
|
131
|
+
None.
|
|
132
|
+
|
|
133
|
+
"""
|
|
134
|
+
ntasks = len(dirs)
|
|
135
|
+
nnodes = int(np.ceil(ntasks / ncores_per_node))
|
|
136
|
+
|
|
137
|
+
if folder_conf_in_job is None:
|
|
138
|
+
folder_conf_in_job = os.path.dirname(file_job)
|
|
139
|
+
if folder_conf_in_job == "":
|
|
140
|
+
folder_conf_in_job = "."
|
|
141
|
+
|
|
142
|
+
with open(file_job + ".conf", "w", newline="\n") as conf_file:
|
|
143
|
+
if number_conf_file:
|
|
144
|
+
line = "{:d} {:s} {:s} {:s}\n"
|
|
145
|
+
else:
|
|
146
|
+
line = "{:s} {:s} {:s}\n"
|
|
147
|
+
for i in range(ntasks):
|
|
148
|
+
if replace_path is not None:
|
|
149
|
+
folder = dirs[i].replace(replace_path[0], replace_path[1])
|
|
150
|
+
param_file = param_files[i].replace(
|
|
151
|
+
replace_path[0], replace_path[1]
|
|
152
|
+
)
|
|
153
|
+
else:
|
|
154
|
+
folder = dirs[i]
|
|
155
|
+
param_file = param_files[i]
|
|
156
|
+
folder = format_path_linux(folder)
|
|
157
|
+
param_file = format_path_linux(param_file)
|
|
158
|
+
if number_conf_file:
|
|
159
|
+
line2 = line.format(i, shaltop_file, folder, param_file)
|
|
160
|
+
else:
|
|
161
|
+
line2 = line.format(shaltop_file, folder, param_file)
|
|
162
|
+
conf_file.write(line2)
|
|
163
|
+
|
|
164
|
+
n_hours = np.floor(max_time_hours)
|
|
165
|
+
n_min = (max_time_hours - n_hours) * 60
|
|
166
|
+
str_time = "{:02.0f}:{:02.0f}:00\n".format(n_hours, n_min)
|
|
167
|
+
|
|
168
|
+
basename = os.path.basename(file_job)
|
|
169
|
+
path_conf_in_job = posixpath.join(folder_conf_in_job, basename + ".conf")
|
|
170
|
+
|
|
171
|
+
with open(file_job + ".job", "w", newline="\n") as job_file:
|
|
172
|
+
job_file.write("#!/bin/sh\n")
|
|
173
|
+
job_file.write("#SBATCH -J multijob\n")
|
|
174
|
+
job_file.write("#SBATCH --job-name={:s}\n".format(job_name))
|
|
175
|
+
job_file.write("#SBATCH --output={:s}%j.out\n".format(job_name))
|
|
176
|
+
job_file.write("#SBATCH --partition " + partitions + "\n")
|
|
177
|
+
job_file.write("#SBATCH --nodes={:d}".format(nnodes) + "\n")
|
|
178
|
+
job_file.write("#SBATCH --ntasks={:d}".format(ntasks) + "\n")
|
|
179
|
+
job_file.write("#SBATCH --time={:s}\n".format(str_time))
|
|
180
|
+
job_file.write("\n")
|
|
181
|
+
job_file.write("module purge\n")
|
|
182
|
+
job_file.write("module load slurm\n")
|
|
183
|
+
job_file.write("\n")
|
|
184
|
+
line = "srun -n {:d} -l --multi-prog {:s}"
|
|
185
|
+
job_file.write(line.format(ntasks, path_conf_in_job))
|
|
186
|
+
|
|
187
|
+
|
|
77
188
|
def make_simus(law, rheol_params, folder_data, folder_out, readme_file):
|
|
78
189
|
"""
|
|
79
190
|
Write shaltop initial file for simple slope test case
|
|
@@ -93,57 +204,58 @@ def make_simus(law, rheol_params, folder_data, folder_out, readme_file):
|
|
|
93
204
|
|
|
94
205
|
"""
|
|
95
206
|
# Get topography and initial mass, and write them in Shaltop format
|
|
96
|
-
zfile = os.path.join(folder_data,
|
|
97
|
-
mfile = os.path.join(folder_data,
|
|
207
|
+
zfile = os.path.join(folder_data, "topo.asc")
|
|
208
|
+
mfile = os.path.join(folder_data, "mass.asc")
|
|
98
209
|
x, y, z, dx = tilupy.raster.read_ascii(zfile)
|
|
99
210
|
_, _, m, _ = tilupy.raster.read_ascii(mfile)
|
|
100
|
-
np.savetxt(os.path.join(folder_out,
|
|
101
|
-
np.savetxt(os.path.join(folder_out,
|
|
211
|
+
np.savetxt(os.path.join(folder_out, "z.d"), z.T.flatten())
|
|
212
|
+
np.savetxt(os.path.join(folder_out, "m.d"), m.T.flatten())
|
|
102
213
|
|
|
103
214
|
# Get simulation parameters from README.txt and raster .asc files
|
|
104
215
|
params = tilupy.notations.readme_to_params(readme_file, README_PARAM_MATCH)
|
|
105
|
-
params[
|
|
106
|
-
params[
|
|
107
|
-
params[
|
|
108
|
-
params[
|
|
109
|
-
params[
|
|
110
|
-
params[
|
|
216
|
+
params["nx"] = len(x)
|
|
217
|
+
params["ny"] = len(y)
|
|
218
|
+
params["per"] = dx * len(x)
|
|
219
|
+
params["pery"] = dx * len(y)
|
|
220
|
+
params["file_m_init"] = "../m.d"
|
|
221
|
+
params["file_z_init"] = "../z.d"
|
|
111
222
|
|
|
112
223
|
# Folder for rheological law, and set params accordingly
|
|
113
224
|
folder_law = os.path.join(folder_out, law)
|
|
114
|
-
params[
|
|
225
|
+
params["icomp"] = SHALTOP_LAW_ID[law]
|
|
115
226
|
|
|
116
227
|
param_names = [param for param in rheol_params]
|
|
117
228
|
|
|
118
229
|
texts = tilupy.notations.make_rheol_string(rheol_params, law)
|
|
119
230
|
|
|
120
231
|
# Run shaltop file
|
|
121
|
-
run_shaltop_file = os.path.join(folder_law,
|
|
232
|
+
run_shaltop_file = os.path.join(folder_law, "run_shaltop.sh")
|
|
122
233
|
file_txt = ""
|
|
123
234
|
|
|
124
235
|
for i in range(len(rheol_params[param_names[0]])):
|
|
125
|
-
|
|
126
236
|
simu_text = texts[i]
|
|
127
237
|
for param_name in param_names:
|
|
128
238
|
params[param_name] = rheol_params[param_name][i]
|
|
129
|
-
params[
|
|
239
|
+
params["folder_output"] = simu_text
|
|
130
240
|
folder_results = os.path.join(folder_law, simu_text)
|
|
131
241
|
os.makedirs(folder_results, exist_ok=True)
|
|
132
|
-
with open(os.path.join(folder_results,
|
|
133
|
-
fid.write(
|
|
134
|
-
fid.write(
|
|
135
|
-
fid.write(
|
|
136
|
-
fid.write(
|
|
137
|
-
|
|
138
|
-
write_params_file(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
file_txt +=
|
|
142
|
-
file_txt += '
|
|
143
|
-
file_txt +=
|
|
144
|
-
file_txt += (
|
|
145
|
-
|
|
146
|
-
|
|
242
|
+
with open(os.path.join(folder_results, ".gitignore"), "w") as fid:
|
|
243
|
+
fid.write("# Ignore everything in this directory")
|
|
244
|
+
fid.write("*")
|
|
245
|
+
fid.write("# Except this file")
|
|
246
|
+
fid.write("!.gitignore")
|
|
247
|
+
|
|
248
|
+
write_params_file(
|
|
249
|
+
params, directory=folder_law, file_name=simu_text + ".txt"
|
|
250
|
+
)
|
|
251
|
+
file_txt += "start_time=`date +%s`\n"
|
|
252
|
+
file_txt += 'shaltop "" ' + simu_text + ".txt\n"
|
|
253
|
+
file_txt += "end_time=`date +%s`\n"
|
|
254
|
+
file_txt += "elapsed_time=$(($end_time - $start_time))\n"
|
|
255
|
+
file_txt += (
|
|
256
|
+
'string_time="${start_time} ' + simu_text + ' ${elapsed_time}"\n'
|
|
257
|
+
)
|
|
258
|
+
file_txt += "echo ${string_time} >> simulation_duration.txt\n\n"
|
|
147
259
|
|
|
148
260
|
with open(run_shaltop_file, "w") as fid:
|
|
149
261
|
fid.write(file_txt)
|