From eb0d35b8b267cda4ecdd45b6eca7c7d4ad4b0ab3 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 17 May 2023 19:52:14 +0200 Subject: [PATCH 01/12] neutral defaults to not show specs of docs computer in online documentation --- mesh2hrtf/NumCalc/manage_numcalc.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index 96dc88ef..d192c80e 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -7,9 +7,9 @@ import mesh2hrtf as m2h -def manage_numcalc(project_path=os.getcwd(), numcalc_path=None, +def manage_numcalc(project_path=None, numcalc_path=None, max_ram_load=None, ram_safety_factor=1.05, max_cpu_load=90, - max_instances=psutil.cpu_count(), wait_time=15, + max_instances=None, wait_time=15, starting_order='alternate', confirm_errors=False): """ Run NumCalc on one or multiple Mesh2HRTF project folders. @@ -32,7 +32,7 @@ def manage_numcalc(project_path=os.getcwd(), numcalc_path=None, The directory to simulate: It can be path to either 1- directory that contains multiple Mesh2HRTF project folders or 2- one Mesh2HRTF project folder (folder containing "parameters.json"). - The default is os.getcwd() + The default ``None`` uses ``os.getcwd()`` numcalc_path : str, optional On Unix, this is the path to the NumCalc binary (by default 'NumCalc' is used). On Windows, this is the path to the folder @@ -42,7 +42,7 @@ def manage_numcalc(project_path=os.getcwd(), numcalc_path=None, max_ram_load : number, optional The RAM that can maximally be used in GB. New NumCalc instances are only started if enough RAM is available. The default ``None`` uses all - available RAM will be used. + available RAM. ram_safety_factor : number, optional A safety factor that is applied to the estimated RAM consumption. The estimate is obtained using NumCalc -estimate_ram. The default of @@ -52,9 +52,9 @@ def manage_numcalc(project_path=os.getcwd(), numcalc_path=None, Maximum allowed CPU load in percent. New instances are only launched if the current CPU load is below this value. The default is 90 percent. max_instances : int, optional - The maximum numbers of parallel NumCalc instances. By default a new - instance is launched until the number of available CPU cores given by - ``psutil.cpu_count()`` is reached. + The maximum numbers of parallel NumCalc instances. If max_instances is + ``None``, by default a new instance is launched until the number of + available CPU cores given by ``psutil.cpu_count()`` is reached. wait_time : int, optional Delay in seconds for waiting until the RAM and CPU usage is checked after launching a NumCalc instance. This has to be sufficiently large @@ -81,6 +81,9 @@ def manage_numcalc(project_path=os.getcwd(), numcalc_path=None, """ # log_file initialization ------------------------------------------------- + if project_path is None: + project_path = os.getcwd() + current_time = time.strftime("%Y_%m_%d_%H-%M-%S", time.localtime()) log_file = os.path.join( project_path, f"manage_numcalc_{current_time}.txt") @@ -120,7 +123,9 @@ def manage_numcalc(project_path=os.getcwd(), numcalc_path=None, wait_time_busy = 1 # check input ------------------------------------------------------------- - if max_instances > psutil.cpu_count(): + if max_instances is None: + max_instances = psutil.cpu_count() + elif max_instances > psutil.cpu_count(): _raise_error( (f"max_instances is {max_instances} but can not be larger than " f"{psutil.cpu_count()} (The number of logical CPUs)"), From 79d07c09236bce8aad6c768331dc7df481822c66 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 17 May 2023 19:58:29 +0200 Subject: [PATCH 02/12] more robust and simple RAM maximum handling --- mesh2hrtf/NumCalc/manage_numcalc.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index d192c80e..d66c8a36 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -100,18 +100,16 @@ def manage_numcalc(project_path=None, numcalc_path=None, numcalc_path = "NumCalc" if numcalc_path is None else numcalc_path ram_info = psutil.virtual_memory() + total_ram = ram_info.total / 1073741824 if max_ram_load is None: - max_ram_load = ram_info.total / 1073741824 - elif max_ram_load > ram_info.total / 1073741824: + max_ram_load = total_ram + elif max_ram_load > total_ram: raise ValueError(( f"The maximum RAM load of {max_ram_load} GB must be smaller than " - f"the total RAM, which is {ram_info.total / 1073741824} GB.")) + f"the total RAM, which is {total_ram} GB.")) # helping variables ------------------------------------------------------- - # RAM that should not be used - ram_offset = max([0, ram_info.total / 1073741824 - max_ram_load]) - # trick to get colored print-outs https://stackoverflow.com/a/54955094 text_color_red = '\033[31m' text_color_green = '\033[32m' @@ -302,7 +300,7 @@ def manage_numcalc(project_path=None, numcalc_path=None, # current time and resources current_time = time.strftime( "%b %d %Y, %H:%M:%S", time.localtime()) - ram_available, ram_used = _get_current_ram(ram_offset) + ram_available = _get_current_ram(max_ram_load) cpu_load = psutil.cpu_percent(.1) running_instances = _numcalc_instances() @@ -447,12 +445,16 @@ def _print_message(message, text_color, log_file): f.write(message + "\n") -def _get_current_ram(ram_offset): - """Get the available RAM = free RAM - ram_offset""" +def _get_current_ram(total_ram, max_ram_load): + """ + Get the available based on currently available RAM, total RAM, and allowed + RAM load + """ ram_info = psutil.virtual_memory() - ram_available = max([0, ram_info.available / 1073741824 - ram_offset]) - ram_used = ram_info.used / 1073741824 - return ram_available, ram_used + ram_free = ram_info.available / 1073741824 + ram_used = total_ram - ram_free + ram_available = max([0, max_ram_load - ram_used]) + return ram_available def _numcalc_instances(): From 1dfb3e1f78ed14ee5f2edc56a7d582070d261759 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 17 May 2023 20:51:35 +0200 Subject: [PATCH 03/12] improve command line output --- mesh2hrtf/NumCalc/manage_numcalc.py | 44 ++++++++++++++++------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index d66c8a36..2f8fbbba 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -158,11 +158,12 @@ def manage_numcalc(project_path=None, numcalc_path=None, message += ( f"project_path: {project_path}\n" f"numcalc_path: {numcalc_path}\n" - f"max_ram_load: {max_ram_load}\n" + f"max_ram_load: {max_ram_load:.2f} GB ({total_ram:.2f} GB detected)\n" f"ram_safety_factor: {ram_safety_factor}\n" - f"max_cpu_load: {max_cpu_load}\n" - f"max_instances: {max_instances}\n" - f"wait_time: {wait_time}\n" + f"max_cpu_load: {max_cpu_load} %\n" + f"max_instances: {max_instances} " + f"({psutil.cpu_count()} cores detected)\n" + f"wait_time: {wait_time} seconds\n" f"starting_order: {starting_order}\n" f"confirm_errors: {confirm_errors}\n") @@ -237,9 +238,9 @@ def manage_numcalc(project_path=None, numcalc_path=None, projects_to_run.append(project) message += ( f"{len(instances_to_run)}/{len(all_instances)} frequency " - f"steps to run in {os.path.basename(project)}\n") + f"steps to run in '{os.path.basename(project)}'\n") else: - message += f"{os.path.basename(project)} is already complete\n" + message += f"'{os.path.basename(project)}' is already complete\n" _print_message(message, text_color_reset, log_file) @@ -255,7 +256,7 @@ def manage_numcalc(project_path=None, numcalc_path=None, total_nr_to_run = instances_to_run.shape[0] # Status printouts: - message = (f"Started {os.path.basename(project)} " + message = (f"Started '{os.path.basename(project)}' project " f"({pp + 1}/{len(projects_to_run)}, {current_time})") message = "\n" + message + "\n" + "-" * len(message) + "\n" if total_nr_to_run: @@ -300,7 +301,7 @@ def manage_numcalc(project_path=None, numcalc_path=None, # current time and resources current_time = time.strftime( "%b %d %Y, %H:%M:%S", time.localtime()) - ram_available = _get_current_ram(max_ram_load) + ram_available, ram_used = _get_current_ram(total_ram, max_ram_load) cpu_load = psutil.cpu_percent(.1) running_instances = _numcalc_instances() @@ -315,12 +316,13 @@ def manage_numcalc(project_path=None, numcalc_path=None, # print message (only done once between launching instances) if started_instance: _print_message( - (f"\n... waiting for resources (checking every " - f"second, {current_time}):\n" - f" {running_instances} NumCalc instances running (" - f"{cpu_load}% CPU load)\n" - f" {round(ram_available, 2)} GB RAM available (" - f"{round(ram_required, 2)} GB RAM needed next)\n"), + (f"\n... waiting for resources and checking every " + f"second ({current_time})\n" + f"{running_instances} NumCalc instances running, " + f"{round(ram_available, 2)} GB RAM available " + f"({ram_used:.2f} GB used), " + f"{round(ram_required, 2)} GB required, " + f"{cpu_load:.2f}% CPU load)\n"), text_color_reset, log_file) started_instance = False @@ -336,11 +338,15 @@ def manage_numcalc(project_path=None, numcalc_path=None, # start new NumCalc instance source = int(instances_to_run[idx, 0]) step = int(instances_to_run[idx, 1]) + frequency = float(instances_to_run[idx, 2]) + ram = float(instances_to_run[idx, 3]) progress = total_nr_to_run - instances_to_run.shape[0] + 1 message = ( - f"{progress}/{total_nr_to_run} starting instance from: " - f"{os.path.basename(project)} (source {source}, step {step}, " - f"{current_time})") + f"{progress}/{total_nr_to_run} starting instance from " + f"'{os.path.basename(project)}' ({current_time})\n" + f"source {source}, step {step} ({frequency} Hz)\n" + f"estimated {ram:.2f} GB RAM of available {ram_available:.2f} " + "GB required\n") _print_message(message, text_color_reset, log_file) # new working directory @@ -397,7 +403,7 @@ def manage_numcalc(project_path=None, numcalc_path=None, continue if instances_to_run.shape[0] > 0: - message += f"{os.path.basename(project)}: " + message += f"'{os.path.basename(project)}': " unfinished = [f"source {int(p[0])} step {int(p[1])}" for p in instances_to_run] message += "; ".join(unfinished) + "\n" @@ -454,7 +460,7 @@ def _get_current_ram(total_ram, max_ram_load): ram_free = ram_info.available / 1073741824 ram_used = total_ram - ram_free ram_available = max([0, max_ram_load - ram_used]) - return ram_available + return ram_available, ram_used def _numcalc_instances(): From fb510e8b6bf9ce2e9ebc178892ab149467cd7d32 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 17 May 2023 20:57:14 +0200 Subject: [PATCH 04/12] further improve command line output --- mesh2hrtf/NumCalc/manage_numcalc.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index 2f8fbbba..cbd29842 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -318,11 +318,11 @@ def manage_numcalc(project_path=None, numcalc_path=None, _print_message( (f"\n... waiting for resources and checking every " f"second ({current_time})\n" - f"{running_instances} NumCalc instances running, " + f"{running_instances} NumCalc instances running at " + f"{cpu_load:.2f}% CPU load\n" f"{round(ram_available, 2)} GB RAM available " f"({ram_used:.2f} GB used), " - f"{round(ram_required, 2)} GB required, " - f"{cpu_load:.2f}% CPU load)\n"), + f"{round(ram_required, 2)} GB required\n"), text_color_reset, log_file) started_instance = False @@ -344,7 +344,7 @@ def manage_numcalc(project_path=None, numcalc_path=None, message = ( f"{progress}/{total_nr_to_run} starting instance from " f"'{os.path.basename(project)}' ({current_time})\n" - f"source {source}, step {step} ({frequency} Hz)\n" + f"source {source}, step {step}, {frequency} Hz\n" f"estimated {ram:.2f} GB RAM of available {ram_available:.2f} " "GB required\n") _print_message(message, text_color_reset, log_file) From b50d339e13bdfc1444e16c14301b02f63dbd5d03 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 17 May 2023 21:08:28 +0200 Subject: [PATCH 05/12] remove line break --- mesh2hrtf/NumCalc/manage_numcalc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index cbd29842..e33cf054 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -316,7 +316,7 @@ def manage_numcalc(project_path=None, numcalc_path=None, # print message (only done once between launching instances) if started_instance: _print_message( - (f"\n... waiting for resources and checking every " + (f"... waiting for resources and checking every " f"second ({current_time})\n" f"{running_instances} NumCalc instances running at " f"{cpu_load:.2f}% CPU load\n" From 5ff5ffc1dedc11e4a8363687568efe714ff9e051 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 24 May 2023 19:12:10 +0200 Subject: [PATCH 06/12] add suggestion by chris-hld --- mesh2hrtf/NumCalc/manage_numcalc.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index e33cf054..8cbceb9d 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -158,7 +158,8 @@ def manage_numcalc(project_path=None, numcalc_path=None, message += ( f"project_path: {project_path}\n" f"numcalc_path: {numcalc_path}\n" - f"max_ram_load: {max_ram_load:.2f} GB ({total_ram:.2f} GB detected)\n" + f"max_ram_load: {max_ram_load:.2f} GB ({total_ram:.2f} GB detected, " + f"{ram_info.available / 1073741824:.2f} GB available)\n" f"ram_safety_factor: {ram_safety_factor}\n" f"max_cpu_load: {max_cpu_load} %\n" f"max_instances: {max_instances} " From 88eb8c8bd89463afbddccd2a5fc8f63a732292fd Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Wed, 24 May 2023 19:19:14 +0200 Subject: [PATCH 07/12] correct order of console printouts --- mesh2hrtf/NumCalc/manage_numcalc.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index 8cbceb9d..29a49b9a 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -229,7 +229,13 @@ def manage_numcalc(project_path=None, numcalc_path=None, "-------------------------------------------------\n") message += f"Detected {len(all_projects)} Mesh2HRTF projects in\n" - message += f"{os.path.dirname(log_file)}\n\n" + message += f"{os.path.dirname(log_file)}\n" + + # print already here because _check_project might produce output that + # should come after this + _print_message(message, text_color_reset, log_file) + + message = "\n" for project in all_projects: all_instances, instances_to_run, *_ = _check_project( From 98e08d80a80a595066370118eb6a491cada34f1b Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Thu, 25 May 2023 16:31:51 +0200 Subject: [PATCH 08/12] improve saving blender file upon project folder export --- mesh2hrtf/Mesh2Input/mesh2input.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesh2hrtf/Mesh2Input/mesh2input.py b/mesh2hrtf/Mesh2Input/mesh2input.py index 602aba68..75653876 100644 --- a/mesh2hrtf/Mesh2Input/mesh2input.py +++ b/mesh2hrtf/Mesh2Input/mesh2input.py @@ -371,7 +371,7 @@ def save(operator, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_btx=False, filter_collada=False, filter_folder=True, filemode=8, - compress=False, relative_remap=True, copy=False) + compress=True, relative_remap=True, copy=True) # Write evaluation grid data -------------------------------------------------- From 27c0b387c48a45e0df99b0f57535edfccc1ad73a Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Mon, 29 May 2023 18:40:41 +0200 Subject: [PATCH 09/12] improve documentation --- mesh2hrtf/NumCalc/manage_numcalc.py | 5 ++++- mesh2hrtf/NumCalc/manage_numcalc_script.py | 16 ++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/mesh2hrtf/NumCalc/manage_numcalc.py b/mesh2hrtf/NumCalc/manage_numcalc.py index 29a49b9a..4776a8f6 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc.py +++ b/mesh2hrtf/NumCalc/manage_numcalc.py @@ -59,7 +59,10 @@ def manage_numcalc(project_path=None, numcalc_path=None, Delay in seconds for waiting until the RAM and CPU usage is checked after launching a NumCalc instance. This has to be sufficiently large for the RAM and CPU to be fully used by the started NumCalc instance. - The default is 15. After this initial wait time, the resources are + The default is 15 s but values of 60 s or even more might be required + depending on the machine. The RAM values that ``manage_numcalc`` + outputs are usually a good indicator to check if `wait_time` is + sufficiently high. After this initial wait time, the resources are checked every second. And the next instance is started, once enough resources are available. starting_order : str, optional diff --git a/mesh2hrtf/NumCalc/manage_numcalc_script.py b/mesh2hrtf/NumCalc/manage_numcalc_script.py index 11c1ff7f..136f2c0d 100644 --- a/mesh2hrtf/NumCalc/manage_numcalc_script.py +++ b/mesh2hrtf/NumCalc/manage_numcalc_script.py @@ -62,12 +62,16 @@ " by ``psutil.cpu_count()`` is reached.")) parser.add_argument( "--wait_time", default=15, type=int, - help=("Delay in seconds for waiting until the RAM and CPU usage is checked" - " after launching a NumCalc instance. This has to be sufficiently " - "arge for the RAM and CPU to be fully used by the started NumCalc " - "instance. The default is 15. After this initial wait time, the " - "resources are checked every second. And the next instance is " - "started, once enough resources are available.")) + help=( + "Delay in seconds for waiting until the RAM and CPU usage is checked " + "after launching a NumCalc instance. This has to be sufficiently " + "large for the RAM and CPU to be fully used by the started NumCalc " + "instance. The default is 15 s but values of 60 s or even more might " + "be required depending on the machine. The RAM values that " + "`manage_numcalc` outputs are usually a good indicator to check if " + "`wait_time` is sufficiently high. After this initial wait time, the " + "resources are checked every second. And the next instance is started," + " once enough resources are available.")) parser.add_argument( "--starting_order", default='alternate', choices=('alternate', 'high', 'low'), type=str, From 7056b3ecd4635bf375722b2eb0d95f0143ef4950 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 31 May 2023 20:07:53 +0200 Subject: [PATCH 10/12] fix parsing nc.out files --- mesh2hrtf/Output2HRTF/write_output_report.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mesh2hrtf/Output2HRTF/write_output_report.py b/mesh2hrtf/Output2HRTF/write_output_report.py index 3f7ca415..a65089cc 100644 --- a/mesh2hrtf/Output2HRTF/write_output_report.py +++ b/mesh2hrtf/Output2HRTF/write_output_report.py @@ -139,9 +139,6 @@ def _parse_nc_out_files(sources, num_sources, num_frequencies): out = -np.ones((num_frequencies, 11, num_sources)) # values for steps out[:, 0] = np.arange(1, num_frequencies + 1)[..., np.newaxis] - # values indicating failed input check and non-convergence - out[:, 3] = 0 - out[:, 4] = 0 # regular expression for finding a number that can be int or float re_number = r"(\d+(?:\.\d+)?)" @@ -198,10 +195,14 @@ def _parse_nc_out_files(sources, num_sources, num_frequencies): # check if the input data was ok if "Too many integral points in the theta" not in line: out[step-1, 3, ss] = 1 + else: + out[step-1, 4, ss] = 0 # check and write convergence if 'Maximum number of iterations is reached!' not in line: out[step-1, 4, ss] = 1 + else: + out[step-1, 4, ss] = 0 # check iterations idx = re.search(r'number of iterations = \d+,', line) From 1bf7e7eb181aff1543690e22d9d3e5b7b679fbd2 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Thu, 1 Jun 2023 08:33:38 +0200 Subject: [PATCH 11/12] fix copy and past bug thanks to automated testing --- mesh2hrtf/Output2HRTF/write_output_report.py | 2 +- tests/test_output.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mesh2hrtf/Output2HRTF/write_output_report.py b/mesh2hrtf/Output2HRTF/write_output_report.py index a65089cc..bb41768a 100644 --- a/mesh2hrtf/Output2HRTF/write_output_report.py +++ b/mesh2hrtf/Output2HRTF/write_output_report.py @@ -196,7 +196,7 @@ def _parse_nc_out_files(sources, num_sources, num_frequencies): if "Too many integral points in the theta" not in line: out[step-1, 3, ss] = 1 else: - out[step-1, 4, ss] = 0 + out[step-1, 3, ss] = 0 # check and write convergence if 'Maximum number of iterations is reached!' not in line: diff --git a/tests/test_output.py b/tests/test_output.py index 60a67356..ef20fd68 100644 --- a/tests/test_output.py +++ b/tests/test_output.py @@ -290,7 +290,7 @@ def test_merge_sofa_files(pattern): [["case_3"], True, ["Frequency steps that were not calculated:\n59, 60", "Frequency steps with bad input:\n58"], []], - # no isses in source 1 but issues in source 2 + # no issues in source 1 but issues in source 2 [["case_0", "case_1"], True, ["Detected issues for source 2", "Frequency steps that were not calculated:\n59, 60"], From 345afd26a114418bb17c49640c1ac5b336f6a450 Mon Sep 17 00:00:00 2001 From: f-brinkmann Date: Thu, 8 Jun 2023 15:17:05 +0200 Subject: [PATCH 12/12] prepare release 1.1.1 --- CONTRIBUTING.rst | 2 +- HISTORY.rst | 11 +++++++++-- VERSION | 2 +- docs/Lebedev_N10/evaluation_grid.png | Bin 374946 -> 374946 bytes docs/conf.py | 4 +--- mesh2hrtf/Mesh2Input/mesh2input.py | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 372d1c58..d6e27d02 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -106,9 +106,9 @@ To release a new Mesh2HRTF version do the following - Write the new version to the file VERSION and mesh2input.py - Commit all changes to develop - Update HISTORY.rst (also include new contributors) +- check if installing the python package works via ``pip install -e .`` - check if the tests pass - check if the documentation is building -- check if installing the python package works via ``pip install -e .`` - merge develop into main - add a tagg and release on github - merge main into develop diff --git a/HISTORY.rst b/HISTORY.rst index f050c670..0a688b26 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,8 +1,15 @@ History ======= +v1.1.1 (09 June 2023) +--------------------- +* When creating a Mesh2HRTF project from Blender, the Blender project is now saved to the project folder as a compressed copy. Previously it was not compressed and saved directly. The latter came with the danger of making changes to Blender project after creating the Mesh2HRTF project without noting. In this case the Blender file might not reflect the settings of the rest of the project folder (PR #105). +* Fix a bug in detecting issues in NumCalc simulations during post-processing using `ouput2hrtf` from the Python API. Errors were not reported in case `NumCalc -estimate_ram` was called before using `manage_numcalc` from the Python API. +* Improve the output of `manage_numcalc` from the Python API. +* Fix a bug in detecting the free RAM in `manage_numcalc` from the Python API. + v1.1.0 (11 Mai 2023) -------------------- +-------------------- * Add dockerfile running the Mesh2HRTF Python API, `NumCalc`, and `hrtf_mesh_grading` * Fixed a bug in installing the Mesh2HRTF Python API * Fixed a bug in `manage_numcalc` if running multiple Mesh2HRTF projects @@ -81,7 +88,7 @@ v0.3.0 * Small bugfixes in the scripts v0.2.0 (2018) ------- +------------- * Mesh2Input: * MaterialAssignment.py: A Python script that can be loaded into Blender to center the head mesh in the coordinate system * MeshCentering.py: A Python script that can be loaded into Blender to automatically assign the materials 'Skin', 'Left ear', and 'Right ear' diff --git a/VERSION b/VERSION index 9084fa2f..524cb552 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.0 +1.1.1 diff --git a/docs/Lebedev_N10/evaluation_grid.png b/docs/Lebedev_N10/evaluation_grid.png index 932d2c5bac5e28e436487161378e71d5beb27e64..42711384146a9d3f0ca15f980fdc4eb5a1b299f1 100644 GIT binary patch delta 60 zcmZ4VQEbsiu?cPp=6Z%Y3K=CO1;tkS`nicE1v&X8Ihjd%`9 Export", "description": "Export Blender scene as Mesh2HRTF project",