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 CHANGED
@@ -13,23 +13,29 @@ import argparse
13
13
  import glob
14
14
 
15
15
 
16
- def process_results(fn_name, model, res_name, folder=None, param_files=None,
17
- kwargs_read=None, **kwargs_fn):
18
-
19
- assert(model is not None)
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 = '*.txt'
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('No parameter file matching param_files pattern was found')
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 = 'Processing simulation {:s}, {:s} {:s} .....'
48
+ print_str = "Processing simulation {:s}, {:s} {:s} ....."
43
49
  print(print_str.format(param_file, fn_name, res_name))
44
- kw_read['file_params'] = param_file
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(model=None, res_name='h', param_files=None, folder=None,
50
- kwargs_read=None, **kwargs):
51
-
52
- kw = dict(fmt='asc')
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('save', model, res_name,
56
- folder=folder, param_files=param_files,
57
- kwargs_read=kwargs_read, **kw)
58
-
59
-
60
- def plot_results(model=None, res_name='h', param_files=None, folder=None,
61
- kwargs_read=None, **kwargs):
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('plot', model, res_name,
67
- folder=folder, param_files=param_files,
68
- kwargs_read=kwargs_read, **kwargs)
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(prog=prog,
73
- description=description,
74
- formatter_class=argparse.ArgumentDefaultsHelpFormatter)
75
- parser.add_argument('model', help="Model name",
76
- type=str)
77
- parser.add_argument('-n', '--res_name', help="Name of output, only for maps",
78
- default='h', type=str,
79
- )
80
- parser.add_argument('-p', '--param_files', help="Parameter file (globbing)",
81
- default='*.txt', type=str)
82
- parser.add_argument('-f', '--folder', help="Root folder, default is current folder",
83
- default=None, type=str)
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('tilupy_plot', 'Plot thin-layer simulation results')
89
- parser.add_argument('--fmt', help=("Plot output format "
90
- "(any accepted by matplotlib.savefig)"),
91
- default='png', type=str,
92
- )
93
- parser.add_argument('--vmin', help=("Minimum plotted value, "
94
- "adapted to data by default"),
95
- default=None, type=float,
96
- )
97
- parser.add_argument('--vmax', help=("Maximum plotted value, "
98
- "adapted to data by default"),
99
- default=None, type=float,
100
- )
101
- parser.add_argument('--minval_abs', help=("Minimum plotted absolute value,"
102
- " adapted to data by default"),
103
- default=None, type=float,
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('tilupy_to_raster',
111
- 'Convert simulation results to rasters')
112
- parser.add_argument('--fmt', help=("File output format, "
113
- "tif/tiff requires rasterio"),
114
- default='asc', type=str,
115
- choices=['tif', 'tiff', 'txt', 'asc', 'ascii'])
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__ == '__main__':
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
- SHALTOP_LAW_ID = dict(coulomb=1,
21
- voellmy=8,
22
- bingham=6,
23
- muI=7)
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), 'w') as file_params:
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('{:s} {:d}\n'.format(name, val))
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('{:s} {:.8G}\n'.format(name, val))
55
+ file_params.write("{:s} {:.8G}\n".format(name, val))
57
56
  if isinstance(val, str):
58
- file_params.write('{:s} {:s}\n'.format(name, val))
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(file_out,
68
- np.reshape(np.flip(rast, axis=0), (rast.size, 1)),
69
- fmt='%.12G')
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(x0=x[0], y0=y[0], dx=x[1]-x[0], dy=y[1]-y[0],
72
- nx=len(x), ny=len(y))
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, 'topo.asc')
97
- mfile = os.path.join(folder_data, 'mass.asc')
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, 'z.d'), z.T.flatten())
101
- np.savetxt(os.path.join(folder_out, 'm.d'), m.T.flatten())
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['nx'] = len(x)
106
- params['ny'] = len(y)
107
- params['per'] = dx*len(x)
108
- params['pery'] = dx*len(y)
109
- params['file_m_init'] = '../m.d'
110
- params['file_z_init'] = '../z.d'
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['icomp'] = SHALTOP_LAW_ID[law]
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, 'run_shaltop.sh')
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['folder_output'] = simu_text
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, '.gitignore'), 'w') as fid:
133
- fid.write('# Ignore everything in this directory')
134
- fid.write('*')
135
- fid.write('# Except this file')
136
- fid.write('!.gitignore')
137
-
138
- write_params_file(params, directory=folder_law,
139
- file_name=simu_text+'.txt')
140
- file_txt += 'start_time=`date +%s`\n'
141
- file_txt += 'shaltop "" ' + simu_text + '.txt\n'
142
- file_txt += 'end_time=`date +%s`\n'
143
- file_txt += 'elapsed_time=$(($end_time - $start_time))\n'
144
- file_txt += ('string_time="${start_time} ' +
145
- simu_text + ' ${elapsed_time}"\n')
146
- file_txt += 'echo ${string_time} >> simulation_duration.txt\n\n'
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)