From 5a335dfe80ae7a7e46df3b37b23fa7613683fb40 Mon Sep 17 00:00:00 2001
From: Michael Zikeli <michael.zikeli@fau.de>
Date: Thu, 6 Feb 2025 18:29:43 +0100
Subject: [PATCH] [ci skip] Add benchmark name parameter to Scenario class and
 enhance schema update logic.

---
 .../simulation_setup/benchmark_configs_RDM.py | 32 +++++++++++++++----
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/apps/benchmarks/UniformGridCPU/simulation_setup/benchmark_configs_RDM.py b/apps/benchmarks/UniformGridCPU/simulation_setup/benchmark_configs_RDM.py
index ce2a49930..a6b13fd80 100644
--- a/apps/benchmarks/UniformGridCPU/simulation_setup/benchmark_configs_RDM.py
+++ b/apps/benchmarks/UniformGridCPU/simulation_setup/benchmark_configs_RDM.py
@@ -60,11 +60,13 @@ ldc_setup = {'Border': [
 
 
 class Scenario:
-    def __init__(self, cells_per_block=(128, 128, 128), periodic=(1, 1, 1), blocks_per_process=1,
+    def __init__(self, benchmark_name="not defined", cells_per_block=(128, 128, 128), periodic=(1, 1, 1), blocks_per_process=1,
                  timesteps=None, time_step_strategy="normal", omega=1.8, inner_outer_split=(1, 1, 1),
                  warmup_steps=2, outer_iterations=3, init_shear_flow=False, boundary_setup=False,
                  vtk_write_frequency=0, remaining_time_logger_frequency=-1, db_file_name=None):
 
+        self.benchmark_name = benchmark_name
+
         if boundary_setup:
             init_shear_flow = False
             periodic = (0, 0, 0)
@@ -125,6 +127,7 @@ class Scenario:
         data.update(self.config_dict['DomainSetup'])
         data.update(kwargs)
 
+        data['Identifier'] = self.benchmark_name
         data['executable'] = sys.argv[0]
         data['compile_flags'] = wlb.build_info.compiler_flags
         data['walberla_version'] = wlb.build_info.version
@@ -143,12 +146,23 @@ class Scenario:
         result = data
         sequenceValuesToScalars(result)
         num_tries = 4
-        # check multiple times e.g. may fail when multiple benchmark processes are running
         table_name = "runs"
         table_name = table_name.replace("-", "_")
+
         for num_try in range(num_tries):
             try:
-                checkAndUpdateSchema(result, table_name, self.db_file_name)
+                # Check existing columns
+                conn = sqlite3.connect(self.db_file_name)
+                c = conn.cursor()
+                c.execute(f"PRAGMA table_info({table_name})")
+                existing_columns = [info[1] for info in c.fetchall()]
+                conn.close()
+
+                # Filter out existing columns
+                new_columns = {k: v for k, v in result.items() if k not in existing_columns}
+
+                if new_columns:
+                    checkAndUpdateSchema(new_columns, table_name, self.db_file_name, alter_table=True)
                 storeSingle(result, table_name, self.db_file_name)
                 break
             except sqlite3.OperationalError as e:
@@ -165,7 +179,8 @@ def weak_scaling_benchmark():
     scenarios = wlb.ScenarioManager()
 
     for t in ["simpleOverlap"]:
-        scenarios.add(Scenario(time_step_strategy=t,
+        scenarios.add(Scenario(benchmark_name="weakScalingUniformGrid",
+                               time_step_strategy=t,
                                inner_outer_split=(1, 1, 1),
                                cells_per_block=(WeakX, WeakY, WeakZ),
                                boundary_setup=True,
@@ -184,7 +199,8 @@ def strong_scaling_benchmark():
     cells_per_block = tuple([d // b for d, b in zip(domain_size, reversed(blocks))])
 
     for t in ["simpleOverlap"]:
-        scenarios.add(Scenario(cells_per_block=cells_per_block,
+        scenarios.add(Scenario(benchmark_name="strongScalingUniformGridOneBlock",
+                               cells_per_block=cells_per_block,
                                time_step_strategy=t,
                                outer_iterations=1,
                                timesteps=num_time_steps(cells_per_block),
@@ -198,7 +214,8 @@ def single_node_benchmark():
     wlb.log_info_on_root("")
 
     scenarios = wlb.ScenarioManager()
-    scenario = Scenario(cells_per_block=(128, 128, 128),
+    scenario = Scenario(benchmark_name="singleNodeUniformGridOneBlock",
+                        cells_per_block=(128, 128, 128),
                         time_step_strategy='kernelOnly',
                         outer_iterations=1,
                         timesteps=10)
@@ -213,7 +230,8 @@ def validation_run():
     time_step_strategy = "noOverlap"  # "noOverlap"
 
     scenarios = wlb.ScenarioManager()
-    scenario = Scenario(cells_per_block=(64, 64, 64),
+    scenario = Scenario(benchmark_name="validationUniformGrid",
+                        cells_per_block=(64, 64, 64),
                         time_step_strategy=time_step_strategy,
                         timesteps=201,
                         outer_iterations=1,
-- 
GitLab