diff --git a/.dependencies.json b/.dependencies.json index 1b74c19..5311b84 100644 --- a/.dependencies.json +++ b/.dependencies.json @@ -18,7 +18,7 @@ "erf": { "url": "https://github.com/erf-model/ERF.git", "branch": "development", - "commit": "1df48173da427f57a8201e157518afa7fd2e73ee" + "commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945" }, "remora": { "url": "https://github.com/AMReX-Codes/REMORA.git", diff --git a/database/configs/amrex_config.py b/database/configs/amrex_config.py index 3fa943b..e99b318 100644 --- a/database/configs/amrex_config.py +++ b/database/configs/amrex_config.py @@ -52,3 +52,11 @@ class AMReXConfig(BaseAMReXConfig): priority_cases = [ "Tests/Amr/Advection_AmrCore", ] + + @classmethod + def get_plotfile_period_param(cls) -> str | None: + return "amr.plot_per" + + @classmethod + def get_plotfile_step_interval_param(cls) -> str | None: + return "amr.plot_int" diff --git a/database/configs/base_amrex_config.py b/database/configs/base_amrex_config.py index d7c7886..4ef0073 100644 --- a/database/configs/base_amrex_config.py +++ b/database/configs/base_amrex_config.py @@ -172,6 +172,32 @@ class BaseAMReXConfig: default_exec_pattern: ClassVar[str | None] = None """Glob pattern for default executable within default_exec_repo_path.""" + build_system_preference: ClassVar[str] = "gnumake" + """Preferred build system for executable discovery (e.g., gnumake, cmake).""" + executable_search_path_templates: ClassVar[list[str]] = ["{central_build_dir}"] + """Ordered executable search templates used by runtime runner fallbacks.""" + cmake_executable_names: ClassVar[list[str]] = [] + """Executable filenames emitted by CMake workflows (e.g., erf_exec).""" + cmake_executable_ignores_accel_suffix: ClassVar[bool] = False + """If True, CMake executables are treated as feature-agnostic names.""" + gnumake_executable_globs: ClassVar[list[str]] = ["*.ex"] + """Executable glob patterns emitted by GNUmake workflows.""" + cmake_source_dir_template: ClassVar[str] = "{repo_root}" + """CMake source directory template for compile orchestration.""" + cmake_build_dir_template: ClassVar[str] = "{repo_root}/build" + """CMake build directory template for compile orchestration.""" + cmake_install_prefix_template: ClassVar[str | None] = None + """Optional CMake install prefix template.""" + cmake_configure_args: ClassVar[list[str]] = [] + """Additional args for `cmake -S ... -B ...`.""" + cmake_build_args: ClassVar[list[str]] = [] + """Additional args for `cmake --build ...`.""" + cmake_install_args: ClassVar[list[str]] = [] + """Additional args for `cmake --install ...`.""" + gnumake_clean_targets: ClassVar[list[str]] = ["realclean"] + """GNUmake clean targets executed before build.""" + gnumake_build_args: ClassVar[list[str]] = ["USE_MPI=TRUE", "DEBUG=FALSE"] + """GNUmake build flag defaults.""" # === Solver Heuristics (Config-Driven) === selection_keywords: ClassVar[list[str]] = [] @@ -2076,6 +2102,68 @@ def resolve_default_inputs_path(cls, repo_root: Path | None) -> Path | None: return base / "inputs" return None + @classmethod + def get_build_system_preference(cls) -> str: + return str(getattr(cls, "build_system_preference", "gnumake")).strip().lower() + + @classmethod + def get_executable_search_path_templates(cls) -> list[str]: + templates = getattr(cls, "executable_search_path_templates", []) + return [str(item) for item in templates] + + @classmethod + def get_cmake_executable_names(cls) -> list[str]: + names = getattr(cls, "cmake_executable_names", []) + return [str(item) for item in names] + + @classmethod + def cmake_ignores_accel_suffix(cls) -> bool: + return bool(getattr(cls, "cmake_executable_ignores_accel_suffix", False)) + + @classmethod + def get_gnumake_executable_globs(cls) -> list[str]: + globs = getattr(cls, "gnumake_executable_globs", []) + return [str(item) for item in globs] if globs else ["*.ex"] + + @classmethod + def get_cmake_source_dir_template(cls) -> str: + return str(getattr(cls, "cmake_source_dir_template", "{repo_root}")) + + @classmethod + def get_cmake_build_dir_template(cls) -> str: + return str(getattr(cls, "cmake_build_dir_template", "{repo_root}/build")) + + @classmethod + def get_cmake_install_prefix_template(cls) -> str | None: + value = getattr(cls, "cmake_install_prefix_template", None) + return None if value is None else str(value) + + @classmethod + def get_cmake_configure_args(cls) -> list[str]: + return [str(item) for item in getattr(cls, "cmake_configure_args", [])] + + @classmethod + def get_cmake_build_args(cls) -> list[str]: + return [str(item) for item in getattr(cls, "cmake_build_args", [])] + + @classmethod + def get_cmake_install_args(cls) -> list[str]: + return [str(item) for item in getattr(cls, "cmake_install_args", [])] + + @classmethod + def get_gnumake_clean_targets(cls) -> list[str]: + targets = getattr(cls, "gnumake_clean_targets", None) + if targets is None: + return ["realclean"] + return [str(item) for item in targets] or ["realclean"] + + @classmethod + def get_gnumake_build_args(cls) -> list[str]: + args = getattr(cls, "gnumake_build_args", None) + if args is None: + args = getattr(cls, "gnumake_flags", ["USE_MPI=TRUE", "DEBUG=FALSE"]) + return [str(item) for item in args] + @classmethod def get_slurm_metadata(cls) -> dict[str, str]: """ @@ -2296,6 +2384,68 @@ def get_viz_variable_catalog(cls, repo_root: Path | None = None) -> list[dict[st return [] @classmethod + def get_viz_tier1_intents(cls) -> dict[str, dict[str, Any]]: + """ + Return canonical semantic visualization intents (Tier 1). + """ + return { + "temperature": {"aliases": ["temperature", "temp", "thermal"]}, + "velocity": {"aliases": ["velocity", "speed"]}, + "vertical_velocity": { + "aliases": [ + "vertical velocity", + "vertical_velocity", + "w-velocity", + "w velocity", + "updraft", + "downdraft", + ] + }, + "pressure": {"aliases": ["pressure", "pres"]}, + "density": {"aliases": ["density", "rho"]}, + "vorticity": {"aliases": ["vorticity", "vort"]}, + "cloud_water": { + "aliases": [ + "cloud water", + "cloud_water", + "liquid water", + "cloud liquid", + "qc", + ] + }, + } + + @classmethod + def build_viz_tier2_candidates(cls, repo_root: Path | None = None) -> dict[str, list[dict[str, Any]]]: + """ + Build solver candidates (Tier 2) from live source catalog. + """ + catalog = cls.get_viz_variable_catalog(repo_root=repo_root) + if not catalog: + return {} + + intents = cls.get_viz_tier1_intents() + candidates: dict[str, list[dict[str, Any]]] = {} + for token, spec in intents.items(): + aliases = {token.lower()} + for alias in spec.get("aliases", []) or []: + aliases.add(str(alias).strip().lower()) + token_candidates: list[dict[str, Any]] = [] + for entry in catalog: + if not isinstance(entry, dict): + continue + name = str(entry.get("name", "")).strip() + if not name: + continue + entry_aliases = {name.lower()} + for alias in entry.get("aliases", []) or []: + entry_aliases.add(str(alias).strip().lower()) + if aliases.intersection(entry_aliases): + token_candidates.append(dict(entry)) + if token_candidates: + candidates[token] = token_candidates + return candidates + def get_default_slice_axis(cls) -> str | None: """ Return preferred default slice-normal axis for visualization. @@ -2304,6 +2454,50 @@ def get_default_slice_axis(cls) -> str | None: """ return None + @classmethod + def get_plotfile_var_param(cls) -> str: + """ + Return solver-specific parameter key for plot variable selection. + """ + return "amr.plot_vars" + + @classmethod + def get_plot_var_param_candidates(cls) -> list[str]: + """ + Return ordered plot-var ParmParse candidate keys (primary first). + """ + return [cls.get_plotfile_var_param()] + + @classmethod + def get_plotfile_period_param(cls) -> str | None: + """ + Return solver-specific time-based plot cadence parameter, if supported. + """ + return None + + @classmethod + def get_plotfile_step_interval_param(cls) -> str | None: + """ + Return solver-specific step-based plot interval parameter, if supported. + """ + return None + + @classmethod + def supports_physical_time_cadence(cls) -> bool: + """ + Return whether solver time-based cadence can be interpreted from seconds. + """ + return True + + @classmethod + def convert_plot_cadence_prompt_seconds_to_solver_time(cls, seconds: float) -> float | None: + """ + Convert prompt seconds into solver-time cadence units. + + Default behavior assumes solver time is seconds (identity transform). + """ + return float(seconds) + @classmethod def _resource_bytes_per_cell(cls, config: dict[str, Any]) -> int: return 200 diff --git a/database/configs/erf_config.py b/database/configs/erf_config.py index 138a6f2..cfa8e33 100644 --- a/database/configs/erf_config.py +++ b/database/configs/erf_config.py @@ -29,6 +29,22 @@ def get_default_slice_axis(cls) -> str | None: """ return "y" + @classmethod + def get_plotfile_var_param(cls) -> str: + return "erf.plot_vars_1" + + @classmethod + def get_plotfile_period_param(cls) -> str | None: + return "erf.plot_per_1" + + @classmethod + def get_plotfile_step_interval_param(cls) -> str | None: + return "erf.plot_int_1" + + @classmethod + def get_plot_var_param_candidates(cls) -> list[str]: + return ["erf.plot_vars_1", "amr.plot_vars", "plot_vars"] + # === Registry Metadata === github_org = "erf-model" github_repo = "ERF" @@ -38,6 +54,29 @@ def get_default_slice_axis(cls) -> str | None: default_inputs_path = "Exec/RegTests/Bubble/inputs" default_exec_repo_path = "Exec/RegTests/Bubble" default_exec_pattern = "ERF*ex" + build_system_preference = "cmake" + preferred_build_system = "cmake" + executable_search_path_templates = [ + "{repo_root}/build/Exec", + "{repo_root}/Build/Exec", + "{repo_root}/install/bin", + "{central_build_dir}", + ] + cmake_executable_names = ["erf_exec"] + cmake_executable_ignores_accel_suffix = True + gnumake_executable_globs = ["ERF*ex"] + cmake_source_dir_template = "{repo_root}" + cmake_build_dir_template = "{repo_root}/build" + cmake_install_prefix_template = None + cmake_configure_args = [ + "-DCMAKE_BUILD_TYPE=Release", + "-DERF_ENABLE_MPI=ON", + ] + cmake_build_args = [] + cmake_install_args = [] + gnumake_clean_targets = ["realclean"] + gnumake_build_args = ["USE_MPI=TRUE", "DEBUG=FALSE"] + gnumake_flags = ["USE_MPI=TRUE", "DEBUG=FALSE"] selection_keywords = [ "abl", diff --git a/database/configs/pelelmex_config.py b/database/configs/pelelmex_config.py index e4555b6..0329299 100644 --- a/database/configs/pelelmex_config.py +++ b/database/configs/pelelmex_config.py @@ -167,6 +167,22 @@ class PeleLMeXConfig(BaseAMReXConfig): "prompt": "What {section}.atol and {section}.rtol should I use for PeleLMeX with a QSSA mechanism?", } + @classmethod + def get_plotfile_var_param(cls) -> str: + return "peleLM.derive_plot_vars" + + @classmethod + def get_plot_var_param_candidates(cls) -> list[str]: + return ["peleLM.derive_plot_vars", "amr.plot_vars", "plot_vars"] + + @classmethod + def get_plotfile_period_param(cls) -> str | None: + return "amr.plot_per" + + @classmethod + def get_plotfile_step_interval_param(cls) -> str | None: + return "amr.plot_int" + prompt_templates: ClassVar[dict[str, Any]] = { "misc": { "schema_scan": """Identify requested concepts from the case description that do not map to known baseline or schema parameters. diff --git a/database/configs/remora_config.py b/database/configs/remora_config.py index 62e2866..f735b04 100644 --- a/database/configs/remora_config.py +++ b/database/configs/remora_config.py @@ -29,6 +29,14 @@ def get_default_slice_axis(cls) -> str | None: """ return "y" + @classmethod + def get_plotfile_period_param(cls) -> str | None: + return "remora.plot_int_time" + + @classmethod + def get_plotfile_step_interval_param(cls) -> str | None: + return "remora.plot_int" + # === Registry Metadata === github_org = "AMReX-Codes" github_repo = "REMORA" diff --git a/database/faiss/cborg/build_session_manifest.json b/database/faiss/cborg/build_session_manifest.json index 2e9064e..402707d 100644 --- a/database/faiss/cborg/build_session_manifest.json +++ b/database/faiss/cborg/build_session_manifest.json @@ -1,5 +1,32 @@ { + "build_script": "build_all_indices.py", "entries": [ + { + "build_script": "build_all_indices.py", + "dependencies_commit": null, + "embedding_dimension": null, + "embedding_model": "lbl/nomic-embed-text", + "embedding_provider": "cborg", + "generated_at": "2026-03-18T14:44:08.389712+00:00", + "level": "0", + "manifest_path": "level0/faiss_provenance.json", + "repo_commit": null, + "solver": null, + "version": "1" + }, + { + "build_script": "build_all_indices.py", + "dependencies_commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", + "embedding_dimension": null, + "embedding_model": "lbl/nomic-embed-text", + "embedding_provider": "cborg", + "generated_at": "2026-03-18T14:45:12.017072+00:00", + "level": "1", + "manifest_path": "level1/erf_faiss_provenance.json", + "repo_commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", + "solver": "erf", + "version": "1" + }, { "build_script": "build_all_indices.py", "dependencies_commit": "99914444329f6be784c6a153581c53bc60ae8937", @@ -26,6 +53,19 @@ "solver": "erf", "version": "1" }, + { + "build_script": "build_all_indices.py", + "dependencies_commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", + "embedding_dimension": null, + "embedding_model": "lbl/nomic-embed-text", + "embedding_provider": "cborg", + "generated_at": "2026-03-18T14:58:05.501994+00:00", + "level": "2", + "manifest_path": "level2/erf_faiss_provenance.json", + "repo_commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", + "solver": "erf", + "version": "1" + }, { "build_script": "build_all_indices.py", "dependencies_commit": "a6b4dff152c2cad2cf0edee58099eefffd2ba328", @@ -66,5 +106,6 @@ "version": "1" } ], + "generated_at": "2026-03-18T14:58:05.507710+00:00", "version": "1" } diff --git a/database/faiss/cborg/erf_case_details/index.faiss b/database/faiss/cborg/erf_case_details/index.faiss index 3c512ec..c63eadd 100644 Binary files a/database/faiss/cborg/erf_case_details/index.faiss and b/database/faiss/cborg/erf_case_details/index.faiss differ diff --git a/database/faiss/cborg/erf_case_details/index.pkl b/database/faiss/cborg/erf_case_details/index.pkl index 99c39b4..e67f0bc 100644 Binary files a/database/faiss/cborg/erf_case_details/index.pkl and b/database/faiss/cborg/erf_case_details/index.pkl differ diff --git a/database/faiss/cborg/erf_case_names/index.faiss b/database/faiss/cborg/erf_case_names/index.faiss index e203a2e..4da5114 100644 Binary files a/database/faiss/cborg/erf_case_names/index.faiss and b/database/faiss/cborg/erf_case_names/index.faiss differ diff --git a/database/faiss/cborg/erf_case_names/index.pkl b/database/faiss/cborg/erf_case_names/index.pkl index 8a7c72a..143d937 100644 Binary files a/database/faiss/cborg/erf_case_names/index.pkl and b/database/faiss/cborg/erf_case_names/index.pkl differ diff --git a/database/faiss/cborg/erf_case_structure/index.faiss b/database/faiss/cborg/erf_case_structure/index.faiss index 8647399..74852b6 100644 Binary files a/database/faiss/cborg/erf_case_structure/index.faiss and b/database/faiss/cborg/erf_case_structure/index.faiss differ diff --git a/database/faiss/cborg/erf_case_structure/index.pkl b/database/faiss/cborg/erf_case_structure/index.pkl index 32b25de..65ae7d4 100644 Binary files a/database/faiss/cborg/erf_case_structure/index.pkl and b/database/faiss/cborg/erf_case_structure/index.pkl differ diff --git a/database/faiss/cborg/erf_input_templates/index.faiss b/database/faiss/cborg/erf_input_templates/index.faiss index 4c50740..5e44274 100644 Binary files a/database/faiss/cborg/erf_input_templates/index.faiss and b/database/faiss/cborg/erf_input_templates/index.faiss differ diff --git a/database/faiss/cborg/erf_input_templates/index.pkl b/database/faiss/cborg/erf_input_templates/index.pkl index 9d487ac..cb80ce2 100644 Binary files a/database/faiss/cborg/erf_input_templates/index.pkl and b/database/faiss/cborg/erf_input_templates/index.pkl differ diff --git a/database/faiss/cborg/level0/code_lineage_metadata.json b/database/faiss/cborg/level0/code_lineage_metadata.json index 0515233..4e13058 100644 --- a/database/faiss/cborg/level0/code_lineage_metadata.json +++ b/database/faiss/cborg/level0/code_lineage_metadata.json @@ -4,6 +4,13 @@ "lineage_info": { "description": "AMReX is the base framework supporting solver applications." }, + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 0, "chunk_index": 0 }, @@ -16,6 +23,13 @@ ], "description": "PeleC evolved from CNS for compressible reacting flows." }, + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, "chunk_parent": 1, "chunk_index": 1 }, @@ -25,6 +39,13 @@ "evolved_from": "PeleLM", "description": "PeleLMeX is the modernized successor to PeleLM." }, + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, "chunk_parent": 2, "chunk_index": 2 }, @@ -33,6 +54,13 @@ "lineage_info": { "description": "incflo is an AMReX incompressible flow application." }, + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, "chunk_parent": 3, "chunk_index": 3 }, @@ -41,6 +69,13 @@ "lineage_info": { "description": "WarpX is an AMReX-based electromagnetic PIC solver." }, + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, "chunk_parent": 4, "chunk_index": 4 }, @@ -49,6 +84,13 @@ "lineage_info": { "description": "ERF is an AMReX atmospheric and weather modeling solver." }, + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, "chunk_parent": 5, "chunk_index": 5 }, @@ -60,6 +102,13 @@ ], "description": "REMORA shares setup patterns with ERF and specializes them for ocean/coastal circulation." }, + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, "chunk_parent": 6, "chunk_index": 6 } diff --git a/database/faiss/cborg/level0/cross_cutting_guidance_metadata.json b/database/faiss/cborg/level0/cross_cutting_guidance_metadata.json index d51a997..57568a6 100644 --- a/database/faiss/cborg/level0/cross_cutting_guidance_metadata.json +++ b/database/faiss/cborg/level0/cross_cutting_guidance_metadata.json @@ -3,6 +3,13 @@ "code_name": "AMReX", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 0, "chunk_index": 0 }, @@ -10,6 +17,13 @@ "code_name": "PeleC", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, "chunk_parent": 1, "chunk_index": 1 }, @@ -17,6 +31,13 @@ "code_name": "PeleLMeX", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, "chunk_parent": 2, "chunk_index": 2 }, @@ -24,6 +45,13 @@ "code_name": "incflo", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, "chunk_parent": 3, "chunk_index": 3 }, @@ -31,6 +59,13 @@ "code_name": "WarpX", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, "chunk_parent": 4, "chunk_index": 4 }, @@ -38,6 +73,13 @@ "code_name": "ERF", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, "chunk_parent": 5, "chunk_index": 5 }, @@ -45,6 +87,13 @@ "code_name": "REMORA", "guidance_type": "solver_guidance", "source": "config", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, "chunk_parent": 6, "chunk_index": 6 } diff --git a/database/faiss/cborg/level0/physics_regimes_metadata.json b/database/faiss/cborg/level0/physics_regimes_metadata.json index 0c51a11..c66630c 100644 --- a/database/faiss/cborg/level0/physics_regimes_metadata.json +++ b/database/faiss/cborg/level0/physics_regimes_metadata.json @@ -8,6 +8,13 @@ "core amr", "tutorial" ], + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 0, "chunk_index": 0 }, @@ -21,6 +28,13 @@ "detonation", "chemistry" ], + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, "chunk_parent": 1, "chunk_index": 1 }, @@ -34,6 +48,13 @@ "high mach", "compressible" ], + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, "chunk_parent": 2, "chunk_index": 2 }, @@ -46,6 +67,13 @@ "flame", "chemistry" ], + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, "chunk_parent": 3, "chunk_index": 3 }, @@ -58,6 +86,13 @@ "incompressible limit", "diffusion dominated" ], + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, "chunk_parent": 4, "chunk_index": 4 }, @@ -70,6 +105,13 @@ "navier-stokes", "low speed flow" ], + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, "chunk_parent": 5, "chunk_index": 5 }, @@ -83,6 +125,13 @@ "accelerator", "laser-plasma" ], + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, "chunk_parent": 6, "chunk_index": 6 }, @@ -96,6 +145,13 @@ "weather", "wind" ], + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, "chunk_parent": 7, "chunk_index": 7 }, @@ -109,6 +165,13 @@ "upwelling", "channel circulation" ], + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, "chunk_parent": 8, "chunk_index": 8 } diff --git a/database/faiss/cborg/level0/solver_capabilities.faiss b/database/faiss/cborg/level0/solver_capabilities.faiss index 54b4fd0..f6d547c 100644 Binary files a/database/faiss/cborg/level0/solver_capabilities.faiss and b/database/faiss/cborg/level0/solver_capabilities.faiss differ diff --git a/database/faiss/cborg/level0/solver_capabilities_metadata.json b/database/faiss/cborg/level0/solver_capabilities_metadata.json index 71100de..6a9ff91 100644 --- a/database/faiss/cborg/level0/solver_capabilities_metadata.json +++ b/database/faiss/cborg/level0/solver_capabilities_metadata.json @@ -3,6 +3,13 @@ "code_name": "AMReX", "capability": "AMReX framework reference and core AMR tutorials", "capability_type": "description", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 0, "chunk_index": 0 }, @@ -10,385 +17,1400 @@ "code_name": "AMReX", "capability": "amrex framework tutorials", "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 1, "chunk_index": 1 }, { "code_name": "AMReX", - "capability": "amrcore reference advection tests", + "capability": "advection tutorial and nested grid advection examples", "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 2, "chunk_index": 2 }, { "code_name": "AMReX", - "capability": "amrex", - "capability_type": "keyword", + "capability": "amrcore reference advection tests", + "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 3, "chunk_index": 3 }, { "code_name": "AMReX", - "capability": "amrex tutorial", - "capability_type": "keyword", + "capability": "AMR advection and passive scalar transport workflows", + "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 4, "chunk_index": 4 }, { "code_name": "AMReX", - "capability": "amrex amrcore", + "capability": "amrex", "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, "chunk_parent": 5, "chunk_index": 5 }, + { + "code_name": "AMReX", + "capability": "amrex tutorial", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 6, + "chunk_index": 6 + }, + { + "code_name": "AMReX", + "capability": "amrex amrcore", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 7, + "chunk_index": 7 + }, + { + "code_name": "AMReX", + "capability": "advection tutorial", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 8, + "chunk_index": 8 + }, + { + "code_name": "AMReX", + "capability": "amr advection", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 9, + "chunk_index": 9 + }, + { + "code_name": "AMReX", + "capability": "passive scalar", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 10, + "chunk_index": 10 + }, + { + "code_name": "AMReX", + "capability": "nested grid advection", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 11, + "chunk_index": 11 + }, + { + "code_name": "AMReX", + "capability": "advection_amrcore", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "AMReX@bac24575", + "l1": "AMReX@bac24575", + "l2": "AMReX@bac24575" + }, + "chunk_parent": 12, + "chunk_index": 12 + }, { "code_name": "PeleC", "capability": "Compressible reacting flow with detailed chemistry", "capability_type": "description", - "chunk_parent": 6, - "chunk_index": 6 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 13, + "chunk_index": 13 }, { "code_name": "PeleC", "capability": "compressible reacting flow", "capability_type": "specific", - "chunk_parent": 7, - "chunk_index": 7 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 14, + "chunk_index": 14 }, { "code_name": "PeleC", "capability": "strong shock handling", "capability_type": "specific", - "chunk_parent": 8, - "chunk_index": 8 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 15, + "chunk_index": 15 }, { "code_name": "PeleC", "capability": "detonation and flame propagation", "capability_type": "specific", - "chunk_parent": 9, - "chunk_index": 9 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 16, + "chunk_index": 16 + }, + { + "code_name": "PeleC", + "capability": "premixed methane and PMF combustion workflows", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 17, + "chunk_index": 17 + }, + { + "code_name": "PeleC", + "capability": "jet flame and reacting jet configurations", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 18, + "chunk_index": 18 + }, + { + "code_name": "PeleC", + "capability": "fuel injection and turbulent flame interaction studies", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 19, + "chunk_index": 19 }, { "code_name": "PeleC", "capability": "detailed chemical kinetics", "capability_type": "specific", - "chunk_parent": 10, - "chunk_index": 10 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 20, + "chunk_index": 20 }, { "code_name": "PeleC", "capability": "flame", "capability_type": "keyword", - "chunk_parent": 11, - "chunk_index": 11 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 21, + "chunk_index": 21 }, { "code_name": "PeleC", "capability": "combustion", "capability_type": "keyword", - "chunk_parent": 12, - "chunk_index": 12 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 22, + "chunk_index": 22 }, { "code_name": "PeleC", "capability": "methane", "capability_type": "keyword", - "chunk_parent": 13, - "chunk_index": 13 + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 23, + "chunk_index": 23 + }, + { + "code_name": "PeleC", + "capability": "premixed methane", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 24, + "chunk_index": 24 + }, + { + "code_name": "PeleC", + "capability": "pmf", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 25, + "chunk_index": 25 + }, + { + "code_name": "PeleC", + "capability": "premixed flame", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 26, + "chunk_index": 26 + }, + { + "code_name": "PeleC", + "capability": "jet flame", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 27, + "chunk_index": 27 + }, + { + "code_name": "PeleC", + "capability": "reacting jet", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 28, + "chunk_index": 28 + }, + { + "code_name": "PeleC", + "capability": "fuel injection", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelec_complete_v1_amrex53dc0a4_pelephysicsac521b3_peleca6b4dff.json", + "level_versions": { + "l0": "PeleC@unknown", + "l1": "PeleC@unknown", + "l2": "PeleC@unknown" + }, + "chunk_parent": 29, + "chunk_index": 29 }, { "code_name": "PeleLMeX", "capability": "Low Mach combustion with detailed transport", "capability_type": "description", - "chunk_parent": 14, - "chunk_index": 14 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 30, + "chunk_index": 30 }, { "code_name": "PeleLMeX", "capability": "low Mach number formulation", "capability_type": "specific", - "chunk_parent": 15, - "chunk_index": 15 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 31, + "chunk_index": 31 }, { "code_name": "PeleLMeX", "capability": "detailed chemical kinetics", "capability_type": "specific", - "chunk_parent": 16, - "chunk_index": 16 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 32, + "chunk_index": 32 }, { "code_name": "PeleLMeX", "capability": "diffusion-dominated combustion", "capability_type": "specific", - "chunk_parent": 17, - "chunk_index": 17 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "code_name": "PeleLMeX", + "capability": "counterflow and counter-flow diffusion flame configurations", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 34, + "chunk_index": 34 + }, + { + "code_name": "PeleLMeX", + "capability": "opposed-flow reacting flame setups", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 35, + "chunk_index": 35 }, { "code_name": "PeleLMeX", "capability": "flame dynamics with transport effects", "capability_type": "specific", - "chunk_parent": 18, - "chunk_index": 18 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 36, + "chunk_index": 36 }, { "code_name": "PeleLMeX", "capability": "low mach", "capability_type": "keyword", - "chunk_parent": 19, - "chunk_index": 19 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 37, + "chunk_index": 37 }, { "code_name": "PeleLMeX", "capability": "incompressible combustion", "capability_type": "keyword", - "chunk_parent": 20, - "chunk_index": 20 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 38, + "chunk_index": 38 }, { "code_name": "PeleLMeX", "capability": "diffusion flame", "capability_type": "keyword", - "chunk_parent": 21, - "chunk_index": 21 + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 39, + "chunk_index": 39 + }, + { + "code_name": "PeleLMeX", + "capability": "counterflow", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 40, + "chunk_index": 40 + }, + { + "code_name": "PeleLMeX", + "capability": "counter-flow", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 41, + "chunk_index": 41 + }, + { + "code_name": "PeleLMeX", + "capability": "opposed-flow", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 42, + "chunk_index": 42 + }, + { + "code_name": "PeleLMeX", + "capability": "counterflow diffusion", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "pelelmex_complete_v1_amrex53dc0a4_pelephysicsac521b3_pelelmex9e7fb9f.json", + "level_versions": { + "l0": "PeleLMeX@unknown", + "l1": "PeleLMeX@unknown", + "l2": "PeleLMeX@unknown" + }, + "chunk_parent": 43, + "chunk_index": 43 }, { "code_name": "incflo", "capability": "Incompressible flow solver", "capability_type": "description", - "chunk_parent": 22, - "chunk_index": 22 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, + "chunk_parent": 44, + "chunk_index": 44 }, { "code_name": "incflo", "capability": "incompressible navier-stokes solver", "capability_type": "specific", - "chunk_parent": 23, - "chunk_index": 23 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, + "chunk_parent": 45, + "chunk_index": 45 }, { "code_name": "incflo", "capability": "godunov-based fluid dynamics", "capability_type": "specific", - "chunk_parent": 24, - "chunk_index": 24 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, + "chunk_parent": 46, + "chunk_index": 46 }, { "code_name": "incflo", "capability": "benchmark turbulent and channel-flow configurations", "capability_type": "specific", - "chunk_parent": 25, - "chunk_index": 25 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, + "chunk_parent": 47, + "chunk_index": 47 }, { "code_name": "incflo", "capability": "incompressible", "capability_type": "keyword", - "chunk_parent": 26, - "chunk_index": 26 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, + "chunk_parent": 48, + "chunk_index": 48 }, { "code_name": "incflo", "capability": "flow", "capability_type": "keyword", - "chunk_parent": 27, - "chunk_index": 27 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "incflo@bac24575", + "l1": "incflo@bac24575", + "l2": "incflo@bac24575" + }, + "chunk_parent": 49, + "chunk_index": 49 }, { "code_name": "WarpX", "capability": "Advanced electromagnetic particle-in-cell code", "capability_type": "description", - "chunk_parent": 28, - "chunk_index": 28 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 50, + "chunk_index": 50 }, { "code_name": "WarpX", "capability": "particle-in-cell method", "capability_type": "specific", - "chunk_parent": 29, - "chunk_index": 29 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 51, + "chunk_index": 51 }, { "code_name": "WarpX", "capability": "electromagnetic field evolution", "capability_type": "specific", - "chunk_parent": 30, - "chunk_index": 30 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 52, + "chunk_index": 52 }, { "code_name": "WarpX", "capability": "laser-plasma and beam dynamics", "capability_type": "specific", - "chunk_parent": 31, - "chunk_index": 31 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 53, + "chunk_index": 53 }, { "code_name": "WarpX", "capability": "plasma", "capability_type": "keyword", - "chunk_parent": 32, - "chunk_index": 32 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 54, + "chunk_index": 54 }, { "code_name": "WarpX", "capability": "laser", "capability_type": "keyword", - "chunk_parent": 33, - "chunk_index": 33 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 55, + "chunk_index": 55 }, { "code_name": "WarpX", "capability": "accelerator", "capability_type": "keyword", - "chunk_parent": 34, - "chunk_index": 34 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "WarpX@bac24575", + "l1": "WarpX@bac24575", + "l2": "WarpX@bac24575" + }, + "chunk_parent": 56, + "chunk_index": 56 }, { "code_name": "ERF", "capability": "Atmospheric modeling and weather simulation", "capability_type": "description", - "chunk_parent": 35, - "chunk_index": 35 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 57, + "chunk_index": 57 }, { "code_name": "ERF", "capability": "atmospheric boundary layer modeling", "capability_type": "specific", - "chunk_parent": 36, - "chunk_index": 36 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 58, + "chunk_index": 58 + }, + { + "code_name": "ERF", + "capability": "atmospheric boundary and stratified atmosphere studies", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 59, + "chunk_index": 59 }, { "code_name": "ERF", "capability": "terrain-influenced weather dynamics", "capability_type": "specific", - "chunk_parent": 37, - "chunk_index": 37 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 60, + "chunk_index": 60 + }, + { + "code_name": "ERF", + "capability": "thermal bubble and dry convection benchmarks", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 61, + "chunk_index": 61 }, { "code_name": "ERF", "capability": "buoyancy-driven and density-current flows", "capability_type": "specific", - "chunk_parent": 38, - "chunk_index": 38 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 62, + "chunk_index": 62 + }, + { + "code_name": "ERF", + "capability": "density current and cold air outflow dynamics", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 63, + "chunk_index": 63 }, { "code_name": "ERF", "capability": "moist convection and squall-line simulations", "capability_type": "specific", - "chunk_parent": 39, - "chunk_index": 39 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 64, + "chunk_index": 64 + }, + { + "code_name": "ERF", + "capability": "squall line and squall-line convection workflows", + "capability_type": "specific", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 65, + "chunk_index": 65 }, { "code_name": "ERF", "capability": "hurricane and tropical-cyclone test workflows", "capability_type": "specific", - "chunk_parent": 40, - "chunk_index": 40 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 66, + "chunk_index": 66 }, { "code_name": "ERF", "capability": "radiation and land-surface coupling tests", "capability_type": "specific", - "chunk_parent": 41, - "chunk_index": 41 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 67, + "chunk_index": 67 }, { "code_name": "ERF", "capability": "wind-farm parameterization workflows", "capability_type": "specific", - "chunk_parent": 42, - "chunk_index": 42 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 68, + "chunk_index": 68 }, { "code_name": "ERF", "capability": "data-assimilation and initialization from netcdf", "capability_type": "specific", - "chunk_parent": 43, - "chunk_index": 43 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 69, + "chunk_index": 69 + }, + { + "code_name": "ERF", + "capability": "abl", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 70, + "chunk_index": 70 }, { "code_name": "ERF", "capability": "atmospheric", "capability_type": "keyword", - "chunk_parent": 44, - "chunk_index": 44 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 71, + "chunk_index": 71 + }, + { + "code_name": "ERF", + "capability": "boundary layer", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 72, + "chunk_index": 72 }, { "code_name": "ERF", "capability": "weather", "capability_type": "keyword", - "chunk_parent": 45, - "chunk_index": 45 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 73, + "chunk_index": 73 }, { "code_name": "ERF", "capability": "wind", "capability_type": "keyword", - "chunk_parent": 46, - "chunk_index": 46 + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 74, + "chunk_index": 74 + }, + { + "code_name": "ERF", + "capability": "thermal bubble", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 75, + "chunk_index": 75 + }, + { + "code_name": "ERF", + "capability": "dry convection", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 76, + "chunk_index": 76 + }, + { + "code_name": "ERF", + "capability": "2d squall line", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 77, + "chunk_index": 77 + }, + { + "code_name": "ERF", + "capability": "squallline", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 78, + "chunk_index": 78 + }, + { + "code_name": "ERF", + "capability": "squall line", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 79, + "chunk_index": 79 + }, + { + "code_name": "ERF", + "capability": "squall-line", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 80, + "chunk_index": 80 + }, + { + "code_name": "ERF", + "capability": "moist convection", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 81, + "chunk_index": 81 + }, + { + "code_name": "ERF", + "capability": "atmospheric boundary", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 82, + "chunk_index": 82 + }, + { + "code_name": "ERF", + "capability": "density current", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 83, + "chunk_index": 83 + }, + { + "code_name": "ERF", + "capability": "cold air outflow", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 84, + "chunk_index": 84 + }, + { + "code_name": "ERF", + "capability": "stratified atmosphere", + "capability_type": "keyword", + "solver_commit": "unknown", + "solver_schema_file": "erf_complete_v1_amrexbac2457_erf5613ec3.json", + "level_versions": { + "l0": "ERF@unknown", + "l1": "ERF@unknown", + "l2": "ERF@unknown" + }, + "chunk_parent": 85, + "chunk_index": 85 }, { "code_name": "REMORA", "capability": "Ocean modeling and coastal circulation simulation", "capability_type": "description", - "chunk_parent": 47, - "chunk_index": 47 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 86, + "chunk_index": 86 }, { "code_name": "REMORA", "capability": "regional ocean circulation modeling", "capability_type": "specific", - "chunk_parent": 48, - "chunk_index": 48 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 87, + "chunk_index": 87 + }, + { + "code_name": "REMORA", + "capability": "ocean circulation", + "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 88, + "chunk_index": 88 }, { "code_name": "REMORA", "capability": "wind-driven upwelling configurations", "capability_type": "specific", - "chunk_parent": 49, - "chunk_index": 49 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 89, + "chunk_index": 89 }, { "code_name": "REMORA", "capability": "periodic channel and coastal flow setups", "capability_type": "specific", - "chunk_parent": 50, - "chunk_index": 50 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 90, + "chunk_index": 90 + }, + { + "code_name": "REMORA", + "capability": "baroclinic flow over coastal ocean topography", + "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 91, + "chunk_index": 91 + }, + { + "code_name": "REMORA", + "capability": "seamount and bathymetry-driven circulation dynamics", + "capability_type": "specific", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 92, + "chunk_index": 92 }, { "code_name": "REMORA", "capability": "ocean", "capability_type": "keyword", - "chunk_parent": 51, - "chunk_index": 51 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 93, + "chunk_index": 93 }, { "code_name": "REMORA", "capability": "coastal", "capability_type": "keyword", - "chunk_parent": 52, - "chunk_index": 52 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 94, + "chunk_index": 94 }, { "code_name": "REMORA", "capability": "circulation", "capability_type": "keyword", - "chunk_parent": 53, - "chunk_index": 53 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 95, + "chunk_index": 95 }, { "code_name": "REMORA", "capability": "seamount", "capability_type": "keyword", - "chunk_parent": 54, - "chunk_index": 54 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 96, + "chunk_index": 96 }, { "code_name": "REMORA", "capability": "upwelling", "capability_type": "keyword", - "chunk_parent": 55, - "chunk_index": 55 + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 97, + "chunk_index": 97 + }, + { + "code_name": "REMORA", + "capability": "baroclinic flow", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 98, + "chunk_index": 98 + }, + { + "code_name": "REMORA", + "capability": "coastal ocean", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 99, + "chunk_index": 99 + }, + { + "code_name": "REMORA", + "capability": "topography", + "capability_type": "keyword", + "solver_commit": "bac24575", + "solver_schema_file": "amrex_schema_bac24575.json", + "level_versions": { + "l0": "REMORA@bac24575", + "l1": "REMORA@bac24575", + "l2": "REMORA@bac24575" + }, + "chunk_parent": 100, + "chunk_index": 100 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_configuration_complexity.faiss b/database/faiss/cborg/level2/erf_case_configuration_complexity.faiss index 4d3bfb6..f843ee3 100644 Binary files a/database/faiss/cborg/level2/erf_case_configuration_complexity.faiss and b/database/faiss/cborg/level2/erf_case_configuration_complexity.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_configuration_complexity_metadata.json b/database/faiss/cborg/level2/erf_case_configuration_complexity_metadata.json index e72dde7..e8f0e00 100644 --- a/database/faiss/cborg/level2/erf_case_configuration_complexity_metadata.json +++ b/database/faiss/cborg/level2/erf_case_configuration_complexity_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -49,7 +49,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -106,7 +106,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -150,7 +150,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -189,7 +189,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -234,7 +234,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -279,7 +279,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -326,7 +326,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -365,7 +365,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -426,7 +426,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -493,7 +493,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -559,7 +559,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -611,7 +611,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -663,7 +663,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -715,7 +715,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -767,7 +767,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -829,7 +829,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -877,7 +877,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -940,7 +940,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -995,7 +995,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -1052,7 +1052,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -1115,7 +1115,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -1190,7 +1190,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1243,920 +1243,14 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "param_count": 52, - "complexity_score": 1.0, - "index_type": "configuration_complexity", - "chunk_parent": 19, - "chunk_index": 22 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "param_count": 47, - "complexity_score": 0.94, - "index_type": "configuration_complexity", - "chunk_parent": 20, - "chunk_index": 23 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "param_count": 41, - "complexity_score": 0.82, - "index_type": "configuration_complexity", - "chunk_parent": 21, - "chunk_index": 24 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "param_count": 40, - "complexity_score": 0.8, - "index_type": "configuration_complexity", - "chunk_parent": 22, - "chunk_index": 25 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "param_count": 55, - "complexity_score": 1.0, - "index_type": "configuration_complexity", - "chunk_parent": 23, - "chunk_index": 26 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "param_count": 44, - "complexity_score": 0.88, - "index_type": "configuration_complexity", - "chunk_parent": 24, - "chunk_index": 27 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "param_count": 57, - "complexity_score": 1.0, - "index_type": "configuration_complexity", - "chunk_parent": 25, - "chunk_index": 28 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 46, - "complexity_score": 0.92, - "index_type": "configuration_complexity", - "chunk_parent": 26, - "chunk_index": 29 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 46, - "complexity_score": 0.92, - "index_type": "configuration_complexity", - "chunk_parent": 27, - "chunk_index": 30 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 50, - "complexity_score": 1.0, - "index_type": "configuration_complexity", - "chunk_parent": 28, - "chunk_index": 31 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 52, - "complexity_score": 1.0, - "index_type": "configuration_complexity", - "chunk_parent": 29, - "chunk_index": 32 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 44, - "complexity_score": 0.88, - "index_type": "configuration_complexity", - "chunk_parent": 30, - "chunk_index": 33 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 44, - "complexity_score": 0.88, - "index_type": "configuration_complexity", - "chunk_parent": 31, - "chunk_index": 34 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 49, - "complexity_score": 0.98, - "index_type": "configuration_complexity", - "chunk_parent": 32, - "chunk_index": 35 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "param_count": 51, - "complexity_score": 1.0, - "index_type": "configuration_complexity", - "chunk_parent": 33, - "chunk_index": 36 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, - "param_count": 76, + "param_count": 53, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 34, - "chunk_index": 37 + "chunk_parent": 19, + "chunk_index": 22 }, { "case_name": "Bubble", @@ -2207,8 +1301,8 @@ "param_count": 41, "complexity_score": 0.82, "index_type": "configuration_complexity", - "chunk_parent": 35, - "chunk_index": 38 + "chunk_parent": 20, + "chunk_index": 23 }, { "case_name": "Couette_Poiseuille", @@ -2252,8 +1346,8 @@ "param_count": 34, "complexity_score": 0.68, "index_type": "configuration_complexity", - "chunk_parent": 36, - "chunk_index": 39 + "chunk_parent": 21, + "chunk_index": 24 }, { "case_name": "EB_Poiseuille", @@ -2314,8 +1408,8 @@ "param_count": 51, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 37, - "chunk_index": 40 + "chunk_parent": 22, + "chunk_index": 25 }, { "case_name": "EB_SquareCylinder", @@ -2390,8 +1484,8 @@ "param_count": 65, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 38, - "chunk_index": 41 + "chunk_parent": 23, + "chunk_index": 26 }, { "case_name": "FlowInABox", @@ -2449,8 +1543,8 @@ "param_count": 48, "complexity_score": 0.96, "index_type": "configuration_complexity", - "chunk_parent": 39, - "chunk_index": 42 + "chunk_parent": 24, + "chunk_index": 27 }, { "case_name": "ImmersedForcingTest", @@ -2459,8 +1553,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2476,7 +1570,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2489,10 +1583,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2504,11 +1597,11 @@ "prob.T_0_Pert_Mag": "0.5", "prob.pert_ref_height": "500." }, - "param_count": 47, - "complexity_score": 0.94, + "param_count": 46, + "complexity_score": 0.92, "index_type": "configuration_complexity", - "chunk_parent": 40, - "chunk_index": 43 + "chunk_parent": 25, + "chunk_index": 28 }, { "case_name": "InitFromNCFile", @@ -2552,8 +1645,8 @@ "param_count": 34, "complexity_score": 0.68, "index_type": "configuration_complexity", - "chunk_parent": 41, - "chunk_index": 44 + "chunk_parent": 26, + "chunk_index": 29 }, { "case_name": "IsentropicVortex", @@ -2607,8 +1700,8 @@ "param_count": 44, "complexity_score": 0.88, "index_type": "configuration_complexity", - "chunk_parent": 42, - "chunk_index": 45 + "chunk_parent": 27, + "chunk_index": 30 }, { "case_name": "MetGrid", @@ -2653,8 +1746,8 @@ "param_count": 35, "complexity_score": 0.7, "index_type": "configuration_complexity", - "chunk_parent": 43, - "chunk_index": 46 + "chunk_parent": 28, + "chunk_index": 31 }, { "case_name": "MovingTerrain", @@ -2699,8 +1792,8 @@ "param_count": 35, "complexity_score": 0.7, "index_type": "configuration_complexity", - "chunk_parent": 44, - "chunk_index": 47 + "chunk_parent": 29, + "chunk_index": 32 }, { "case_name": "MultiSpeciesBubble", @@ -2770,8 +1863,8 @@ "param_count": 60, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 45, - "chunk_index": 48 + "chunk_parent": 30, + "chunk_index": 33 }, { "case_name": "ParticleTests", @@ -2833,8 +1926,8 @@ "param_count": 52, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 46, - "chunk_index": 49 + "chunk_parent": 31, + "chunk_index": 34 }, { "case_name": "Radiation", @@ -2899,8 +1992,8 @@ "param_count": 55, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 47, - "chunk_index": 50 + "chunk_parent": 32, + "chunk_index": 35 }, { "case_name": "ScalarAdvDiff", @@ -2953,8 +2046,95 @@ "param_count": 43, "complexity_score": 0.86, "index_type": "configuration_complexity", - "chunk_parent": 48, - "chunk_index": 51 + "chunk_parent": 33, + "chunk_index": 36 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "param_count": 76, + "complexity_score": 1.0, + "index_type": "configuration_complexity", + "chunk_parent": 34, + "chunk_index": 37 }, { "case_name": "StokesSecondProblem", @@ -3009,8 +2189,8 @@ "param_count": 45, "complexity_score": 0.9, "index_type": "configuration_complexity", - "chunk_parent": 49, - "chunk_index": 52 + "chunk_parent": 35, + "chunk_index": 38 }, { "case_name": "TaylorGreenVortex", @@ -3050,8 +2230,8 @@ "param_count": 30, "complexity_score": 0.6, "index_type": "configuration_complexity", - "chunk_parent": 50, - "chunk_index": 53 + "chunk_parent": 36, + "chunk_index": 39 }, { "case_name": "Terrain2d_Cylinder", @@ -3116,8 +2296,8 @@ "param_count": 55, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 51, - "chunk_index": 54 + "chunk_parent": 37, + "chunk_index": 40 }, { "case_name": "Terrain3d_Hemisphere", @@ -3188,8 +2368,8 @@ "param_count": 61, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 52, - "chunk_index": 55 + "chunk_parent": 38, + "chunk_index": 41 }, { "case_name": "TurbulentInflow", @@ -3231,7 +2411,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3263,11 +2442,11 @@ "erf.perturbation_nondimensional": "0.042", "erf.perturbation_T_infinity": "290.0" }, - "param_count": 67, + "param_count": 66, "complexity_score": 1.0, "index_type": "configuration_complexity", - "chunk_parent": 53, - "chunk_index": 56 + "chunk_parent": 39, + "chunk_index": 42 }, { "case_name": "WPS_Test", @@ -3323,8 +2502,8 @@ "param_count": 46, "complexity_score": 0.92, "index_type": "configuration_complexity", - "chunk_parent": 54, - "chunk_index": 57 + "chunk_parent": 40, + "chunk_index": 43 }, { "case_name": "WitchOfAgnesi", @@ -3378,7 +2557,7 @@ "param_count": 44, "complexity_score": 0.88, "index_type": "configuration_complexity", - "chunk_parent": 55, - "chunk_index": 58 + "chunk_parent": 41, + "chunk_index": 44 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_development_activity.faiss b/database/faiss/cborg/level2/erf_case_development_activity.faiss index 7ddc88f..53ebb7e 100644 Binary files a/database/faiss/cborg/level2/erf_case_development_activity.faiss and b/database/faiss/cborg/level2/erf_case_development_activity.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_development_activity_metadata.json b/database/faiss/cborg/level2/erf_case_development_activity_metadata.json index 29d63f0..02c4cc7 100644 --- a/database/faiss/cborg/level2/erf_case_development_activity_metadata.json +++ b/database/faiss/cborg/level2/erf_case_development_activity_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -47,7 +47,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -102,7 +102,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -144,7 +144,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -181,7 +181,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -224,7 +224,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -267,7 +267,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -312,7 +312,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -349,7 +349,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -408,7 +408,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -473,7 +473,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -537,7 +537,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -587,7 +587,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -647,7 +647,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -693,7 +693,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -754,7 +754,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -807,7 +807,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -862,7 +862,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -923,7 +923,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -996,7 +996,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1049,888 +1049,12 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "index_type": "development_activity", - "chunk_parent": 19, - "chunk_index": 19 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "index_type": "development_activity", - "chunk_parent": 20, - "chunk_index": 20 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "index_type": "development_activity", - "chunk_parent": 21, - "chunk_index": 21 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "index_type": "development_activity", - "chunk_parent": 22, - "chunk_index": 22 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "index_type": "development_activity", - "chunk_parent": 23, - "chunk_index": 23 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "index_type": "development_activity", - "chunk_parent": 24, - "chunk_index": 24 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "index_type": "development_activity", - "chunk_parent": 25, - "chunk_index": 25 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 26, - "chunk_index": 26 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 27, - "chunk_index": 27 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 28, - "chunk_index": 28 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 29, - "chunk_index": 29 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 30, - "chunk_index": 30 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 31, - "chunk_index": 31 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 32, - "chunk_index": 32 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "development_activity", - "chunk_parent": 33, - "chunk_index": 33 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, "index_type": "development_activity", - "chunk_parent": 34, - "chunk_index": 34 + "chunk_parent": 19, + "chunk_index": 19 }, { "case_name": "Bubble", @@ -1979,8 +1103,8 @@ "prob.z_r": "2000.0" }, "index_type": "development_activity", - "chunk_parent": 35, - "chunk_index": 35 + "chunk_parent": 20, + "chunk_index": 20 }, { "case_name": "Couette_Poiseuille", @@ -2022,8 +1146,8 @@ "prob.W_0": "0.0" }, "index_type": "development_activity", - "chunk_parent": 36, - "chunk_index": 36 + "chunk_parent": 21, + "chunk_index": 21 }, { "case_name": "EB_Poiseuille", @@ -2082,8 +1206,8 @@ "prob.zc_frac": "0.15" }, "index_type": "development_activity", - "chunk_parent": 37, - "chunk_index": 37 + "chunk_parent": 22, + "chunk_index": 22 }, { "case_name": "EB_SquareCylinder", @@ -2156,8 +1280,8 @@ "prob.rho_0": "1.0" }, "index_type": "development_activity", - "chunk_parent": 38, - "chunk_index": 38 + "chunk_parent": 23, + "chunk_index": 23 }, { "case_name": "FlowInABox", @@ -2213,8 +1337,8 @@ "prob.T_0_Pert_Mag": "0.1" }, "index_type": "development_activity", - "chunk_parent": 39, - "chunk_index": 39 + "chunk_parent": 24, + "chunk_index": 24 }, { "case_name": "ImmersedForcingTest", @@ -2223,8 +1347,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2240,7 +1364,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2253,10 +1377,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2269,8 +1392,8 @@ "prob.pert_ref_height": "500." }, "index_type": "development_activity", - "chunk_parent": 40, - "chunk_index": 40 + "chunk_parent": 25, + "chunk_index": 25 }, { "case_name": "InitFromNCFile", @@ -2312,8 +1435,8 @@ "prob.T_0": "1.0" }, "index_type": "development_activity", - "chunk_parent": 41, - "chunk_index": 41 + "chunk_parent": 26, + "chunk_index": 26 }, { "case_name": "IsentropicVortex", @@ -2365,8 +1488,8 @@ "amr.grid_eff": "0.8" }, "index_type": "development_activity", - "chunk_parent": 42, - "chunk_index": 42 + "chunk_parent": 27, + "chunk_index": 27 }, { "case_name": "MetGrid", @@ -2409,8 +1532,8 @@ "fabarray.mfiter_tile_size": "1024 1024 1024" }, "index_type": "development_activity", - "chunk_parent": 43, - "chunk_index": 43 + "chunk_parent": 28, + "chunk_index": 28 }, { "case_name": "MovingTerrain", @@ -2453,8 +1576,8 @@ "prob.T_0": "300.;" }, "index_type": "development_activity", - "chunk_parent": 44, - "chunk_index": 44 + "chunk_parent": 29, + "chunk_index": 29 }, { "case_name": "MultiSpeciesBubble", @@ -2522,8 +1645,8 @@ "prob.qv_init_water": "0.01" }, "index_type": "development_activity", - "chunk_parent": 45, - "chunk_index": 45 + "chunk_parent": 30, + "chunk_index": 30 }, { "case_name": "ParticleTests", @@ -2583,8 +1706,8 @@ "prob.rho_0": "1.16" }, "index_type": "development_activity", - "chunk_parent": 46, - "chunk_index": 46 + "chunk_parent": 31, + "chunk_index": 31 }, { "case_name": "Radiation", @@ -2647,8 +1770,8 @@ "erf.rrtmgp_cloud_optics_lw": "rrtmgp-cloud-optics-coeffs-lw.nc" }, "index_type": "development_activity", - "chunk_parent": 47, - "chunk_index": 47 + "chunk_parent": 32, + "chunk_index": 32 }, { "case_name": "ScalarAdvDiff", @@ -2699,8 +1822,93 @@ "erf.cf_set_width": "1" }, "index_type": "development_activity", - "chunk_parent": 48, - "chunk_index": 48 + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "index_type": "development_activity", + "chunk_parent": 34, + "chunk_index": 34 }, { "case_name": "StokesSecondProblem", @@ -2753,8 +1961,8 @@ "prob.rho_0": "1.16" }, "index_type": "development_activity", - "chunk_parent": 49, - "chunk_index": 49 + "chunk_parent": 35, + "chunk_index": 35 }, { "case_name": "TaylorGreenVortex", @@ -2792,8 +2000,8 @@ "prob.V_0": "1.0" }, "index_type": "development_activity", - "chunk_parent": 50, - "chunk_index": 50 + "chunk_parent": 36, + "chunk_index": 36 }, { "case_name": "Terrain2d_Cylinder", @@ -2856,8 +2064,8 @@ "prob.rho_0": "1.16" }, "index_type": "development_activity", - "chunk_parent": 51, - "chunk_index": 51 + "chunk_parent": 37, + "chunk_index": 37 }, { "case_name": "Terrain3d_Hemisphere", @@ -2926,8 +2134,8 @@ "prob.rho_0": "1.16" }, "index_type": "development_activity", - "chunk_parent": 52, - "chunk_index": 52 + "chunk_parent": 38, + "chunk_index": 38 }, { "case_name": "TurbulentInflow", @@ -2969,7 +2177,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3002,8 +2209,8 @@ "erf.perturbation_T_infinity": "290.0" }, "index_type": "development_activity", - "chunk_parent": 53, - "chunk_index": 53 + "chunk_parent": 39, + "chunk_index": 39 }, { "case_name": "WPS_Test", @@ -3057,8 +2264,8 @@ "erf.nc_bdy_file": "\"wrfbdy_chisholmview_d01_width1\"" }, "index_type": "development_activity", - "chunk_parent": 54, - "chunk_index": 54 + "chunk_parent": 40, + "chunk_index": 40 }, { "case_name": "WitchOfAgnesi", @@ -3110,7 +2317,7 @@ "prob.L": "1000.0" }, "index_type": "development_activity", - "chunk_parent": 55, - "chunk_index": 55 + "chunk_parent": 41, + "chunk_index": 41 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_domain_models.faiss b/database/faiss/cborg/level2/erf_case_domain_models.faiss index 3296a47..be07c9c 100644 Binary files a/database/faiss/cborg/level2/erf_case_domain_models.faiss and b/database/faiss/cborg/level2/erf_case_domain_models.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_domain_models_metadata.json b/database/faiss/cborg/level2/erf_case_domain_models_metadata.json index 71dc129..636b6ae 100644 --- a/database/faiss/cborg/level2/erf_case_domain_models_metadata.json +++ b/database/faiss/cborg/level2/erf_case_domain_models_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -48,7 +48,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -104,7 +104,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -147,7 +147,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -185,7 +185,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -229,7 +229,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -273,7 +273,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -319,7 +319,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -357,7 +357,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -417,7 +417,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -483,7 +483,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -548,7 +548,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -599,7 +599,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -660,7 +660,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -707,7 +707,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -769,7 +769,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -823,7 +823,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -879,7 +879,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -941,7 +941,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -1015,7 +1015,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1068,904 +1068,13 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 19, - "chunk_index": 19 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 20, - "chunk_index": 20 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 21, - "chunk_index": 21 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 22, - "chunk_index": 22 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 23, - "chunk_index": 23 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 24, - "chunk_index": 24 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 25, - "chunk_index": 25 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 26, - "chunk_index": 26 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 27, - "chunk_index": 27 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 28, - "chunk_index": 28 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 29, - "chunk_index": 29 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 30, - "chunk_index": 30 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 31, - "chunk_index": 31 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 32, - "chunk_index": 32 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "chemistry_params": {}, - "index_type": "domain_models", - "chunk_parent": 33, - "chunk_index": 33 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 34, - "chunk_index": 34 + "chunk_parent": 19, + "chunk_index": 19 }, { "case_name": "Bubble", @@ -2015,8 +1124,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 35, - "chunk_index": 35 + "chunk_parent": 20, + "chunk_index": 20 }, { "case_name": "Couette_Poiseuille", @@ -2059,8 +1168,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 36, - "chunk_index": 36 + "chunk_parent": 21, + "chunk_index": 21 }, { "case_name": "EB_Poiseuille", @@ -2120,8 +1229,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 37, - "chunk_index": 37 + "chunk_parent": 22, + "chunk_index": 22 }, { "case_name": "EB_SquareCylinder", @@ -2195,8 +1304,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 38, - "chunk_index": 38 + "chunk_parent": 23, + "chunk_index": 23 }, { "case_name": "FlowInABox", @@ -2253,8 +1362,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 39, - "chunk_index": 39 + "chunk_parent": 24, + "chunk_index": 24 }, { "case_name": "ImmersedForcingTest", @@ -2263,8 +1372,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2280,7 +1389,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2293,10 +1402,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2310,8 +1418,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 40, - "chunk_index": 40 + "chunk_parent": 25, + "chunk_index": 25 }, { "case_name": "InitFromNCFile", @@ -2354,8 +1462,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 41, - "chunk_index": 41 + "chunk_parent": 26, + "chunk_index": 26 }, { "case_name": "IsentropicVortex", @@ -2408,8 +1516,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 42, - "chunk_index": 42 + "chunk_parent": 27, + "chunk_index": 27 }, { "case_name": "MetGrid", @@ -2453,8 +1561,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 43, - "chunk_index": 43 + "chunk_parent": 28, + "chunk_index": 28 }, { "case_name": "MovingTerrain", @@ -2498,8 +1606,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 44, - "chunk_index": 44 + "chunk_parent": 29, + "chunk_index": 29 }, { "case_name": "MultiSpeciesBubble", @@ -2568,8 +1676,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 45, - "chunk_index": 45 + "chunk_parent": 30, + "chunk_index": 30 }, { "case_name": "ParticleTests", @@ -2630,8 +1738,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 46, - "chunk_index": 46 + "chunk_parent": 31, + "chunk_index": 31 }, { "case_name": "Radiation", @@ -2695,8 +1803,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 47, - "chunk_index": 47 + "chunk_parent": 32, + "chunk_index": 32 }, { "case_name": "ScalarAdvDiff", @@ -2748,8 +1856,94 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 48, - "chunk_index": 48 + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "chemistry_params": {}, + "index_type": "domain_models", + "chunk_parent": 34, + "chunk_index": 34 }, { "case_name": "StokesSecondProblem", @@ -2803,8 +1997,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 49, - "chunk_index": 49 + "chunk_parent": 35, + "chunk_index": 35 }, { "case_name": "TaylorGreenVortex", @@ -2843,8 +2037,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 50, - "chunk_index": 50 + "chunk_parent": 36, + "chunk_index": 36 }, { "case_name": "Terrain2d_Cylinder", @@ -2908,8 +2102,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 51, - "chunk_index": 51 + "chunk_parent": 37, + "chunk_index": 37 }, { "case_name": "Terrain3d_Hemisphere", @@ -2979,8 +2173,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 52, - "chunk_index": 52 + "chunk_parent": 38, + "chunk_index": 38 }, { "case_name": "TurbulentInflow", @@ -3022,7 +2216,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3056,8 +2249,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 53, - "chunk_index": 53 + "chunk_parent": 39, + "chunk_index": 39 }, { "case_name": "WPS_Test", @@ -3112,8 +2305,8 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 54, - "chunk_index": 54 + "chunk_parent": 40, + "chunk_index": 40 }, { "case_name": "WitchOfAgnesi", @@ -3166,7 +2359,7 @@ }, "chemistry_params": {}, "index_type": "domain_models", - "chunk_parent": 55, - "chunk_index": 55 + "chunk_parent": 41, + "chunk_index": 41 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_grid_specifications.faiss b/database/faiss/cborg/level2/erf_case_grid_specifications.faiss index 2328a80..f97600b 100644 Binary files a/database/faiss/cborg/level2/erf_case_grid_specifications.faiss and b/database/faiss/cborg/level2/erf_case_grid_specifications.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_grid_specifications_metadata.json b/database/faiss/cborg/level2/erf_case_grid_specifications_metadata.json index 2341238..84923ad 100644 --- a/database/faiss/cborg/level2/erf_case_grid_specifications_metadata.json +++ b/database/faiss/cborg/level2/erf_case_grid_specifications_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -56,7 +56,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -119,7 +119,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -169,7 +169,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -214,7 +214,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -265,7 +265,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -316,7 +316,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -369,7 +369,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -414,7 +414,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -481,7 +481,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -554,7 +554,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -625,7 +625,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -682,7 +682,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -758,7 +758,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -811,7 +811,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -881,7 +881,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -943,7 +943,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -1007,7 +1007,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -1078,7 +1078,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -1164,7 +1164,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1217,1027 +1217,21 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_lo": "-75000. -50000. 0.", - "geometry.prob_hi": "75000. 50000. 24000.", - "amr.n_cell": "600 400 96", - "geometry.is_periodic": "1 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 19, - "chunk_index": 19 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "amr.v": "1", - "amr.max_level": "0", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "index_type": "grid_specifications", - "chunk_parent": 20, - "chunk_index": 20 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 21, - "chunk_index": 21 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "0", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 22, - "chunk_index": 22 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 23, - "chunk_index": 23 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 24, - "chunk_index": 24 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "0", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 25, - "chunk_index": 25 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 26, - "chunk_index": 26 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 27, - "chunk_index": 27 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 28, - "chunk_index": 28 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 29, - "chunk_index": 29 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 30, - "chunk_index": 30 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 31, - "chunk_index": 31 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 32, - "chunk_index": 32 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "grid_params": { - "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "geometry.is_periodic": "0 0 0", - "amr.v": "1", - "amr.max_level": "0" - }, - "index_type": "grid_specifications", - "chunk_parent": 33, - "chunk_index": 33 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, "grid_params": { "amrex.fpe_trap_invalid": "1", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", + "geometry.prob_lo": "-75000. -50000. 0.", + "geometry.prob_hi": "75000. 50000. 24000.", + "amr.n_cell": "600 400 96", + "geometry.is_periodic": "1 0 0", "amr.v": "1", "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 34, - "chunk_index": 34 + "chunk_parent": 19, + "chunk_index": 19 }, { "case_name": "Bubble", @@ -2295,8 +1289,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 35, - "chunk_index": 35 + "chunk_parent": 20, + "chunk_index": 20 }, { "case_name": "Couette_Poiseuille", @@ -2346,8 +1340,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 36, - "chunk_index": 36 + "chunk_parent": 21, + "chunk_index": 21 }, { "case_name": "EB_Poiseuille", @@ -2417,8 +1411,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 37, - "chunk_index": 37 + "chunk_parent": 22, + "chunk_index": 22 }, { "case_name": "EB_SquareCylinder", @@ -2503,8 +1497,8 @@ "eb2.geometry": "\"box\"" }, "index_type": "grid_specifications", - "chunk_parent": 38, - "chunk_index": 38 + "chunk_parent": 23, + "chunk_index": 23 }, { "case_name": "FlowInABox", @@ -2569,8 +1563,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 39, - "chunk_index": 39 + "chunk_parent": 24, + "chunk_index": 24 }, { "case_name": "ImmersedForcingTest", @@ -2579,8 +1573,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2596,7 +1590,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2609,10 +1603,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2626,15 +1619,15 @@ }, "grid_params": { "amrex.fpe_trap_invalid": "1", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "amr.v": "1", "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 40, - "chunk_index": 40 + "chunk_parent": 25, + "chunk_index": 25 }, { "case_name": "InitFromNCFile", @@ -2684,8 +1677,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 41, - "chunk_index": 41 + "chunk_parent": 26, + "chunk_index": 26 }, { "case_name": "IsentropicVortex", @@ -2751,8 +1744,8 @@ "amr.grid_eff": "0.8" }, "index_type": "grid_specifications", - "chunk_parent": 42, - "chunk_index": 42 + "chunk_parent": 27, + "chunk_index": 27 }, { "case_name": "MetGrid", @@ -2802,8 +1795,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 43, - "chunk_index": 43 + "chunk_parent": 28, + "chunk_index": 28 }, { "case_name": "MovingTerrain", @@ -2854,8 +1847,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 44, - "chunk_index": 44 + "chunk_parent": 29, + "chunk_index": 29 }, { "case_name": "MultiSpeciesBubble", @@ -2931,8 +1924,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 45, - "chunk_index": 45 + "chunk_parent": 30, + "chunk_index": 30 }, { "case_name": "ParticleTests", @@ -3004,8 +1997,8 @@ "erf.refinement_indicators": "box1" }, "index_type": "grid_specifications", - "chunk_parent": 46, - "chunk_index": 46 + "chunk_parent": 31, + "chunk_index": 31 }, { "case_name": "Radiation", @@ -3077,8 +2070,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 47, - "chunk_index": 47 + "chunk_parent": 32, + "chunk_index": 32 }, { "case_name": "ScalarAdvDiff", @@ -3139,8 +2132,102 @@ "erf.refinement_indicators": "box1" }, "index_type": "grid_specifications", - "chunk_parent": 48, - "chunk_index": 48 + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "grid_params": { + "amrex.fpe_trap_invalid": "1", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "amr.v": "1", + "amr.max_level": "0" + }, + "index_type": "grid_specifications", + "chunk_parent": 34, + "chunk_index": 34 }, { "case_name": "StokesSecondProblem", @@ -3204,8 +2291,8 @@ "erf.refinement_indicators": "box1" }, "index_type": "grid_specifications", - "chunk_parent": 49, - "chunk_index": 49 + "chunk_parent": 35, + "chunk_index": 35 }, { "case_name": "TaylorGreenVortex", @@ -3251,8 +2338,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 50, - "chunk_index": 50 + "chunk_parent": 36, + "chunk_index": 36 }, { "case_name": "Terrain2d_Cylinder", @@ -3326,8 +2413,8 @@ "erf.refinement_indicators": "box1" }, "index_type": "grid_specifications", - "chunk_parent": 51, - "chunk_index": 51 + "chunk_parent": 37, + "chunk_index": 37 }, { "case_name": "Terrain3d_Hemisphere", @@ -3407,8 +2494,8 @@ "erf.refinement_indicators": "box1" }, "index_type": "grid_specifications", - "chunk_parent": 52, - "chunk_index": 52 + "chunk_parent": 38, + "chunk_index": 38 }, { "case_name": "TurbulentInflow", @@ -3450,7 +2537,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3494,8 +2580,8 @@ "erf.refinement_indicators": "box1" }, "index_type": "grid_specifications", - "chunk_parent": 53, - "chunk_index": 53 + "chunk_parent": 39, + "chunk_index": 39 }, { "case_name": "WPS_Test", @@ -3556,8 +2642,8 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 54, - "chunk_index": 54 + "chunk_parent": 40, + "chunk_index": 40 }, { "case_name": "WitchOfAgnesi", @@ -3618,7 +2704,7 @@ "amr.max_level": "0" }, "index_type": "grid_specifications", - "chunk_parent": 55, - "chunk_index": 55 + "chunk_parent": 41, + "chunk_index": 41 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_path_hierarchy.faiss b/database/faiss/cborg/level2/erf_case_path_hierarchy.faiss index 6df98e5..71b41e1 100644 Binary files a/database/faiss/cborg/level2/erf_case_path_hierarchy.faiss and b/database/faiss/cborg/level2/erf_case_path_hierarchy.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_path_hierarchy_metadata.json b/database/faiss/cborg/level2/erf_case_path_hierarchy_metadata.json index cc04d5b..d065215 100644 --- a/database/faiss/cborg/level2/erf_case_path_hierarchy_metadata.json +++ b/database/faiss/cborg/level2/erf_case_path_hierarchy_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -43,6 +43,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL" ], "index_type": "path_hierarchy", @@ -51,7 +52,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -102,6 +103,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "MOST_test_suite" ], @@ -111,7 +113,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -149,6 +151,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "MYNN_Debug" ], @@ -158,7 +161,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -191,6 +194,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "Rayleigh_check" ], @@ -200,7 +204,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -239,6 +243,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "Scaling", "Aurora" @@ -249,7 +254,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -288,6 +293,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "Scaling", "Perlmutter" @@ -298,7 +304,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -339,6 +345,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "WW3_coupling" ], @@ -348,7 +355,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -381,6 +388,7 @@ }, "path_components": [ "Exec", + "CanonicalTests", "ABL", "column_diffusion_test" ], @@ -390,7 +398,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -445,7 +453,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Canonical_LES", "Convective_ABL" ], @@ -455,7 +463,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -516,7 +524,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Canonical_LES", "Neutral_ABL" ], @@ -526,7 +534,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -586,7 +594,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Canonical_LES", "Stable_ABL" ], @@ -596,7 +604,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -642,7 +650,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Channel_DNS" ], "index_type": "path_hierarchy", @@ -651,7 +659,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -707,7 +715,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "DensityCurrent" ], "index_type": "path_hierarchy", @@ -716,7 +724,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -758,7 +766,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "EkmanSpiral" ], "index_type": "path_hierarchy", @@ -767,7 +775,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -824,7 +832,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Idealized_Terrain", "ScharMountain" ], @@ -834,7 +842,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -883,7 +891,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Idealized_Terrain", "WitchOfAgnesi" ], @@ -893,7 +901,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -944,7 +952,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Real_Terrain", "Altamont" ], @@ -954,7 +962,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -1011,7 +1019,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "Real_Terrain", "Askervein" ], @@ -1021,7 +1029,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -1090,7 +1098,7 @@ }, "path_components": [ "Exec", - "CanonicalFlows", + "CanonicalTests", "SquallLine_2D" ], "index_type": "path_hierarchy", @@ -1099,7 +1107,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1152,987 +1160,17 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "path_components": [ - "Exec", - "CanonicalFlows", - "SuperCell_3D" - ], - "index_type": "path_hierarchy", - "chunk_parent": 19, - "chunk_index": 19 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "path_components": [ - "Exec", - "DevTests", - "DataAssimilation" - ], - "index_type": "path_hierarchy", - "chunk_parent": 20, - "chunk_index": 20 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "path_components": [ - "Exec", - "DevTests", - "Hurricane" - ], - "index_type": "path_hierarchy", - "chunk_parent": 21, - "chunk_index": 21 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "path_components": [ - "Exec", - "DevTests", - "ML_Init_HSE" - ], - "index_type": "path_hierarchy", - "chunk_parent": 22, - "chunk_index": 22 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "path_components": [ - "Exec", - "DevTests", - "Shoc" - ], - "index_type": "path_hierarchy", - "chunk_parent": 23, - "chunk_index": 23 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "path_components": [ - "Exec", - "DevTests", - "Tornado" - ], - "index_type": "path_hierarchy", - "chunk_parent": 24, - "chunk_index": 24 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "path_components": [ - "Exec", - "DevTests", - "TropicalCyclone" - ], - "index_type": "path_hierarchy", - "chunk_parent": 25, - "chunk_index": 25 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "SingleTurbine", - "EWP" - ], - "index_type": "path_hierarchy", - "chunk_parent": 26, - "chunk_index": 26 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "SingleTurbine", - "Fitch" - ], - "index_type": "path_hierarchy", - "chunk_parent": 27, - "chunk_index": 27 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "SingleTurbine", - "SimpleActuatorDisk", - "NoTerrain" - ], - "index_type": "path_hierarchy", - "chunk_parent": 28, - "chunk_index": 28 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "SingleTurbine", - "SimpleActuatorDisk", - "WithTerrain" - ], - "index_type": "path_hierarchy", - "chunk_parent": 29, - "chunk_index": 29 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "WindFarm", - "EWP" - ], - "index_type": "path_hierarchy", - "chunk_parent": 30, - "chunk_index": 30 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "WindFarm", - "Fitch" - ], - "index_type": "path_hierarchy", - "chunk_parent": 31, - "chunk_index": 31 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "WindFarm", - "GeneralActuatorDisk" - ], - "index_type": "path_hierarchy", - "chunk_parent": 32, - "chunk_index": 32 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "path_components": [ - "Exec", - "DevTests", - "WindFarmTests", - "WindFarm", - "SimpleActuatorDisk", - "WithTerrain" - ], - "index_type": "path_hierarchy", - "chunk_parent": 33, - "chunk_index": 33 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, "path_components": [ "Exec", - "DevTests", - "sinusoidal_mass_flux" + "CanonicalTests", + "SuperCell_3D" ], "index_type": "path_hierarchy", - "chunk_parent": 34, - "chunk_index": 34 + "chunk_parent": 19, + "chunk_index": 19 }, { "case_name": "Bubble", @@ -2186,8 +1224,8 @@ "Bubble" ], "index_type": "path_hierarchy", - "chunk_parent": 35, - "chunk_index": 35 + "chunk_parent": 20, + "chunk_index": 20 }, { "case_name": "Couette_Poiseuille", @@ -2234,8 +1272,8 @@ "Couette_Poiseuille" ], "index_type": "path_hierarchy", - "chunk_parent": 36, - "chunk_index": 36 + "chunk_parent": 21, + "chunk_index": 21 }, { "case_name": "EB_Poiseuille", @@ -2299,8 +1337,8 @@ "EB_Poiseuille" ], "index_type": "path_hierarchy", - "chunk_parent": 37, - "chunk_index": 37 + "chunk_parent": 22, + "chunk_index": 22 }, { "case_name": "EB_SquareCylinder", @@ -2378,8 +1416,8 @@ "EB_SquareCylinder" ], "index_type": "path_hierarchy", - "chunk_parent": 38, - "chunk_index": 38 + "chunk_parent": 23, + "chunk_index": 23 }, { "case_name": "FlowInABox", @@ -2440,8 +1478,8 @@ "FlowInABox" ], "index_type": "path_hierarchy", - "chunk_parent": 39, - "chunk_index": 39 + "chunk_parent": 24, + "chunk_index": 24 }, { "case_name": "ImmersedForcingTest", @@ -2450,8 +1488,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2467,7 +1505,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2480,10 +1518,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2501,8 +1538,8 @@ "ImmersedForcingTest" ], "index_type": "path_hierarchy", - "chunk_parent": 40, - "chunk_index": 40 + "chunk_parent": 25, + "chunk_index": 25 }, { "case_name": "InitFromNCFile", @@ -2549,8 +1586,8 @@ "InitFromNCFile" ], "index_type": "path_hierarchy", - "chunk_parent": 41, - "chunk_index": 41 + "chunk_parent": 26, + "chunk_index": 26 }, { "case_name": "IsentropicVortex", @@ -2607,8 +1644,8 @@ "IsentropicVortex" ], "index_type": "path_hierarchy", - "chunk_parent": 42, - "chunk_index": 42 + "chunk_parent": 27, + "chunk_index": 27 }, { "case_name": "MetGrid", @@ -2656,8 +1693,8 @@ "MetGrid" ], "index_type": "path_hierarchy", - "chunk_parent": 43, - "chunk_index": 43 + "chunk_parent": 28, + "chunk_index": 28 }, { "case_name": "MovingTerrain", @@ -2705,8 +1742,8 @@ "MovingTerrain" ], "index_type": "path_hierarchy", - "chunk_parent": 44, - "chunk_index": 44 + "chunk_parent": 29, + "chunk_index": 29 }, { "case_name": "MultiSpeciesBubble", @@ -2779,8 +1816,8 @@ "MultiSpeciesBubble" ], "index_type": "path_hierarchy", - "chunk_parent": 45, - "chunk_index": 45 + "chunk_parent": 30, + "chunk_index": 30 }, { "case_name": "ParticleTests", @@ -2845,8 +1882,8 @@ "ParticleTests" ], "index_type": "path_hierarchy", - "chunk_parent": 46, - "chunk_index": 46 + "chunk_parent": 31, + "chunk_index": 31 }, { "case_name": "Radiation", @@ -2914,8 +1951,8 @@ "Radiation" ], "index_type": "path_hierarchy", - "chunk_parent": 47, - "chunk_index": 47 + "chunk_parent": 32, + "chunk_index": 32 }, { "case_name": "ScalarAdvDiff", @@ -2971,8 +2008,98 @@ "ScalarAdvDiff" ], "index_type": "path_hierarchy", - "chunk_parent": 48, - "chunk_index": 48 + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "path_components": [ + "Exec", + "RegTests", + "SineMassFlux" + ], + "index_type": "path_hierarchy", + "chunk_parent": 34, + "chunk_index": 34 }, { "case_name": "StokesSecondProblem", @@ -3030,8 +2157,8 @@ "StokesSecondProblem" ], "index_type": "path_hierarchy", - "chunk_parent": 49, - "chunk_index": 49 + "chunk_parent": 35, + "chunk_index": 35 }, { "case_name": "TaylorGreenVortex", @@ -3074,8 +2201,8 @@ "TaylorGreenVortex" ], "index_type": "path_hierarchy", - "chunk_parent": 50, - "chunk_index": 50 + "chunk_parent": 36, + "chunk_index": 36 }, { "case_name": "Terrain2d_Cylinder", @@ -3143,8 +2270,8 @@ "Terrain2d_Cylinder" ], "index_type": "path_hierarchy", - "chunk_parent": 51, - "chunk_index": 51 + "chunk_parent": 37, + "chunk_index": 37 }, { "case_name": "Terrain3d_Hemisphere", @@ -3218,8 +2345,8 @@ "Terrain3d_Hemisphere" ], "index_type": "path_hierarchy", - "chunk_parent": 52, - "chunk_index": 52 + "chunk_parent": 38, + "chunk_index": 38 }, { "case_name": "TurbulentInflow", @@ -3261,7 +2388,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3299,8 +2425,8 @@ "TurbulentInflow" ], "index_type": "path_hierarchy", - "chunk_parent": 53, - "chunk_index": 53 + "chunk_parent": 39, + "chunk_index": 39 }, { "case_name": "WPS_Test", @@ -3359,8 +2485,8 @@ "WPS_Test" ], "index_type": "path_hierarchy", - "chunk_parent": 54, - "chunk_index": 54 + "chunk_parent": 40, + "chunk_index": 40 }, { "case_name": "WitchOfAgnesi", @@ -3417,7 +2543,7 @@ "WitchOfAgnesi" ], "index_type": "path_hierarchy", - "chunk_parent": 55, - "chunk_index": 55 + "chunk_parent": 41, + "chunk_index": 41 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_physics_parameters.faiss b/database/faiss/cborg/level2/erf_case_physics_parameters.faiss index 5e560ee..3f2b063 100644 Binary files a/database/faiss/cborg/level2/erf_case_physics_parameters.faiss and b/database/faiss/cborg/level2/erf_case_physics_parameters.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_physics_parameters_metadata.json b/database/faiss/cborg/level2/erf_case_physics_parameters_metadata.json index b1467f3..e9ad155 100644 --- a/database/faiss/cborg/level2/erf_case_physics_parameters_metadata.json +++ b/database/faiss/cborg/level2/erf_case_physics_parameters_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -47,7 +47,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -102,7 +102,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -144,7 +144,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -181,7 +181,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -224,7 +224,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -267,7 +267,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -312,7 +312,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -349,7 +349,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -408,7 +408,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -473,7 +473,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -537,7 +537,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -587,7 +587,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -647,7 +647,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -693,7 +693,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -754,7 +754,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -807,7 +807,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -862,7 +862,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -923,7 +923,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -996,7 +996,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1049,888 +1049,12 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "index_type": "physics_parameters", - "chunk_parent": 19, - "chunk_index": 19 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "index_type": "physics_parameters", - "chunk_parent": 20, - "chunk_index": 20 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "index_type": "physics_parameters", - "chunk_parent": 21, - "chunk_index": 21 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "index_type": "physics_parameters", - "chunk_parent": 22, - "chunk_index": 22 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "index_type": "physics_parameters", - "chunk_parent": 23, - "chunk_index": 23 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "index_type": "physics_parameters", - "chunk_parent": 24, - "chunk_index": 24 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "index_type": "physics_parameters", - "chunk_parent": 25, - "chunk_index": 25 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 26, - "chunk_index": 26 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 27, - "chunk_index": 27 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 28, - "chunk_index": 28 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 29, - "chunk_index": 29 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 30, - "chunk_index": 30 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 31, - "chunk_index": 31 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 32, - "chunk_index": 32 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "physics_parameters", - "chunk_parent": 33, - "chunk_index": 33 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, "index_type": "physics_parameters", - "chunk_parent": 34, - "chunk_index": 34 + "chunk_parent": 19, + "chunk_index": 19 }, { "case_name": "Bubble", @@ -1979,8 +1103,8 @@ "prob.z_r": "2000.0" }, "index_type": "physics_parameters", - "chunk_parent": 35, - "chunk_index": 35 + "chunk_parent": 20, + "chunk_index": 20 }, { "case_name": "Couette_Poiseuille", @@ -2022,8 +1146,8 @@ "prob.W_0": "0.0" }, "index_type": "physics_parameters", - "chunk_parent": 36, - "chunk_index": 36 + "chunk_parent": 21, + "chunk_index": 21 }, { "case_name": "EB_Poiseuille", @@ -2082,8 +1206,8 @@ "prob.zc_frac": "0.15" }, "index_type": "physics_parameters", - "chunk_parent": 37, - "chunk_index": 37 + "chunk_parent": 22, + "chunk_index": 22 }, { "case_name": "EB_SquareCylinder", @@ -2156,8 +1280,8 @@ "prob.rho_0": "1.0" }, "index_type": "physics_parameters", - "chunk_parent": 38, - "chunk_index": 38 + "chunk_parent": 23, + "chunk_index": 23 }, { "case_name": "FlowInABox", @@ -2213,8 +1337,8 @@ "prob.T_0_Pert_Mag": "0.1" }, "index_type": "physics_parameters", - "chunk_parent": 39, - "chunk_index": 39 + "chunk_parent": 24, + "chunk_index": 24 }, { "case_name": "ImmersedForcingTest", @@ -2223,8 +1347,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2240,7 +1364,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2253,10 +1377,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2269,8 +1392,8 @@ "prob.pert_ref_height": "500." }, "index_type": "physics_parameters", - "chunk_parent": 40, - "chunk_index": 40 + "chunk_parent": 25, + "chunk_index": 25 }, { "case_name": "InitFromNCFile", @@ -2312,8 +1435,8 @@ "prob.T_0": "1.0" }, "index_type": "physics_parameters", - "chunk_parent": 41, - "chunk_index": 41 + "chunk_parent": 26, + "chunk_index": 26 }, { "case_name": "IsentropicVortex", @@ -2365,8 +1488,8 @@ "amr.grid_eff": "0.8" }, "index_type": "physics_parameters", - "chunk_parent": 42, - "chunk_index": 42 + "chunk_parent": 27, + "chunk_index": 27 }, { "case_name": "MetGrid", @@ -2409,8 +1532,8 @@ "fabarray.mfiter_tile_size": "1024 1024 1024" }, "index_type": "physics_parameters", - "chunk_parent": 43, - "chunk_index": 43 + "chunk_parent": 28, + "chunk_index": 28 }, { "case_name": "MovingTerrain", @@ -2453,8 +1576,8 @@ "prob.T_0": "300.;" }, "index_type": "physics_parameters", - "chunk_parent": 44, - "chunk_index": 44 + "chunk_parent": 29, + "chunk_index": 29 }, { "case_name": "MultiSpeciesBubble", @@ -2522,8 +1645,8 @@ "prob.qv_init_water": "0.01" }, "index_type": "physics_parameters", - "chunk_parent": 45, - "chunk_index": 45 + "chunk_parent": 30, + "chunk_index": 30 }, { "case_name": "ParticleTests", @@ -2583,8 +1706,8 @@ "prob.rho_0": "1.16" }, "index_type": "physics_parameters", - "chunk_parent": 46, - "chunk_index": 46 + "chunk_parent": 31, + "chunk_index": 31 }, { "case_name": "Radiation", @@ -2647,8 +1770,8 @@ "erf.rrtmgp_cloud_optics_lw": "rrtmgp-cloud-optics-coeffs-lw.nc" }, "index_type": "physics_parameters", - "chunk_parent": 47, - "chunk_index": 47 + "chunk_parent": 32, + "chunk_index": 32 }, { "case_name": "ScalarAdvDiff", @@ -2699,8 +1822,93 @@ "erf.cf_set_width": "1" }, "index_type": "physics_parameters", - "chunk_parent": 48, - "chunk_index": 48 + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "index_type": "physics_parameters", + "chunk_parent": 34, + "chunk_index": 34 }, { "case_name": "StokesSecondProblem", @@ -2753,8 +1961,8 @@ "prob.rho_0": "1.16" }, "index_type": "physics_parameters", - "chunk_parent": 49, - "chunk_index": 49 + "chunk_parent": 35, + "chunk_index": 35 }, { "case_name": "TaylorGreenVortex", @@ -2792,8 +2000,8 @@ "prob.V_0": "1.0" }, "index_type": "physics_parameters", - "chunk_parent": 50, - "chunk_index": 50 + "chunk_parent": 36, + "chunk_index": 36 }, { "case_name": "Terrain2d_Cylinder", @@ -2856,8 +2064,8 @@ "prob.rho_0": "1.16" }, "index_type": "physics_parameters", - "chunk_parent": 51, - "chunk_index": 51 + "chunk_parent": 37, + "chunk_index": 37 }, { "case_name": "Terrain3d_Hemisphere", @@ -2926,8 +2134,8 @@ "prob.rho_0": "1.16" }, "index_type": "physics_parameters", - "chunk_parent": 52, - "chunk_index": 52 + "chunk_parent": 38, + "chunk_index": 38 }, { "case_name": "TurbulentInflow", @@ -2969,7 +2177,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3002,8 +2209,8 @@ "erf.perturbation_T_infinity": "290.0" }, "index_type": "physics_parameters", - "chunk_parent": 53, - "chunk_index": 53 + "chunk_parent": 39, + "chunk_index": 39 }, { "case_name": "WPS_Test", @@ -3057,8 +2264,8 @@ "erf.nc_bdy_file": "\"wrfbdy_chisholmview_d01_width1\"" }, "index_type": "physics_parameters", - "chunk_parent": 54, - "chunk_index": 54 + "chunk_parent": 40, + "chunk_index": 40 }, { "case_name": "WitchOfAgnesi", @@ -3110,7 +2317,7 @@ "prob.L": "1000.0" }, "index_type": "physics_parameters", - "chunk_parent": 55, - "chunk_index": 55 + "chunk_parent": 41, + "chunk_index": 41 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_case_resource_requirements.faiss b/database/faiss/cborg/level2/erf_case_resource_requirements.faiss index 3296a47..be07c9c 100644 Binary files a/database/faiss/cborg/level2/erf_case_resource_requirements.faiss and b/database/faiss/cborg/level2/erf_case_resource_requirements.faiss differ diff --git a/database/faiss/cborg/level2/erf_case_resource_requirements_metadata.json b/database/faiss/cborg/level2/erf_case_resource_requirements_metadata.json index 6ea2ef6..c1ac3f5 100644 --- a/database/faiss/cborg/level2/erf_case_resource_requirements_metadata.json +++ b/database/faiss/cborg/level2/erf_case_resource_requirements_metadata.json @@ -1,7 +1,7 @@ [ { "case_name": "ABL", - "repo_path": "Exec/ABL", + "repo_path": "Exec/CanonicalTests/ABL", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "2", @@ -47,7 +47,7 @@ }, { "case_name": "MOST_test_suite", - "repo_path": "Exec/ABL/MOST_test_suite", + "repo_path": "Exec/CanonicalTests/ABL/MOST_test_suite", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -102,7 +102,7 @@ }, { "case_name": "MYNN_Debug", - "repo_path": "Exec/ABL/MYNN_Debug", + "repo_path": "Exec/CanonicalTests/ABL/MYNN_Debug", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "3000", @@ -144,7 +144,7 @@ }, { "case_name": "Rayleigh_check", - "repo_path": "Exec/ABL/Rayleigh_check", + "repo_path": "Exec/CanonicalTests/ABL/Rayleigh_check", "inputs_content": { "erf.prob_name": "\"ABL\"", "stop_time": "600.0", @@ -181,7 +181,7 @@ }, { "case_name": "Aurora", - "repo_path": "Exec/ABL/Scaling/Aurora", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Aurora", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -224,7 +224,7 @@ }, { "case_name": "Perlmutter", - "repo_path": "Exec/ABL/Scaling/Perlmutter", + "repo_path": "Exec/CanonicalTests/ABL/Scaling/Perlmutter", "inputs_content": { "max_step": "10", "amrex.fpe_trap_invalid": "1", @@ -267,7 +267,7 @@ }, { "case_name": "WW3_coupling", - "repo_path": "Exec/ABL/WW3_coupling", + "repo_path": "Exec/CanonicalTests/ABL/WW3_coupling", "inputs_content": { "erf.prob_name": "\"ABL\"", "max_step": "8", @@ -312,7 +312,7 @@ }, { "case_name": "column_diffusion_test", - "repo_path": "Exec/ABL/column_diffusion_test", + "repo_path": "Exec/CanonicalTests/ABL/column_diffusion_test", "inputs_content": { "stop_time": "3600.0", "geometry.prob_extent": "40 40 1000", @@ -349,7 +349,7 @@ }, { "case_name": "Convective_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Convective_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Convective_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -408,7 +408,7 @@ }, { "case_name": "Neutral_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Neutral_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Neutral_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -473,7 +473,7 @@ }, { "case_name": "Stable_ABL", - "repo_path": "Exec/CanonicalFlows/Canonical_LES/Stable_ABL", + "repo_path": "Exec/CanonicalTests/Canonical_LES/Stable_ABL", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -537,7 +537,7 @@ }, { "case_name": "Channel_DNS", - "repo_path": "Exec/CanonicalFlows/Channel_DNS", + "repo_path": "Exec/CanonicalTests/Channel_DNS", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "true", @@ -587,7 +587,7 @@ }, { "case_name": "DensityCurrent", - "repo_path": "Exec/CanonicalFlows/DensityCurrent", + "repo_path": "Exec/CanonicalTests/DensityCurrent", "inputs_content": { "erf.prob_name": "\"Density Current\"", "erf.init_type": "Isentropic", @@ -647,7 +647,7 @@ }, { "case_name": "EkmanSpiral", - "repo_path": "Exec/CanonicalFlows/EkmanSpiral", + "repo_path": "Exec/CanonicalTests/EkmanSpiral", "inputs_content": { "erf.prob_name": "\"Ekman Spiral\"", "max_step": "1", @@ -693,7 +693,7 @@ }, { "case_name": "ScharMountain", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/ScharMountain", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/ScharMountain", "inputs_content": { "erf.prob_name": "\"Flow over Schar Mountain\"", "max_step": "20000", @@ -754,7 +754,7 @@ }, { "case_name": "WitchOfAgnesi", - "repo_path": "Exec/CanonicalFlows/Idealized_Terrain/WitchOfAgnesi", + "repo_path": "Exec/CanonicalTests/Idealized_Terrain/WitchOfAgnesi", "inputs_content": { "stop_time": "18000.", "amrex.fpe_trap_invalid": "0", @@ -807,7 +807,7 @@ }, { "case_name": "Altamont", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Altamont", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Altamont", "inputs_content": { "stop_time": "1200.0", "amrex.fpe_trap_invalid": "0", @@ -862,7 +862,7 @@ }, { "case_name": "Askervein", - "repo_path": "Exec/CanonicalFlows/Real_Terrain/Askervein", + "repo_path": "Exec/CanonicalTests/Real_Terrain/Askervein", "inputs_content": { "erf.anelastic": "1", "erf.use_fft": "1", @@ -923,7 +923,7 @@ }, { "case_name": "SquallLine_2D", - "repo_path": "Exec/CanonicalFlows/SquallLine_2D", + "repo_path": "Exec/CanonicalTests/SquallLine_2D", "inputs_content": { "erf.prob_name": "\"SquallLine\"", "erf.init_type": "MoistBaseState", @@ -996,7 +996,7 @@ }, { "case_name": "SuperCell_3D", - "repo_path": "Exec/CanonicalFlows/SuperCell_3D", + "repo_path": "Exec/CanonicalTests/SuperCell_3D", "inputs_content": { "erf.prob_name": "\"SuperCell\"", "erf.init_type": "MoistBaseState", @@ -1049,888 +1049,12 @@ "prob.rayleigh_V_0": "1.0", "prob.rayleigh_W_0": "0.0", "prob.rayleigh_T_0": "300.0", - "prob.use_empirical_sat_pressure": "true" - }, - "index_type": "resource_requirements", - "chunk_parent": 19, - "chunk_index": 19 - }, - { - "case_name": "DataAssimilation", - "repo_path": "Exec/DevTests/DataAssimilation", - "inputs_content": { - "max_step": "100", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0 0 -1", - "geometry.prob_hi": "50 25 1", - "amr.n_cell": "384 192 4", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "ensemble.n_members": "3", - "ensemble_pert.amplitude": "100", - "erf.substepping_type": "None", - "erf.fixed_dt": "0.00005", - "erf.anelastic": "0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp", - "erf.file_name_digits": "6", - "erf.alpha_T": "0.0", - "erf.alpha_C": "0.0", - "erf.use_gravity": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "prob.p_inf": "1e5", - "prob.T_inf": "300.", - "prob.M_inf": "1.1952286093343936", - "prob.alpha": "0.0", - "prob.beta": "1.1088514254079065", - "prob.R": "0.25", - "prob.sigma": "1.0", - "prob.xc": "0.1", - "prob.yc": "0.5", - "erf.coupling_type": "TwoWay", - "erf.regrid_int": "2", - "amr.ref_ratio_vect": "2 2 1 2 2 1", - "erf.refinement_indicators": "lo_scalar", - "erf.lo_scalar.max_level": "0", - "erf.lo_scalar.field_name": "scalar", - "erf.lo_scalar.value_greater": "0.1", - "amr.n_error_buf": "5 5", - "amr.grid_eff": "0.8" - }, - "index_type": "resource_requirements", - "chunk_parent": 20, - "chunk_index": 20 - }, - { - "case_name": "Hurricane", - "repo_path": "Exec/DevTests/Hurricane", - "inputs_content": { - "erf.prob_name": "\"Hurricane\"", - "erf.init_type": "MoistBaseState", - "max_step": "1000", - "stop_time": "1000000.0", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "2048 1024 2048", - "geometry.prob_lo": "-1999999 1499999 0.", - "geometry.prob_hi": "3999999 5259999 25000.", - "amr.n_cell": "1000 500 100", - "erf.IC_file": "\"ERF_IC_Laura_LargeDomain.bin\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Open\"", - "xhi.type": "\"Open\"", - "ylo.type": "\"Open\"", - "yhi.type": "\"Open\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "true", - "erf.latitude": "30.0", - "erf.rotational_time_period": "86165.734375", - "erf.fixed_dt": "5.0", - "erf.fixed_fast_dt": "2.5", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta temp vorticity_x vorticity_y vorticity_z qv qc qrain rain_accum", - "erf.use_gravity": "true", - "erf.buoyancy_type": "1", - "erf.Cs": "0.25", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "200.33", - "erf.alpha_T": "200.33", - "erf.alpha_C": "200.33", - "erf.moisture_model": "\"Kessler\"" - }, - "index_type": "resource_requirements", - "chunk_parent": 21, - "chunk_index": 21 - }, - { - "case_name": "ML_Init_HSE", - "repo_path": "Exec/DevTests/ML_Init_HSE", - "inputs_content": { - "erf.prob_name": "\"ML Init HSE Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-25000. 0. 0.", - "geometry.prob_hi": "25000. 1. 10000.", - "amr.n_cell": "100 1 70", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_mri_dt_ratio": "6", - "erf.fixed_dt": "1.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "10000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens z_phys", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_zdamp": "10000.0", - "erf.rayleigh_dampcoef": "0.005", - "erf.dycore_horiz_adv_type": "Centered_4th", - "erf.dycore_vert_adv_type": "Centered_4th", - "erf.dryscal_horiz_adv_type": "Centered_4th", - "erf.dryscal_vert_adv_type": "Centered_4th", - "erf.moistscal_horiz_adv_type": "Centered_4th", - "erf.moistscal_vert_adv_type": "Centered_4th", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_smoothing": "0", - "prob.custom_terrain_type": "\"ScharMountain\"", - "prob.Th_0": "300.0", - "prob.model_filename": "\"HSE_NN.pt\"", - "prob.model_unscale_filename": "\"HSE_NN_Unscale.bin\"" - }, - "index_type": "resource_requirements", - "chunk_parent": 22, - "chunk_index": 22 - }, - { - "case_name": "Shoc", - "repo_path": "Exec/DevTests/Shoc", - "inputs_content": { - "erf.prob_name": "\"SHOC Test\"", - "stop_time": "3600.0", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "4000.0 4000.0 2000.0", - "amr.n_cell": "4 4 200", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"surface_layer\"", - "erf.surface_layer.flux_type": "\"bulk_coeff\"", - "erf.most.Cd": "0.0011", - "erf.most.Ch": "0.0011", - "erf.most.Cq": "0.0011", - "erf.most.surf_temp": "291.044", - "erf.most.surf_moist": "0.01181", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "1.0", - "erf.fixed_mri_dt_ratio": "6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "100", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta rhoQ1 rhoQ2 rhoadv_0 x_velocity y_velocity z_velocity pressure theta scalar temp KE Kmh Kmv Khh Khv pres_hse dens_hse pert_pres pert_dens qt qv qc qrain", - "erf.use_gravity": "true", - "erf.abl_driver_type": "\"GeostrophicWind\"", - "erf.abl_geo_wind": "7.0 -5.5 0.0", - "erf.use_coriolis": "true", - "erf.latitude": "90.", - "erf.rotational_time_period": "86164.0900027328", - "erf.four_stream_radiation": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_horiz_adv_type": "\"Upwind_3rd_SL\"", - "erf.moistscal_vert_adv_type": "\"Upwind_3rd_SL\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.17", - "erf.pbl_type": "\"SHOC\"", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.init_type": "\"input_sounding\"", - "erf.input_sounding_file": "\"input_sounding_moist\"", - "erf.sounding_type": "Ideal", - "prob.KE_0": "0.4", - "prob.KE_decay_height": "1000.", - "prob.KE_decay_order": "2" - }, - "index_type": "resource_requirements", - "chunk_parent": 23, - "chunk_index": 23 - }, - { - "case_name": "Tornado", - "repo_path": "Exec/DevTests/Tornado", - "inputs_content": { - "erf.prob_name": "\"Tornado\"", - "max_step": "12000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "195000. \t143000. \t20500.", - "amr.n_cell": "195 \t143 \t\t69", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zhi.type": "\"SlipWall\"", - "zlo.type": "\"surface_layer\"", - "erf.most.z0": "0.1", - "erf.most.zref": "10.0", - "erf.fixed_dt": "1.0", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1200", - "erf.plotfile_type": "amrex", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoQ1 x_velocity y_velocity z_velocity pressure temp theta pres_hse z_phys qt qp qv qc", - "erf.use_gravity": "true", - "erf.terrain_type": "StaticFittedMesh", - "erf.moisture_model": "\"Kessler\"", - "erf.molec_diff_type": "\"None\"", - "erf.pbl_type": "\"MYNN25\"", - "erf.les_type": "\"Smagorinsky2D\"", - "erf.Cs": "0.15", - "prob.rho_0": "1.0", - "prob.T_0": "300.0", - "prob.KE_0": "0.5", - "prob.KE_decay_height": "250.", - "prob.KE_decay_order": "3", - "erf.real_width": "1", - "erf.real_set_width": "1", - "erf.init_type": "WRFInput", - "erf.nc_init_file_0": "\"wrfinput_tornado_d01\"", - "erf.nc_bdy_file": "\"wrfbdy_tornado_d01\"" - }, - "index_type": "resource_requirements", - "chunk_parent": 24, - "chunk_index": 24 - }, - { - "case_name": "TropicalCyclone", - "repo_path": "Exec/DevTests/TropicalCyclone", - "inputs_content": { - "erf.prob_name": "\"Tropical Cyclone\"", - "stop_time": "200000.0", - "amrex.fpe_trap_invalid": "0", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "-200000. -200000. 0.", - "geometry.prob_hi": "200000. 200000. 9999", - "amr.n_cell": "80 80 42", - "erf.grid_stretching_ratio": "1.1", - "erf.initial_dz": "20.0", - "xlo.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"surface_layer\"", - "erf.use_explicit_most": "1", - "erf.most.surf_temp": "301.14", - "erf.most.zref": "10.", - "erf.most.average_policy": "1", - "erf.most.include_wstar": "1", - "erf.most.pblh_calc": "\"MYNN25\"", - "erf.is_land": "0", - "erf.most.roughness_type_sea": "\"donelan\"", - "zhi.type": "\"SlipWall\"", - "erf.fixed_dt": "5.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "200", - "erf.plot_vars_1": "density x_velocity y_velocity z_velocity pressure theta KE Kmv Khv", - "erf.use_gravity": "true", - "erf.pbl_type": "\"MYNN25\"", - "erf.advect_tke": "false", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"None\"", - "erf.dycore_horiz_adv_type": "\"Upwind_5th\"", - "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", - "erf.dryscal_horiz_adv_type": "\"Upwind_5th\"", - "erf.dryscal_vert_adv_type": "\"Upwind_3rd\"", - "erf.use_coriolis": "true", - "erf.coriolis_3d": "false", - "erf.latitude": "20.", - "erf.rotational_time_period": "86164.0900027328", - "erf.rayleigh_damp_W": "true", - "erf.rayleigh_dampcoef": "0.2", - "erf.rayleigh_zdamp": "5000.", - "prob.RZERO": "100e3", - "prob.ZZERO": "5e3", - "prob.RMAX": "20e3", - "prob.VMAX": "15.", - "prob.KE_0": "0.5", - "erf.init_type": "\"input_sounding\"", - "erf.sounding_type": "Ideal", - "erf.input_sounding_file": "\"input_sounding_meso\"" - }, - "index_type": "resource_requirements", - "chunk_parent": 25, - "chunk_index": 25 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 26, - "chunk_index": 26 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "100000.0 100000.0 1000.0", - "amr.n_cell": "100 100 100", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "2.0", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 vorticity_x vorticity_y vorticity_z", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "10.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 27, - "chunk_index": 27 - }, - { - "case_name": "NoTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/NoTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "2000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.windfarm_type": "SimpleAD", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.windfarm_loc_table": "\"windturbines_loc_xy.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "10", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta KE num_turb vorticity_x vorticity_y vorticity_z", - "erf.dycore_horiz_adv_type": "\"Centered_2nd\"", - "erf.dycore_vert_adv_type": "\"Centered_2nd\"", - "erf.dryscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.dryscal_vert_adv_type": "\"Centered_2nd\"", - "erf.moistscal_horiz_adv_type": "\"Centered_2nd\"", - "erf.moistscal_vert_adv_type": "\"Centered_2nd\"", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 28, - "chunk_index": 28 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/SingleTurbine/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1000.0 1000.0 500.0", - "amr.n_cell": "100 100 50", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_z_levels": "0.000000 5.000000 11.040962 17.202744 23.487761 29.898478 36.437410 43.107120 49.910224 56.849391 63.927341 71.146850 78.510749 86.021926 93.683327 101.497956 109.468877 117.599217 125.892163 134.350968 142.978950 151.779491 160.756043 169.912126 179.251331 188.777319 198.493828 208.404667 218.513722 228.824959 239.342420 250.070231 261.012597 272.173811 283.558250 295.170377 307.014747 319.096004 331.418886 343.988226 356.808952 369.886094 383.224778 396.830235 410.707802 424.862920 439.301141 454.028126 469.049651 484.371606 500.000000", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.windfarm_loc_type": "\"x_y\"", - "erf.sampling_distance_by_D": "0.5", - "erf.turb_disk_angle_from_x": "90.0", - "erf.windfarm_x_shift": "200.0", - "erf.windfarm_y_shift": "200.0", - "erf.windfarm_loc_table": "\"windturbines_loc_x_y_1WT.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_1WT.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"SlipWall\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "10. 0. 0.", - "xlo.density": "1.226", - "xlo.theta": "300.", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.1", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE num_turb SMark0 SMark1 vorticity_x vorticity_y vorticity_z", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "10.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.custom_terrain_type": "\"WindFarmTest\"", - "prob.rho_0": "1.226", - "prob.A_0": "1.0", - "prob.U_0": "10.0", - "prob.V_0": "0.0", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 29, - "chunk_index": 29 - }, - { - "case_name": "EWP", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/EWP", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"EWP\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 30, - "chunk_index": 30 - }, - { - "case_name": "Fitch", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/Fitch", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "10000", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "36000 20000 1000", - "amr.n_cell": "72 40 200", - "erf.windfarm_type": "\"Fitch\"", - "erf.windfarm_x_shift": "9000.0", - "erf.windfarm_y_shift": "6000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.6", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 31, - "chunk_index": 31 - }, - { - "case_name": "GeneralActuatorDisk", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/GeneralActuatorDisk", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "28800", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "18000 10000 1000", - "amr.n_cell": "900 500 50", - "erf.windfarm_type": "\"GeneralAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "1000.0", - "erf.windfarm_y_shift": "1000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.windfarm_spec_table_extra": "\"NREL-2.82-127_performance.csv\"", - "erf.windfarm_blade_table": "\"NREL-2p8-127_AeroDyn15_blade.dat\"", - "erf.windfarm_airfoil_tables": "\"Airfoils\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Outflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Outflow\"", - "yhi.type": "\"Outflow\"", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "1000", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta QKE vorticity SMark0 SMark1", - "erf.use_gravity": "true", - "erf.les_type": "\"None\"", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.dynamic_viscosity": "0.0", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 32, - "chunk_index": 32 - }, - { - "case_name": "WithTerrain", - "repo_path": "Exec/DevTests/WindFarmTests/WindFarm/SimpleActuatorDisk/WithTerrain", - "inputs_content": { - "erf.prob_name": "\"Wind Farm Test\"", - "max_step": "1", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "20000 10000 1000", - "amr.n_cell": "1000 500 50", - "erf.windfarm_type": "\"SimpleAD\"", - "erf.sampling_distance_by_D": "2.5", - "erf.turb_disk_angle_from_x": "135.0", - "erf.windfarm_x_shift": "000.0", - "erf.windfarm_y_shift": "000.0", - "erf.windfarm_loc_type": "\"lat_lon\"", - "erf.windfarm_loc_table": "\"windturbines_KingPlains.txt\"", - "erf.windfarm_spec_table": "\"windturbines_spec_KingPlains.tbl\"", - "erf.terrain_type": "StaticFittedMesh", - "erf.terrain_file_name_USGS": "\"ERF_terrain_file.txt\"", - "geometry.is_periodic": "0 0 0", - "zlo.type": "\"SlipWall\"", - "zhi.type": "\"Outflow\"", - "xlo.type": "\"Inflow\"", - "xhi.type": "\"Outflow\"", - "ylo.type": "\"Inflow\"", - "yhi.type": "\"Outflow\"", - "xlo.velocity": "7.07 7.07 0.0", - "ylo.velocity": "7.07 7.07 0.0", - "erf.use_native_mri": "1", - "erf.fixed_dt": "0.125", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "1000", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta num_turb QKE vorticity SMark0 SMark1", - "erf.alpha_T": "0.0", - "erf.alpha_C": "1.0", - "erf.use_gravity": "true", - "erf.molec_diff_type": "\"ConstantAlpha\"", - "erf.les_type": "\"None\"", - "erf.Cs": "1.5", - "erf.dynamic_viscosity": "0.0", - "erf.pbl_type": "\"None\"", - "erf.init_type": "\"uniform\"", - "prob.rho_0": "1.0", - "prob.A_0": "1.0", - "prob.U_0": "7.07", - "prob.V_0": "7.07", - "prob.W_0": "0.0", - "prob.T_0": "300.0" - }, - "index_type": "resource_requirements", - "chunk_parent": 33, - "chunk_index": 33 - }, - { - "case_name": "sinusoidal_mass_flux", - "repo_path": "Exec/DevTests/sinusoidal_mass_flux", - "inputs_content": { - "erf.prob_name": "\"SinusoidalMassFlux\"", - "stop_time": "3600", - "amrex.fpe_trap_invalid": "1", - "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_lo": "0. 0. 0.", - "geometry.prob_hi": "400. 400. 2975.", - "amr.n_cell": "4 4 50", - "geometry.is_periodic": "1 1 0", - "zlo.type": "\"Outflow\"", - "zhi.type": "\"Outflow\"", - "erf.fixed_dt": "0.25", - "erf.fixed_fast_dt": "0.25", - "erf.sum_interval": "1", - "erf.v": "1", - "amr.v": "1", - "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", - "erf.profile_int": "200", - "amr.max_level": "0", - "erf.check_file": "chk", - "erf.check_int": "-1", - "erf.plot_file_1": "plt", - "erf.plot_int_1": "100", - "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", - "particles.disable_plt": "false", - "erf.use_gravity": "true", - "erf.use_coriolis": "false", - "erf.dycore_horiz_adv_type": "Upwind_3rd", - "erf.dycore_vert_adv_type": "Upwind_3rd", - "erf.dryscal_horiz_adv_type": "Upwind_3rd", - "erf.dryscal_vert_adv_type": "Upwind_3rd", - "erf.moistscal_horiz_adv_type": "WENO5", - "erf.moistscal_vert_adv_type": "WENO5", - "erf.moisture_model": "\"SuperDroplets\"", - "erf.buoyancy_type": "1", - "erf.molec_diff_type": "\"None\"", - "erf.les_type": "\"Smagorinsky\"", - "erf.Cs": "0.17", - "erf.Pr_t": "0.33333333333333", - "erf.Sc_t": "0.33333333333333", - "super_droplets_moisture.initial_distribution_type": "\"uniform\"", - "super_droplets_moisture.diagnostics_interval": "100", - "super_droplets_moisture.include_coalescence": "false", - "super_droplets_moisture.prescribed_advection": "true", - "super_droplets_moisture.density_scaling": "true", - "super_droplets_moisture.advect_with_gravity": "false", - "super_droplets_moisture.dimensionality": "\"one_d_z\"", - "super_droplets_moisture.aerosols": "NH42SO4", - "super_droplets_moisture.num_initializations": "1", - "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", - "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", - "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", - "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", - "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", - "super_droplets_moisture.initial_number_density": "5.0e7", - "super_droplets_moisture.initial_particles_per_cell": "128", - "erf.init_type": "\"input_sounding\"", - "erf.nudging_from_input_sounding": "true", - "erf.tau_nudging": "0.2", - "erf.add_custom_rhotheta_forcing": "true", - "erf.add_custom_moisture_forcing": "true", - "erf.add_custom_geostrophic_profile": "true", - "erf.add_custom_w_subsidence": "true", - "erf.custom_forcing_uses_primitive_vars": "true", - "prob.U_0_Pert_Mag": "0.0", - "prob.V_0_Pert_Mag": "0.0", - "prob.W_0_Pert_Mag": "0.0", - "prob.pert_ref_height": "1600.0", - "prob.T_0_Pert_Mag": "0.0", - "prob.qv_0_Pert_Mag": "0.0", - "prob.advection_heating_rate": "0.0", - "prob.source_cutoff": "1500.0", - "prob.source_cutoff_transition": "1500.0", - "prob.advection_moisture_rate": "0.0", - "prob.moisture_source_cutoff": "300.0", - "prob.moisture_source_cutoff_transition": "200.0", - "prob.custom_TKE": "true" + "prob.use_empirical_psat": "true", + "prob.T_from_theta_in_moist_init": "true" }, "index_type": "resource_requirements", - "chunk_parent": 34, - "chunk_index": 34 + "chunk_parent": 19, + "chunk_index": 19 }, { "case_name": "Bubble", @@ -1979,8 +1103,8 @@ "prob.z_r": "2000.0" }, "index_type": "resource_requirements", - "chunk_parent": 35, - "chunk_index": 35 + "chunk_parent": 20, + "chunk_index": 20 }, { "case_name": "Couette_Poiseuille", @@ -2022,8 +1146,8 @@ "prob.W_0": "0.0" }, "index_type": "resource_requirements", - "chunk_parent": 36, - "chunk_index": 36 + "chunk_parent": 21, + "chunk_index": 21 }, { "case_name": "EB_Poiseuille", @@ -2082,8 +1206,8 @@ "prob.zc_frac": "0.15" }, "index_type": "resource_requirements", - "chunk_parent": 37, - "chunk_index": 37 + "chunk_parent": 22, + "chunk_index": 22 }, { "case_name": "EB_SquareCylinder", @@ -2156,8 +1280,8 @@ "prob.rho_0": "1.0" }, "index_type": "resource_requirements", - "chunk_parent": 38, - "chunk_index": 38 + "chunk_parent": 23, + "chunk_index": 23 }, { "case_name": "FlowInABox", @@ -2213,8 +1337,8 @@ "prob.T_0_Pert_Mag": "0.1" }, "index_type": "resource_requirements", - "chunk_parent": 39, - "chunk_index": 39 + "chunk_parent": 24, + "chunk_index": 24 }, { "case_name": "ImmersedForcingTest", @@ -2223,8 +1347,8 @@ "stop_time": "1800", "amrex.fpe_trap_invalid": "1", "fabarray.mfiter_tile_size": "1024 1024 1024", - "geometry.prob_extent": "1280 1280 1280", - "amr.n_cell": "256 256 256", + "geometry.prob_extent": "640 640 640", + "amr.n_cell": "128 128 128", "geometry.is_periodic": "1 1 0", "zlo.type": "\"NoSlipWall\"", "zhi.type": "\"SlipWall\"", @@ -2240,7 +1364,7 @@ "erf.check_file": "chk", "erf.check_int": "-1", "erf.plot_file_1": "plt", - "erf.plot_int_1": "600", + "erf.plot_int_1": "60", "erf.plot_vars_1": "density terrain_IB_mask rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta", "erf.use_gravity": "true", "erf.molec_diff_type": "\"None\"", @@ -2253,10 +1377,9 @@ "prob.dampcoef": "0.2", "prob.zdamp": "300.", "erf.init_type": "\"input_sounding\"", - "erf.init_sounding_ideal": "1", "erf.input_sounding_file": "\"input_sounding_CBL\"", "erf.terrain_type": "ImmersedForcing", - "erf.terrain_file_name": "WoA_dx5m_h100m.txt", + "erf.terrain_file_name": "WoA_dx5m_h100m_128x128.txt", "erf.immersed_forcing_substep": "true", "erf.if_use_most": "true", "erf.if_surf_temp_flux": "0.3", @@ -2269,8 +1392,8 @@ "prob.pert_ref_height": "500." }, "index_type": "resource_requirements", - "chunk_parent": 40, - "chunk_index": 40 + "chunk_parent": 25, + "chunk_index": 25 }, { "case_name": "InitFromNCFile", @@ -2312,8 +1435,8 @@ "prob.T_0": "1.0" }, "index_type": "resource_requirements", - "chunk_parent": 41, - "chunk_index": 41 + "chunk_parent": 26, + "chunk_index": 26 }, { "case_name": "IsentropicVortex", @@ -2365,8 +1488,8 @@ "amr.grid_eff": "0.8" }, "index_type": "resource_requirements", - "chunk_parent": 42, - "chunk_index": 42 + "chunk_parent": 27, + "chunk_index": 27 }, { "case_name": "MetGrid", @@ -2409,8 +1532,8 @@ "fabarray.mfiter_tile_size": "1024 1024 1024" }, "index_type": "resource_requirements", - "chunk_parent": 43, - "chunk_index": 43 + "chunk_parent": 28, + "chunk_index": 28 }, { "case_name": "MovingTerrain", @@ -2453,8 +1576,8 @@ "prob.T_0": "300.;" }, "index_type": "resource_requirements", - "chunk_parent": 44, - "chunk_index": 44 + "chunk_parent": 29, + "chunk_index": 29 }, { "case_name": "MultiSpeciesBubble", @@ -2522,8 +1645,8 @@ "prob.qv_init_water": "0.01" }, "index_type": "resource_requirements", - "chunk_parent": 45, - "chunk_index": 45 + "chunk_parent": 30, + "chunk_index": 30 }, { "case_name": "ParticleTests", @@ -2583,8 +1706,8 @@ "prob.rho_0": "1.16" }, "index_type": "resource_requirements", - "chunk_parent": 46, - "chunk_index": 46 + "chunk_parent": 31, + "chunk_index": 31 }, { "case_name": "Radiation", @@ -2647,8 +1770,8 @@ "erf.rrtmgp_cloud_optics_lw": "rrtmgp-cloud-optics-coeffs-lw.nc" }, "index_type": "resource_requirements", - "chunk_parent": 47, - "chunk_index": 47 + "chunk_parent": 32, + "chunk_index": 32 }, { "case_name": "ScalarAdvDiff", @@ -2699,8 +1822,93 @@ "erf.cf_set_width": "1" }, "index_type": "resource_requirements", - "chunk_parent": 48, - "chunk_index": 48 + "chunk_parent": 33, + "chunk_index": 33 + }, + { + "case_name": "SineMassFlux", + "repo_path": "Exec/RegTests/SineMassFlux", + "inputs_content": { + "erf.prob_name": "\"SinusoidalMassFlux\"", + "stop_time": "3600", + "amrex.fpe_trap_invalid": "1", + "fabarray.mfiter_tile_size": "1024 1024 1024", + "geometry.prob_lo": "0. 0. 0.", + "geometry.prob_hi": "400. 400. 2975.", + "amr.n_cell": "4 4 50", + "geometry.is_periodic": "1 1 0", + "zlo.type": "\"Outflow\"", + "zhi.type": "\"Outflow\"", + "erf.fixed_dt": "0.25", + "erf.fixed_fast_dt": "0.25", + "erf.sum_interval": "1", + "erf.v": "1", + "amr.v": "1", + "erf.data_log": "\"surf\" \"mean\" \"flux\" \"subgrid\"", + "erf.profile_int": "200", + "amr.max_level": "0", + "erf.check_file": "chk", + "erf.check_int": "-1", + "erf.plot_file_1": "plt", + "erf.plot_int_1": "100", + "erf.plot_vars_1": "density rhotheta x_velocity y_velocity z_velocity pressure temp theta qt qp qv qc qsat qrain rel_humidity super_droplets_moisture_radius super_droplets_moisture_mass_density super_droplets_moisture_number_density", + "particles.disable_plt": "false", + "erf.use_gravity": "true", + "erf.use_coriolis": "false", + "erf.dycore_horiz_adv_type": "Upwind_3rd", + "erf.dycore_vert_adv_type": "Upwind_3rd", + "erf.dryscal_horiz_adv_type": "Upwind_3rd", + "erf.dryscal_vert_adv_type": "Upwind_3rd", + "erf.moistscal_horiz_adv_type": "WENO5", + "erf.moistscal_vert_adv_type": "WENO5", + "erf.moisture_model": "\"SuperDroplets\"", + "erf.buoyancy_type": "1", + "erf.molec_diff_type": "\"None\"", + "erf.les_type": "\"Smagorinsky\"", + "erf.Cs": "0.17", + "erf.Pr_t": "0.33333333333333", + "erf.Sc_t": "0.33333333333333", + "super_droplets_moisture.initial_distribution_type": "\"uniform\"", + "super_droplets_moisture.diagnostics_interval": "100", + "super_droplets_moisture.include_coalescence": "false", + "super_droplets_moisture.prescribed_advection": "true", + "super_droplets_moisture.density_scaling": "true", + "super_droplets_moisture.advect_with_gravity": "false", + "super_droplets_moisture.dimensionality": "\"one_d_z\"", + "super_droplets_moisture.aerosols": "NH42SO4", + "super_droplets_moisture.num_initializations": "1", + "super_droplets_moisture.initial_aerosol_distribution_type_NH42SO4": "\"radius_log_normal\"", + "super_droplets_moisture.initial_aerosol_mean_radius_NH42SO4": "80.0e-9", + "super_droplets_moisture.initial_aerosol_min_radius_NH42SO4": "1e-9", + "super_droplets_moisture.initial_aerosol_max_radius_NH42SO4": "5e-6", + "super_droplets_moisture.initial_aerosol_std_radius_NH42SO4": "0.146", + "super_droplets_moisture.initial_number_density": "5.0e7", + "super_droplets_moisture.initial_particles_per_cell": "128", + "erf.init_type": "\"input_sounding\"", + "erf.nudging_from_input_sounding": "true", + "erf.tau_nudging": "0.2", + "erf.add_custom_rhotheta_forcing": "true", + "erf.add_custom_moisture_forcing": "true", + "erf.add_custom_geostrophic_profile": "true", + "erf.add_custom_w_subsidence": "true", + "erf.custom_forcing_uses_primitive_vars": "true", + "prob.U_0_Pert_Mag": "0.0", + "prob.V_0_Pert_Mag": "0.0", + "prob.W_0_Pert_Mag": "0.0", + "prob.pert_ref_height": "1600.0", + "prob.T_0_Pert_Mag": "0.0", + "prob.qv_0_Pert_Mag": "0.0", + "prob.advection_heating_rate": "0.0", + "prob.source_cutoff": "1500.0", + "prob.source_cutoff_transition": "1500.0", + "prob.advection_moisture_rate": "0.0", + "prob.moisture_source_cutoff": "300.0", + "prob.moisture_source_cutoff_transition": "200.0", + "prob.custom_TKE": "true" + }, + "index_type": "resource_requirements", + "chunk_parent": 34, + "chunk_index": 34 }, { "case_name": "StokesSecondProblem", @@ -2753,8 +1961,8 @@ "prob.rho_0": "1.16" }, "index_type": "resource_requirements", - "chunk_parent": 49, - "chunk_index": 49 + "chunk_parent": 35, + "chunk_index": 35 }, { "case_name": "TaylorGreenVortex", @@ -2792,8 +2000,8 @@ "prob.V_0": "1.0" }, "index_type": "resource_requirements", - "chunk_parent": 50, - "chunk_index": 50 + "chunk_parent": 36, + "chunk_index": 36 }, { "case_name": "Terrain2d_Cylinder", @@ -2856,8 +2064,8 @@ "prob.rho_0": "1.16" }, "index_type": "resource_requirements", - "chunk_parent": 51, - "chunk_index": 51 + "chunk_parent": 37, + "chunk_index": 37 }, { "case_name": "Terrain3d_Hemisphere", @@ -2926,8 +2134,8 @@ "prob.rho_0": "1.16" }, "index_type": "resource_requirements", - "chunk_parent": 52, - "chunk_index": 52 + "chunk_parent": 38, + "chunk_index": 38 }, { "case_name": "TurbulentInflow", @@ -2969,7 +2177,6 @@ "erf.plot_file_1": "plt", "erf.plot_int_1": "100", "erf.plot_vars_1": "z_phys density x_velocity y_velocity z_velocity pressure theta pert_pres pert_dens", - "erf.use_mono_adv": "true", "erf.dycore_horiz_adv_type": "\"Upwind_3rd\"", "erf.dycore_vert_adv_type": "\"Upwind_3rd\"", "erf.dryscal_horiz_adv_type": "WENO3", @@ -3002,8 +2209,8 @@ "erf.perturbation_T_infinity": "290.0" }, "index_type": "resource_requirements", - "chunk_parent": 53, - "chunk_index": 53 + "chunk_parent": 39, + "chunk_index": 39 }, { "case_name": "WPS_Test", @@ -3057,8 +2264,8 @@ "erf.nc_bdy_file": "\"wrfbdy_chisholmview_d01_width1\"" }, "index_type": "resource_requirements", - "chunk_parent": 54, - "chunk_index": 54 + "chunk_parent": 40, + "chunk_index": 40 }, { "case_name": "WitchOfAgnesi", @@ -3110,7 +2317,7 @@ "prob.L": "1000.0" }, "index_type": "resource_requirements", - "chunk_parent": 55, - "chunk_index": 55 + "chunk_parent": 41, + "chunk_index": 41 } ] \ No newline at end of file diff --git a/database/faiss/cborg/level2/erf_faiss_provenance.json b/database/faiss/cborg/level2/erf_faiss_provenance.json index ee7cb98..d7aeea8 100644 --- a/database/faiss/cborg/level2/erf_faiss_provenance.json +++ b/database/faiss/cborg/level2/erf_faiss_provenance.json @@ -1,12 +1,12 @@ { "build_script": "build_all_indices.py", - "dependencies_commit": "1df48173da427f57a8201e157518afa7fd2e73ee", + "dependencies_commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", "embedding_dimension": null, - "embedding_model": "text-embedding-3-small", + "embedding_model": "lbl/nomic-embed-text", "embedding_provider": "cborg", - "generated_at": "2026-03-11T22:53:38.819203+00:00", + "generated_at": "2026-03-18T14:58:05.501994+00:00", "level": "2", - "repo_commit": "1df48173da427f57a8201e157518afa7fd2e73ee", + "repo_commit": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", "solver": "erf", "version": "1" } \ No newline at end of file diff --git a/database/schemas/ERF_schema_1df48173.json b/database/schemas/ERF_schema_5613ec39.json similarity index 98% rename from database/schemas/ERF_schema_1df48173.json rename to database/schemas/ERF_schema_5613ec39.json index 23e1a01..ab584ab 100644 --- a/database/schemas/ERF_schema_1df48173.json +++ b/database/schemas/ERF_schema_5613ec39.json @@ -21,6 +21,28 @@ "priority": "tier3", "description": null }, + "eb2.plane_point": { + "type": null, + "required": false, + "is_array": false, + "build_flags": [], + "default": null, + "source_file": "Source/ERF.cpp", + "source_type": "manual", + "priority": "tier3", + "description": null + }, + "eb2.plane_normal": { + "type": null, + "required": false, + "is_array": false, + "build_flags": [], + "default": null, + "source_file": "Source/ERF.cpp", + "source_type": "manual", + "priority": "tier3", + "description": null + }, "eb2.box_lo": { "type": "int", "required": false, @@ -4051,7 +4073,7 @@ "is_array": false, "build_flags": [], "default": 1.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", "source_type": "header", "priority": "tier3", "description": null @@ -4062,7 +4084,106 @@ "is_array": false, "build_flags": [], "default": 0.1, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_deltaT": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": "sinusoidal perturbations for regression tests" + }, + "prob.pert_deltaQV": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": "sinusoidal perturbations for regression tests" + }, + "prob.pert_periods_T": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_periods_QV": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.T_0_Pert_Mag": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.qv_0_Pert_Mag": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.wbar_sub_max": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": -0.65, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_ref_height": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 100.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.custom_TKE": { + "type": "bool", + "required": false, + "is_array": false, + "build_flags": [], + "default": "false", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", "source_type": "header", "priority": "tier3", "description": null @@ -4122,17 +4243,6 @@ "priority": "tier3", "description": null }, - "prob.T_0_Pert_Mag": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 0.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.pert_rhotheta": { "type": "bool", "required": false, @@ -4188,17 +4298,6 @@ "priority": "tier3", "description": null }, - "prob.pert_ref_height": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 100.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.qt_init": { "type": "Real", "required": false, @@ -4331,6 +4430,39 @@ "priority": "tier3", "description": null }, + "prob.advection_heating_rate": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.source_cutoff": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 500.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.source_cutoff_transition": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 50.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, "prob.y_c": { "type": "Real", "required": false, @@ -4397,35 +4529,35 @@ "priority": "tier3", "description": null }, - "prob.rhoKE_0": { + "prob.wbar_cutoff_max": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": -1, - "source_file": "Source/Prob/ERF_InitCustomPert_ABL.H", + "default": 1500.0, + "source_file": "Source/Prob/ERF_UpdateWSubsidence_RICO.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.qv_0_Pert_Mag": { + "prob.Q_0_Pert_Mag": { "type": "Real", "required": false, "is_array": false, "build_flags": [], "default": 0.0, - "source_file": "Source/Prob/ERF_InitCustomPert_Bomex.H", + "source_file": "Source/Prob/ERF_InitCustomPert_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", - "description": null + "description": "random initial perturbations (legacy code)" }, - "prob.custom_TKE": { - "type": "bool", + "prob.rhoKE_0": { + "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "false", - "source_file": "Source/Prob/ERF_InitCustomPert_Bomex.H", + "default": -1, + "source_file": "Source/Prob/ERF_InitCustomPert_ABL.H", "source_type": "header", "priority": "tier3", "description": null @@ -4507,90 +4639,79 @@ "priority": "tier3", "description": "z-radius of scalar bubble" }, - "prob.source_cutoff": { + "prob.pert_periods_u": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 500.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", + "default": 5.0, + "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.source_cutoff_transition": { + "prob.pert_periods_v": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 50.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", + "default": 5.0, + "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.advection_heating_rate": { + "prob.pert_delta_u": { "type": "Real", "required": false, "is_array": false, "build_flags": [], "default": 0.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, - "prob.pert_periods_u": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 5.0, "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_periods_v": { + "prob.pert_lo": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 5.0, + "default": "-1e34", "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_delta_u": { + "prob.pert_hi": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 0.0, + "default": "1e34", "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_lo": { + "prob.advection_heating_rate_base": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "-1e34", - "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", + "default": 5.4e-05, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_hi": { + "prob.advection_moisture_rate_base": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "1e34", - "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", + "default": 1e-08, + "source_file": "Source/Prob/ERF_UpdateRhoQtSources_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", "description": null @@ -4639,28 +4760,6 @@ "priority": "tier3", "description": null }, - "prob.wbar_sub_max": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": -0.65, - "source_file": "Source/Prob/ERF_UpdateWSubsidence_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, - "prob.wbar_cutoff_max": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 1500.0, - "source_file": "Source/Prob/ERF_UpdateWSubsidence_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.wbar_cutoff_min": { "type": "Real", "required": false, @@ -6992,8 +7091,8 @@ "metadata": { "solver": "ERF", "schema_version": 1, - "repo_commit": "1df48173", - "generated_at": "2026-03-12T11:12:11.596135+00:00" + "repo_commit": "5613ec39", + "generated_at": "2026-03-18T14:38:38.553275+00:00" }, "parameters": { "erf.fix_random_seed": { @@ -7018,6 +7117,28 @@ "priority": "tier3", "description": null }, + "eb2.plane_point": { + "type": null, + "required": false, + "is_array": false, + "build_flags": [], + "default": null, + "source_file": "Source/ERF.cpp", + "source_type": "manual", + "priority": "tier3", + "description": null + }, + "eb2.plane_normal": { + "type": null, + "required": false, + "is_array": false, + "build_flags": [], + "default": null, + "source_file": "Source/ERF.cpp", + "source_type": "manual", + "priority": "tier3", + "description": null + }, "eb2.box_lo": { "type": "int", "required": false, @@ -11048,7 +11169,7 @@ "is_array": false, "build_flags": [], "default": 1.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", "source_type": "header", "priority": "tier3", "description": null @@ -11059,7 +11180,106 @@ "is_array": false, "build_flags": [], "default": 0.1, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_deltaT": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": "sinusoidal perturbations for regression tests" + }, + "prob.pert_deltaQV": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": "sinusoidal perturbations for regression tests" + }, + "prob.pert_periods_T": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_periods_QV": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.T_0_Pert_Mag": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.qv_0_Pert_Mag": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.wbar_sub_max": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": -0.65, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_ref_height": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 100.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.custom_TKE": { + "type": "bool", + "required": false, + "is_array": false, + "build_flags": [], + "default": "false", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", "source_type": "header", "priority": "tier3", "description": null @@ -11119,17 +11339,6 @@ "priority": "tier3", "description": null }, - "prob.T_0_Pert_Mag": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 0.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.pert_rhotheta": { "type": "bool", "required": false, @@ -11185,17 +11394,6 @@ "priority": "tier3", "description": null }, - "prob.pert_ref_height": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 100.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.qt_init": { "type": "Real", "required": false, @@ -11328,6 +11526,39 @@ "priority": "tier3", "description": null }, + "prob.advection_heating_rate": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.source_cutoff": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 500.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.source_cutoff_transition": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 50.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, "prob.y_c": { "type": "Real", "required": false, @@ -11394,35 +11625,35 @@ "priority": "tier3", "description": null }, - "prob.rhoKE_0": { + "prob.wbar_cutoff_max": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": -1, - "source_file": "Source/Prob/ERF_InitCustomPert_ABL.H", + "default": 1500.0, + "source_file": "Source/Prob/ERF_UpdateWSubsidence_RICO.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.qv_0_Pert_Mag": { + "prob.Q_0_Pert_Mag": { "type": "Real", "required": false, "is_array": false, "build_flags": [], "default": 0.0, - "source_file": "Source/Prob/ERF_InitCustomPert_Bomex.H", + "source_file": "Source/Prob/ERF_InitCustomPert_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", - "description": null + "description": "random initial perturbations (legacy code)" }, - "prob.custom_TKE": { - "type": "bool", + "prob.rhoKE_0": { + "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "false", - "source_file": "Source/Prob/ERF_InitCustomPert_Bomex.H", + "default": -1, + "source_file": "Source/Prob/ERF_InitCustomPert_ABL.H", "source_type": "header", "priority": "tier3", "description": null @@ -11504,90 +11735,79 @@ "priority": "tier3", "description": "z-radius of scalar bubble" }, - "prob.source_cutoff": { + "prob.pert_periods_u": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 500.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", + "default": 5.0, + "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.source_cutoff_transition": { + "prob.pert_periods_v": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 50.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", + "default": 5.0, + "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.advection_heating_rate": { + "prob.pert_delta_u": { "type": "Real", "required": false, "is_array": false, "build_flags": [], "default": 0.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, - "prob.pert_periods_u": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 5.0, "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_periods_v": { + "prob.pert_lo": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 5.0, + "default": "-1e34", "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_delta_u": { + "prob.pert_hi": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 0.0, + "default": "1e34", "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_lo": { + "prob.advection_heating_rate_base": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "-1e34", - "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", + "default": 5.4e-05, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_hi": { + "prob.advection_moisture_rate_base": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "1e34", - "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", + "default": 1e-08, + "source_file": "Source/Prob/ERF_UpdateRhoQtSources_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", "description": null @@ -11636,28 +11856,6 @@ "priority": "tier3", "description": null }, - "prob.wbar_sub_max": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": -0.65, - "source_file": "Source/Prob/ERF_UpdateWSubsidence_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, - "prob.wbar_cutoff_max": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 1500.0, - "source_file": "Source/Prob/ERF_UpdateWSubsidence_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.wbar_cutoff_min": { "type": "Real", "required": false, diff --git a/database/schemas/amrex_schema_bac24575.json b/database/schemas/amrex_schema_bac24575.json index e251f00..bf0a464 100644 --- a/database/schemas/amrex_schema_bac24575.json +++ b/database/schemas/amrex_schema_bac24575.json @@ -3197,7 +3197,7 @@ "solver": "amrex", "schema_version": 1, "repo_commit": "bac24575", - "generated_at": "2026-03-12T11:12:07.807620+00:00" + "generated_at": "2026-03-18T14:38:35.819966+00:00" }, "parameters": { "amr.regrid_on_restart": { @@ -6395,4 +6395,4 @@ "description": null } } -} \ No newline at end of file +} diff --git a/database/schemas/erf_complete_current.json b/database/schemas/erf_complete_current.json index f5957ce..709e52c 120000 --- a/database/schemas/erf_complete_current.json +++ b/database/schemas/erf_complete_current.json @@ -1 +1 @@ -erf_complete_v1_amrexbac2457_erf1df4817.json \ No newline at end of file +erf_complete_v1_amrexbac2457_erf5613ec3.json \ No newline at end of file diff --git a/database/schemas/erf_complete_v1_amrexbac2457_erf1df4817.json b/database/schemas/erf_complete_v1_amrexbac2457_erf5613ec3.json similarity index 98% rename from database/schemas/erf_complete_v1_amrexbac2457_erf1df4817.json rename to database/schemas/erf_complete_v1_amrexbac2457_erf5613ec3.json index 567bd26..5df0164 100644 --- a/database/schemas/erf_complete_v1_amrexbac2457_erf1df4817.json +++ b/database/schemas/erf_complete_v1_amrexbac2457_erf5613ec3.json @@ -7,12 +7,12 @@ "ERF" ], "composition_method": "auto-compose (gitmodules)", - "total_parameters": 855, + "total_parameters": 862, "repo_commits": { "amrex": "bac24575699ecaa6ce153cf088077b1282dfbe87", - "erf": "1df48173da427f57a8201e157518afa7fd2e73ee" + "erf": "5613ec3943a33d5f0b4f954e34c4e3ff5559a945" }, - "generated_at": "2026-03-12T11:12:11.621840+00:00" + "generated_at": "2026-03-18T14:38:38.575463+00:00" }, "parameters": { "amr.regrid_on_restart": { @@ -746,23 +746,23 @@ "description": null }, "eb2.plane_point": { - "type": "int", - "required": true, + "type": null, + "required": false, "is_array": false, "build_flags": [], "default": null, - "source_file": "Src/EB/AMReX_EB2.cpp", + "source_file": "Source/ERF.cpp", "source_type": "manual", "priority": "tier3", "description": null }, "eb2.plane_normal": { - "type": "Real", - "required": true, + "type": null, + "required": false, "is_array": false, "build_flags": [], "default": null, - "source_file": "Src/EB/AMReX_EB2.cpp", + "source_file": "Source/ERF.cpp", "source_type": "manual", "priority": "tier3", "description": null @@ -7118,7 +7118,7 @@ "is_array": false, "build_flags": [], "default": 1.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", "source_type": "header", "priority": "tier3", "description": null @@ -7129,7 +7129,106 @@ "is_array": false, "build_flags": [], "default": 0.1, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_deltaT": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": "sinusoidal perturbations for regression tests" + }, + "prob.pert_deltaQV": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": "sinusoidal perturbations for regression tests" + }, + "prob.pert_periods_T": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_periods_QV": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.T_0_Pert_Mag": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.qv_0_Pert_Mag": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.wbar_sub_max": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": -0.65, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.pert_ref_height": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 100.0, + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.custom_TKE": { + "type": "bool", + "required": false, + "is_array": false, + "build_flags": [], + "default": "false", + "source_file": "Source/Prob/ERF_InitCustomPert_RICO.H", "source_type": "header", "priority": "tier3", "description": null @@ -7189,17 +7288,6 @@ "priority": "tier3", "description": null }, - "prob.T_0_Pert_Mag": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 0.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.pert_rhotheta": { "type": "bool", "required": false, @@ -7255,17 +7343,6 @@ "priority": "tier3", "description": null }, - "prob.pert_ref_height": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 100.0, - "source_file": "Source/Prob/ERF_InitCustomPertVels_TurbulentInflow.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.qt_init": { "type": "Real", "required": false, @@ -7398,6 +7475,39 @@ "priority": "tier3", "description": null }, + "prob.advection_heating_rate": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 0.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.source_cutoff": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 500.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, + "prob.source_cutoff_transition": { + "type": "Real", + "required": false, + "is_array": false, + "build_flags": [], + "default": 50.0, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SineMassFlux.H", + "source_type": "header", + "priority": "tier3", + "description": null + }, "prob.y_c": { "type": "Real", "required": false, @@ -7464,35 +7574,35 @@ "priority": "tier3", "description": null }, - "prob.rhoKE_0": { + "prob.wbar_cutoff_max": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": -1, - "source_file": "Source/Prob/ERF_InitCustomPert_ABL.H", + "default": 1500.0, + "source_file": "Source/Prob/ERF_UpdateWSubsidence_RICO.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.qv_0_Pert_Mag": { + "prob.Q_0_Pert_Mag": { "type": "Real", "required": false, "is_array": false, "build_flags": [], "default": 0.0, - "source_file": "Source/Prob/ERF_InitCustomPert_Bomex.H", + "source_file": "Source/Prob/ERF_InitCustomPert_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", - "description": null + "description": "random initial perturbations (legacy code)" }, - "prob.custom_TKE": { - "type": "bool", + "prob.rhoKE_0": { + "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "false", - "source_file": "Source/Prob/ERF_InitCustomPert_Bomex.H", + "default": -1, + "source_file": "Source/Prob/ERF_InitCustomPert_ABL.H", "source_type": "header", "priority": "tier3", "description": null @@ -7574,90 +7684,79 @@ "priority": "tier3", "description": "z-radius of scalar bubble" }, - "prob.source_cutoff": { + "prob.pert_periods_u": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 500.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", + "default": 5.0, + "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.source_cutoff_transition": { + "prob.pert_periods_v": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 50.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", + "default": 5.0, + "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.advection_heating_rate": { + "prob.pert_delta_u": { "type": "Real", "required": false, "is_array": false, "build_flags": [], "default": 0.0, - "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, - "prob.pert_periods_u": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 5.0, "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_periods_v": { + "prob.pert_lo": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 5.0, + "default": "-1e34", "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_delta_u": { + "prob.pert_hi": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": 0.0, + "default": "1e34", "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_lo": { + "prob.advection_heating_rate_base": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "-1e34", - "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", + "default": 5.4e-05, + "source_file": "Source/Prob/ERF_UpdateRhoThetaSources_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", "description": null }, - "prob.pert_hi": { + "prob.advection_moisture_rate_base": { "type": "Real", "required": false, "is_array": false, "build_flags": [], - "default": "1e34", - "source_file": "Source/Prob/ERF_InitCustomPertVels_CouettePoiseuille.H", + "default": 1e-08, + "source_file": "Source/Prob/ERF_UpdateRhoQtSources_SDMCongestus3D.H", "source_type": "header", "priority": "tier3", "description": null @@ -7706,28 +7805,6 @@ "priority": "tier3", "description": null }, - "prob.wbar_sub_max": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": -0.65, - "source_file": "Source/Prob/ERF_UpdateWSubsidence_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, - "prob.wbar_cutoff_max": { - "type": "Real", - "required": false, - "is_array": false, - "build_flags": [], - "default": 1500.0, - "source_file": "Source/Prob/ERF_UpdateWSubsidence_Bomex.H", - "source_type": "header", - "priority": "tier3", - "description": null - }, "prob.wbar_cutoff_min": { "type": "Real", "required": false, diff --git a/demo/README.md b/demo/README.md index 5f93cfb..2b702cc 100644 --- a/demo/README.md +++ b/demo/README.md @@ -123,6 +123,25 @@ To build indices and upload to the hosted OpenAI vector store: bash demo/setup_demo_database.sh --upload-openai ``` +### Startup readiness preflight prerequisites + +Use this as the zero-manual-setup path for first runs: + +1. Keep solver repos as siblings of `amrex-agent` (autodetected default). +2. Run `bash demo/setup_demo_database.sh`. +3. Start the CLI from repo root. + +Required behavior and fallbacks: + +- Sibling repo autodetect: default lookup is `../ERF`, `../PeleC`, `../PeleLMeX`, `../amrex`. +- Auto-clone fallback: run `bash demo/setup_demo_database.sh --clone-missing` to fetch missing repos using `.dependencies.json` pins. +- Rebuild/index repair: if schemas or FAISS artifacts are stale/corrupt, rerun setup. + - Full rebuild: `bash demo/setup_demo_database.sh` + - Single-code repair: `bash demo/setup_demo_database.sh --code ` +- Non-interactive fail-fast: CI/headless startup readiness checks should exit non-zero on blocking repo/dependency/index issues instead of prompting. +- Code-specific build policy: defaults and fallbacks can vary by solver/codebase. +- ERF-specific build policy is documented in `demo/erf/README.md` (CMake Release default and GNUmake fallback notes). + ### Optional: Hosted Vector Store (no local FAISS) If you want hosted retrieval instead of local indices, see `demo/vector_store/README.md`. diff --git a/demo/erf/README.md b/demo/erf/README.md index 1374b2c..cc1b6b0 100644 --- a/demo/erf/README.md +++ b/demo/erf/README.md @@ -37,3 +37,21 @@ python database/scripts/build_all_indices.py --code erf --repo "$ERF_REPO_PATH" python database/scripts/build_index.py --config erf --type case_structure --source "$ERF_REPO_PATH" --embedding cborg python database/scripts/build_index.py --config erf --type case_details --source "$ERF_REPO_PATH" --embedding cborg ``` + +## Startup readiness preflight prerequisites (ERF) + +Zero-manual-setup path: + +1. Keep ERF as a sibling repo (`../ERF`) or set `ERF_REPO_PATH`. +2. Run `bash demo/setup_demo_database.sh --code erf`. +3. Run the agent from repo root. + +Required behavior and fallback notes: + +- Sibling repo autodetect: ERF is discovered from sibling layout first. +- Auto-clone fallback: `bash demo/setup_demo_database.sh --code erf --clone-missing` clones missing ERF using `.dependencies.json`. +- Rebuild/index repair: rerun ERF build commands when schema/index artifacts are stale or mismatched: + - `bash demo/setup_demo_database.sh --code erf` +- Non-interactive fail-fast: headless startup checks must return non-zero on blocking ERF repo/index/dependency issues. +- CMake-default build note: ERF docs specify `CMAKE_BUILD_TYPE` default `Release` and Release should be preferred for ERF CMake builds. +- Fallback when CMake is unavailable: use GNUmakefile builds (`make ... DEBUG=FALSE`) as the fallback route. diff --git a/docs/academy.md b/docs/academy.md index 7dbc210..e42ee97 100644 --- a/docs/academy.md +++ b/docs/academy.md @@ -43,6 +43,8 @@ Once registered, invoke `execute_workflow` through the Academy path with payload ``` For full MCP payload templates and field mapping, see `docs/mcp.md`. +For runtime intent precedence, fallback, and permission behavior, see +`docs/intent_runtime_routing.md`. ## Single-workflow demo (Academy) diff --git a/docs/demos.md b/docs/demos.md index 0bfdbe0..b491c4b 100644 --- a/docs/demos.md +++ b/docs/demos.md @@ -2,6 +2,23 @@ This page mirrors the quickstart and demo READMEs directly so the docs stay in sync. +## Startup readiness preflight prerequisites + +Phase-3 prerequisite coverage for demos: + +- Zero-manual-setup path: sibling solver repos + `bash demo/setup_demo_database.sh` + run from repo root. +- Sibling repo autodetect: default lookup uses sibling repos (for example `../ERF`). +- Auto-clone fallback: `--clone-missing` uses `.dependencies.json` pins when repos are absent. +- Rebuild/index repair: rerun setup (or `--code `) when schema/FAISS artifacts are stale or mismatched. +- Non-interactive fail-fast: headless startup checks should exit non-zero on blocking readiness issues. +- Build defaults/fallbacks are code-specific; do not assume one policy applies to all solvers. +- ERF-specific build defaults/fallbacks are documented in `demo/erf/README.md`. + +Detailed runnable commands are maintained in: + +- `demo/README.md` +- `demo/erf/README.md` + ```markdown {% include "../README.md" diff --git a/docs/intent_runtime_routing.md b/docs/intent_runtime_routing.md new file mode 100644 index 0000000..ae98020 --- /dev/null +++ b/docs/intent_runtime_routing.md @@ -0,0 +1,108 @@ +# Intent Runtime Routing + +This page documents how runtime intent is interpreted and applied without +mixing it into inputs-file modifications. + +## Scope Boundary + +- `inputs/baseline` domain: + - architect `modifications` + - input writer remap/apply paths + - solver inputs content +- `runtime intent` domain: + - execution environment and submission behavior + - MPI/task count + - walltime/qos/constraint/system/account + - visualization intent + +Runtime intent is consumed by runner and visualization paths. It is not passed +into `ConfigModelFactory.apply_modifications`. + +## Visualization Mapping Contract + +Visualization field resolution is code-gated and tiered: + +1. Tier 1 semantic intents: canonical tokens extracted from prompt text (for + example `cloud_water`, `temperature`, `velocity`). +2. Tier 2 solver candidates: live solver-code catalog candidates resolved from + `build_viz_tier2_candidates(repo_root)`. +3. Tier 3 executable selection: final `requested_fields` consumed by input + writing/visualization, selected only from Tier 2 candidates. + +Policy: + +- Missing solver code/catalog during visualization mapping is a hard runtime + failure with remediation guidance. +- No blind fallback to unresolved generic semantic tokens in final + `requested_fields`. +- Ambiguity or no-match is routed to clarification with candidate-constrained + question payloads. + +## Precedence + +Effective runtime values are resolved in this order: + +1. CLI flags +2. config overrides +3. `execution_intent` +4. defaults + +Example: + +- Prompt: `run with 4 procs` +- CLI: `--run-ntasks 8` +- Effective local launch: `mpirun -np 8 ...` + +## Prompt Runtime Fields + +Prompt can request: + +- `environment`: `local`, `perlmutter`, `mcp` +- `run_mode`: `dry`, `stage`, `submit`, `full` +- `total_procs` +- `walltime` +- `qos`, `constraint`, `system` +- `account` and remote path selectors (audited and gate-aware) + +Never prompt-controlled: + +- credentials/tokens/secrets +- write-policy controls +- auth/security material + +## Perlmutter Reachability Fallback + +If runtime intent requests `perlmutter`, runner performs a read-only probe of +the remote filesystem root. When unreachable, effective environment falls back +to `local` and records: + +- `environment_fallback_perlmutter_unreachable` +- probe reason (`missing_path`, `not_readable`, or probe error) + +This fallback does not elevate permissions and is logged in +`workflow_history.details`. + +## Noninteractive Permissions + +Noninteractive calls do not get extra approval power: + +- critical tools still require explicit approval token or trusted approval source +- `gate_approved=true` without trusted source does not bypass critical gates +- demo-only bypass behavior is unchanged + +## Troubleshooting + +### Prompt requested 4 procs but run is serial + +Check: + +1. Effective runtime in runner `workflow_history.details.runtime_effective`. +2. Whether CLI/config overrode prompt (`CLI > config > intent`). +3. Whether fallback changed environment due unreachable Perlmutter. + +### Prompt requested Perlmutter but ran local + +Check: + +1. `runtime_adjustments` for fallback markers. +2. Remote path readability from the current host/session. diff --git a/docs/mcp.md b/docs/mcp.md index ad108b3..2554d9c 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -176,3 +176,10 @@ If `session_id` is provided on calls via `src/academy_mcp_agent.py`, merged tool ```bash pytest tests/unit/test_mcp_tools.py ``` + +## Runtime intent notes + +- Runtime intent routing is documented in `docs/intent_runtime_routing.md`. +- Prompt-specified runtime settings remain subject to critical-tool gating. +- Noninteractive payloads do not gain extra permissions; approval still requires + an approval token or trusted approval source. diff --git a/docs/sfapi.md b/docs/sfapi.md index 275ce8e..6fe8b81 100644 --- a/docs/sfapi.md +++ b/docs/sfapi.md @@ -183,6 +183,14 @@ python amrex_agent.py \ - Stage-out fails: ensure a REST token or OAuth session is available for downloads (`~/.nersc/token` or `NERSC_API_TOKEN`). +## Runtime intent interaction + +When `perlmutter` is requested via runtime intent, runner performs a read-only +remote filesystem probe before execution. If the probe fails, execution falls +back to `local` and records the adjustment in workflow history. + +For full precedence and gating behavior, see `docs/intent_runtime_routing.md`. + ## Related references - Demo configs: `demo/superfacility/` diff --git a/docs/workflow_visualization.md b/docs/workflow_visualization.md index a6026be..09be709 100644 --- a/docs/workflow_visualization.md +++ b/docs/workflow_visualization.md @@ -12,6 +12,27 @@ The workflow generates visualizations from AMReX plotfiles after a successful analysis pass. Visualization uses the multi-backend service (AMReX tools first, then optional pyamrex, then yt) and records metadata in the graph state. +### Intent Resolution and Clarification + +Visualization intent resolution is deterministic-first and code-derived: + +- Architect emits semantic visualization intent only. +- `visualization_intent_node` performs canonical mapping through solver + Tier-2 candidates from live code catalogs. +- If mapping is ambiguous/unresolved, the node records diagnostics: + - `visualization_mapping_candidates` + - `visualization_mapping_unresolved` + - `visualization_mapping_source` + - `visualization_mapping_confidence` +- Clarification node asks constrained disambiguation questions using provided + candidate sets, and AI responses outside the candidate set are rejected. + +Hard-fail behavior: + +- If solver catalog/source code is unavailable for a visualization mapping + request, runtime fails with actionable remediation instead of silently + guessing fields. + ### Workflow Flow ``` diff --git a/scripts/test_first_run_erf_auto_setup.sh b/scripts/test_first_run_erf_auto_setup.sh new file mode 100755 index 0000000..8a49891 --- /dev/null +++ b/scripts/test_first_run_erf_auto_setup.sh @@ -0,0 +1,280 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Phase 14 command matrix runner +# Usage: +# export CBORG_API_KEY=... +# bash scripts/phase14_command_matrix.sh +# Optional overrides: +# REPO_URL, BRANCH, ROOT, PROMPT, PHASE14_MODE, BUILD_SCENARIO, FORCE_BUILD_ALL, RUN_SCENARIOS, PHASE14_INTERACTIVE_MODE + +export TS="${TS:-$(date +%Y%m%d_%H%M%S)}" +export ROOT="${ROOT:-$HOME/codes/worktree_sandbox/phase14_runs_$TS}" +export REPO_URL="${REPO_URL:-git@github.com:AMReX-Codes/amrex-agent.git}" +export BRANCH="${BRANCH:-preflight_layer_fix_stack_main_erf_test_visuals}" +export PROMPT="${PROMPT:-Run a 2D squall line simulation using a Straka-style/Kessler setup with open x boundaries and HO outflow aloft. Run the simulation for 10 steps and output simulation data every 1 step. Visualize the cloud water every 1 step from the simulation data.}" + +export PHASE14_MODE="${PHASE14_MODE:-fast}" +export BUILD_SCENARIO="${BUILD_SCENARIO:-E}" +export FORCE_BUILD_ALL="${FORCE_BUILD_ALL:-0}" +export RUN_SCENARIOS="${RUN_SCENARIOS:-A,B,C,D,E}" +export PHASE14_INTERACTIVE_MODE="${PHASE14_INTERACTIVE_MODE:-auto}" +export SCENARIO_A_SELECTION="${SCENARIO_A_SELECTION:-4}" +export SCENARIO_B_SELECTION="${SCENARIO_B_SELECTION:-2}" +if [[ -z "${SKIP_BUILD_SCENARIOS:-}" ]]; then + if [[ "$PHASE14_MODE" == "fast" ]]; then + export SKIP_BUILD_SCENARIOS="A,B,C,D" + else + export SKIP_BUILD_SCENARIOS="" + fi +fi +export SCENARIO_E_SELECTION="${SCENARIO_E_SELECTION:-4}" + +: "${CBORG_API_KEY:?CBORG_API_KEY is required}" + +mkdir -p "$ROOT"/{scenario_A,scenario_B,scenario_C,scenario_D,scenario_E,logs} + +echo "[phase14] root: $ROOT" +echo "[phase14] mode=$PHASE14_MODE build_scenario=$BUILD_SCENARIO force_build_all=$FORCE_BUILD_ALL skip_build=$SKIP_BUILD_SCENARIOS" +echo "[phase14] run_scenarios=$RUN_SCENARIOS" +echo "[phase14] interactive_mode=$PHASE14_INTERACTIVE_MODE" + +contains_csv_token() { + local csv="$1" + local token="$2" + IFS=',' read -r -a parts <<< "$csv" + for part in "${parts[@]}"; do + if [[ "${part^^}" == "${token^^}" ]]; then + return 0 + fi + done + return 1 +} + +should_run() { + local scenario="$1" + contains_csv_token "$RUN_SCENARIOS" "$scenario" +} + +should_build() { + local scenario="$1" + if [[ "$FORCE_BUILD_ALL" == "1" ]]; then + return 0 + fi + if [[ "$PHASE14_MODE" == "full" ]]; then + return 0 + fi + if contains_csv_token "$SKIP_BUILD_SCENARIOS" "$scenario"; then + return 1 + fi + [[ "${scenario^^}" == "${BUILD_SCENARIO^^}" ]] +} + +scenario_run_mode() { + local scenario="$1" + if should_build "$scenario"; then + printf "full" + else + printf "dry" + fi +} + +extract_issue_codes() { + local transcript="$1" + if [[ ! -f "$transcript" ]]; then + printf "none" + return + fi + local codes + codes="$(grep -oE 'ERF_[A-Z_]+' "$transcript" 2>/dev/null | sort -u | paste -sd ',' - || true)" + printf "%s" "${codes:-none}" +} + +pinned_erf_commit() { + local repo_dir="$1" + ( + cd "$repo_dir" + python - <<'PY' +import json +from pathlib import Path +path = Path('.dependencies.json') +data = json.loads(path.read_text(encoding='utf-8')) +commit = None +if isinstance(data.get('repos'), dict): + commit = ((data.get('repos') or {}).get('erf') or {}).get('commit') +if not commit and isinstance(data.get('repositories'), dict): + commit = ((data.get('repositories') or {}).get('ERF') or {}).get('commit') +if not commit: + raise SystemExit('Could not locate ERF commit in .dependencies.json') +print(commit) +PY + ) +} + +run_agent_tty() { + local transcript="$1" + local run_mode="$2" + local erf_path="${3:-}" + local input_text="${4:-}" + + local cmd="python amrex_agent.py --run-mode $run_mode --indexing-strategy simple --inputs-file-strategy llm_compare --json --verbose --prompt \"$PROMPT\"" + if [[ -n "$erf_path" ]]; then + cmd="ERF_REPO_PATH=$erf_path $cmd" + fi + if [[ -n "$input_text" ]]; then + printf '%b' "$input_text" | script -q -c "$cmd" "$transcript" || true + return + fi + script -q -c "$cmd" "$transcript" || true +} + +selection_input() { + local scenario="$1" + if [[ "$PHASE14_INTERACTIVE_MODE" != "scripted" ]]; then + printf "" + return + fi + case "${scenario^^}" in + A) printf "%s\n" "$SCENARIO_A_SELECTION" ;; + B) printf "%s\n" "$SCENARIO_B_SELECTION" ;; + E) printf "%s\n" "$SCENARIO_E_SELECTION" ;; + *) printf "" ;; + esac +} + +run_agent_non_tty() { + local transcript="$1" + local run_mode="$2" + local erf_path="${3:-}" + + if [[ -n "$erf_path" ]]; then + ERF_REPO_PATH="$erf_path" python amrex_agent.py --run-mode "$run_mode" --indexing-strategy simple --inputs-file-strategy llm_compare --json --verbose --prompt "$PROMPT" >"$transcript" 2>&1 || true + else + python amrex_agent.py --run-mode "$run_mode" --indexing-strategy simple --inputs-file-strategy llm_compare --json --verbose --prompt "$PROMPT" >"$transcript" 2>&1 || true + fi +} + +if should_run A; then + # ========= Scenario A: isolated clone (no sibling repos) ========= + cd "$ROOT/scenario_A" + git clone "$REPO_URL" amrex-agent + cd amrex-agent + git checkout "$BRANCH" + A_MODE="$(scenario_run_mode A)" + run_agent_tty "$ROOT/logs/scenario_A_transcript.txt" "$A_MODE" "" "$(selection_input A)" +fi + +if should_run B; then + # ========= Scenario B: clone + mock sibling ERF mismatch ========= + cd "$ROOT/scenario_B" + git clone "$REPO_URL" amrex-agent + cd amrex-agent + git checkout "$BRANCH" + + cd .. + git clone git@github.com:erf-model/ERF.git ERF + cd ERF + git submodule update --init --recursive + git checkout HEAD~1 + cd ../amrex-agent + + B_MODE="$(scenario_run_mode B)" + run_agent_tty "$ROOT/logs/scenario_B_transcript.txt" "$B_MODE" "$ROOT/scenario_B/ERF" "$(selection_input B)" +fi + +if should_run C; then + # ========= Scenario C: clone + aligned ERF state ========= + cd "$ROOT/scenario_C" + git clone "$REPO_URL" amrex-agent + cd amrex-agent + git checkout "$BRANCH" + PINNED_ERF_COMMIT="$(pinned_erf_commit "$PWD")" + + cd .. + git clone git@github.com:erf-model/ERF.git ERF + cd ERF + git submodule update --init --recursive + git checkout "$PINNED_ERF_COMMIT" + cd ../amrex-agent + + C_MODE="$(scenario_run_mode C)" + run_agent_tty "$ROOT/logs/scenario_C_transcript.txt" "$C_MODE" "$ROOT/scenario_C/ERF" + + find "$PWD/output" -name "qc_slice.png" -print | tee "$ROOT/logs/scenario_C_qc_slice_paths.txt" +fi + +if should_run D; then + # ========= Scenario D: explicit ERF_REPO_PATH override ========= + cd "$ROOT/scenario_D" + git clone "$REPO_URL" amrex-agent + cd amrex-agent + git checkout "$BRANCH" + + D_MODE="$(scenario_run_mode D)" + run_agent_tty "$ROOT/logs/scenario_D_transcript.txt" "$D_MODE" "$ROOT/scenario_C/ERF" +fi + +if should_run E; then + # ========= Scenario E: mismatch + interactive development rebuild ========= + cd "$ROOT/scenario_E" + git clone "$REPO_URL" amrex-agent + cd amrex-agent + git checkout "$BRANCH" + + cd .. + git clone git@github.com:erf-model/ERF.git ERF + cd ERF + git submodule update --init --recursive + git checkout development || git checkout HEAD~1 + cd ../amrex-agent + + cat > "$ROOT/logs/scenario_E_rebuild_commands.txt" < "$ROOT/logs/summary.tsv" +for s in A B C D; do + if ! should_run "$s"; then + continue + fi + T="$ROOT/logs/scenario_${s}_transcript.txt" + Q="$(grep -R --line-number "qc_slice.png" "$ROOT/scenario_${s}/amrex-agent/output" 2>/dev/null | head -n1 || true)" + MODE="$(scenario_run_mode "$s")" + BUILD="no" + if should_build "$s"; then + BUILD="yes" + fi + CODES="$(extract_issue_codes "$T")" + printf "scenario_%s\t%s\tn/a\t%s\tno\t%s\t%s\t%s\tunknown\n" "$s" "$MODE" "$BUILD" "$CODES" "$T" "${Q:-none}" >> "$ROOT/logs/summary.tsv" +done + +if should_run E; then + E_Q="$(grep -R --line-number "qc_slice.png" "$ROOT/scenario_E/amrex-agent/output" 2>/dev/null | head -n1 || true)" + E_BUILD="no" + if should_build E; then + E_BUILD="yes" + fi + E_CODES="$(extract_issue_codes "$ROOT/logs/scenario_E_rebuild_transcript.txt")" + printf "scenario_E\t%s\tdevelopment_rebuild\t%s\tyes\t%s\t%s\t%s\tunknown\n" "$(scenario_run_mode E)" "$E_BUILD" "$E_CODES" "$ROOT/logs/scenario_E_rebuild_transcript.txt" "${E_Q:-none}" >> "$ROOT/logs/summary.tsv" +fi + +echo +cat "$ROOT/logs/summary.tsv" +echo +echo "[phase14] complete" diff --git a/src/config.py b/src/config.py index 33188e4..476cc98 100644 --- a/src/config.py +++ b/src/config.py @@ -512,7 +512,7 @@ class AMReXAgentConfig(BaseModel): ) faiss_embedding_model: str = Field( - default="text-embedding-3-small", + default="lbl/nomic-embed-text", description="Embedding model name (for OpenAI fallback if CBORG unavailable)" ) @@ -842,10 +842,9 @@ class AMReXAgentConfig(BaseModel): ) visualization_backend: str = Field( - default='auto', - description="Visualization backend: 'auto' (Phase 5: AMReX tools → pyamrex → yt), " - "'amrex_tools', 'pyamrex', 'yt'. " - "Phase 4: yt-only. Phase 5: Multi-backend with auto-selection." + default='yt', + description="Visualization backend: 'yt' (default), 'amrex_tools', 'pyamrex', " + "or 'auto' (maps to yt-first selection)." ) amrex_tools_path: Optional[Path] = Field( diff --git a/src/first_run.py b/src/first_run.py new file mode 100644 index 0000000..82e4a3c --- /dev/null +++ b/src/first_run.py @@ -0,0 +1,1128 @@ +"""Startup readiness checks for first-run preflight.""" + +from __future__ import annotations + +import json +import logging +import os +import shutil +import subprocess +import time +from pathlib import Path +from shutil import which +from string import hexdigits +from typing import Any + +from src.services.faiss_artifacts import faiss_indices_present +from src.services.schema_staleness import check_schema_staleness + +logger = logging.getLogger(__name__) + + +ISSUE_ERF_REPO_MISSING = "ERF_REPO_MISSING" +ISSUE_ERF_COMMIT_MISMATCH = "ERF_COMMIT_MISMATCH" +ISSUE_FAISS_INDEX_MISSING = "FAISS_INDEX_MISSING" +ISSUE_FAISS_MANIFEST_MISMATCH = "FAISS_MANIFEST_MISMATCH" +ISSUE_SCHEMA_STALE = "SCHEMA_STALE" +ISSUE_BUILD_POLICY = "ERF_BUILD_POLICY" + + +def _issue(code: str, severity: str, suggested_action: str, **extra: Any) -> dict[str, Any]: + issue = { + "code": code, + "severity": severity, + "suggested_action": suggested_action, + } + issue.update(extra) + return issue + + +def _read_dependencies(repo_root: Path) -> dict[str, Any]: + deps_path = repo_root / ".dependencies.json" + if not deps_path.exists(): + return {} + try: + return json.loads(deps_path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + return {} + + +def _as_path(value: Any) -> Path | None: + if value in (None, ""): + return None + return Path(value) + + +def _erf_path(repo_root: Path, erf_repo_path: Any = None) -> Path: + path = _as_path(erf_repo_path) + if path is not None: + return path + return repo_root.parent / "ERF" + + +def _path_matches(left: Any, right: Any) -> bool: + if left in (None, "") or right in (None, ""): + return False + try: + return Path(left).expanduser().resolve() == Path(right).expanduser().resolve() + except OSError: + return str(left) == str(right) + + +def _resolution_source_for_erf( + repo_root: Path, + config: Any, + explicit_erf_path: Any, +) -> tuple[str, bool]: + sibling = repo_root.parent / "ERF" + env_value = os.environ.get("ERF_REPO_PATH") + config_value = getattr(config, "erf_repo_path", None) if config is not None else None + + if explicit_erf_path not in (None, ""): + if _path_matches(explicit_erf_path, env_value): + return ("env", True) + if _path_matches(explicit_erf_path, config_value): + return ("config", True) + return ("cli", True) + if env_value: + return ("env", True) + if config_value not in (None, ""): + return ("config", True) + if sibling.exists(): + return ("sibling", True) + return ("sibling", True) + + +def _repo_resolution_row( + *, + repo_name: str, + repo_path: Path, + source: str, + deterministic: bool, +) -> dict[str, Any]: + exists = repo_path.exists() + is_git_repo = exists and (repo_path / ".git").exists() + head_sha = _get_git_head_sha(repo_path) if is_git_repo else "" + status = "ok" + if not exists: + status = "missing" + elif not is_git_repo: + status = "invalid" + return { + "solver": repo_name, + "selected_path": str(repo_path), + "source": source, + "deterministic": "yes" if deterministic else "no", + "exists": "yes" if exists else "no", + "is_git_repo": "yes" if is_git_repo else "no", + "head_sha": head_sha or "-", + "status": status, + } + + +def _log_repo_resolution_table(rows: list[dict[str, Any]], stage: str) -> None: + if not rows: + return + logger.info("Preflight repo resolution (%s):", stage) + logger.info("solver | selected_path | source | deterministic | exists | is_git_repo | head_sha | status") + for row in rows: + logger.info( + "%s | %s | %s | %s | %s | %s | %s | %s", + row.get("solver", "-"), + row.get("selected_path", "-"), + row.get("source", "-"), + row.get("deterministic", "-"), + row.get("exists", "-"), + row.get("is_git_repo", "-"), + row.get("head_sha", "-"), + row.get("status", "-"), + ) + + +def _get_git_head_sha(repo_path: Path) -> str: + result = subprocess.run( + ["git", "-C", str(repo_path), "rev-parse", "HEAD"], + capture_output=True, + text=True, + check=False, + ) + if result.returncode != 0: + return "" + return result.stdout.strip() + + +def _checkout_repo_commit(repo_path: Path, commit: str) -> bool: + if not commit: + return False + result = subprocess.run( + ["git", "-C", str(repo_path), "checkout", str(commit)], + capture_output=True, + text=True, + check=False, + ) + return result.returncode == 0 + + +def _short_sha(sha: str) -> str: + return sha[:10] if sha else "unknown" + + +def _is_commit_like(value: str) -> bool: + text = value.strip() + if len(text) < 7: + return False + return all(ch in hexdigits for ch in text) + + +def _collect_indexed_commits(repo_root: Path, repo_name: str) -> set[str]: + commits: set[str] = set() + faiss_root = repo_root / "database" / "faiss" + if not faiss_root.exists(): + return commits + for manifest_path in faiss_root.glob("*/build_session_manifest.json"): + try: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + continue + entries = manifest.get("entries") + if not isinstance(entries, list): + continue + for entry in entries: + if not isinstance(entry, dict): + continue + solver = str(entry.get("solver") or "").strip().lower() + if solver != repo_name: + continue + for key in ("repo_commit", "dependencies_commit"): + commit = str(entry.get(key) or "").strip() + if _is_commit_like(commit): + commits.add(commit.lower()) + return commits + + +def _detect_schema_staleness(**kwargs: Any) -> bool: + schema_root = Path(kwargs.get("schema_root") or "") + repo_root = Path(kwargs.get("repo_root") or ".") + repo_paths = kwargs.get("repo_paths") or {"erf": _erf_path(repo_root, kwargs.get("erf_repo_path"))} + solver = str(kwargs.get("solver") or "erf").lower() + if not schema_root.exists(): + return False + candidates = sorted(schema_root.glob(f"{solver}_schema_*.json")) + if not candidates: + return False + report = check_schema_staleness(candidates[-1], repo_paths=repo_paths) + return bool(report.is_stale) + + +def _cmake_available() -> bool: + return which("cmake") is not None + + +def _manifest_path(faiss_root: Path, provider: str) -> Path: + return faiss_root / provider / "build_session_manifest.json" + + +def _github_https_to_ssh(url: str) -> str: + text = str(url).strip() + prefix = "https://github.com/" + if not text.startswith(prefix): + return text + repo_path = text[len(prefix):].strip("/") + if not repo_path: + return text + return f"git@github.com:{repo_path}.git" if not repo_path.endswith(".git") else f"git@github.com:{repo_path}" + + +def _preferred_clone_urls(repo_url: str) -> list[str]: + primary = str(repo_url).strip() + ssh = _github_https_to_ssh(primary) + if ssh == primary: + return [primary] + return [ssh, primary] + + +def _run_git_streaming(cmd: list[str], *, timeout: int) -> tuple[int, str]: + """Run a git command with line-by-line streamed output and captured tail.""" + tail_lines: list[str] = [] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + try: + if process.stdout is not None: + for line in process.stdout: + logger.info("%s", line.rstrip("\n")) + tail_lines.append(line.rstrip("\n")) + if len(tail_lines) > 80: + tail_lines.pop(0) + process.wait(timeout=timeout) + except subprocess.TimeoutExpired: + process.kill() + process.wait() + return 124, f"git command timed out after {timeout}s: {' '.join(cmd)}" + finally: + if process.stdout is not None: + process.stdout.close() + + tail = "\n".join(tail_lines).strip() + return process.returncode, tail[-500:] + + +def _clone_missing_repo(**kwargs: Any) -> dict[str, Any]: + repo_name = str(kwargs.get("repo_name") or "erf").lower() + repo_root = Path(kwargs.get("repo_root") or ".") + target_path = Path(kwargs.get("target_path") or _erf_path(repo_root)) + expected = kwargs.get("expected_dependencies") or {} + repo_meta = (expected.get("repos") or {}).get(repo_name, {}) + repo_url = repo_meta.get("url") + branch = repo_meta.get("branch") + commit = repo_meta.get("commit") + + if not repo_url: + return {"ok": False, "error": "Missing repository URL in dependencies metadata"} + + clone_timeout = int(kwargs.get("clone_timeout_seconds") or 300) + clone_error = "" + selected_url = None + logger.info( + "Preflight clone start: repo=%s target=%s timeout=%ss", + repo_name.upper(), + target_path, + clone_timeout, + ) + for candidate_url in _preferred_clone_urls(str(repo_url)): + selected_url = candidate_url + logger.info("Preflight clone attempt: %s", candidate_url) + if target_path.exists(): + shutil.rmtree(target_path, ignore_errors=True) + + clone_rc, clone_tail = _run_git_streaming( + ["git", "clone", "--recursive", str(candidate_url), str(target_path)], + timeout=clone_timeout, + ) + if clone_rc == 124: + clone_error = clone_tail + logger.warning("Preflight clone timed out for %s", candidate_url) + continue + if clone_rc == 0: + logger.info("Preflight clone succeeded via %s", candidate_url) + break + clone_error = clone_tail or "git clone failed" + logger.warning("Preflight clone failed for %s", candidate_url) + else: + return {"ok": False, "error": clone_error or "git clone failed"} + + if commit: + subprocess.run( + ["git", "-C", str(target_path), "checkout", str(commit)], + capture_output=True, + text=True, + check=False, + ) + elif branch: + subprocess.run( + ["git", "-C", str(target_path), "checkout", str(branch)], + capture_output=True, + text=True, + check=False, + ) + + submodule_rc, submodule_tail = _run_git_streaming( + ["git", "-C", str(target_path), "submodule", "update", "--init", "--recursive"], + timeout=clone_timeout, + ) + if submodule_rc != 0: + return {"ok": False, "error": submodule_tail or "git submodule update failed"} + logger.info("Preflight submodule update complete") + return {"ok": True, "path": str(target_path), "url": selected_url} + + +def check_repo_readiness(**kwargs: Any) -> dict[str, Any]: + repo_root = Path(kwargs.get("repo_root") or ".") + erf_repo_path = _erf_path(repo_root, kwargs.get("erf_repo_path")) + issues: list[dict[str, Any]] = [] + if not erf_repo_path.exists() or not (erf_repo_path / ".git").exists(): + issues.append( + _issue( + ISSUE_ERF_REPO_MISSING, + "error", + "Add a local ERF repository path or clone ERF into a sibling directory.", + repo_name="erf", + target_path=str(erf_repo_path), + ) + ) + return {"issues": issues} + + +def check_dependency_commit_alignment(**kwargs: Any) -> dict[str, Any]: + repo_root = Path(kwargs.get("repo_root") or ".") + erf_repo_path = _erf_path(repo_root, kwargs.get("erf_repo_path")) + expected_dependencies = kwargs.get("expected_dependencies") or _read_dependencies(repo_root) + expected_sha = ((expected_dependencies.get("repos") or {}).get("erf") or {}).get("commit") + issues: list[dict[str, Any]] = [] + + if expected_sha and erf_repo_path.exists(): + actual_sha = _get_git_head_sha(erf_repo_path) + has_git_metadata = (erf_repo_path / ".git").exists() + if not actual_sha and not has_git_metadata: + return {"issues": issues} + if actual_sha and actual_sha != expected_sha: + rebuild_steps = [ + "python -u database/scripts/build_schema.py \"$ERF_PATH\" --output database/schemas --auto-compose", + "python -u scripts/rename_schema_after_build.py --repo-root . --schemas-dir database/schemas --singleton-rename", + "python -u database/scripts/build_all_indices.py --level 1 --repo \"$ERF_PATH\" --output database/faiss --provider cborg", + "python -u database/scripts/build_all_indices.py --level 2 --repo \"$ERF_PATH\" --output database/faiss --provider cborg", + "python -u database/scripts/build_index.py --config erf --type case_structure --source \"$ERF_PATH\" --embedding cborg --embedding-model lbl/nomic-embed-text --provider cborg", + "python -u database/scripts/build_index.py --config erf --type case_details --source \"$ERF_PATH\" --embedding cborg --embedding-model lbl/nomic-embed-text --provider cborg", + "python -u database/scripts/build_index.py --config erf --type input_templates --source \"$ERF_PATH\" --embedding cborg --embedding-model lbl/nomic-embed-text --provider cborg", + "python -u database/scripts/build_all_indices.py --check --output database/faiss --provider cborg", + ] + rebuild_cmds = " && \\\n ".join(rebuild_steps) + issues.append( + _issue( + ISSUE_ERF_COMMIT_MISMATCH, + "error", + ( + "Check out the ERF commit pinned in .dependencies.json, or rebuild ERF embeddings and inputs schema.\n" + "Rebuild sequence:\n" + f" ERF_PATH={erf_repo_path} && \\\n" + f" {rebuild_cmds}" + ), + expected_commit=expected_sha, + actual_commit=actual_sha, + repo_name="erf", + repo_path=str(erf_repo_path), + ) + ) + return {"issues": issues} + + +def check_faiss_readiness(**kwargs: Any) -> dict[str, Any]: + faiss_root = Path(kwargs.get("faiss_root") or "database/faiss") + provider = str(kwargs.get("provider") or "cborg") + embedding_model = str(kwargs.get("embedding_model") or "") + provider_root = faiss_root / provider if (faiss_root / provider).exists() else faiss_root + issues: list[dict[str, Any]] = [] + if not faiss_indices_present(provider_root): + issues.append( + _issue( + ISSUE_FAISS_INDEX_MISSING, + "error", + "Run demo/setup_demo_database.sh to build FAISS indices for your embedding provider.", + provider=provider, + embedding_model=embedding_model, + ) + ) + return {"issues": issues} + + +def check_manifest_compatibility(**kwargs: Any) -> dict[str, Any]: + manifest = kwargs.get("manifest") or {} + configured_provider = kwargs.get("configured_provider") + configured_model = kwargs.get("configured_embedding_model") + manifest_provider = manifest.get("provider") or manifest.get("embedding_provider") + manifest_model = manifest.get("embedding_model") + + mismatch = ( + (configured_provider and manifest_provider and str(configured_provider) != str(manifest_provider)) + or (configured_model and manifest_model and str(configured_model) != str(manifest_model)) + ) + if not mismatch: + return {"issues": []} + + return { + "issues": [ + _issue( + ISSUE_FAISS_MANIFEST_MISMATCH, + "error", + "Rebuild FAISS indices so provider and embedding model match your current config.", + configured_provider=configured_provider, + configured_embedding_model=configured_model, + manifest_provider=manifest_provider, + manifest_embedding_model=manifest_model, + ) + ] + } + + +def check_schema_staleness_readiness(**kwargs: Any) -> dict[str, Any]: + stale = _detect_schema_staleness(**kwargs) + if not stale: + return {"issues": []} + return { + "issues": [ + _issue( + ISSUE_SCHEMA_STALE, + "error", + "Rebuild schemas and indices because repository commits changed.", + ) + ] + } + + +def check_erf_build_readiness(**kwargs: Any) -> dict[str, Any]: + erf_repo_path = _as_path(kwargs.get("erf_repo_path")) + if erf_repo_path is None or not erf_repo_path.exists(): + return {"issues": []} + if _cmake_available(): + return {"issues": []} + return { + "issues": [ + _issue( + ISSUE_BUILD_POLICY, + "warning", + "CMake is unavailable; use the GNUmakefile build fallback for ERF.", + fallback="GNUmakefile fallback when CMake is unavailable", + ) + ] + } + + +def _load_manifest_for_provider(faiss_root: Path, provider: str) -> dict[str, Any]: + path = _manifest_path(faiss_root, provider) + if not path.exists(): + return {} + try: + return json.loads(path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + return {} + + +def _collect_readiness_issues(**kwargs: Any) -> list[dict[str, Any]]: + repo_root = Path(kwargs.get("repo_root") or ".") + config = kwargs.get("config") + provider = kwargs.get("provider") or getattr(config, "embedding_provider", "cborg") + embedding_model = kwargs.get("embedding_model") or getattr(config, "embedding_model", None) + faiss_root = Path(kwargs.get("faiss_root") or repo_root / "database" / "faiss") + + checks = [ + check_repo_readiness(repo_root=repo_root, erf_repo_path=kwargs.get("erf_repo_path")), + check_dependency_commit_alignment( + repo_root=repo_root, + erf_repo_path=kwargs.get("erf_repo_path"), + expected_dependencies=kwargs.get("expected_dependencies"), + ), + check_faiss_readiness( + faiss_root=faiss_root, + provider=str(provider), + embedding_model=str(embedding_model or ""), + ), + check_manifest_compatibility( + manifest=kwargs.get("manifest") or _load_manifest_for_provider(faiss_root, str(provider)), + configured_provider=provider, + configured_embedding_model=embedding_model, + ), + check_schema_staleness_readiness( + schema_root=Path(kwargs.get("schema_root") or repo_root / "database" / "schemas"), + repo_root=repo_root, + erf_repo_path=kwargs.get("erf_repo_path"), + solver=kwargs.get("solver") or "erf", + ), + check_erf_build_readiness(erf_repo_path=kwargs.get("erf_repo_path") or _erf_path(repo_root)), + ] + + issues: list[dict[str, Any]] = [] + for result in checks: + issues.extend(result.get("issues", [])) + return issues + + +def _has_blocking(issues: list[dict[str, Any]]) -> bool: + return any(str(issue.get("severity", "")).lower() == "error" for issue in issues) + + +def _config_repo_path(config: Any, repo_name: str) -> Path | None: + if config is None: + return None + normalized = str(repo_name or "").strip().lower() + attr_map = { + "erf": "erf_repo_path", + "pelec": "pelec_repo_path", + "pelelmex": "pelelmex_repo_path", + "amrex": "amrex_repo_path", + "remora": "remora_repo_path", + "warpx": "warpx_repo_path", + "incflo": "incflo_repo_path", + "amrex-tutorials": "amrex_tutorials_repo_path", + } + attr_name = attr_map.get(normalized) + if attr_name: + direct = _as_path(getattr(config, attr_name, None)) + if direct is not None: + return direct + + repositories = getattr(config, "repositories", None) + if isinstance(repositories, dict): + for key, value in repositories.items(): + if str(key).strip().lower() == normalized: + resolved = _as_path(value) + if resolved is not None: + return resolved + return None + + +def _is_git_repo(path: Path | None) -> bool: + return path is not None and path.exists() and (path / ".git").exists() + + +def _interactive_missing_repo_prompt(repo_name: str, custom_path: Path | None) -> str: + upper = repo_name.upper() + if custom_path is not None and not _is_git_repo(custom_path): + print(f"\n{upper} repository path is configured but unusable: {custom_path}") + else: + print(f"\n{upper} repository is missing.") + print("Choose an action:") + print(" 1) Clone pinned repository") + print(" 2) Enter custom local path") + print(" 3) Select from discovered local repositories") + print(" 4) Skip for now") + + while True: + response = input("Selection [1/2/3/4, default 4]: ").strip().lower() + if response in {"1", "clone"}: + return "clone" + if response in {"2", "custom"}: + return "custom" + if response in {"3", "select"}: + return "select" + if response in {"", "4", "skip"}: + return "skip" + print("Invalid selection. Enter 1, 2, 3, or 4.") + + +def _interactive_commit_mismatch_prompt( + repo_name: str, + expected_commit: str, + actual_commit: str, +) -> str: + upper = repo_name.upper() + print(f"\n{upper} commit mismatch detected.") + print(f" expected: {_short_sha(expected_commit)} ({expected_commit})") + print(f" actual : {_short_sha(actual_commit)} ({actual_commit})") + print("Choose an action:") + print(f" 1) Checkout pinned commit {_short_sha(expected_commit)}") + print(f" 2) Continue with current commit {_short_sha(actual_commit)}") + print(" 3) Continue with current commit + rebuild embeddings and inputs schema") + print(" 4) Checkout development + rebuild embeddings and inputs schema") + print(" 5) Abort preflight (safe default)") + + while True: + response = input("Selection [1/2/3/4/5, default 5]: ").strip().lower() + if response in {"1", "checkout"}: + return "checkout" + if response in {"2", "continue"}: + return "continue" + if response in {"3", "continue_rebuild"}: + return "continue_rebuild" + if response in {"4", "development_rebuild", "dev", "development"}: + return "development_rebuild" + if response in {"", "5", "abort"}: + return "abort" + print("Invalid selection. Enter 1, 2, 3, 4, or 5.") + + +def _run_rebuild_chain(repo_root: Path, erf_repo_path: Path) -> bool: + def _announce(message: str) -> None: + print(message, flush=True) + logger.info("%s", message) + + commands: list[tuple[list[str], bool]] = [ + ([ + "python", + "-u", + "database/scripts/build_schema.py", + str(erf_repo_path), + "--output", + "database/schemas", + "--auto-compose", + ], True), + ([ + "python", + "-u", + "scripts/rename_schema_after_build.py", + "--repo-root", + ".", + "--schemas-dir", + "database/schemas", + "--singleton-rename", + ], True), + ([ + "python", + "-u", + "database/scripts/build_all_indices.py", + "--level", + "1", + "--repo", + str(erf_repo_path), + "--output", + "database/faiss", + "--provider", + "cborg", + ], True), + ([ + "python", + "-u", + "database/scripts/build_all_indices.py", + "--level", + "2", + "--repo", + str(erf_repo_path), + "--output", + "database/faiss", + "--provider", + "cborg", + ], True), + ([ + "python", + "-u", + "database/scripts/build_index.py", + "--config", + "erf", + "--type", + "case_structure", + "--source", + str(erf_repo_path), + "--embedding", + "cborg", + "--embedding-model", + "lbl/nomic-embed-text", + "--provider", + "cborg", + ], True), + ([ + "python", + "-u", + "database/scripts/build_index.py", + "--config", + "erf", + "--type", + "case_details", + "--source", + str(erf_repo_path), + "--embedding", + "cborg", + "--embedding-model", + "lbl/nomic-embed-text", + "--provider", + "cborg", + ], True), + ([ + "python", + "-u", + "database/scripts/build_index.py", + "--config", + "erf", + "--type", + "input_templates", + "--source", + str(erf_repo_path), + "--embedding", + "cborg", + "--embedding-model", + "lbl/nomic-embed-text", + "--provider", + "cborg", + ], True), + ([ + "python", + "-u", + "database/scripts/build_all_indices.py", + "--check", + "--output", + "database/faiss", + "--provider", + "cborg", + ], False), + ] + _announce( + f"[preflight] Starting ERF embeddings/inputs-schema rebuild at: {erf_repo_path}" + ) + for index, (command, required) in enumerate(commands, start=1): + start_time = time.monotonic() + _announce(f"[preflight] Rebuild step {index}/{len(commands)} starting") + logger.info("Preflight rebuild command: %s", " ".join(command)) + result = subprocess.run( + command, + cwd=repo_root, + capture_output=True, + text=True, + check=False, + ) + elapsed = time.monotonic() - start_time + if result.returncode != 0: + level_msg = "FAILED" if required else "WARN" + _announce(f"[preflight] Rebuild step {index}/{len(commands)} {level_msg} in {elapsed:.1f}s") + if required: + logger.error( + "Rebuild command failed (%s): %s", + result.returncode, + " ".join(command), + ) + else: + logger.warning( + "Optional rebuild check failed (%s): %s", + result.returncode, + " ".join(command), + ) + stdout_tail = (result.stdout or "").strip().splitlines()[-10:] + stderr_tail = (result.stderr or "").strip().splitlines()[-10:] + if stdout_tail: + logger.error("stdout tail:\n%s", "\n".join(stdout_tail)) + if stderr_tail: + logger.error("stderr tail:\n%s", "\n".join(stderr_tail)) + if required: + return False + continue + _announce(f"[preflight] Rebuild step {index}/{len(commands)} complete in {elapsed:.1f}s") + _announce("[preflight] ERF embeddings/inputs-schema rebuild complete.") + return True + + +def _checkout_development_and_rebuild(repo_root: Path, repo_path: Path) -> bool: + if not _is_git_repo(repo_path): + return False + checkout_attempts = [["checkout", "development"], ["checkout", "HEAD~1"]] + for args in checkout_attempts: + result = subprocess.run( + ["git", "-C", str(repo_path), *args], + capture_output=True, + text=True, + check=False, + ) + if result.returncode == 0: + return _run_rebuild_chain(repo_root, repo_path) + return False + + +def _interactive_checkout_failure_prompt(repo_name: str, expected_commit: str) -> str: + print(f"Checkout to {_short_sha(expected_commit)} failed for {repo_name.upper()}.") + print("Choose next step:") + print(" 1) Retry checkout") + print(" 2) Continue with current commit") + print(" 3) Abort preflight") + while True: + response = input("Selection [1/2/3, default 3]: ").strip().lower() + if response in {"1", "retry"}: + return "retry" + if response in {"2", "continue"}: + return "continue" + if response in {"", "3", "abort"}: + return "abort" + print("Invalid selection. Enter 1, 2, or 3.") + + +def _discover_local_repo_candidates(repo_root: Path, repo_name: str) -> list[Path]: + repo_token = str(repo_name or "").lower() + candidates: dict[str, Path] = {} + + for base in (repo_root.parent, repo_root): + if not base.exists(): + continue + for child in base.iterdir(): + if not child.is_dir(): + continue + if repo_token not in child.name.lower(): + continue + if not _is_git_repo(child): + continue + candidates[str(child.resolve())] = child + + return [candidates[key] for key in sorted(candidates)] + + +def _candidate_index_status(head_commit: str, indexed_commits: set[str]) -> str: + if not head_commit: + return "unknown" + return "yes" if head_commit.lower() in indexed_commits else "no" + + +def _try_interactive_resolution( + *, + response: str, + repo_name: str, + repo_root: Path, + target_path: Path, + expected_dependencies: dict[str, Any], + discovered_candidates: list[Path] | None = None, + indexed_commits: set[str] | None = None, +) -> tuple[str, bool, Path | None]: + if response == "clone": + result = _clone_missing_repo( + repo_root=repo_root, + repo_name=repo_name, + target_path=str(target_path), + expected_dependencies=expected_dependencies, + ) + return (f"clone_missing:{repo_name}", bool(result.get("ok")), target_path if result.get("ok") else None) + if response == "custom": + custom_text = input(f"Enter the full path to your {repo_name.upper()} repository: ").strip() + custom_path = Path(custom_text) if custom_text else None + return (f"use_custom_path:{repo_name}", _is_git_repo(custom_path), custom_path if _is_git_repo(custom_path) else None) + if response == "select": + candidates = list(discovered_candidates or []) + if not candidates: + print("No discovered repositories are available for selection.") + return (f"select_discovered_repo:{repo_name}", False, None) + for idx, candidate in enumerate(candidates, start=1): + candidate_sha = _get_git_head_sha(candidate) + status = _candidate_index_status(candidate_sha, indexed_commits or set()) + print(f"[{idx}] {candidate}") + print(f" head={_short_sha(candidate_sha)} indexed_match={status}") + selected = input("Select candidate number: ").strip() + if not selected.isdigit(): + return (f"select_discovered_repo:{repo_name}", False, None) + selected_idx = int(selected) + if selected_idx < 1 or selected_idx > len(candidates): + return (f"select_discovered_repo:{repo_name}", False, None) + selected_repo = candidates[selected_idx - 1] + return (f"use_discovered_repo:{repo_name}", _is_git_repo(selected_repo), selected_repo if _is_git_repo(selected_repo) else None) + return ("", False, None) + + +def resolve_readiness_issues_noninteractive(**kwargs: Any) -> dict[str, Any]: + repo_root = Path(kwargs.get("repo_root") or ".") + issues = list(kwargs.get("issues") or []) + expected_dependencies = kwargs.get("expected_dependencies") or _read_dependencies(repo_root) + custom_repo_paths = kwargs.get("custom_repo_paths") or {} + config = kwargs.get("config") + allow_clone_missing = bool(kwargs.get("allow_clone_missing", False)) + + attempted_actions: list[str] = [] + resolved: list[dict[str, Any]] = [] + unresolved: list[dict[str, Any]] = [] + resolved_repo_paths: dict[str, str] = {} + + for issue in issues: + if issue.get("code") != ISSUE_ERF_REPO_MISSING: + unresolved.append(issue) + continue + + repo_name = str(issue.get("repo_name") or "erf").lower() + custom_path = _as_path(custom_repo_paths.get(repo_name)) or _config_repo_path(config, repo_name) + if _is_git_repo(custom_path): + attempted_actions.append(f"use_custom_path:{repo_name}") + resolved.append(issue) + resolved_repo_paths[repo_name] = str(custom_path) + continue + + sibling_path = Path(issue.get("target_path") or _erf_path(repo_root)) + if _is_git_repo(sibling_path): + attempted_actions.append(f"use_sibling_repo:{repo_name}") + resolved.append(issue) + resolved_repo_paths[repo_name] = str(sibling_path) + continue + + if allow_clone_missing: + clone_result = _clone_missing_repo( + repo_root=repo_root, + repo_name=repo_name, + target_path=str(sibling_path), + expected_dependencies=expected_dependencies, + ) + attempted_actions.append(f"clone_missing:{repo_name}") + if clone_result.get("ok"): + resolved.append(issue) + resolved_repo_paths[repo_name] = str(sibling_path) + continue + + unresolved.append(issue) + + exit_code = 1 if _has_blocking(unresolved) else 0 + return { + "mode": "noninteractive", + "attempted_actions": attempted_actions, + "resolved": resolved, + "unresolved": unresolved, + "resolved_repo_paths": resolved_repo_paths, + "exit_code": exit_code, + } + + +def resolve_readiness_issues_interactive(**kwargs: Any) -> dict[str, Any]: + repo_root = Path(kwargs.get("repo_root") or ".") + issues = list(kwargs.get("issues") or []) + expected_dependencies = kwargs.get("expected_dependencies") or _read_dependencies(repo_root) + custom_repo_paths = kwargs.get("custom_repo_paths") or {} + config = kwargs.get("config") + + attempted_actions: list[str] = [] + resolved: list[dict[str, Any]] = [] + unresolved: list[dict[str, Any]] = [] + resolved_repo_paths: dict[str, str] = {} + waived_issue_codes: set[str] = set() + + for issue in issues: + code = issue.get("code") + if code == ISSUE_ERF_COMMIT_MISMATCH: + repo_name = str(issue.get("repo_name") or "erf").lower() + repo_path = ( + _as_path(issue.get("repo_path")) + or _as_path(custom_repo_paths.get(repo_name)) + or _config_repo_path(config, repo_name) + or _erf_path(repo_root) + ) + expected_commit = str(issue.get("expected_commit") or "") + actual_commit = str(issue.get("actual_commit") or "") + response = _interactive_commit_mismatch_prompt(repo_name, expected_commit, actual_commit) + if response == "checkout": + attempted_actions.append(f"checkout_pinned_commit:{repo_name}") + while True: + if _is_git_repo(repo_path) and _checkout_repo_commit(repo_path, expected_commit): + resolved.append(issue) + resolved_repo_paths[repo_name] = str(repo_path) + break + next_step = _interactive_checkout_failure_prompt(repo_name, expected_commit) + if next_step == "retry": + attempted_actions.append(f"retry_checkout_pinned_commit:{repo_name}") + continue + if next_step == "continue": + attempted_actions.append(f"continue_with_current_commit:{repo_name}") + resolved.append(issue) + resolved_repo_paths[repo_name] = str(repo_path) + break + attempted_actions.append(f"abort_commit_mismatch:{repo_name}") + unresolved.append(issue) + break + if issue in resolved or issue in unresolved: + continue + unresolved.append(issue) + continue + if response == "continue": + attempted_actions.append(f"continue_with_current_commit:{repo_name}") + resolved.append(issue) + resolved_repo_paths[repo_name] = str(repo_path) + continue + if response == "continue_rebuild": + attempted_actions.append(f"continue_with_current_commit_rebuild:{repo_name}") + if _run_rebuild_chain(repo_root, repo_path): + resolved.append(issue) + resolved_repo_paths[repo_name] = str(repo_path) + waived_issue_codes.add(ISSUE_ERF_COMMIT_MISMATCH) + continue + unresolved.append(issue) + continue + if response == "development_rebuild": + attempted_actions.append(f"checkout_development_rebuild:{repo_name}") + if _checkout_development_and_rebuild(repo_root, repo_path): + resolved.append(issue) + resolved_repo_paths[repo_name] = str(repo_path) + waived_issue_codes.add(ISSUE_ERF_COMMIT_MISMATCH) + continue + unresolved.append(issue) + continue + attempted_actions.append(f"abort_commit_mismatch:{repo_name}") + unresolved.append(issue) + continue + + if code != ISSUE_ERF_REPO_MISSING: + unresolved.append(issue) + continue + + repo_name = str(issue.get("repo_name") or "erf").lower() + custom_path = _as_path(custom_repo_paths.get(repo_name)) or _config_repo_path(config, repo_name) + if _is_git_repo(custom_path): + attempted_actions.append(f"use_custom_path:{repo_name}") + resolved.append(issue) + resolved_repo_paths[repo_name] = str(custom_path) + continue + + target_path = Path(issue.get("target_path") or _erf_path(repo_root)) + if _is_git_repo(target_path): + attempted_actions.append(f"use_sibling_repo:{repo_name}") + resolved.append(issue) + resolved_repo_paths[repo_name] = str(target_path) + continue + + discovered_candidates = _discover_local_repo_candidates(repo_root, repo_name) + indexed_commits = _collect_indexed_commits(repo_root, repo_name) + response = _interactive_missing_repo_prompt(repo_name, custom_path) + action, ok, selected_path = _try_interactive_resolution( + response=response, + repo_name=repo_name, + repo_root=repo_root, + target_path=target_path, + expected_dependencies=expected_dependencies, + discovered_candidates=discovered_candidates, + indexed_commits=indexed_commits, + ) + if action: + attempted_actions.append(action) + if ok: + resolved.append(issue) + if selected_path is not None: + resolved_repo_paths[repo_name] = str(selected_path) + continue + + unresolved.append(issue) + + return { + "mode": "interactive", + "attempted_actions": attempted_actions, + "resolved": resolved, + "unresolved": unresolved, + "resolved_repo_paths": resolved_repo_paths, + "waived_issue_codes": sorted(waived_issue_codes), + "exit_code": 0, + } + + +def apply_interactive_fixes(**kwargs: Any) -> dict[str, Any]: + return resolve_readiness_issues_interactive(**kwargs) + + +def run_startup_readiness_checks(**kwargs: Any) -> dict[str, Any]: + repo_root = Path(kwargs.get("repo_root") or ".") + config = kwargs.get("config") + is_tty = bool(kwargs.get("is_tty", False)) + non_interactive = bool(getattr(config, "non_interactive", False)) + explicit_erf_path = kwargs.get("erf_repo_path") + source, deterministic = _resolution_source_for_erf(repo_root, config, explicit_erf_path) + erf_path = _erf_path(repo_root, explicit_erf_path) + repo_resolution_rows = [ + _repo_resolution_row( + repo_name="erf", + repo_path=erf_path, + source=source, + deterministic=deterministic, + ) + ] + _log_repo_resolution_table(repo_resolution_rows, "deterministic") + + ignore_issue_codes = { + str(code).strip() + for code in (kwargs.get("ignore_issue_codes") or []) + if str(code).strip() + } + issues = _collect_readiness_issues(**kwargs) + if ignore_issue_codes: + issues = [ + issue + for issue in issues + if str(issue.get("code") or "").strip() not in ignore_issue_codes + ] + if not issues: + return {"exit_code": 0, "issues": [], "repo_resolution_rows": repo_resolution_rows} + + if non_interactive or not is_tty: + result = resolve_readiness_issues_noninteractive( + repo_root=repo_root, + issues=issues, + allow_clone_missing=bool(kwargs.get("allow_clone_missing", False)), + expected_dependencies=kwargs.get("expected_dependencies") or _read_dependencies(repo_root), + custom_repo_paths=kwargs.get("custom_repo_paths"), + config=config, + ) + result.setdefault("issues", issues) + result.setdefault("repo_resolution_rows", repo_resolution_rows) + return result + + return { + "mode": "interactive", + "issues": issues, + "resolved": [], + "unresolved": issues, + "repo_resolution_rows": repo_resolution_rows, + "exit_code": 0, + } diff --git a/src/main.py b/src/main.py index 6211a64..6294ae7 100644 --- a/src/main.py +++ b/src/main.py @@ -22,6 +22,7 @@ from langgraph.graph import END, START, StateGraph from src.config import AMReXAgentConfig, load_config +from src.first_run import apply_interactive_fixes, run_startup_readiness_checks from src.models import GraphState from src.nodes import ( analysis_node, # Phase 4 @@ -36,6 +37,8 @@ route_after_reviewer, route_after_runner, # Phase 4 ) +from src.nodes.execution_intent_node import build_execution_intent, execution_intent_node +from src.nodes.visualization_intent_node import build_visualization_intent from src.services.viz_param_extractor import extract_viz_params_from_prompt from src.utils.job_status import normalize_job_status @@ -735,6 +738,121 @@ def _load_benchmark_context(path: str | None) -> dict[str, Any] | None: return data +def _is_tty_session() -> bool: + stdin_tty = bool(getattr(sys.stdin, "isatty", lambda: False)()) + stdout_tty = bool(getattr(sys.stdout, "isatty", lambda: False)()) + return stdin_tty and stdout_tty + + +def _log_preflight_issues(issues: list[dict[str, Any]]) -> None: + if not issues: + return + logger.error("Startup readiness preflight found unresolved issues:") + for issue in issues: + code = issue.get("code", "UNKNOWN") + severity = str(issue.get("severity", "unknown")).upper() + action = issue.get("suggested_action", "No suggested action provided.") + logger.error(" [%s] %s: %s", code, severity, action) + + +def _has_blocking_issues(issues: list[dict[str, Any]]) -> bool: + return any(str(issue.get("severity", "")).lower() == "error" for issue in issues) + + +def _run_startup_preflight(config: AMReXAgentConfig) -> None: + raw_repo_root = getattr(config, "amrex_agent_root", None) + if isinstance(raw_repo_root, Path): + repo_root = raw_repo_root + elif isinstance(raw_repo_root, (str, os.PathLike)): + repo_root = Path(raw_repo_root) + else: + repo_root = Path.cwd() + is_tty = _is_tty_session() + readiness_result = run_startup_readiness_checks( + repo_root=repo_root, + config=config, + is_tty=is_tty, + allow_clone_missing=is_tty, + erf_repo_path=getattr(config, "erf_repo_path", None), + ) + waived_issue_codes: set[str] = set() + + def _apply_resolved_repo_paths(result: dict[str, Any]) -> None: + resolved_repo_paths = result.get("resolved_repo_paths") or {} + if not isinstance(resolved_repo_paths, dict): + return + erf_path = resolved_repo_paths.get("erf") + if erf_path: + setattr(config, "erf_repo_path", Path(erf_path)) + + if ( + is_tty + and isinstance(readiness_result, dict) + and readiness_result.get("mode") == "interactive" + and readiness_result.get("issues") + ): + readiness_result = apply_interactive_fixes( + repo_root=repo_root, + config=config, + issues=readiness_result.get("issues") or [], + ) + waived_issue_codes.update(str(code) for code in (readiness_result.get("waived_issue_codes") or [])) + _apply_resolved_repo_paths(readiness_result) + + unresolved_after_interactive = list(readiness_result.get("unresolved") or []) + if unresolved_after_interactive: + unresolved_codes = { + str(issue.get("code") or "").strip() + for issue in unresolved_after_interactive + if isinstance(issue, dict) + } + attempted_actions = list(readiness_result.get("attempted_actions") or []) + attempted_rebuild = any("rebuild" in str(action) for action in attempted_actions) + if attempted_rebuild and "ERF_COMMIT_MISMATCH" in unresolved_codes: + logger.warning( + "Skipping immediate second interactive remediation pass after rebuild failure." + ) + unresolved = unresolved_after_interactive + readiness_result.setdefault("issues", unresolved) + readiness_result["exit_code"] = 1 + _log_preflight_issues(unresolved) + raise ValueError("Startup readiness preflight failed. Resolve blocking issues and retry.") + + # Re-run checks immediately so post-selection commit mismatch and other + # follow-on gates are evaluated in the same preflight session. + followup_result = run_startup_readiness_checks( + repo_root=repo_root, + config=config, + is_tty=is_tty, + allow_clone_missing=False, + erf_repo_path=getattr(config, "erf_repo_path", None), + ignore_issue_codes=sorted(waived_issue_codes), + ) + if followup_result.get("mode") == "interactive" and followup_result.get("issues"): + followup_result = apply_interactive_fixes( + repo_root=repo_root, + config=config, + issues=followup_result.get("issues") or [], + ) + waived_issue_codes.update(str(code) for code in (followup_result.get("waived_issue_codes") or [])) + _apply_resolved_repo_paths(followup_result) + readiness_result = followup_result + + unresolved = list(readiness_result.get("unresolved") or readiness_result.get("issues") or []) + exit_code = int(readiness_result.get("exit_code") or 0) + if not unresolved and exit_code == 0: + return + + _log_preflight_issues(unresolved) + if _has_blocking_issues(unresolved) or exit_code != 0: + if not is_tty: + logger.error( + "Interactive remediation is disabled in non-TTY mode. Re-run from a terminal " + "without output redirection to enable interactive fixes." + ) + raise ValueError("Startup readiness preflight failed. Resolve blocking issues and retry.") + + def _resolve_metrics_workflow_id( result: dict[str, Any], benchmark_context: dict[str, Any] | None, @@ -906,6 +1024,7 @@ def main(args: list[str] | None = None) -> None: apply_privacy_log_filter(config) _warn_if_schema_missing(config, getattr(parsed_args, "baseline_override", None)) + _run_startup_preflight(config) # Disable schema validator temporarily (modifications format issue) # config.disabled_validators = ["SchemaSyntaxValidator"] # Re-enabled for parameter resolution @@ -1130,6 +1249,19 @@ def initialize_state( raise ValueError("User requirement prompt cannot be empty") requested_plot_vars, visualization_config = extract_viz_params_from_prompt(prompt_content) + visualization_intent = build_visualization_intent( + prompt=prompt_content, + solver_name="", + repo_root=None, + requested_plot_vars=requested_plot_vars, + visualization_config=visualization_config, + prior_intent=None, + ).model_dump() + execution_intent = build_execution_intent( + prompt=prompt_content, + resolved_config={}, + prior_intent=None, + ).model_dump() # 3. Initialize state with defaults return { @@ -1138,6 +1270,8 @@ def initialize_state( "config": config, "requested_plot_vars": requested_plot_vars, "visualization_config": visualization_config, + "visualization_intent": visualization_intent, + "execution_intent": execution_intent, "paper_source": paper_source, "paper_input_type": paper_input_type, "paper_validator_enabled": paper_validator_enabled, @@ -1179,6 +1313,7 @@ def create_amrex_agent_graph(checkpointer: Any = None) -> StateGraph: workflow.add_node("architect", architect_node) workflow.add_node("reviewer", reviewer_node) workflow.add_node("input_writer", input_writer_node) + workflow.add_node("execution_intent", execution_intent_node) workflow.add_node("runner", runner_node) workflow.add_node("analysis", analysis_node) workflow.add_node("visualization", visualization_node) @@ -1208,7 +1343,8 @@ def create_amrex_agent_graph(checkpointer: Any = None) -> StateGraph: ) # 4. Linear execution path - workflow.add_edge("input_writer", "runner") + workflow.add_edge("input_writer", "execution_intent") + workflow.add_edge("execution_intent", "runner") # 4b. Conditional routing from runner (check for failures) workflow.add_conditional_edges( diff --git a/src/mcp_tools.py b/src/mcp_tools.py index e3febcd..1cfbb2b 100644 --- a/src/mcp_tools.py +++ b/src/mcp_tools.py @@ -552,7 +552,7 @@ def mcp_run_simulation(payload: dict) -> dict: if dry_run and executable_path is None and case_dir: dry_run_steps.append( - f"Skipping compile in {case_dir}: make USE_MPI=TRUE", + f"Skipping compile in {case_dir}: nice make -j12 USE_MPI=TRUE DEBUG=FALSE", ) dry_run_steps.append( f"Skipping run directory setup under {active_config.output_dir}", diff --git a/src/models.py b/src/models.py index ff656f4..1fdfeff 100644 --- a/src/models.py +++ b/src/models.py @@ -69,6 +69,8 @@ class GraphState(TypedDict, total=False): # ======================================== # Visualization Outputs (Phase 4/5) # ======================================== + execution_intent: Optional[Dict[str, Any]] # Canonical pre-run execution intent + visualization_intent: Optional[Dict[str, Any]] # Canonical pre-run visualization intent visualization_images: Optional[List[str]] # Paths to generated images # Phase 5 Workflow Integration - Visualization metadata diff --git a/src/models/execution_intent.py b/src/models/execution_intent.py new file mode 100644 index 0000000..4fe07ce --- /dev/null +++ b/src/models/execution_intent.py @@ -0,0 +1,25 @@ +""" +Typed execution intent contract. +""" + +from __future__ import annotations + +from typing import Any, Literal + +from pydantic import BaseModel, Field + + +class ExecutionIntent(BaseModel): + """Canonical execution/runtime intent shared across parsing and runner.""" + + environment: Literal["local", "perlmutter", "mcp"] | None = None + run_mode: Literal["dry", "stage", "submit", "full"] | None = None + total_procs: int | None = None + walltime: str | None = None + qos: str | None = None + constraint: str | None = None + account: str | None = None + system: str | None = None + source: Literal["prompt", "clarification", "default"] = "default" + adjustments: list[str] = Field(default_factory=list) + execution_config: dict[str, Any] = Field(default_factory=dict) diff --git a/src/models/graph_state_canonical.py b/src/models/graph_state_canonical.py index c8cb947..60fdea4 100644 --- a/src/models/graph_state_canonical.py +++ b/src/models/graph_state_canonical.py @@ -51,8 +51,14 @@ class GraphState(TypedDict, total=False): config: AMReXAgentConfig # Runtime configuration (paths, API keys) output_dir: Optional[str] # Optional output directory override submit: Optional[Dict[str, Any]] # Submission settings (e.g., dry_run) + execution_intent: Optional[Dict[str, Any]] # Canonical execution intent contract requested_plot_vars: Optional[List[str]] # Prompt-extracted plot quantities visualization_config: Optional[Dict[str, Any]] # Prompt-extracted visualization settings + visualization_intent: Optional[Dict[str, Any]] # Canonical visualization intent contract + visualization_mapping_candidates: Optional[Dict[str, Any]] + visualization_mapping_unresolved: Optional[List[str]] + visualization_mapping_source: Optional[str] + visualization_mapping_confidence: Optional[float] # ======================================== # PLANNING PHASE (Architect outputs) diff --git a/src/models/visualization_intent.py b/src/models/visualization_intent.py new file mode 100644 index 0000000..4ecdc4d --- /dev/null +++ b/src/models/visualization_intent.py @@ -0,0 +1,35 @@ +""" +Typed visualization intent contract. +""" + +from __future__ import annotations + +from typing import Any, Literal + +from pydantic import BaseModel, Field + + +class VisualizationPlotSpec(BaseModel): + """Optional explicit render request for a single plot.""" + + type: str = "slice" + field: str + axis: str | None = None + + +class VisualizationIntent(BaseModel): + """ + Canonical visualization intent shared across planning, writing, and rendering. + """ + + requested_fields: list[str] = Field(default_factory=list) + cadence_prompt_seconds: int | None = None + cadence_solver_time: float | None = None + timestep_scope: Literal["latest", "all"] = "latest" + plots: list[VisualizationPlotSpec] = Field(default_factory=list) + solver_name: str | None = None + source: Literal["prompt", "clarification", "default"] = "default" + adjustments: list[str] = Field(default_factory=list) + + # Compatibility carrier for current writer/renderer logic. + visualization_config: dict[str, Any] = Field(default_factory=dict) diff --git a/src/nodes/clarification_handler_node.py b/src/nodes/clarification_handler_node.py index 3c5eb35..71b3646 100644 --- a/src/nodes/clarification_handler_node.py +++ b/src/nodes/clarification_handler_node.py @@ -48,6 +48,16 @@ def clarification_handler_node(state: dict[str, Any]) -> dict[str, Any]: "clarification_turns": turns + 1, "skip_further_clarification": False, } + if answered_by == "ai_agent" and not _is_allowed_candidate_response( + pending_record.get("question", {}), + response, + ): + return { + "clarification_history": history, + "clarification_needed": True, + "clarification_turns": turns + 1, + "skip_further_clarification": False, + } updated_record = _resolve_record(pending_record, response, answered_by) history[pending_index] = updated_record @@ -120,7 +130,15 @@ def _apply_resolved_value( if decision_level == 4 or field_name in _PLOT_VAR_FIELDS: requested_plot_vars = list(state.get("requested_plot_vars") or []) merged = _merge_plot_vars(requested_plot_vars, resolved_value) - return {"requested_plot_vars": merged} + intent = dict(state.get("visualization_intent") or {}) + if not isinstance(intent, dict): + intent = {} + existing_requested = intent.get("requested_fields", intent.get("requested_plot_vars", [])) + if not isinstance(existing_requested, list): + existing_requested = [] + intent_merged = _merge_plot_vars(existing_requested, resolved_value) + intent["requested_fields"] = intent_merged + return {"requested_plot_vars": merged, "visualization_intent": intent} if not field_name: return {} @@ -169,6 +187,18 @@ def _merge_plot_vars(current: list[Any], resolved_value: str) -> list[str]: return merged +def _is_allowed_candidate_response(question: dict[str, Any], response: str) -> bool: + question_data = _question_to_dict(question) + context = question_data.get("context", {}) + if not isinstance(context, dict): + return True + allowed = context.get("candidates") + if not isinstance(allowed, list) or not allowed: + return True + allowed_set = {str(v).strip() for v in allowed if str(v).strip()} + return str(response).strip() in allowed_set + + def _as_history(value: Any) -> list[dict[str, Any]]: if not isinstance(value, list): return [] diff --git a/src/nodes/clarification_node.py b/src/nodes/clarification_node.py index 6484049..e4601e5 100644 --- a/src/nodes/clarification_node.py +++ b/src/nodes/clarification_node.py @@ -6,11 +6,11 @@ from src.models import GraphState from src.models.clarification_schemas import ClarificationQuestion, ClarificationRecord +from src.services.viz_param_extractor import get_plot_var_param_candidates REQUIRED_FIELDS = ("n_cell", "max_level", "stop_time", "max_step") RESOURCE_FIELDS = ("node_count", "time_limit", "cluster") -PLOTFILE_VAR_KEYS = ("amr.plot_vars", "peleLM.derive_plot_vars", "plot_vars") MAX_CLARIFICATION_TURNS = 3 @@ -261,8 +261,41 @@ def _check_level_4_visualization( prompt: str, requested_plot_vars: Any, ) -> ClarificationQuestion | None: - del state, locked_fields, prompt - if requested_plot_vars == [] and not _has_plotfile_var(resolved): + del locked_fields, prompt + mapping_candidates = state.get("visualization_mapping_candidates") + mapping_unresolved = state.get("visualization_mapping_unresolved") + if isinstance(mapping_candidates, dict) and mapping_candidates: + token = next(iter(mapping_candidates.keys())) + entries = mapping_candidates.get(token, []) + names: list[str] = [] + if isinstance(entries, list): + for entry in entries: + if isinstance(entry, dict): + name = str(entry.get("name", "")).strip() + if name: + names.append(name) + if names: + return ClarificationQuestion( + field_name="requested_plot_vars", + question_text=f"Which field should represent '{token}' in visualization output?", + decision_level=4, + fallback_tier="amrex_generic", + context={ + "reason": "visualization_mapping_ambiguity", + "token": token, + "candidates": names, + }, + ) + if isinstance(mapping_unresolved, list) and mapping_unresolved: + token = str(mapping_unresolved[0]).strip() + return ClarificationQuestion( + field_name="requested_plot_vars", + question_text=f"No solver field matched '{token}'. Which plot variable should be used?", + decision_level=4, + fallback_tier="amrex_generic", + context={"reason": "visualization_mapping_unresolved", "token": token, "candidates": []}, + ) + if requested_plot_vars == [] and not _has_plotfile_var(resolved, state): return ClarificationQuestion( field_name="plot_vars", question_text="Which variables should be written to plotfiles for visualization?", @@ -386,7 +419,7 @@ def _base_context( "missing_fields": missing_fields, "ambiguous_fields": [], "requested_plot_vars_empty": requested_plot_vars == [], - "missing_plotfile_vars": requested_plot_vars == [] and not _has_plotfile_var(resolved), + "missing_plotfile_vars": requested_plot_vars == [] and not _has_plotfile_var(resolved, None), } @@ -406,8 +439,12 @@ def _fallback_tier_for_field(field: str) -> str: return "free_text" -def _has_plotfile_var(resolved: dict[str, Any]) -> bool: - for key in PLOTFILE_VAR_KEYS: +def _has_plotfile_var(resolved: dict[str, Any], state: GraphState | None) -> bool: + solver = "" + if isinstance(state, dict): + solver = str(state.get("selected_solver") or "").strip() + keys = get_plot_var_param_candidates(solver) + ["plot_vars"] + for key in keys: if _has_value(resolved.get(key)): return True return False diff --git a/src/nodes/execution_intent_node.py b/src/nodes/execution_intent_node.py new file mode 100644 index 0000000..b495151 --- /dev/null +++ b/src/nodes/execution_intent_node.py @@ -0,0 +1,215 @@ +""" +Execution intent normalization node. + +Builds a canonical execution_intent object from prompt + resolved config context. +""" + +from __future__ import annotations + +import re +from typing import Any + +from src.models import GraphState +from src.models.execution_intent import ExecutionIntent + +_PROCS_RE = re.compile( + r"\b(\d+)\s*(?:mpi\s*)?(?:proc|procs|process(?:es)?|rank|ranks|task|tasks|ntasks?)\b", + re.IGNORECASE, +) +_WALL_HOURS_RE = re.compile(r"\b(\d+)\s*(?:h|hr|hrs|hour|hours)\b", re.IGNORECASE) +_WALL_MINS_RE = re.compile(r"\b(\d+)\s*(?:m|min|mins|minute|minutes)\b", re.IGNORECASE) + + +def _coerce_positive_int(value: Any) -> int | None: + try: + candidate = int(value) + except (TypeError, ValueError): + return None + return candidate if candidate > 0 else None + + +def _coerce_walltime(value: Any) -> str | None: + if not isinstance(value, str): + return None + token = value.strip() + if not token: + return None + if re.fullmatch(r"\d{2}:\d{2}:\d{2}", token): + return token + return None + + +def _read_execution_config_from_resolved(resolved: dict[str, Any]) -> dict[str, Any]: + execution = resolved.get("execution") + if isinstance(execution, dict): + return dict(execution) + return {} + + +def _extract_prompt_environment(prompt: str) -> str | None: + lower = prompt.lower() + if "perlmutter" in lower: + return "perlmutter" + if "local" in lower: + return "local" + if "mcp" in lower: + return "mcp" + return None + + +def _extract_prompt_run_mode(prompt: str) -> str | None: + lower = prompt.lower() + if "dry run" in lower or "run_mode dry" in lower: + return "dry" + if "stage only" in lower or "run_mode stage" in lower: + return "stage" + if "submit only" in lower or "run_mode submit" in lower: + return "submit" + if "full run" in lower or "run_mode full" in lower: + return "full" + return None + + +def _extract_prompt_total_procs(prompt: str) -> int | None: + match = _PROCS_RE.search(prompt) + if not match: + return None + return _coerce_positive_int(match.group(1)) + + +def _extract_prompt_walltime(prompt: str) -> str | None: + hours_match = _WALL_HOURS_RE.search(prompt) + mins_match = _WALL_MINS_RE.search(prompt) + if not hours_match and not mins_match: + return None + hours = int(hours_match.group(1)) if hours_match else 0 + mins = int(mins_match.group(1)) if mins_match else 0 + mins = mins % 60 + return f"{hours:02d}:{mins:02d}:00" + + +def _parse_from_prompt(prompt: str) -> dict[str, Any]: + return { + "environment": _extract_prompt_environment(prompt), + "run_mode": _extract_prompt_run_mode(prompt), + "total_procs": _extract_prompt_total_procs(prompt), + "walltime": _extract_prompt_walltime(prompt), + } + + +def _merge_execution_values(resolved: dict[str, Any], prompt: str, prior: dict[str, Any]) -> tuple[dict[str, Any], str]: + execution = _read_execution_config_from_resolved(resolved) + prompt_values = _parse_from_prompt(prompt) + + merged: dict[str, Any] = {} + merged.update(prompt_values) + merged.update(prior) + merged.update(execution) + # Flat legacy aliases on resolved_config take precedence over nested defaults. + for source_key in ("environment", "run_mode", "run_ntasks", "mpi_ranks", "total_procs"): + if source_key in resolved: + merged[source_key] = resolved.get(source_key) + + source = "default" + if any(prompt_values.values()): + source = "prompt" + if execution: + source = "clarification" + if prior: + source = str(prior.get("source", source)) + if source not in {"prompt", "clarification", "default"}: + source = "default" + return merged, source + + +def build_execution_intent( + *, + prompt: str, + resolved_config: dict[str, Any] | None = None, + prior_intent: dict[str, Any] | None = None, +) -> ExecutionIntent: + resolved = dict(resolved_config or {}) + prior = dict(prior_intent or {}) + merged, source = _merge_execution_values(resolved, prompt, prior) + + total_procs = ( + _coerce_positive_int(merged.get("run_ntasks")) + or _coerce_positive_int(merged.get("mpi_ranks")) + or _coerce_positive_int(merged.get("total_procs")) + ) + walltime = _coerce_walltime(merged.get("walltime")) or _extract_prompt_walltime(prompt) + environment = merged.get("environment") + run_mode = merged.get("run_mode") + + if isinstance(environment, str): + environment = environment.strip().lower() or None + else: + environment = None + if isinstance(run_mode, str): + run_mode = run_mode.strip().lower() or None + else: + run_mode = None + + payload = { + "environment": environment, + "run_mode": run_mode, + "total_procs": total_procs, + "walltime": walltime, + "qos": merged.get("qos"), + "constraint": merged.get("constraint"), + "account": merged.get("account") or merged.get("superfacility_account"), + "system": merged.get("system"), + "source": source, + "adjustments": list(prior.get("adjustments", [])) if isinstance(prior.get("adjustments"), list) else [], + "execution_config": execution_payload_from_merged(merged, total_procs, walltime, environment, run_mode), + } + return ExecutionIntent.model_validate(payload) + + +def execution_payload_from_merged( + merged: dict[str, Any], + total_procs: int | None, + walltime: str | None, + environment: str | None, + run_mode: str | None, +) -> dict[str, Any]: + payload = dict(merged.get("execution_config", {})) if isinstance(merged.get("execution_config"), dict) else {} + if total_procs is not None: + payload["total_procs"] = total_procs + if walltime is not None: + payload["walltime"] = walltime + if environment is not None: + payload["environment"] = environment + if run_mode is not None: + payload["run_mode"] = run_mode + return payload + + +def resolve_execution_intent(state: dict[str, Any]) -> dict[str, Any]: + existing = state.get("execution_intent") + if isinstance(existing, dict): + try: + return ExecutionIntent.model_validate(existing).model_dump() + except Exception: + pass + + prompt = str(state.get("prompt") or state.get("user_requirement") or "") + resolved_config = state.get("resolved_config") + model = build_execution_intent( + prompt=prompt, + resolved_config=resolved_config if isinstance(resolved_config, dict) else {}, + prior_intent=None, + ) + return model.model_dump() + + +def execution_intent_node(state: GraphState) -> dict[str, Any]: + prompt = str(state.get("prompt") or state.get("user_requirement") or "") + resolved_config = state.get("resolved_config") if isinstance(state.get("resolved_config"), dict) else {} + prior_intent = state.get("execution_intent") if isinstance(state.get("execution_intent"), dict) else {} + model = build_execution_intent( + prompt=prompt, + resolved_config=resolved_config, + prior_intent=prior_intent, + ) + return {"execution_intent": model.model_dump()} diff --git a/src/nodes/input_writer_node.py b/src/nodes/input_writer_node.py index c9a316e..7879fa8 100644 --- a/src/nodes/input_writer_node.py +++ b/src/nodes/input_writer_node.py @@ -11,6 +11,7 @@ from typing import Any from src.models import GraphState +from src.nodes.visualization_intent_node import resolve_visualization_intent from src.services.input_writer import InputWriterService from src.utils.gate import run_preconfirm_gate @@ -113,7 +114,9 @@ def input_writer_node(state: GraphState) -> dict[str, Any]: modifications = plan_details.get("modifications", []) baseline = plan_details.get("baseline") reasoning = plan_details.get("reasoning", "") - requested_plot_vars = state.get("requested_plot_vars", []) or [] + vis_intent = resolve_visualization_intent(state) + requested_plot_vars = vis_intent.get("requested_fields", []) or [] + visualization_config = vis_intent.get("visualization_config", {}) or {} logger.debug(f"[InputWriter] Plan extracted from workflow_history: {selected_case}") logger.debug(f"[InputWriter] Extracted {len(modifications)} modifications: {modifications[:3]}...") @@ -228,6 +231,7 @@ def _should_prefer_strategy_on_retry(state: GraphState) -> bool: "user_prompt": (state.get("prompt") or state.get("user_prompt") or ""), "output_dir": str(run_dir), # Service physically creates this "requested_plot_vars": requested_plot_vars, + "visualization_config": visualization_config, } signature = inspect.signature(service.apply_plan) params = signature.parameters diff --git a/src/nodes/runner_node.py b/src/nodes/runner_node.py index d4af90b..407fb57 100644 --- a/src/nodes/runner_node.py +++ b/src/nodes/runner_node.py @@ -5,11 +5,13 @@ """ import inspect import logging +import os from datetime import datetime from pathlib import Path from typing import Any from src.models import GraphState +from src.nodes.execution_intent_node import resolve_execution_intent from src.services.run_superfacility import SuperfacilityRunner from src.services.run_superfacility_tools import stage_out_outputs from src.utils.gate import run_preconfirm_gate @@ -18,6 +20,89 @@ logger = logging.getLogger(__name__) +def _default_perlmutter_root(config: Any) -> Path: + configured = getattr(config, "remote_output_dir", None) + if configured: + return Path(os.path.expandvars(str(configured))).expanduser() + return Path("/global/cfs/cdirs") + + +def _is_perlmutter_reachable(config: Any) -> tuple[bool, str]: + target = _default_perlmutter_root(config) + try: + if not target.exists(): + return False, f"missing_path:{target}" + if not os.access(target, os.R_OK): + return False, f"not_readable:{target}" + next(target.iterdir(), None) + return True, f"ok:{target}" + except Exception as exc: + return False, f"probe_error:{exc}" + + +def _effective_runtime_from_intent(config: Any, state: GraphState) -> tuple[dict[str, Any], list[str]]: + intent = resolve_execution_intent(state) + adjustments = list(intent.get("adjustments", [])) if isinstance(intent.get("adjustments"), list) else [] + + detected_environment = str(getattr(config, "environment", "local") or "local") + try: + from src.config import detect_environment + + host_environment = detect_environment() + except Exception: + host_environment = detected_environment + allow_prompt_environment = detected_environment == host_environment + + if allow_prompt_environment and isinstance(intent.get("environment"), str): + environment = intent["environment"] + else: + environment = detected_environment + intent_environment = intent.get("environment") if isinstance(intent.get("environment"), str) else None + + configured_ranks = getattr(config, "mpi_ranks", 1) + total_procs = _coerce_positive_int(configured_ranks) or 1 + if total_procs == 1 and isinstance(intent.get("total_procs"), int) and intent["total_procs"] > 0: + total_procs = intent["total_procs"] + + run_mode = str(getattr(config, "run_mode", "full") or "full") + if run_mode == "full" and isinstance(intent.get("run_mode"), str): + run_mode = intent["run_mode"] + + walltime = "00:10:00" + if isinstance(intent.get("walltime"), str): + walltime = intent["walltime"] + qos = str(intent.get("qos") or "regular") + constraint = str(intent.get("constraint") or "gpu&hbm40g") + account = intent.get("account") + system = str(intent.get("system") or "perlmutter") + + if environment == "perlmutter" and intent_environment == "perlmutter": + reachable, reason = _is_perlmutter_reachable(config) + if not reachable: + environment = "local" + adjustments.append("environment_fallback_perlmutter_unreachable") + adjustments.append(reason) + + return { + "environment": environment, + "total_procs": max(1, int(total_procs)), + "run_mode": run_mode, + "walltime": walltime, + "qos": qos, + "constraint": constraint, + "account": account, + "system": system, + }, adjustments + + +def _coerce_positive_int(value: Any) -> int | None: + try: + candidate = int(value) + except (TypeError, ValueError): + return None + return candidate if candidate > 0 else None + + def runner_node(state: GraphState) -> dict[str, Any]: """ Execute the simulation job for the prepared run directory. @@ -115,7 +200,9 @@ def runner_node(state: GraphState) -> dict[str, Any]: compile_gate_entry = None run_gate_entry = None try: - run_mode = getattr(config, "run_mode", None) + runtime, runtime_adjustments = _effective_runtime_from_intent(config, state) + + run_mode = runtime.get("run_mode") if run_mode is None or run_mode == "full": if getattr(config, "dry_run", False): run_mode = "dry" @@ -126,7 +213,7 @@ def runner_node(state: GraphState) -> dict[str, Any]: node_name="runner_compile", summary_lines=[ "This step compiles/links the executable and prepares the run directory.", - f"Environment: {config.environment}", + f"Environment: {runtime.get('environment')}", f"Run mode: {run_mode}", f"Run directory: {run_directory}", f"Inputs file: {inputs_file_path}", @@ -156,13 +243,13 @@ def runner_node(state: GraphState) -> dict[str, Any]: run_after_compile = False # Select runner based on environment - if config.environment == "local": + if runtime.get("environment") == "local": from src.services.run_local import LocalRunner runner = LocalRunner(config) logger.info("Using LocalRunner for local execution") else: runner = SuperfacilityRunner(config) - logger.info(f"Using SuperfacilityRunner for {config.environment}") + logger.info(f"Using SuperfacilityRunner for {runtime.get('environment')}") # Setup job (Runner Node: Executable Resolution: Executable Discovery & Linking) # Service handles: @@ -223,7 +310,7 @@ def runner_node(state: GraphState) -> dict[str, Any]: summary_lines=[ "This step submits the job to run.", f"Run directory: {actual_run_dir}", - f"Environment: {config.environment}", + f"Environment: {runtime.get('environment')}", f"Run mode: {run_mode}", ], options=[{"label": "Submit run", "value": "run_now"}], @@ -256,7 +343,17 @@ def runner_node(state: GraphState) -> dict[str, Any]: if submit_sig: params = submit_sig.parameters if "nodes" in params: - submit_kwargs["nodes"] = getattr(config, "mpi_ranks", 1) + submit_kwargs["nodes"] = runtime.get("total_procs", 1) + if "walltime" in params: + submit_kwargs["walltime"] = runtime.get("walltime", "00:10:00") + if "qos" in params: + submit_kwargs["qos"] = runtime.get("qos", "regular") + if "constraint" in params: + submit_kwargs["constraint"] = runtime.get("constraint", "gpu&hbm40g") + if "account" in params and runtime.get("account"): + submit_kwargs["account"] = runtime.get("account") + if "system" in params: + submit_kwargs["system"] = runtime.get("system", "perlmutter") if "run_mode" in params: submit_kwargs["run_mode"] = run_mode if "dry_run" in params: @@ -266,7 +363,7 @@ def runner_node(state: GraphState) -> dict[str, Any]: submit_result = runner.submit(**submit_kwargs) - if config.environment != "local": + if runtime.get("environment") != "local": monitor_enabled = getattr(config, "monitor_job", True) job_status = submit_result.get("job_status") monitor_states = {None, "queued", "pending", "running", "submitted"} @@ -334,6 +431,8 @@ def runner_node(state: GraphState) -> dict[str, Any]: "job_id": job_id, "script_path": submit_result.get("script_path"), "run_directory": str(actual_run_dir), + "runtime_effective": runtime, + "runtime_adjustments": runtime_adjustments, } } diff --git a/src/nodes/visualization_intent_node.py b/src/nodes/visualization_intent_node.py new file mode 100644 index 0000000..77ea3c5 --- /dev/null +++ b/src/nodes/visualization_intent_node.py @@ -0,0 +1,285 @@ +""" +Visualization intent normalization node. + +Builds a canonical visualization_intent object from prompt + solver context. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from src.models import GraphState +from src.models.visualization_intent import VisualizationIntent, VisualizationPlotSpec +from src.services.viz_param_extractor import ( + convert_prompt_seconds_to_solver_time, + extract_viz_params_from_prompt, + resolve_viz_field_mapping, +) + + +def _dedupe_preserve_order(values: list[str]) -> list[str]: + seen: set[str] = set() + deduped: list[str] = [] + for value in values: + token = str(value).strip() + if not token or token in seen: + continue + seen.add(token) + deduped.append(token) + return deduped + + +def _infer_solver_name(state: dict[str, Any]) -> str: + plan = state.get("plan") or {} + baseline = plan.get("baseline") if isinstance(plan, dict) else {} + if not isinstance(baseline, dict): + baseline = {} + + if isinstance(state.get("selected_solver"), str) and state.get("selected_solver"): + return str(state.get("selected_solver")) + if isinstance(plan.get("selected_solver"), str) and plan.get("selected_solver"): + return str(plan.get("selected_solver")) + if isinstance(baseline.get("code_name"), str) and baseline.get("code_name"): + return str(baseline.get("code_name")) + + history = state.get("workflow_history") + if isinstance(history, list): + for entry in reversed(history): + if not isinstance(entry, dict) or entry.get("node") != "architect": + continue + details = entry.get("details") + if not isinstance(details, dict): + continue + baseline_details = details.get("baseline") + if isinstance(baseline_details, dict): + code_name = baseline_details.get("code_name") or baseline_details.get("code") + if isinstance(code_name, str) and code_name.strip(): + return code_name.strip() + return "" + + +def _infer_repo_root(state: dict[str, Any], solver_name: str) -> str | None: + config = state.get("config") + repos = getattr(config, "repositories", None) + if isinstance(repos, dict): + repo_path = repos.get(solver_name) + if repo_path: + return str(repo_path) + + plan = state.get("plan") or {} + baseline = plan.get("baseline") if isinstance(plan, dict) else {} + if isinstance(baseline, dict): + repo_path = baseline.get("repo_path") + if repo_path: + return str(repo_path) + return None + + +def build_visualization_intent( + *, + prompt: str, + solver_name: str = "", + repo_root: str | Path | None = None, + requested_plot_vars: list[str] | None = None, + visualization_config: dict[str, Any] | None = None, + prior_intent: dict[str, Any] | None = None, + mapping_diagnostics_out: dict[str, Any] | None = None, +) -> VisualizationIntent: + """ + Build a canonical visualization_intent payload. + + precedence: + - explicit requested_plot_vars / visualization_config / prior_intent + augment prompt-derived extraction. + """ + extracted_vars, extracted_config = extract_viz_params_from_prompt( + prompt or "", + code_name=solver_name or None, + repo_root=repo_root, + ) + + prior = prior_intent if isinstance(prior_intent, dict) else {} + prior_fields = prior.get("requested_fields", []) + if not isinstance(prior_fields, list): + prior_fields = [] + prior_vars = prior.get("requested_plot_vars", []) + if not isinstance(prior_vars, list): + prior_vars = [] + + merged_requested = _dedupe_preserve_order( + extracted_vars + + list(requested_plot_vars or []) + + list(prior_fields) + + list(prior_vars) + ) + mapping_diagnostics: dict[str, Any] = { + "resolved_fields": list(merged_requested), + "candidate_fields_by_token": {}, + "unresolved_tokens": [], + "ambiguous_tokens": [], + "mapping_source": "semantic_only" if merged_requested else "none", + "mapping_confidence": 1.0, + } + if solver_name and merged_requested: + mapping_diagnostics = resolve_viz_field_mapping( + merged_requested, + code_name=solver_name, + repo_root=repo_root, + ) + merged_requested = list(mapping_diagnostics.get("resolved_fields", [])) + + merged_config: dict[str, Any] = {} + if isinstance(extracted_config, dict): + merged_config.update(extracted_config) + prior_config = prior.get("visualization_config", {}) + if isinstance(prior_config, dict): + merged_config.update(prior_config) + if isinstance(visualization_config, dict): + merged_config.update(visualization_config) + + cadence_prompt_seconds_raw = merged_config.get("plot_interval_seconds") + cadence_prompt_seconds: int | None = None + if isinstance(cadence_prompt_seconds_raw, (int, float)): + candidate = int(round(float(cadence_prompt_seconds_raw))) + cadence_prompt_seconds = candidate if candidate > 0 else None + + adjustments: list[str] = [] + cadence_solver_time: float | None = None + if cadence_prompt_seconds is not None: + cadence_solver_time = convert_prompt_seconds_to_solver_time( + solver_name, + cadence_prompt_seconds, + ) + merged_config["cadence_prompt_seconds"] = cadence_prompt_seconds + if cadence_solver_time is not None: + merged_config["cadence_solver_time"] = cadence_solver_time + merged_config["cadence_mode"] = "time" + else: + fallback_steps = max(1, cadence_prompt_seconds) + merged_config["cadence_solver_steps"] = fallback_steps + merged_config["cadence_mode"] = "step" + adjustments.append("cadence_fallback_to_steps_unknown_time_units") + timestep_scope = str(merged_config.get("timesteps", "latest")).strip().lower() or "latest" + if timestep_scope not in {"latest", "all"}: + timestep_scope = "latest" + merged_config["timesteps"] = timestep_scope + + solver_mappings_applied = bool(solver_name) + + plots_payload = merged_config.get("plots", []) + parsed_plots: list[VisualizationPlotSpec] = [] + if isinstance(plots_payload, list): + for entry in plots_payload: + if not isinstance(entry, dict): + continue + field = str(entry.get("field", "")).strip() + if not field: + continue + parsed_plots.append( + VisualizationPlotSpec( + type=str(entry.get("type", "slice")), + field=field, + axis=str(entry.get("axis")) if entry.get("axis") is not None else None, + ) + ) + + source = "default" + if prior: + source = str(prior.get("source", "default")).strip().lower() or "default" + if extracted_vars or extracted_config: + source = "prompt" + if not solver_mappings_applied and not merged_requested: + source = "default" + if source not in {"prompt", "clarification", "default"}: + source = "default" + + if isinstance(mapping_diagnostics_out, dict): + mapping_diagnostics_out.clear() + mapping_diagnostics_out.update(mapping_diagnostics) + + return VisualizationIntent( + requested_fields=merged_requested, + cadence_prompt_seconds=cadence_prompt_seconds, + cadence_solver_time=cadence_solver_time, + timestep_scope=timestep_scope, + plots=parsed_plots, + solver_name=solver_name or None, + source=source, + adjustments=adjustments, + visualization_config=merged_config, + ) + + +def resolve_visualization_intent(state: dict[str, Any]) -> dict[str, Any]: + """ + Return canonical visualization intent from state, with legacy fallback. + """ + existing = state.get("visualization_intent") + if isinstance(existing, dict): + requested = existing.get("requested_fields", existing.get("requested_plot_vars", [])) + vis_cfg = existing.get("visualization_config", {}) + if not isinstance(requested, list): + requested = [] + if not isinstance(vis_cfg, dict): + vis_cfg = {} + prepared = dict(existing) + prepared["requested_fields"] = _dedupe_preserve_order([str(v) for v in requested]) + prepared["visualization_config"] = vis_cfg + if "cadence_prompt_seconds" not in prepared and isinstance(prepared.get("cadence_seconds"), (int, float)): + converted_prompt = int(round(float(prepared["cadence_seconds"]))) + prepared["cadence_prompt_seconds"] = converted_prompt if converted_prompt > 0 else None + timestep_scope = str(prepared.get("timestep_scope", vis_cfg.get("timesteps", "latest"))).strip().lower() + prepared["timestep_scope"] = timestep_scope if timestep_scope in {"latest", "all"} else "latest" + prepared["source"] = prepared.get("source") if prepared.get("source") in {"prompt", "clarification", "default"} else "default" + try: + model = VisualizationIntent.model_validate(prepared) + return model.model_dump() + except Exception: + # Keep existing behavior if legacy payload is malformed. + return prepared + + solver_name = _infer_solver_name(state) + repo_root = _infer_repo_root(state, solver_name) + prompt = str(state.get("prompt") or state.get("user_requirement") or "") + model = build_visualization_intent( + prompt=prompt, + solver_name=solver_name, + repo_root=repo_root, + requested_plot_vars=[], + visualization_config={}, + prior_intent=None, + ) + return model.model_dump() + + +def visualization_intent_node(state: GraphState) -> dict[str, Any]: + """ + Graph node that materializes visualization_intent into canonical state. + """ + solver_name = _infer_solver_name(state) + repo_root = _infer_repo_root(state, solver_name) + prompt = str(state.get("prompt") or state.get("user_requirement") or "") + prior_intent = state.get("visualization_intent") if isinstance(state.get("visualization_intent"), dict) else {} + + mapping: dict[str, Any] = {} + model = build_visualization_intent( + prompt=prompt, + solver_name=solver_name, + repo_root=repo_root, + requested_plot_vars=[], + visualization_config={}, + prior_intent=prior_intent, + mapping_diagnostics_out=mapping, + ) + intent = model.model_dump() + + return { + "visualization_intent": intent, + "requested_plot_vars": list(model.requested_fields), + "visualization_config": dict(intent.get("visualization_config", {})), + "visualization_mapping_candidates": dict(mapping.get("candidate_fields_by_token", {})), + "visualization_mapping_unresolved": list(mapping.get("unresolved_tokens", [])), + "visualization_mapping_source": mapping.get("mapping_source"), + "visualization_mapping_confidence": mapping.get("mapping_confidence"), + } diff --git a/src/nodes/visualization_node.py b/src/nodes/visualization_node.py index b7364ed..1396bcb 100644 --- a/src/nodes/visualization_node.py +++ b/src/nodes/visualization_node.py @@ -21,6 +21,7 @@ from typing import Any from src.models import GraphState +from src.nodes.visualization_intent_node import resolve_visualization_intent from src.services.visualization import VisualizationService from src.utils.gate import run_preconfirm_gate @@ -41,23 +42,60 @@ def get_run_directory_and_analysis(state: GraphState) -> tuple: tuple Tuple of (run_directory, analysis_report). """ - # Try canonical path for run_directory - run_dir = None + workflow_history = state.get("workflow_history", []) + runner_run_dir = None + input_writer_run_dir = None + + # Prefer latest runner entry (post-staging/execution path). + try: + runner_entry = next( + e for e in reversed(workflow_history) + if e.get("node") == "runner" + ) + runner_run_dir = runner_entry.get("details", {}).get("run_directory") + if runner_run_dir: + logger.debug("Visualization run directory loaded from runner workflow_history entry") + except StopIteration: + pass + + # Fall back to latest input_writer entry (canonical initial run dir). try: input_writer_entry = next( - e for e in state.get('workflow_history', []) - if e.get('node') == 'input_writer' + e for e in reversed(workflow_history) + if e.get("node") == "input_writer" ) - run_dir = input_writer_entry.get('details', {}).get('run_directory') + input_writer_run_dir = input_writer_entry.get("details", {}).get("run_directory") except StopIteration: pass - # Fallback to state - if not run_dir: + if runner_run_dir: + run_dir = runner_run_dir + elif input_writer_run_dir: + run_dir = input_writer_run_dir + logger.debug("Visualization run directory loaded from input_writer workflow_history entry") + else: run_dir = state.get("run_directory") + if run_dir: + logger.debug("Visualization run directory loaded from state fallback") + + if runner_run_dir and input_writer_run_dir and runner_run_dir != input_writer_run_dir: + logger.warning( + "Visualization run directory divergence: runner=%s input_writer=%s; using runner path", + runner_run_dir, + input_writer_run_dir, + ) - # Get analysis report (can be in state or as fallback from workflow_history) + # Get analysis report from state, then workflow history if missing. analysis_report = state.get("analysis_report", {}) + if not analysis_report: + try: + analysis_entry = next( + e for e in reversed(workflow_history) + if e.get("node") == "analysis" + ) + analysis_report = analysis_entry.get("details", {}).get("report", {}) or {} + except StopIteration: + analysis_report = {} return run_dir, analysis_report @@ -294,6 +332,7 @@ def visualization_node(state: GraphState) -> dict[str, Any]: or plan.get("inputs_file_path") or plan.get("baseline_inputs_path") ) + vis_intent = resolve_visualization_intent(state) vis_config = _build_vis_config( plan=plan, analysis_report=analysis_report, @@ -302,9 +341,21 @@ def visualization_node(state: GraphState) -> dict[str, Any]: prompt=state.get("prompt", ""), solver_name=solver_name, inputs_file_path=inputs_file_path, - requested_plot_vars=state.get("requested_plot_vars", []) or [], + requested_plot_vars=vis_intent.get("requested_fields", []) or [], + prompt_visualization_config=vis_intent.get("visualization_config", {}) or {}, ) + if ( + str(getattr(config, "environment", "local")).lower() != "local" + and str(vis_config.get("timesteps", "latest")).lower() == "all" + ): + logger.info( + "Requested visualization over all plotfiles, but remote stage-out currently " + "retrieves only the latest plotfile; using latest." + ) + vis_config["timesteps"] = "latest" + vis_config["timesteps_adjusted_reason"] = "remote_stage_out_latest_only" + logger.debug(f" Will generate {len(vis_config.get('plots', []))} plot(s):") for plot_cfg in vis_config.get('plots', []): logger.debug(f" - {plot_cfg['field']} ({plot_cfg['type']} along {plot_cfg['axis']})") @@ -419,6 +470,7 @@ def _build_vis_config( solver_name: str = "", inputs_file_path: str | None = None, requested_plot_vars: list[str] | None = None, + prompt_visualization_config: dict[str, Any] | None = None, ) -> dict[str, Any]: """ Build visualization configuration from plan and analysis signals. @@ -452,6 +504,11 @@ def _build_vis_config( if not isinstance(vis_config.get("plots"), list): vis_config["plots"] = [] + prompt_vis = prompt_visualization_config if isinstance(prompt_visualization_config, dict) else {} + prompt_timestep_scope = str(prompt_vis.get("timesteps", "")).strip().lower() + if prompt_timestep_scope in {"all", "latest"}: + vis_config["timesteps"] = prompt_timestep_scope + # Normalize plan-provided entries so defaults are deterministic. plan_plots: list[dict[str, Any]] = [] for plot_cfg in vis_config.get("plots", []): diff --git a/src/policy/gate_policy.py b/src/policy/gate_policy.py index 43786d7..d5c5128 100644 --- a/src/policy/gate_policy.py +++ b/src/policy/gate_policy.py @@ -28,7 +28,8 @@ def allowed(self) -> bool: def _has_explicit_approval(context: dict[str, Any]) -> bool: """Check request/session context for explicit gate approval.""" - if context.get("gate_approved") is True: + approval_source = str(context.get("approval_source") or "").strip().lower() + if context.get("gate_approved") is True and approval_source in {"interactive", "ui", "human"}: return True token = context.get("approval_token") return isinstance(token, str) and bool(token.strip()) diff --git a/src/services/architect.py b/src/services/architect.py index 1cb9794..af288e7 100644 --- a/src/services/architect.py +++ b/src/services/architect.py @@ -5272,117 +5272,25 @@ def _plan_modifications(self, requirements: dict, baseline: dict, def _plan_visualization(self, requirements: dict, baseline: dict) -> dict: """ - Determine visualization configuration from user requirements. + Determine semantic visualization intent from user requirements. + """ + del baseline - Extracts visualization intent from prompt: - - "show temperature" → temperature slice plot - - "visualize flame structure" → Temp + species slices - - "plot velocity field" → velocity magnitude slice - - "compare different timesteps" → timesteps = 'all' + from src.services.viz_param_extractor import extract_viz_params_from_prompt - Args: - requirements: User requirements dict - baseline: Selected baseline case + prompt = str(requirements.get("user_prompt", "")) + semantic_tokens, extracted_config = extract_viz_params_from_prompt(prompt) - Returns - ------- - Visualization configuration dict - """ vis_config = { 'enabled': True, 'backend': 'yt', # Phase 4: yt-only 'plots': [], - 'timesteps': 'latest', + 'timesteps': str(extracted_config.get("timesteps", "latest")), 'format': 'png', - 'container_mode': self.config.environment in ['perlmutter', 'mcp'] + 'container_mode': self.config.environment in ['perlmutter', 'mcp'], + 'requested_semantic_tokens': semantic_tokens, + 'visualization_config': extracted_config, } - - prompt = requirements.get('user_prompt', '').lower() - - # Temperature (common for combustion) - if any(kw in prompt for kw in ['temperature', 'temp', 'flame', 'heat']): - vis_config['plots'].append({ - 'type': 'slice', - 'field': 'Temp', - 'axis': 'z', - 'colormap': 'hot' - }) - - # Density - if 'density' in prompt or 'rho' in prompt: - vis_config['plots'].append({ - 'type': 'slice', - 'field': 'density', - 'axis': 'z', - 'colormap': 'viridis' - }) - - # Velocity - if any(kw in prompt for kw in ['velocity', 'flow', 'speed']): - vis_config['plots'].append({ - 'type': 'slice', - 'field': 'velocity_magnitude', - 'axis': 'z', - 'colormap': 'plasma' - }) - - # Species (if reactions enabled) - solver_name = ( - baseline.get('code_name') - or baseline.get('code') - or baseline.get('metadata', {}).get('code') - or requirements.get('solver') - ) - solver_config = self.code_configs.get(solver_name) if solver_name else None - reaction_flag_keys = get_reaction_flag_keys(solver_name) if solver_name else [] - inputs_content = baseline.get('metadata', {}).get('inputs_content', {}) - reactions_enabled = False - for flag_key in reaction_flag_keys: - if flag_key in inputs_content: - reactions_enabled = str(inputs_content.get(flag_key)) == "1" - break - - if not reactions_enabled and solver_config: - section_key = solver_config.code_name.lower() - section = baseline.get(section_key, {}) - if isinstance(section, dict): - reactions_enabled = str(section.get("use_reactions", "0")) == "1" - - if reactions_enabled: - fuel = requirements.get('fuel', 'CH4') - if 'species' in prompt or fuel.lower() in prompt: - vis_config['plots'].append({ - 'type': 'slice', - 'field': f'Y({fuel})', - 'axis': 'z', - 'colormap': 'RdYlBu_r' - }) - - # Profile plots - if 'profile' in prompt or '1d' in prompt: - field = 'Temp' # Default - if 'density' in prompt: - field = 'density' - - vis_config['plots'].append({ - 'type': 'profile', - 'field': field, - 'direction': 'x' - }) - - # All timesteps (for movies/comparisons) - if any(kw in prompt for kw in ['movie', 'animation', 'evolution', 'all timesteps']): - vis_config['timesteps'] = 'all' - - # If no plots specified, add default temperature - if not vis_config['plots']: - vis_config['plots'].append({ - 'type': 'slice', - 'field': 'Temp', - 'axis': 'z', - 'colormap': 'hot' - }) - return vis_config def _plan_analysis(self, requirements: dict) -> dict: diff --git a/src/services/build_tools.py b/src/services/build_tools.py index c0496f7..af78615 100644 --- a/src/services/build_tools.py +++ b/src/services/build_tools.py @@ -1,95 +1,175 @@ """Build helpers for AMReX-based codes.""" +from __future__ import annotations + import logging import subprocess from pathlib import Path +from typing import Any from database.configs.registry import is_pele_case_path +from src.services.solver_build_policy import get_solver_build_policy + logger = logging.getLogger(__name__) -def compile_amrex( - case_dir: str, - use_cuda: bool = True, - jobs: int = 16, - config: dict | None = None, +def _run_build_command(cmd: list[str], *, cwd: Path, timeout: int = 600) -> tuple[bool, str]: + try: + result = subprocess.run( + cmd, + cwd=cwd, + capture_output=True, + text=True, + timeout=timeout, + ) + except (subprocess.TimeoutExpired, Exception) as exc: + return False, str(exc) + + if result.returncode == 0: + return True, "" + + tail = (result.stderr or result.stdout or "").strip()[-500:] + return False, tail + + +def _contains_flag(args: list[str], key: str) -> bool: + prefix = f"{key}=" + return any(str(item).startswith(prefix) for item in args) + + +def _contains_cmake_define(args: list[str], key: str) -> bool: + prefix = f"-D{key}=" + return any(str(item).startswith(prefix) for item in args) + + +def _compile_with_cmake( + case_dir: Path, + compile_policy: dict[str, Any], + *, + jobs: int, ) -> bool: - """ - Compile any AMReX code in a case directory. - - Call context: Used by runner services to build executables on demand. - - Works for AMReX-based codes using the GNUmakefile build system. - Auto-detects whether to use TPL targets (Pele codes only). - - Parameters - ---------- - case_dir : str - Path to the case directory containing the build files. - use_cuda : bool, optional - Whether to enable CUDA/HIP builds when available. - jobs : int, optional - Number of parallel build jobs to use. - config : dict or None, optional - Optional configuration data for build customization. - - Returns - ------- - bool - True if compilation succeeded, otherwise False. - """ - case_dir = Path(case_dir) - - if not case_dir.exists(): + source_dir = compile_policy.get("cmake_source_dir") + build_dir = compile_policy.get("cmake_build_dir") + if not source_dir or not build_dir: + return False + + source_path = Path(source_dir).expanduser() + build_path = Path(build_dir).expanduser() + if not source_path.exists(): return False + configure_args = list(compile_policy.get("cmake_configure_args") or []) + build_args = list(compile_policy.get("cmake_build_args") or []) + install_args = list(compile_policy.get("cmake_install_args") or []) + install_prefix = compile_policy.get("cmake_install_prefix") + + if install_prefix and not _contains_cmake_define(configure_args, "CMAKE_INSTALL_PREFIX"): + configure_args.append(f"-DCMAKE_INSTALL_PREFIX={install_prefix}") + + commands: list[tuple[list[str], Path]] = [ + (["cmake", "-S", str(source_path), "-B", str(build_path)] + configure_args, case_dir), + (["cmake", "--build", str(build_path), "--parallel", str(jobs)] + build_args, case_dir), + ] + if install_prefix or install_args: + commands.append((["cmake", "--install", str(build_path)] + install_args, case_dir)) + + for cmd, cwd in commands: + success, details = _run_build_command(cmd, cwd=cwd) + if not success: + logger.error("CMake compilation failed: %s", " ".join(cmd)) + if details: + logger.error("Build output: %s", details) + return False + return True + + +def _compile_with_gnumake( + case_dir: Path, + compile_policy: dict[str, Any], + *, + use_cuda: bool, + jobs: int, +) -> bool: if not (case_dir / "GNUmakefile").exists(): return False - make_flags = [] - if use_cuda: + make_flags = list(compile_policy.get("gnumake_build_args") or []) + if use_cuda and not _contains_flag(make_flags, "USE_CUDA"): make_flags.append("USE_CUDA=TRUE") - make_flags.append("USE_MPI=TRUE") - + clean_targets = list(compile_policy.get("gnumake_clean_targets") or ["realclean"]) + commands: list[list[str]] = [] is_pele_code = is_pele_case_path(case_dir) - if is_pele_code: - logger.debug("Detected Pele code - using TPL targets") - commands = [ - ["make", "TPLrealclean"] + make_flags, - ["make", "realclean"], - ["make", "TPL"] + make_flags, - ["nice", "make", f"-j{jobs}"] + make_flags, - ] - else: - logger.debug("Detected non-Pele AMReX code - skipping TPL targets") - commands = [ - ["make", "realclean"], - ["nice", "make", f"-j{jobs}"] + make_flags, - ] + commands.append(["make", "TPLrealclean"] + make_flags) + for target in clean_targets: + commands.append(["make", str(target)]) + if is_pele_code: + commands.append(["make", "TPL", f"-j{jobs}"] + make_flags) + commands.append(["nice", "make", f"-j{jobs}"] + make_flags) - try: - for cmd in commands: - result = subprocess.run( - cmd, - cwd=case_dir, - capture_output=True, - text=True, - timeout=600, - ) - - if result.returncode != 0: - logger.error("Compilation failed: %s", " ".join(cmd)) - if result.stdout: - logger.error("STDOUT: %s", result.stdout[-500:]) - if result.stderr: - logger.error("STDERR: %s", result.stderr[-500:]) - return False - - return True + for cmd in commands: + success, details = _run_build_command(cmd, cwd=case_dir) + if not success: + logger.error("GNUmake compilation failed: %s", " ".join(cmd)) + if details: + logger.error("Build output: %s", details) + return False + return True - except (subprocess.TimeoutExpired, Exception) as exc: - logger.error("Compilation exception: %s", exc) + +def _solver_repo_path(runtime_config: Any, solver_code: str) -> Path | None: + attr = f"{solver_code.lower()}_repo_path" + value = getattr(runtime_config, attr, None) + return Path(value).expanduser() if value else None + + +def compile_solver( + case_dir: str | Path, + solver_code: str, + runtime_config: Any = None, + use_cuda: bool = True, + jobs: int = 12, +) -> bool: + """Compile a solver with policy-driven branch ordering.""" + case_path = Path(case_dir).expanduser() + if not case_path.exists(): return False + + solver = str(solver_code).strip().upper() + policy = get_solver_build_policy( + solver, + runtime_config=runtime_config, + case_dir=case_path, + repo_root=_solver_repo_path(runtime_config, solver), + ) + preference = str(policy.get("build_system_preference", "gnumake")).strip().lower() + branch_order = ["cmake", "gnumake"] if preference == "cmake" else ["gnumake", "cmake"] + compile_policy = dict(policy.get("compile_policy") or {}) + + for branch in branch_order: + if branch == "cmake": + if _compile_with_cmake(case_path, compile_policy, jobs=jobs): + return True + continue + if _compile_with_gnumake(case_path, compile_policy, use_cuda=use_cuda, jobs=jobs): + return True + return False + + +def compile_amrex( + case_dir: str, + use_cuda: bool = True, + jobs: int = 12, + config: Any = None, +) -> bool: + """Backward-compatible wrapper around policy-driven compile.""" + solver = str(getattr(config, "default_solver", "AMREX")).strip().upper() or "AMREX" + return compile_solver( + case_dir=case_dir, + solver_code=solver, + runtime_config=config, + use_cuda=use_cuda, + jobs=jobs, + ) diff --git a/src/services/config_model_factory.py b/src/services/config_model_factory.py index d44f2bb..882f7d4 100644 --- a/src/services/config_model_factory.py +++ b/src/services/config_model_factory.py @@ -661,6 +661,20 @@ def _merge_duplicate_param_values( if force_append or merge_strategy == "append": merged = ConfigModelFactory._flatten_values(values) + if param in {"amr.plot_vars", "erf.plot_vars_1", "peleLM.derive_plot_vars"}: + deduped: list[Any] = [] + seen: set[str] = set() + for value in merged: + if isinstance(value, str): + tokens = [t.strip() for t in value.replace(",", " ").split() if t.strip()] + else: + tokens = [str(value).strip()] + for token in tokens: + if not token or token in seen: + continue + seen.add(token) + deduped.append(token) + merged = deduped logger.debug( f"[ConfigFactory] Appended {len(values)} values for array param {param}: {merged}" ) diff --git a/src/services/input_writer.py b/src/services/input_writer.py index 60379f8..2d5eecf 100644 --- a/src/services/input_writer.py +++ b/src/services/input_writer.py @@ -17,10 +17,10 @@ from src.services.inputs_file_selector import InputsFileSelector from src.services.inputs_file_writer import InputsFileWriter from src.services.viz_param_extractor import ( - PLOTFILE_VAR_PARAM, - PLOTFILE_VAR_PARAM_DEFAULT, canonicalize_requested_plot_vars, - get_plotfile_var_param, + get_plotfile_period_param, + get_plotfile_step_interval_param, + get_plot_var_param_candidates, ) # Input Writer imports (Schema-Based Configuration System) @@ -42,10 +42,8 @@ def _extract_param_value_from_inputs(inputs_text: str, param_name: str) -> str | return None -def _all_known_plotfile_params() -> set[str]: - params = set(PLOTFILE_VAR_PARAM.values()) - params.add(PLOTFILE_VAR_PARAM_DEFAULT) - return params +def _all_known_plotfile_params(code_name: str) -> set[str]: + return set(get_plot_var_param_candidates(code_name)) def _resolve_plotfile_vars( @@ -60,14 +58,16 @@ def _resolve_plotfile_vars( Priority 2: requested empty, preserve baseline param value for this solver. Priority 3: requested empty, baseline missing param -> write nothing. """ - param_name = get_plotfile_var_param(code_name) + param_candidates = get_plot_var_param_candidates(code_name) + primary_param = param_candidates[0] if requested: - return param_name, " ".join(requested) + return primary_param, " ".join(requested) - baseline_value = _extract_param_value_from_inputs(baseline_inputs_content, param_name) - if baseline_value: - return param_name, baseline_value + for param_name in param_candidates: + baseline_value = _extract_param_value_from_inputs(baseline_inputs_content, param_name) + if baseline_value: + return param_name, baseline_value return None @@ -75,13 +75,14 @@ def _resolve_plotfile_vars( def apply_plotfile_vars_to_inputs_text( inputs_text: str, plotfile_setting: tuple[str, str] | None, + code_name: str | None = None, ) -> str: """ Apply plotfile variable line update to inputs text. If plotfile_setting is None, remove known plotfile var lines. """ - known_params = _all_known_plotfile_params() + known_params = _all_known_plotfile_params(code_name or "") kept_lines: list[str] = [] for line in inputs_text.splitlines(): stripped = line.strip() @@ -102,6 +103,88 @@ def apply_plotfile_vars_to_inputs_text( output += "\n" return output + +def upsert_inputs_param(inputs_text: str, param_name: str, value: str) -> str: + """ + Upsert a single inputs parameter line while preserving unrelated formatting. + """ + lines = inputs_text.splitlines() + output_lines: list[str] = [] + replaced = False + for line in lines: + stripped = line.strip() + if stripped and not stripped.startswith("#") and "=" in line: + lhs = line.split("=", maxsplit=1)[0].strip() + if lhs == param_name: + if not replaced: + output_lines.append(f"{param_name} = {value}") + replaced = True + continue + output_lines.append(line) + + if not replaced: + output_lines.append(f"{param_name} = {value}") + + output = "\n".join(output_lines) + if inputs_text.endswith("\n"): + output += "\n" + return output + + +def _resolve_plotfile_period_settings( + visualization_config: dict | None, + code_name: str, +) -> list[tuple[str, str]]: + """ + Resolve solver-aware plot cadence settings from extracted visualization intent. + """ + if not isinstance(visualization_config, dict): + return [] + + settings: list[tuple[str, str]] = [] + period_param = get_plotfile_period_param(code_name) + step_interval_param = get_plotfile_step_interval_param(code_name) + + cadence_solver_time = visualization_config.get("cadence_solver_time") + if cadence_solver_time is not None: + try: + cadence_value = float(cadence_solver_time) + except (TypeError, ValueError): + cadence_value = 0.0 + if cadence_value > 0: + cadence_str = str(int(cadence_value)) if cadence_value.is_integer() else str(cadence_value) + if period_param: + settings.append((period_param, cadence_str)) + if step_interval_param: + settings.append((step_interval_param, "-1")) + return settings + + cadence_solver_steps = visualization_config.get("cadence_solver_steps") + if cadence_solver_steps is not None: + try: + step_value = int(round(float(cadence_solver_steps))) + except (TypeError, ValueError): + step_value = 0 + if step_value > 0 and step_interval_param: + settings.append((step_interval_param, str(step_value))) + return settings + + # Backward compatibility for existing payloads still using raw seconds. + seconds = visualization_config.get("plot_interval_seconds") + if seconds is not None: + try: + cadence_value = float(seconds) + except (TypeError, ValueError): + cadence_value = 0.0 + if cadence_value > 0: + cadence_str = str(int(cadence_value)) if cadence_value.is_integer() else str(cadence_value) + if period_param: + settings.append((period_param, cadence_str)) + if step_interval_param: + settings.append((step_interval_param, "-1")) + + return settings + class InputWriterService: """Applies architect's plan to generate final configuration. @@ -223,7 +306,8 @@ def apply_plan(self, reasoning: str = "", user_prompt: str = "", output_dir: Path | None = None, - requested_plot_vars: list[str] | None = None) -> dict: + requested_plot_vars: list[str] | None = None, + visualization_config: dict | None = None) -> dict: """ Apply execution plan using Input Writer pipeline. @@ -276,9 +360,6 @@ def apply_plan(self, # Ensure output directory exists output_dir = Path(output_dir) - from src.utils.write_policy import ensure_write_allowed - - ensure_write_allowed(output_dir, self.config, purpose="input_writer.apply_plan") output_dir.mkdir(parents=True, exist_ok=True) try: @@ -396,8 +477,7 @@ def apply_plan(self, strategy=strategy, excluded_files=[], available_files=inputs_candidates, - config=self.config, - user_prompt=user_prompt, + config=self.config ) if selected: selected_inputs_path = str(selected) @@ -449,6 +529,10 @@ def apply_plan(self, baseline_inputs_content=baseline_text, code_name=code_name, ) + cadence_settings = _resolve_plotfile_period_settings( + visualization_config=visualization_config, + code_name=code_name, + ) if not modifications and baseline_text and selected_inputs_path: logger.info("[2/5] Skipping model hydration (no modifications)") @@ -456,7 +540,10 @@ def apply_plan(self, output_text = apply_plotfile_vars_to_inputs_text( baseline_text, plotfile_setting, + code_name=code_name, ) + for param_name, value in cadence_settings: + output_text = upsert_inputs_param(output_text, param_name, value) inputs_path.write_text(output_text) logger.info(f"Wrote {len(output_text)} bytes to {inputs_path}") @@ -508,7 +595,6 @@ def apply_plan(self, solver_config, schema_dir, repo_path, - runtime_config=self.config, ) logger.debug(f"Loading schema from: {schema_path}") @@ -623,7 +709,10 @@ def apply_plan(self, output_text = apply_plotfile_vars_to_inputs_text( output_text, plotfile_setting, + code_name=code_name, ) + for param_name, value in cadence_settings: + output_text = upsert_inputs_param(output_text, param_name, value) # Write to file inputs_path = output_dir / "inputs" @@ -822,8 +911,8 @@ def _retrieve_similar_templates(self, plan: dict) -> list | None: templates_index = f"{code_lower}_input_templates" results = self.embeddings.retrieve_faiss( - search_query, templates_index, + search_query, topk=50 ) diff --git a/src/services/run_local.py b/src/services/run_local.py index c51c8a2..6d96764 100644 --- a/src/services/run_local.py +++ b/src/services/run_local.py @@ -12,7 +12,13 @@ from amrex_tools import copy_to_rundir, setup_run_directory -from src.services.build_tools import compile_amrex +from src.services.build_tools import compile_solver +from src.services.solver_build_policy import ( + central_build_candidates, + derive_central_build_dir, + get_solver_build_policy, + resolve_local_executable_fallback, +) logger = logging.getLogger(__name__) @@ -73,54 +79,63 @@ def find_or_compile_executable( if exe: logger.debug(f"[ OK ] Found existing executable: {exe.name}") return str(exe) - if self._is_erf_context(case_dir): - exe, checked_paths = self._resolve_erf_executable_fallbacks( + solver_code = self._active_solver_code(case_dir) + if solver_code: + exe, checked_paths = self._resolve_executable_fallbacks( + solver_code=solver_code, case_dir=case_dir, require_mpi=require_mpi, require_cuda=False, ) if exe: - logger.debug(f"[ OK ] Found ERF fallback executable: {exe.name}") + logger.debug("[ OK ] Found %s fallback executable: %s", solver_code, exe.name) return str(exe) - checked = ", ".join(str(path) for path in checked_paths) - logger.info("No ERF executable found in fallback paths. Checked: %s", checked) + logger.info("No %s executable found in fallback paths. Checked: %s", solver_code, checked_paths) # No executable found - compile it (FORCE CPU for local). - # For ERF, prefer compiling in central build dir when available. logger.info("No suitable executable found, compiling (CPU-only)...") logger.debug(f" MPI: {require_mpi}, CUDA: False (forced for local)") + solver_code = self._active_solver_code(case_dir) + compile_success = compile_solver( + case_dir=case_dir, + solver_code=solver_code or "AMREX", + runtime_config=self.config, + use_cuda=False, + jobs=12, + ) + if not compile_success: + preference = "gnumake" + if solver_code: + preference = str( + get_solver_build_policy(solver_code, runtime_config=self.config).get( + "build_system_preference", "gnumake" + ) + ).strip().lower() + if solver_code and preference == "cmake": + checked = [case_dir] + _, checked = self._resolve_executable_fallbacks( + solver_code=solver_code, + case_dir=case_dir, + require_mpi=require_mpi, + require_cuda=False, + ) + raise RuntimeError( + f"No {solver_code} executable found. Checked paths: {', '.join(str(path) for path in checked)}" + ) + raise RuntimeError(f"Compilation failed in {case_dir}") - compile_targets = self._compile_targets(case_dir) - compiled_target: Path | None = None - for target in compile_targets: - success = compile_amrex( - case_dir=str(target), - use_cuda=False, # Force CPU for local - jobs=16, - ) - if success: - compiled_target = target - logger.info("Compilation succeeded in %s", target) - break - logger.warning("Compilation attempt failed in %s", target) - - if compiled_target is None: - checked = ", ".join(str(path) for path in compile_targets) - if self._is_erf_context(case_dir): - raise RuntimeError(f"No ERF executable found. Checked paths: {checked}") - raise RuntimeError(f"Compilation failed in all targets: {checked}") - - # Find newly compiled executable in the successful target and known fallbacks - exe = self._find_exe_in_dir(compiled_target, require_mpi, require_cuda=False) - if not exe and self._is_erf_context(case_dir): - exe, _ = self._resolve_erf_executable_fallbacks( + # Find newly compiled executable in case dir and policy fallbacks + exe = self._find_exe_in_dir(case_dir, require_mpi, require_cuda=False) + if not exe and solver_code: + exe, _ = self._resolve_executable_fallbacks( + solver_code=solver_code, case_dir=case_dir, require_mpi=require_mpi, require_cuda=False, ) if not exe: - raise RuntimeError(f"Compiled but no executable found in {compiled_target}") + raise RuntimeError(f"Compiled but no executable found in {case_dir}") logger.info(f"Compiled: {exe.name}") return str(exe) @@ -150,84 +165,75 @@ def _find_exe_in_dir( # Fallback: return first .ex file return ex_files[0] if ex_files else None - def _is_erf_context(self, case_dir: Path | None = None) -> bool: - """Return True when execution context is ERF (config or case path).""" - if str(getattr(self.config, "default_solver", "")).strip().upper() == "ERF": - return True - - if case_dir is None: - return False + def _active_solver_code(self, case_dir: Path | None = None) -> str | None: + if case_dir is not None: + case_path = Path(case_dir).resolve() + + for code, repo in getattr(self.config, "repositories", {}).items(): + if not repo: + continue + try: + case_path.relative_to(Path(repo).resolve()) + return str(code).strip().upper() + except (ValueError, FileNotFoundError): + continue + + for attr, repo in vars(self.config).items(): + if not attr.endswith("_repo_path") or not repo: + continue + try: + case_path.relative_to(Path(repo).resolve()) + return attr[: -len("_repo_path")].upper() + except (ValueError, FileNotFoundError): + continue + + solver = str(getattr(self.config, "default_solver", "")).strip().upper() + return solver or None + + def _solver_repo_path(self, solver_code: str) -> Path | None: + attr = f"{solver_code.lower()}_repo_path" + value = getattr(self.config, attr, None) + return Path(value).expanduser() if value else None + + def _configured_solver_executable_path(self, solver_code: str) -> str | Path | None: + return getattr(self.config, f"{solver_code.lower()}_executable_path", None) + + def _configured_solver_central_build_dir(self, solver_code: str) -> str | Path | None: + return getattr(self.config, f"{solver_code.lower()}_central_build_dir", None) + + def _solver_central_build_candidates(self, case_dir: Path, solver_code: str) -> list[Path]: + return central_build_candidates( + case_dir=case_dir, + repo_root=self._solver_repo_path(solver_code), + configured_central_build_dir=self._configured_solver_central_build_dir(solver_code), + ) - case_path = Path(case_dir).resolve() - repo_root = getattr(self.config, "erf_repo_path", None) - if repo_root: - try: - case_path.relative_to(Path(repo_root).resolve()) - return True - except ValueError: - pass - - return "ERF" in case_path.parts + def _is_erf_context(self, case_dir: Path | None = None) -> bool: + return self._active_solver_code(case_dir) == "ERF" def _derive_erf_central_build_dir(self, case_dir: Path) -> Path | None: - """Derive ERF central build directory (Exec/) from a case path.""" - case_path = Path(case_dir).resolve() + repo_root = self._solver_repo_path("ERF") + derived = derive_central_build_dir(case_dir=case_dir, repo_root=repo_root) + if derived is not None: + return derived - repo_root = getattr(self.config, "erf_repo_path", None) - repo_path = Path(repo_root).resolve() if repo_root else None - relative_case = None - - if repo_path: - try: - relative_case = case_path.relative_to(repo_path) - except ValueError: - relative_case = None - - if relative_case is None: - parts = case_path.parts - if "ERF" not in parts: - return None - erf_index = parts.index("ERF") - repo_path = Path(*parts[:erf_index + 1]) - relative_case = case_path.relative_to(repo_path) - - if not relative_case.parts or relative_case.parts[0] != "Exec": + case_path = Path(case_dir).resolve() + parts = case_path.parts + if "ERF" not in parts: return None - if len(relative_case.parts) < 2: + erf_index = parts.index("ERF") + repo_path = Path(*parts[:erf_index + 1]) + relative_case = case_path.relative_to(repo_path) + if not relative_case.parts or relative_case.parts[0] != "Exec" or len(relative_case.parts) < 2: return None return repo_path / "Exec" / relative_case.parts[1] - def _configured_erf_central_build_dir(self) -> Path | None: - configured = getattr(self.config, "erf_central_build_dir", None) - if not configured: - return None - return Path(os.path.expandvars(str(configured))).expanduser() - - def _erf_central_build_candidates(self, case_dir: Path) -> list[Path]: - """Return ordered central-build candidates (case-derived first).""" - candidates: list[Path] = [] - derived = self._derive_erf_central_build_dir(case_dir) - if derived: - candidates.append(derived) - configured = self._configured_erf_central_build_dir() - if configured: - candidates.append(configured) - - unique: list[Path] = [] - seen: set[str] = set() - for candidate in candidates: - key = str(Path(candidate).resolve()) - if key in seen: - continue - seen.add(key) - unique.append(Path(candidate)) - return unique - def _compile_targets(self, case_dir: Path) -> list[Path]: """Return ordered compile targets for the selected solver.""" targets: list[Path] = [] - if self._is_erf_context(case_dir): - targets.extend(self._erf_central_build_candidates(case_dir)) + solver = self._active_solver_code(case_dir) + if solver: + targets.extend(self._solver_central_build_candidates(case_dir, solver)) targets.append(case_dir) unique_targets: list[Path] = [] @@ -240,37 +246,66 @@ def _compile_targets(self, case_dir: Path) -> list[Path]: unique_targets.append(Path(target)) return unique_targets - def _resolve_erf_executable_fallbacks( + def _resolve_executable_fallbacks( self, + solver_code: str, case_dir: Path, require_mpi: bool = True, require_cuda: bool = False, ) -> tuple[Path | None, list[Path]]: - """ - Resolve ERF executable fallback chain after case-dir search fails. + resolved = resolve_local_executable_fallback( + solver_code=solver_code, + runtime_config=self.config, + case_dir=Path(case_dir), + repo_root=self._solver_repo_path(solver_code), + configured_executable_path=self._configured_solver_executable_path(solver_code), + central_build_dirs=self._solver_central_build_candidates(Path(case_dir), solver_code), + require_mpi=require_mpi, + require_cuda=require_cuda, + find_default_executable=self._find_exe_in_dir, + ) + return resolved["executable_path"], resolved["checked_paths"] - Order: - 1. config.erf_executable_path - 2. derived central build directory (Exec/) - """ - checked_paths: list[Path] = [Path(case_dir)] - - configured = getattr(self.config, "erf_executable_path", None) - if configured: - configured_path = Path(os.path.expandvars(str(configured))).expanduser() - checked_paths.append(configured_path) - if configured_path.is_file(): - return configured_path, checked_paths - - for central_build_dir in self._erf_central_build_candidates(Path(case_dir)): - if central_build_dir in checked_paths: - continue - checked_paths.append(central_build_dir) - exe = self._find_exe_in_dir(central_build_dir, require_mpi, require_cuda) - if exe: - return exe, checked_paths - - return None, checked_paths + def _resolve_erf_executable_fallbacks( + self, + case_dir: Path, + require_mpi: bool = True, + require_cuda: bool = False, + ) -> tuple[Path | None, list[Path]]: + return self._resolve_executable_fallbacks( + solver_code="ERF", + case_dir=case_dir, + require_mpi=require_mpi, + require_cuda=require_cuda, + ) + + def _active_submit_solver_code(self, case_dir: str | Path | None = None) -> str | None: + if case_dir is not None: + return self._active_solver_code(Path(case_dir)) + return self._active_solver_code(None) + + def _find_submit_executable(self, run_path: Path, case_dir: str | Path | None = None) -> Path | None: + solver_code = self._active_submit_solver_code(case_dir) + if solver_code: + policy = get_solver_build_policy(solver_code, runtime_config=self.config) + preference = str(policy.get("build_system_preference", "gnumake")).strip().lower() + branch_order = ["cmake", "gnumake"] if preference == "cmake" else ["gnumake", "cmake"] + + for branch in branch_order: + if branch == "cmake": + for name in policy.get("cmake_executable_names", []): + candidate = run_path / str(name) + if candidate.is_file(): + return candidate + else: + for pattern in policy.get("gnumake_executable_globs", ["*.ex"]): + matches = sorted(run_path.glob(str(pattern))) + for candidate in matches: + if candidate.is_file(): + return candidate + + executables = sorted(run_path.glob("*.ex")) + return executables[0] if executables else None def setup_job( self, @@ -418,12 +453,10 @@ def submit( run_path = Path(run_directory) # Find executable - executables = list(run_path.glob("*.ex")) - if not executables: + exe = self._find_submit_executable(run_path, case_dir=case_dir) + if exe is None: raise FileNotFoundError(f"No executable found in {run_path}") - exe = executables[0] - # Build command if self.config.use_mpi if hasattr(self.config, 'use_mpi') else True: cmd = ["mpirun", "-np", str(nodes), str(exe.name), "inputs"] diff --git a/src/services/run_superfacility.py b/src/services/run_superfacility.py index 0cd4b43..4c68f75 100644 --- a/src/services/run_superfacility.py +++ b/src/services/run_superfacility.py @@ -13,7 +13,13 @@ from amrex_tools import copy_to_rundir, setup_run_directory -from src.services.build_tools import compile_amrex +from src.services.build_tools import compile_solver +from src.services.solver_build_policy import ( + central_build_candidates, + derive_central_build_dir, + get_solver_build_policy, + resolve_local_executable_fallback, +) from src.services.run_superfacility_tools import ( ensure_remote_directory_rest, generate_slurm_script, @@ -121,54 +127,63 @@ def find_or_compile_executable(self, if exe: logger.debug(f"[ OK ] Found existing executable: {exe.name}") return str(exe) - if self._is_erf_context(case_dir): - exe, checked_paths = self._resolve_erf_executable_fallbacks( + solver_code = self._active_solver_code(case_dir) + if solver_code: + exe, checked_paths = self._resolve_executable_fallbacks( + solver_code=solver_code, case_dir=case_dir, require_mpi=require_mpi, require_cuda=require_cuda, ) if exe: - logger.debug(f"[ OK ] Found ERF fallback executable: {exe.name}") + logger.debug("[ OK ] Found %s fallback executable: %s", solver_code, exe.name) return str(exe) - checked = ", ".join(str(path) for path in checked_paths) - logger.info("No ERF executable found in fallback paths. Checked: %s", checked) + logger.info("No %s executable found in fallback paths. Checked: %s", solver_code, checked_paths) # No executable found - compile it. - # For ERF, prefer compiling in central build dir when available. logger.info("No suitable executable found, compiling...") logger.debug(f" MPI: {require_mpi}, CUDA: {require_cuda}") - - compile_targets = self._compile_targets(case_dir) - compiled_target: Path | None = None - for target in compile_targets: - success = compile_amrex( - case_dir=str(target), - use_cuda=require_cuda, - jobs=16, - ) - if success: - compiled_target = target - logger.info("Compilation succeeded in %s", target) - break - logger.warning("Compilation attempt failed in %s", target) - - if compiled_target is None: - checked = ", ".join(str(path) for path in compile_targets) - if self._is_erf_context(case_dir): - raise RuntimeError(f"No ERF executable found. Checked paths: {checked}") - raise RuntimeError(f"Compilation failed in all targets: {checked}") + solver_code = self._active_solver_code(case_dir) + compile_success = compile_solver( + case_dir=case_dir, + solver_code=solver_code or "AMREX", + runtime_config=self.config, + use_cuda=require_cuda, + jobs=12, + ) + if not compile_success: + preference = "gnumake" + if solver_code: + preference = str( + get_solver_build_policy(solver_code, runtime_config=self.config).get( + "build_system_preference", "gnumake" + ) + ).strip().lower() + if solver_code and preference == "cmake": + checked = [case_dir] + _, checked = self._resolve_executable_fallbacks( + solver_code=solver_code, + case_dir=case_dir, + require_mpi=require_mpi, + require_cuda=require_cuda, + ) + raise RuntimeError( + f"No {solver_code} executable found. Checked paths: {', '.join(str(path) for path in checked)}" + ) + raise RuntimeError(f"Compilation failed in {case_dir}") # Find the newly compiled executable - exe = self._find_exe_in_dir(compiled_target, require_mpi, require_cuda) - if not exe and self._is_erf_context(case_dir): - exe, _ = self._resolve_erf_executable_fallbacks( + exe = self._find_exe_in_dir(case_dir, require_mpi, require_cuda) + if not exe and solver_code: + exe, _ = self._resolve_executable_fallbacks( + solver_code=solver_code, case_dir=case_dir, require_mpi=require_mpi, require_cuda=require_cuda, ) if not exe: - raise RuntimeError(f"Compiled but no executable found in {compiled_target}") + raise RuntimeError(f"Compiled but no executable found in {case_dir}") logger.info(f"Compiled: {exe.name}") return str(exe) @@ -200,84 +215,75 @@ def _find_exe_in_dir(self, case_dir: Path, return executables[0] - def _is_erf_context(self, case_dir: Path | None = None) -> bool: - """Return True when execution context is ERF (config or case path).""" - if str(getattr(self.config, "default_solver", "")).strip().upper() == "ERF": - return True + def _active_solver_code(self, case_dir: Path | None = None) -> str | None: + if case_dir is not None: + case_path = Path(case_dir).resolve() - if case_dir is None: - return False + for code, repo in getattr(self.config, "repositories", {}).items(): + if not repo: + continue + try: + case_path.relative_to(Path(repo).resolve()) + return str(code).strip().upper() + except (ValueError, FileNotFoundError): + continue + + for attr, repo in vars(self.config).items(): + if not attr.endswith("_repo_path") or not repo: + continue + try: + case_path.relative_to(Path(repo).resolve()) + return attr[: -len("_repo_path")].upper() + except (ValueError, FileNotFoundError): + continue - case_path = Path(case_dir).resolve() - repo_root = getattr(self.config, "erf_repo_path", None) - if repo_root: - try: - case_path.relative_to(Path(repo_root).resolve()) - return True - except ValueError: - pass + solver = str(getattr(self.config, "default_solver", "")).strip().upper() + return solver or None - return "ERF" in case_path.parts + def _solver_repo_path(self, solver_code: str) -> Path | None: + attr = f"{solver_code.lower()}_repo_path" + value = getattr(self.config, attr, None) + return Path(value).expanduser() if value else None - def _derive_erf_central_build_dir(self, case_dir: Path) -> Path | None: - """Derive ERF central build directory (Exec/) from a case path.""" - case_path = Path(case_dir).resolve() + def _configured_solver_executable_path(self, solver_code: str) -> str | Path | None: + return getattr(self.config, f"{solver_code.lower()}_executable_path", None) - repo_root = getattr(self.config, "erf_repo_path", None) - repo_path = Path(repo_root).resolve() if repo_root else None - relative_case = None + def _configured_solver_central_build_dir(self, solver_code: str) -> str | Path | None: + return getattr(self.config, f"{solver_code.lower()}_central_build_dir", None) - if repo_path: - try: - relative_case = case_path.relative_to(repo_path) - except ValueError: - relative_case = None - - if relative_case is None: - parts = case_path.parts - if "ERF" not in parts: - return None - erf_index = parts.index("ERF") - repo_path = Path(*parts[:erf_index + 1]) - relative_case = case_path.relative_to(repo_path) - - if not relative_case.parts or relative_case.parts[0] != "Exec": + def _solver_central_build_candidates(self, case_dir: Path, solver_code: str) -> list[Path]: + return central_build_candidates( + case_dir=case_dir, + repo_root=self._solver_repo_path(solver_code), + configured_central_build_dir=self._configured_solver_central_build_dir(solver_code), + ) + + def _is_erf_context(self, case_dir: Path | None = None) -> bool: + return self._active_solver_code(case_dir) == "ERF" + + def _derive_erf_central_build_dir(self, case_dir: Path) -> Path | None: + repo_root = self._solver_repo_path("ERF") + derived = derive_central_build_dir(case_dir=case_dir, repo_root=repo_root) + if derived is not None: + return derived + + case_path = Path(case_dir).resolve() + parts = case_path.parts + if "ERF" not in parts: return None - if len(relative_case.parts) < 2: + erf_index = parts.index("ERF") + repo_path = Path(*parts[:erf_index + 1]) + relative_case = case_path.relative_to(repo_path) + if not relative_case.parts or relative_case.parts[0] != "Exec" or len(relative_case.parts) < 2: return None return repo_path / "Exec" / relative_case.parts[1] - def _configured_erf_central_build_dir(self) -> Path | None: - configured = getattr(self.config, "erf_central_build_dir", None) - if not configured: - return None - return Path(os.path.expandvars(str(configured))).expanduser() - - def _erf_central_build_candidates(self, case_dir: Path) -> list[Path]: - """Return ordered central-build candidates (case-derived first).""" - candidates: list[Path] = [] - derived = self._derive_erf_central_build_dir(case_dir) - if derived: - candidates.append(derived) - configured = self._configured_erf_central_build_dir() - if configured: - candidates.append(configured) - - unique: list[Path] = [] - seen: set[str] = set() - for candidate in candidates: - key = str(Path(candidate).resolve()) - if key in seen: - continue - seen.add(key) - unique.append(Path(candidate)) - return unique - def _compile_targets(self, case_dir: Path) -> list[Path]: """Return ordered compile targets for the selected solver.""" targets: list[Path] = [] - if self._is_erf_context(case_dir): - targets.extend(self._erf_central_build_candidates(case_dir)) + solver = self._active_solver_code(case_dir) + if solver: + targets.extend(self._solver_central_build_candidates(case_dir, solver)) targets.append(case_dir) unique_targets: list[Path] = [] @@ -290,37 +296,38 @@ def _compile_targets(self, case_dir: Path) -> list[Path]: unique_targets.append(Path(target)) return unique_targets - def _resolve_erf_executable_fallbacks( + def _resolve_executable_fallbacks( self, + solver_code: str, case_dir: Path, require_mpi: bool = True, require_cuda: bool = True, ) -> tuple[Path | None, list[Path]]: - """ - Resolve ERF executable fallback chain after case-dir search fails. - - Order: - 1. config.erf_executable_path - 2. derived central build directory (Exec/) - """ - checked_paths: list[Path] = [Path(case_dir)] - - configured = getattr(self.config, "erf_executable_path", None) - if configured: - configured_path = Path(os.path.expandvars(str(configured))).expanduser() - checked_paths.append(configured_path) - if configured_path.is_file(): - return configured_path, checked_paths - - for central_build_dir in self._erf_central_build_candidates(Path(case_dir)): - if central_build_dir in checked_paths: - continue - checked_paths.append(central_build_dir) - exe = self._find_exe_in_dir(central_build_dir, require_mpi, require_cuda) - if exe: - return exe, checked_paths + resolved = resolve_local_executable_fallback( + solver_code=solver_code, + runtime_config=self.config, + case_dir=Path(case_dir), + repo_root=self._solver_repo_path(solver_code), + configured_executable_path=self._configured_solver_executable_path(solver_code), + central_build_dirs=self._solver_central_build_candidates(Path(case_dir), solver_code), + require_mpi=require_mpi, + require_cuda=require_cuda, + find_default_executable=self._find_exe_in_dir, + ) + return resolved["executable_path"], resolved["checked_paths"] - return None, checked_paths + def _resolve_erf_executable_fallbacks( + self, + case_dir: Path, + require_mpi: bool = True, + require_cuda: bool = True, + ) -> tuple[Path | None, list[Path]]: + return self._resolve_executable_fallbacks( + solver_code="ERF", + case_dir=case_dir, + require_mpi=require_mpi, + require_cuda=require_cuda, + ) def _resolve_remote_executable( self, @@ -331,6 +338,19 @@ def _resolve_remote_executable( return None case_dir_path = Path(case_dir) + candidate_dirs, explicit_executable = self._render_remote_candidate_dirs(case_dir_path) + if explicit_executable is not None: + return explicit_executable + if not getattr(self.config, "remote_executable_find", False): + return None + solver_code = self._active_solver_code(case_dir_path) + return self._search_remote_executable_candidates( + candidate_dirs, + system=system, + solver_code=solver_code, + ) + + def _render_remote_candidate_dirs(self, case_dir_path: Path) -> tuple[list[Path], Path | None]: relative_case_dir = None repo_name = None for repo_path in getattr(self.config, "repositories", {}).values(): @@ -345,75 +365,97 @@ def _resolve_remote_executable( break case_dir_value = relative_case_dir or case_dir_path.name - case_dir_name = case_dir_path.name - template = getattr(self.config, "remote_executable_template", None) if template: try: rendered = template.format( case_dir=case_dir_value, - case_dir_name=case_dir_name, + case_dir_name=case_dir_path.name, repo_name=repo_name, solver_name=repo_name, ) except KeyError as exc: raise ValueError(f"remote_executable_template missing key: {exc}") from exc - rendered = os.path.expandvars(rendered) - rendered_path = Path(rendered) + rendered_path = Path(os.path.expandvars(rendered)) if rendered_path.suffix == ".ex": - return rendered_path - if getattr(self.config, "remote_executable_find", False): - try: - list_remote_entries(str(rendered_path), system=system) - except Exception as exc: - hint = "" - if "No NERSC session" in str(exc): - hint = ( - " (SFAPI auth missing; set SFAPI_KEY_PATH or NERSC_API_TOKEN " - "to enable remote directory listing)" - ) - raise RuntimeError( - "Remote case directory not available for executable search: " - f"{rendered_path}{hint}" - ) from exc - found = find_remote_executable( - remote_case_dir=str(rendered_path), - system=system, - ) - return Path(found) if found else None - return None - - if not getattr(self.config, "remote_executable_find", False): - return None + return [], rendered_path + return [rendered_path], None account = os.getenv("SBATCH_ACCOUNT") user = os.getenv("USER") if not account or not user or not repo_name or not relative_case_dir: - return None - + return [], None remote_case_dir = Path("/global/cfs/cdirs") / account / user / repo_name / relative_case_dir - try: - list_remote_entries(str(remote_case_dir), system=system) - except Exception as exc: - hint = "" - if "No NERSC session" in str(exc): - hint = ( - " (SFAPI auth missing; set SFAPI_KEY_PATH or NERSC_API_TOKEN " - "to enable remote directory listing)" - ) - raise RuntimeError( - "Remote case directory not available for executable search: " - f"{remote_case_dir}{hint}" - ) from exc - found = find_remote_executable( - remote_case_dir=str(remote_case_dir), - system=system, + return [remote_case_dir], None + + def _map_remote_discovery_error(self, remote_dir: Path, exc: Exception) -> RuntimeError: + hint = "" + if "No NERSC session" in str(exc): + hint = ( + " (SFAPI auth missing; set SFAPI_KEY_PATH or NERSC_API_TOKEN " + "to enable remote directory listing)" + ) + return RuntimeError( + "Remote case directory not available for executable search: " + f"{remote_dir}{hint}" ) - return Path(found) if found else None - # No exact match - return first executable if any + def _search_remote_executable_candidates( + self, + candidate_dirs: list[Path], + system: str, + solver_code: str | None = None, + ) -> Path | None: + policy = ( + get_solver_build_policy(solver_code, runtime_config=self.config) + if solver_code + else {} + ) + for remote_dir in candidate_dirs: + try: + list_remote_entries(str(remote_dir), system=system) + except Exception as exc: + raise self._map_remote_discovery_error(remote_dir, exc) from exc + + found = find_remote_executable( + remote_case_dir=str(remote_dir), + system=system, + build_system_preference=str(policy.get("build_system_preference", "gnumake")), + cmake_executable_names=list(policy.get("cmake_executable_names") or []), + gnumake_executable_globs=list(policy.get("gnumake_executable_globs") or ["*.ex"]), + ) + if found: + return Path(found) return None + def _active_submit_solver_code(self, case_dir: str | Path | None = None) -> str | None: + if case_dir is not None: + return self._active_solver_code(Path(case_dir)) + return self._active_solver_code(None) + + def _find_submit_executable(self, run_dir: Path, case_dir: str | Path | None = None) -> str | None: + solver_code = self._active_submit_solver_code(case_dir) + if solver_code: + policy = get_solver_build_policy(solver_code, runtime_config=self.config) + preference = str(policy.get("build_system_preference", "gnumake")).strip().lower() + branch_order = ["cmake", "gnumake"] if preference == "cmake" else ["gnumake", "cmake"] + + for branch in branch_order: + if branch == "cmake": + for name in policy.get("cmake_executable_names", []): + candidate = run_dir / str(name) + if candidate.is_file(): + return candidate.name + else: + for pattern in policy.get("gnumake_executable_globs", ["*.ex"]): + matches = sorted(run_dir.glob(str(pattern))) + for candidate in matches: + if candidate.is_file(): + return candidate.name + + exe_files = sorted(run_dir.glob("*.ex")) + return exe_files[0].name if exe_files else None + def setup_job(self, inputs_path: str | Path | None = None, case_dir: str | Path | None = None, @@ -576,8 +618,7 @@ def submit(self, account = os.path.expandvars(str(account)) # Find executable in run directory - exe_files = list(run_dir.glob("*.ex")) - executable = exe_files[0].name if exe_files else None + executable = self._find_submit_executable(run_dir, case_dir=case_dir) remote_executable_path = getattr(self.config, "remote_executable_path", None) if remote_executable_path: remote_executable_path = Path(os.path.expandvars(str(remote_executable_path))) diff --git a/src/services/run_superfacility_tools.py b/src/services/run_superfacility_tools.py index 2221950..d17cc64 100644 --- a/src/services/run_superfacility_tools.py +++ b/src/services/run_superfacility_tools.py @@ -1,5 +1,6 @@ """NERSC Superfacility helpers for job submission.""" +import fnmatch import os from pathlib import Path from typing import Any @@ -1417,23 +1418,40 @@ def find_remote_executable( remote_case_dir: str, nersc_session: dict | None = None, system: str = "perlmutter", + build_system_preference: str = "gnumake", + cmake_executable_names: list[str] | None = None, + gnumake_executable_globs: list[str] | None = None, ) -> str | None: """ - Find a .ex executable in a remote case directory. + Find a remote executable using policy branch ordering. """ files = list_remote_files(remote_case_dir, nersc_session=nersc_session, system=system) - candidates: list[str] = [] - for item in files: - name = Path(item).name - if name.endswith(".ex"): - candidates.append(str(Path(remote_case_dir) / name)) - if not candidates: - return None + file_names = [Path(item).name for item in files if Path(item).name] + name_set = set(file_names) + + preference = str(build_system_preference).strip().lower() + branch_order = ["cmake", "gnumake"] if preference == "cmake" else ["gnumake", "cmake"] + cmake_names = [str(name) for name in (cmake_executable_names or [])] + gnumake_globs = [str(pattern) for pattern in (gnumake_executable_globs or ["*.ex"])] + + for branch in branch_order: + if branch == "cmake": + for name in cmake_names: + if name in name_set: + return str(Path(remote_case_dir) / name) + else: + candidates: list[str] = [] + for name in file_names: + if any(fnmatch.fnmatch(name, pattern) for pattern in gnumake_globs): + candidates.append(str(Path(remote_case_dir) / name)) + if not candidates: + continue + cuda_candidates = [c for c in candidates if "CUDA" in Path(c).name] + if cuda_candidates: + return sorted(cuda_candidates)[0] + return sorted(candidates)[0] - cuda_candidates = [c for c in candidates if "CUDA" in Path(c).name] - if cuda_candidates: - return sorted(cuda_candidates)[0] - return sorted(candidates)[0] + return None def monitor_job( diff --git a/src/services/solver_build_policy.py b/src/services/solver_build_policy.py new file mode 100644 index 0000000..672038d --- /dev/null +++ b/src/services/solver_build_policy.py @@ -0,0 +1,425 @@ +"""Build/executable discovery policy resolution from solver config classes.""" + +from __future__ import annotations + +import os +from pathlib import Path +from typing import Any, Callable + +from database.configs.registry import get_config_class + + +def _runtime_override(runtime_config: Any, key: str, default: Any) -> Any: + if runtime_config is None: + return default + return getattr(runtime_config, key, default) + + +def _normalize_string_list(value: Any, default: list[str] | None = None) -> list[str]: + if value is None: + return list(default or []) + return [str(item) for item in value] + + +def _resolve_template( + template: str | None, + *, + case_dir: Path | None, + repo_root: Path | None, + central_build_dirs: list[Path] | None, +) -> str | None: + if template is None: + return None + + text = str(template) + central_dir = str(central_build_dirs[0]) if central_build_dirs else "" + text = text.replace("{case_dir}", str(case_dir) if case_dir is not None else "") + text = text.replace("{repo_root}", str(repo_root) if repo_root is not None else "") + text = text.replace("{central_build_dir}", central_dir) + return text if text.strip() else None + + +def get_solver_build_policy( + solver_code: str, + runtime_config: Any = None, + *, + case_dir: Path | None = None, + repo_root: Path | None = None, + central_build_dirs: list[Path] | None = None, +) -> dict[str, Any]: + """Resolve build/executable policy for a solver with optional runtime overrides.""" + solver = str(solver_code).strip().upper() + solver_config = get_config_class(solver) + + preference = str( + _runtime_override( + runtime_config, + f"{solver.lower()}_build_system_preference", + solver_config.get_build_system_preference(), + ) + ).strip().lower() + if preference not in {"cmake", "gnumake"}: + preference = "gnumake" + + templates = _runtime_override( + runtime_config, + f"{solver.lower()}_executable_search_path_templates", + solver_config.get_executable_search_path_templates(), + ) + + cmake_names = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_executable_names", + solver_config.get_cmake_executable_names(), + ) + cmake_ignore_suffix = bool( + _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_executable_ignores_accel_suffix", + solver_config.cmake_ignores_accel_suffix(), + ) + ) + gnumake_globs = _runtime_override( + runtime_config, + f"{solver.lower()}_gnumake_executable_globs", + solver_config.get_gnumake_executable_globs(), + ) + cmake_source_dir_template = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_source_dir_template", + solver_config.get_cmake_source_dir_template(), + ) + cmake_build_dir_template = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_build_dir_template", + solver_config.get_cmake_build_dir_template(), + ) + cmake_install_prefix_template = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_install_prefix_template", + solver_config.get_cmake_install_prefix_template(), + ) + cmake_configure_args = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_configure_args", + solver_config.get_cmake_configure_args(), + ) + cmake_build_args = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_build_args", + solver_config.get_cmake_build_args(), + ) + cmake_install_args = _runtime_override( + runtime_config, + f"{solver.lower()}_cmake_install_args", + solver_config.get_cmake_install_args(), + ) + gnumake_clean_targets = _runtime_override( + runtime_config, + f"{solver.lower()}_gnumake_clean_targets", + solver_config.get_gnumake_clean_targets(), + ) + gnumake_build_args = _runtime_override( + runtime_config, + f"{solver.lower()}_gnumake_build_args", + solver_config.get_gnumake_build_args(), + ) + + compile_policy = { + "cmake_source_dir_template": str(cmake_source_dir_template), + "cmake_build_dir_template": str(cmake_build_dir_template), + "cmake_install_prefix_template": ( + None if cmake_install_prefix_template is None else str(cmake_install_prefix_template) + ), + "cmake_source_dir": _resolve_template( + str(cmake_source_dir_template), + case_dir=case_dir, + repo_root=repo_root, + central_build_dirs=central_build_dirs, + ), + "cmake_build_dir": _resolve_template( + str(cmake_build_dir_template), + case_dir=case_dir, + repo_root=repo_root, + central_build_dirs=central_build_dirs, + ), + "cmake_install_prefix": _resolve_template( + None if cmake_install_prefix_template is None else str(cmake_install_prefix_template), + case_dir=case_dir, + repo_root=repo_root, + central_build_dirs=central_build_dirs, + ), + "cmake_configure_args": _normalize_string_list(cmake_configure_args), + "cmake_build_args": _normalize_string_list(cmake_build_args), + "cmake_install_args": _normalize_string_list(cmake_install_args), + "gnumake_clean_targets": _normalize_string_list(gnumake_clean_targets, default=["realclean"]), + "gnumake_build_args": _normalize_string_list(gnumake_build_args), + } + + return { + "solver_config": solver_config, + "build_system_preference": preference, + "executable_search_path_templates": [str(item) for item in (templates or [])], + "cmake_executable_names": [str(item) for item in (cmake_names or [])], + "cmake_executable_ignores_accel_suffix": cmake_ignore_suffix, + "gnumake_executable_globs": [str(item) for item in (gnumake_globs or ["*.ex"])], + "compile_policy": compile_policy, + } + + +def derive_central_build_dir(case_dir: Path, repo_root: Path | None) -> Path | None: + """Derive central build directory as ``Exec/`` from a case path.""" + case_path = Path(case_dir).resolve() + repo_path = Path(repo_root).resolve() if repo_root else None + + relative_case = None + if repo_path: + try: + relative_case = case_path.relative_to(repo_path) + except ValueError: + relative_case = None + + if relative_case is None: + return None + if not relative_case.parts or relative_case.parts[0] != "Exec": + return None + if len(relative_case.parts) < 2: + return None + return repo_path / "Exec" / relative_case.parts[1] + + +def central_build_candidates( + case_dir: Path, + repo_root: Path | None, + configured_central_build_dir: str | Path | None = None, +) -> list[Path]: + """Return ordered unique central-build candidates.""" + candidates: list[Path] = [] + derived = derive_central_build_dir(case_dir, repo_root) + if derived: + candidates.append(derived) + + if configured_central_build_dir: + configured = Path(os.path.expandvars(str(configured_central_build_dir))).expanduser() + candidates.append(configured) + + unique: list[Path] = [] + seen: set[str] = set() + for candidate in candidates: + key = str(candidate.resolve()) + if key in seen: + continue + seen.add(key) + unique.append(candidate) + return unique + + +def expand_local_candidate_dirs( + *, + policy: dict[str, Any], + case_dir: Path, + repo_root: Path | None, + central_build_dirs: list[Path], +) -> list[Path]: + """Expand local template directories from policy tokens.""" + templates = list(policy.get("executable_search_path_templates", [])) + candidates: list[Path] = [] + + for template in templates: + template_text = str(template) + for central_dir in (central_build_dirs or [None]): + text = template_text.replace("{case_dir}", str(case_dir)) + text = text.replace("{repo_root}", str(repo_root) if repo_root is not None else "") + text = text.replace("{central_build_dir}", str(central_dir) if central_dir is not None else "") + if not text.strip(): + continue + candidates.append(Path(text).expanduser()) + + unique: list[Path] = [] + seen: set[str] = set() + for candidate in candidates: + key = str(candidate.resolve()) + if key in seen: + continue + seen.add(key) + unique.append(candidate) + return unique + + +def _matches_requirements( + exe_name: str, + *, + require_mpi: bool, + require_cuda: bool, + ignore_accel_suffix: bool, +) -> bool: + if ignore_accel_suffix: + return True + + name = exe_name.lower() + has_mpi = "mpi" in name + has_cuda = "cuda" in name + if require_mpi and not has_mpi: + return False + if require_cuda and not has_cuda: + return False + return True + + +def _branch_order(preference: str) -> list[str]: + pref = str(preference).strip().lower() + return ["cmake", "gnumake"] if pref == "cmake" else ["gnumake", "cmake"] + + +def resolve_local_executable_fallback( + *, + solver_code: str, + runtime_config: Any, + case_dir: Path, + repo_root: Path | None, + configured_executable_path: str | Path | None, + central_build_dirs: list[Path], + require_mpi: bool, + require_cuda: bool, + find_default_executable: Callable[[Path, bool, bool], Path | None], +) -> dict[str, Any]: + """Resolve solver executable fallback using shared policy semantics. + + Returns dict keys: + - executable_path: Path | None + - checked_paths: list[Path] + - effective_policy: dict[str, Any] + - candidate_dirs: list[Path] + - branch_order: list[str] + - selected_branch: str | None + - matching_rules: dict[str, Any] + """ + policy = get_solver_build_policy( + solver_code, + runtime_config=runtime_config, + case_dir=case_dir, + repo_root=repo_root, + central_build_dirs=central_build_dirs, + ) + checked_paths: list[Path] = [Path(case_dir)] + + if configured_executable_path: + configured = Path(os.path.expandvars(str(configured_executable_path))).expanduser() + checked_paths.append(configured) + if configured.is_file(): + return { + "executable_path": configured, + "checked_paths": checked_paths, + "effective_policy": policy, + "candidate_dirs": [], + "branch_order": ["configured"], + "selected_branch": "configured", + "matching_rules": { + "cmake_executable_names": policy.get("cmake_executable_names", []), + "cmake_executable_ignores_accel_suffix": policy.get( + "cmake_executable_ignores_accel_suffix", False + ), + "gnumake_executable_globs": policy.get("gnumake_executable_globs", []), + }, + } + + candidate_dirs = expand_local_candidate_dirs( + policy=policy, + case_dir=Path(case_dir), + repo_root=repo_root, + central_build_dirs=central_build_dirs, + ) + + branch_order = _branch_order(str(policy.get("build_system_preference", "gnumake"))) + for branch in branch_order: + for search_dir in candidate_dirs: + if search_dir not in checked_paths: + checked_paths.append(search_dir) + if not search_dir.exists(): + continue + + if branch == "cmake": + names = list(policy.get("cmake_executable_names") or []) + ignore_suffix = bool(policy.get("cmake_executable_ignores_accel_suffix", False)) + for name in names: + candidate = search_dir / name + if candidate.is_file() and _matches_requirements( + candidate.name, + require_mpi=require_mpi, + require_cuda=require_cuda, + ignore_accel_suffix=ignore_suffix, + ): + return { + "executable_path": candidate, + "checked_paths": checked_paths, + "effective_policy": policy, + "candidate_dirs": candidate_dirs, + "branch_order": branch_order, + "selected_branch": "cmake", + "matching_rules": { + "cmake_executable_names": names, + "cmake_executable_ignores_accel_suffix": ignore_suffix, + "gnumake_executable_globs": policy.get("gnumake_executable_globs", []), + }, + } + else: + globs = list(policy.get("gnumake_executable_globs") or ["*.ex"]) + for pattern in globs: + for candidate in sorted(search_dir.glob(pattern)): + if not candidate.is_file(): + continue + if _matches_requirements( + candidate.name, + require_mpi=require_mpi, + require_cuda=require_cuda, + ignore_accel_suffix=False, + ): + return { + "executable_path": candidate, + "checked_paths": checked_paths, + "effective_policy": policy, + "candidate_dirs": candidate_dirs, + "branch_order": branch_order, + "selected_branch": "gnumake", + "matching_rules": { + "cmake_executable_names": policy.get("cmake_executable_names", []), + "cmake_executable_ignores_accel_suffix": policy.get( + "cmake_executable_ignores_accel_suffix", False + ), + "gnumake_executable_globs": globs, + }, + } + + fallback = find_default_executable(search_dir, require_mpi, require_cuda) + if fallback: + return { + "executable_path": fallback, + "checked_paths": checked_paths, + "effective_policy": policy, + "candidate_dirs": candidate_dirs, + "branch_order": branch_order, + "selected_branch": "gnumake", + "matching_rules": { + "cmake_executable_names": policy.get("cmake_executable_names", []), + "cmake_executable_ignores_accel_suffix": policy.get( + "cmake_executable_ignores_accel_suffix", False + ), + "gnumake_executable_globs": policy.get("gnumake_executable_globs", []), + }, + } + + return { + "executable_path": None, + "checked_paths": checked_paths, + "effective_policy": policy, + "candidate_dirs": candidate_dirs, + "branch_order": branch_order, + "selected_branch": None, + "matching_rules": { + "cmake_executable_names": policy.get("cmake_executable_names", []), + "cmake_executable_ignores_accel_suffix": policy.get( + "cmake_executable_ignores_accel_suffix", False + ), + "gnumake_executable_globs": policy.get("gnumake_executable_globs", []), + }, + } diff --git a/src/services/visualization.py b/src/services/visualization.py index c0ae573..cecd093 100644 --- a/src/services/visualization.py +++ b/src/services/visualization.py @@ -2,10 +2,7 @@ VisualizationService - Multi-backend AMReX plotfile visualization. Purpose: Generate visualizations from AMReX plotfiles -Backends: AMReX native tools (preferred), pyamrex (optional), yt-project (fallback) - -Phase 4: yt-only -Phase 5: Multi-backend with AMReX tools priority +Backends: yt-project (default), pyamrex (optional), AMReX native tools (opt-in) Based on: Plan at /home/jmsexton/.claude/plans/dynamic-foraging-pond.md """ @@ -22,10 +19,8 @@ class VisualizationService: """Multi-backend AMReX plotfile visualization. Features: - - Auto-selects best available backend: - 1. AMReX Tools (fextract, fextrema, fsnapshot) - 2. PyAMReX (Python bindings) - optional - 3. yt-project (fallback) + - Selects backend from config.visualization_backend. + - Defaults to yt to avoid fsnapshot/toolchain coupling. - Container-aware two-stage architecture (with yt backend) - Auto-detect available fields - Standard plots (Temp, density, species) @@ -45,7 +40,7 @@ def __init__(self, config): self.backend = self._select_backend() def _select_backend(self): - """Auto-select best available backend.""" + """Select backend honoring config.visualization_backend.""" from .amrex_tools_backend import AMReXToolsBackend from .yt_backend import YtBackend @@ -56,23 +51,33 @@ def _select_backend(self): except ImportError: has_pyamrex = False - # Priority order - backends = [ - ('amrex_tools', AMReXToolsBackend), # Priority 1: Native C++ tools - ] + requested_backend = str(getattr(self.config, "visualization_backend", "yt")).strip().lower() + if requested_backend in {"", "auto"}: + requested_backend = "yt" + backend_map: dict[str, type] = { + "yt": YtBackend, + "amrex_tools": AMReXToolsBackend, + } if has_pyamrex: - backends.append(('pyamrex', PyAMReXBackend)) # Priority 2: Python bindings + backend_map["pyamrex"] = PyAMReXBackend - backends.append(('yt', YtBackend)) # Priority 3: Fallback + backend_class = backend_map.get(requested_backend) + if backend_class is None: + valid = sorted(backend_map.keys()) + raise RuntimeError( + f"Unknown visualization backend '{requested_backend}'. " + f"Expected one of: {', '.join(valid)}" + ) - for name, backend_class in backends: - backend = backend_class(self.config) - if backend.available(): - logger.debug(f" Selected visualization backend: {name}") - return backend + backend = backend_class(self.config) + if not backend.available(): + raise RuntimeError( + f"Visualization backend '{requested_backend}' is not available in this environment" + ) - raise RuntimeError("No visualization backend available") + logger.debug(f" Selected visualization backend: {requested_backend}") + return backend def find_plotfiles(self, run_dir: Path) -> list[Path]: """ @@ -175,11 +180,13 @@ def create_standard_plots(self, logger.warning("[WARN] No plotfiles found") return [] - # Use latest plotfile - latest = plotfiles[-1] + timestep_mode = "latest" + if isinstance(vis_config, dict): + timestep_mode = str(vis_config.get("timesteps", "latest")).strip().lower() or "latest" + target_plotfiles = plotfiles if timestep_mode == "all" else [plotfiles[-1]] # Get available fields - fields = self.backend.get_field_list(latest) + fields = self.backend.get_field_list(target_plotfiles[-1]) logger.debug("available fields (%d): %s", len(fields), fields) # Determine which fields to plot @@ -199,33 +206,37 @@ def create_standard_plots(self, # Create plots images = [] logger.debug("plots to render (%d): %s", len(plots), plots) - for plot_cfg in plots: - try: - if plot_cfg.get('type') != 'slice': - logger.debug(f" Skipping unsupported plot type: {plot_cfg.get('type')}") - continue - field = plot_cfg.get('field') - axis = plot_cfg.get('axis', 'z') - colormap = plot_cfg.get('colormap', 'viridis') - if not field: - logger.debug(" Skipping plot with missing field") - continue - - output_path = output_dir / f"{field}_slice.png" - - self.backend.create_slice_plot( - plotfile=latest, - field=field, - axis=axis, - output_path=output_path, - colormap=colormap - ) + for plotfile in target_plotfiles: + for plot_cfg in plots: + try: + if plot_cfg.get('type') != 'slice': + logger.debug(f" Skipping unsupported plot type: {plot_cfg.get('type')}") + continue + field = plot_cfg.get('field') + axis = plot_cfg.get('axis', 'z') + colormap = plot_cfg.get('colormap', 'viridis') + if not field: + logger.debug(" Skipping plot with missing field") + continue + + if len(target_plotfiles) > 1: + output_path = output_dir / f"{plotfile.name}_{field}_slice.png" + else: + output_path = output_dir / f"{field}_slice.png" - images.append(output_path) - logger.debug(f" Created {field} slice") + self.backend.create_slice_plot( + plotfile=plotfile, + field=field, + axis=axis, + output_path=output_path, + colormap=colormap + ) - except Exception as e: - logger.debug(f" Failed to create {field} slice: {e}") + images.append(output_path) + logger.debug(f" Created {plotfile.name}: {field} slice") + + except Exception as e: + logger.debug(f" Failed to create {field} slice for {plotfile.name}: {e}") logger.debug(f"\n[ OK ] Generated {len(images)} visualizations") diff --git a/src/services/viz_param_extractor.py b/src/services/viz_param_extractor.py index a1a6f99..69684ad 100644 --- a/src/services/viz_param_extractor.py +++ b/src/services/viz_param_extractor.py @@ -1,14 +1,19 @@ -""" -Deterministic visualization parameter extraction from user prompt text. -""" +"""Deterministic visualization intent extraction and solver-field mapping.""" from __future__ import annotations import logging +import re from pathlib import Path +from typing import Any logger = logging.getLogger(__name__) + +class VizMappingCatalogUnavailableError(RuntimeError): + """Raised when solver code-derived viz catalog is required but unavailable.""" + + QUANTITY_KEYWORDS: dict[str, list[str]] = { "temperature": ["temperature", "temp", "thermal"], "velocity": ["velocity", "speed"], @@ -37,20 +42,29 @@ "line": ["line plot", "time series"], } -# Schema source: database/schemas/ encodes concrete parameter keys per solver. -# This mapping was derived from schema inspection. If a new solver config is -# added to database/configs/, add its plotfile var parameter name here. -# Long-term: this mapping should be declared in each solver's BaseAMReXConfig -# subclass as a class-level attribute: plotfile_var_param: str = 'amr.plot_vars' PLOTFILE_VAR_PARAM: dict[str, str] = { "AMReX": "amr.plot_vars", "PeleC": "amr.plot_vars", "PeleLMeX": "peleLM.derive_plot_vars", - "ERF": "amr.plot_vars", + "ERF": "erf.plot_vars_1", "REMORA": "amr.plot_vars", } PLOTFILE_VAR_PARAM_DEFAULT = "amr.plot_vars" +PLOTFILE_PERIOD_PARAM: dict[str, str] = { + "AMReX": "amr.plot_per", + "PeleLMeX": "amr.plot_per", + "ERF": "erf.plot_per_1", + "REMORA": "remora.plot_int_time", +} + +PLOTFILE_STEP_INTERVAL_PARAM: dict[str, str] = { + "AMReX": "amr.plot_int", + "PeleLMeX": "amr.plot_int", + "ERF": "erf.plot_int_1", + "REMORA": "remora.plot_int", +} + def _extract_quantities(prompt_lower: str) -> list[str]: requested: list[str] = [] @@ -59,7 +73,6 @@ def _extract_quantities(prompt_lower: str) -> list[str]: ) for quantity, keywords in QUANTITY_KEYWORDS.items(): if quantity == "velocity" and has_vertical_velocity: - # Avoid double-counting generic velocity from "vertical velocity". continue if any(keyword in prompt_lower for keyword in keywords): requested.append(quantity) @@ -91,21 +104,226 @@ def _extract_viz_type(prompt_lower: str) -> str | None: return None -def get_plotfile_var_param(code_name: str) -> str: - """ - Return the code-specific inputs file parameter name for plotfile variables. +def _extract_plot_interval_seconds(prompt_lower: str) -> int | None: + pattern = re.compile( + r"\b(?:every|each)\s+(\d+(?:\.\d+)?)\s*" + r"(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h)\b" + ) + match = pattern.search(prompt_lower) + if not match: + return None + + amount = float(match.group(1)) + unit = match.group(2).lower() + if unit.startswith("h"): + seconds = amount * 3600.0 + elif unit.startswith("m"): + seconds = amount * 60.0 + else: + seconds = amount + if seconds <= 0: + return None + return int(round(seconds)) + + +def _extract_timestep_scope(prompt_lower: str, has_cadence: bool) -> str | None: + if has_cadence: + return "all" + if any( + kw in prompt_lower + for kw in ("movie", "animation", "evolution", "all timesteps", "all plotfiles") + ): + return "all" + return None - Falls back to amr.plot_vars with a warning for unknown solvers. - """ + +def _normalize_tier1(raw: Any) -> dict[str, dict[str, Any]]: + normalized: dict[str, dict[str, Any]] = {} + if not isinstance(raw, dict): + raw = {} + for token, spec in raw.items(): + token_name = str(token).strip() + if not token_name: + continue + aliases = [token_name] + if isinstance(spec, dict): + for alias in spec.get("aliases", []) or []: + alias_str = str(alias).strip() + if alias_str: + aliases.append(alias_str) + normalized[token_name] = {"aliases": _dedupe_preserve_order(aliases)} + return normalized + + +def _normalize_candidates(raw: Any) -> dict[str, list[dict[str, Any]]]: + out: dict[str, list[dict[str, Any]]] = {} + if not isinstance(raw, dict): + return out + for token, entries in raw.items(): + token_name = str(token).strip() + if not token_name or not isinstance(entries, list): + continue + token_entries: list[dict[str, Any]] = [] + for entry in entries: + if not isinstance(entry, dict): + continue + name = str(entry.get("name", "")).strip() + if not name: + continue + aliases = [name] + for alias in entry.get("aliases", []) or []: + alias_str = str(alias).strip() + if alias_str: + aliases.append(alias_str) + token_entries.append( + { + "name": name, + "aliases": _dedupe_preserve_order(aliases), + "units": entry.get("units"), + "source": entry.get("source"), + "description": entry.get("description"), + } + ) + if token_entries: + out[token_name] = token_entries + return out + + +def _build_alias_index(entries: list[dict[str, Any]]) -> dict[str, list[dict[str, Any]]]: + alias_index: dict[str, list[dict[str, Any]]] = {} + for entry in entries: + for alias in entry.get("aliases", []) or []: + key = str(alias).strip().lower() + if not key: + continue + alias_index.setdefault(key, []).append(entry) + return alias_index + + +def get_plot_var_param_candidates(code_name: str) -> list[str]: if not code_name: - logger.warning("Unknown solver '' - falling back to %s", PLOTFILE_VAR_PARAM_DEFAULT) - return PLOTFILE_VAR_PARAM_DEFAULT + return [PLOTFILE_VAR_PARAM_DEFAULT] + try: + from database.configs.registry import get_config_class - if code_name in PLOTFILE_VAR_PARAM: - return PLOTFILE_VAR_PARAM[code_name] + config_cls = get_config_class(code_name) + getter = getattr(config_cls, "get_plot_var_param_candidates", None) + if callable(getter): + values = getter() + if isinstance(values, list): + cleaned = [str(v).strip() for v in values if str(v).strip()] + if cleaned: + return _dedupe_preserve_order(cleaned) + except Exception as exc: + logger.debug("plot-var candidates lookup failed for %s: %s", code_name, exc) + legacy = PLOTFILE_VAR_PARAM.get(code_name) + if legacy: + return [legacy] logger.warning("Unknown solver '%s' - falling back to %s", code_name, PLOTFILE_VAR_PARAM_DEFAULT) - return PLOTFILE_VAR_PARAM_DEFAULT + return [PLOTFILE_VAR_PARAM_DEFAULT] + + +def get_plotfile_var_param(code_name: str) -> str: + return get_plot_var_param_candidates(code_name)[0] + + +def resolve_viz_field_mapping( + requested: list[str], + *, + code_name: str | None, + repo_root: str | Path | None = None, + require_solver_catalog: bool = True, +) -> dict[str, Any]: + requested_tokens = _dedupe_preserve_order([str(t).strip() for t in requested if str(t).strip()]) + result: dict[str, Any] = { + "resolved_fields": [], + "candidate_fields_by_token": {}, + "unresolved_tokens": [], + "ambiguous_tokens": [], + "mapping_source": "none", + "mapping_confidence": 1.0, + } + if not requested_tokens: + return result + if not code_name: + result["resolved_fields"] = requested_tokens + result["mapping_source"] = "semantic_only" + return result + + from database.configs.registry import get_config_class + + config_cls = get_config_class(code_name) + unknown_solver = getattr(config_cls, "code_name", "amrex_base") == "amrex_base" and code_name not in PLOTFILE_VAR_PARAM + tier1_getter = getattr(config_cls, "get_viz_tier1_intents", None) + tier2_getter = getattr(config_cls, "build_viz_tier2_candidates", None) + tier1 = _normalize_tier1(tier1_getter() if callable(tier1_getter) else {}) + tier2_raw = tier2_getter(Path(repo_root) if repo_root else None) if callable(tier2_getter) else {} + tier2 = _normalize_candidates(tier2_raw) + if not tier2: + catalog_getter = getattr(config_cls, "get_viz_variable_catalog", None) + if callable(catalog_getter): + catalog = catalog_getter(Path(repo_root) if repo_root else None) or [] + normalized_catalog = _normalize_candidates( + { + token: catalog + for token in (list(tier1.keys()) or requested_tokens) + } + ) + tier2 = normalized_catalog + + if require_solver_catalog and not tier2 and not unknown_solver: + repo_hint = str(repo_root) if repo_root else "" + raise VizMappingCatalogUnavailableError( + "Visualization mapping requires solver code-derived catalog but none was found for " + f"'{code_name}'. Set a valid repository path (e.g. {repo_hint}) and retry." + ) + if not tier2 and unknown_solver: + result["resolved_fields"] = requested_tokens + result["mapping_source"] = "semantic_only" + return result + + combined_entries: list[dict[str, Any]] = [] + for entries in tier2.values(): + combined_entries.extend(entries) + alias_index = _build_alias_index(combined_entries) + + resolved: list[str] = [] + for token in requested_tokens: + token_key = token.lower() + candidates = list(alias_index.get(token_key, [])) + if not candidates: + semantic_spec = tier1.get(token, {}) + for alias in semantic_spec.get("aliases", []) or [token]: + candidates.extend(alias_index.get(str(alias).lower(), [])) + if not candidates and token in tier2: + candidates.extend(tier2.get(token, [])) + + unique: list[dict[str, Any]] = [] + seen_names: set[str] = set() + for entry in candidates: + name = str(entry.get("name", "")).strip() + if not name or name in seen_names: + continue + seen_names.add(name) + unique.append(entry) + + if len(unique) == 1: + resolved.append(unique[0]["name"]) + result["candidate_fields_by_token"][token] = unique + continue + if len(unique) > 1: + result["candidate_fields_by_token"][token] = unique + result["ambiguous_tokens"].append(token) + continue + result["unresolved_tokens"].append(token) + + result["resolved_fields"] = _dedupe_preserve_order(resolved) + result["mapping_source"] = "solver_catalog" + total = len(requested_tokens) + mapped = len(result["resolved_fields"]) + result["mapping_confidence"] = float(mapped / total) if total else 1.0 + return result def canonicalize_requested_plot_vars( @@ -113,66 +331,95 @@ def canonicalize_requested_plot_vars( code_name: str | None = None, repo_root: str | Path | None = None, ) -> list[str]: - """ - Canonicalize extracted visualization requests to solver-native plot variables. - - If no solver or source catalog is available, returns the original list. - """ - if not requested or not code_name: + if not requested: + return [] + if not code_name: return _dedupe_preserve_order(requested) + mapping = resolve_viz_field_mapping( + requested, + code_name=code_name, + repo_root=repo_root, + require_solver_catalog=True, + ) + return mapping["resolved_fields"] + + +def get_plotfile_period_param(code_name: str) -> str | None: + if not code_name: + return None try: from database.configs.registry import get_config_class config_cls = get_config_class(code_name) - catalog_fn = getattr(config_cls, "get_viz_variable_catalog", None) - if catalog_fn is None: - return _dedupe_preserve_order(requested) - catalog = catalog_fn(Path(repo_root) if repo_root else None) + getter = getattr(config_cls, "get_plotfile_period_param", None) + if callable(getter): + value = getter() + if isinstance(value, str) and value.strip(): + return value.strip() + return None except Exception as exc: - logger.debug("viz catalog lookup failed for %s: %s", code_name, exc) - return _dedupe_preserve_order(requested) + logger.debug("plotfile-period param lookup via config failed for %s: %s", code_name, exc) - if not catalog: - return _dedupe_preserve_order(requested) + return PLOTFILE_PERIOD_PARAM.get(code_name) - alias_to_name: dict[str, str] = {} - for entry in catalog: - if not isinstance(entry, dict): - continue - name = str(entry.get("name", "")).strip() - if not name: - continue - alias_to_name[name.lower()] = name - for alias in entry.get("aliases", []) or []: - alias_to_name[str(alias).strip().lower()] = name - - semantic_candidates = { - "temperature": ["temperature", "temp", "Temp"], - "velocity": ["magvel", "mag_vel", "velocity", "x_velocity"], - "vertical_velocity": ["z_velocity", "w_velocity", "w", "vertical velocity"], - "pressure": ["pressure", "pres"], - "density": ["density", "rho"], - "vorticity": ["vorticity", "magvort", "mag_vort", "VortZ", "vorticity_z"], - "cloud_water": ["qc", "cloud water", "cloud_water", "liquid water"], - } - mapped: list[str] = [] - for token in requested: - token_lower = token.lower() - if token_lower in alias_to_name: - mapped.append(alias_to_name[token_lower]) - continue +def get_plotfile_step_interval_param(code_name: str) -> str | None: + if not code_name: + return None + + try: + from database.configs.registry import get_config_class + + config_cls = get_config_class(code_name) + getter = getattr(config_cls, "get_plotfile_step_interval_param", None) + if callable(getter): + value = getter() + if isinstance(value, str) and value.strip(): + return value.strip() + return None + except Exception as exc: + logger.debug("plotfile-step param lookup via config failed for %s: %s", code_name, exc) + + return PLOTFILE_STEP_INTERVAL_PARAM.get(code_name) - resolved = None - for candidate in semantic_candidates.get(token, [token]): - key = candidate.lower() - if key in alias_to_name: - resolved = alias_to_name[key] - break - mapped.append(resolved or token) - return _dedupe_preserve_order(mapped) +def convert_prompt_seconds_to_solver_time(code_name: str, prompt_seconds: int | float | None) -> float | None: + if prompt_seconds is None: + return None + try: + seconds = float(prompt_seconds) + except (TypeError, ValueError): + return None + if seconds <= 0: + return None + if not code_name: + return None + + try: + from database.configs.registry import get_config_class + + config_cls = get_config_class(code_name) + if getattr(config_cls, "code_name", "") == "amrex_base" and code_name not in PLOTFILE_PERIOD_PARAM: + return None + supports_fn = getattr(config_cls, "supports_physical_time_cadence", None) + if callable(supports_fn) and supports_fn() is False: + return None + converter = getattr(config_cls, "convert_plot_cadence_prompt_seconds_to_solver_time", None) + if callable(converter): + converted = converter(seconds) + if converted is None: + return None + converted_value = float(converted) + if converted_value <= 0: + return None + return converted_value + except Exception as exc: + logger.debug("cadence conversion via config failed for %s: %s", code_name, exc) + + if code_name in PLOTFILE_PERIOD_PARAM: + return seconds + return None def extract_viz_params_from_prompt( @@ -180,24 +427,11 @@ def extract_viz_params_from_prompt( code_name: str | None = None, repo_root: str | Path | None = None, ) -> tuple[list[str], dict]: - """ - Extract visualization parameters from prompt. - - Keyword matching only. No LLM. Deterministic. - Returns empty list and empty dict when nothing found. - - B1 handoff: superseded by Intent Extraction Node when - enable_intent_extraction=True. - """ + del code_name, repo_root normalized = (prompt or "").lower() - requested_plot_vars = _extract_quantities(normalized) - requested_plot_vars = canonicalize_requested_plot_vars( - requested_plot_vars, - code_name=code_name, - repo_root=repo_root, - ) + requested_plot_vars = _dedupe_preserve_order(_extract_quantities(normalized)) - visualization_config: dict[str, str] = {} + visualization_config: dict[str, Any] = {} color_scale = _extract_color_scale(normalized) if color_scale: visualization_config["color_scale"] = color_scale @@ -206,4 +440,15 @@ def extract_viz_params_from_prompt( if viz_type: visualization_config["viz_type"] = viz_type - return _dedupe_preserve_order(requested_plot_vars), visualization_config + plot_interval_seconds = _extract_plot_interval_seconds(normalized) + if plot_interval_seconds is not None: + visualization_config["plot_interval_seconds"] = plot_interval_seconds + + timestep_scope = _extract_timestep_scope( + normalized, + has_cadence=plot_interval_seconds is not None, + ) + if timestep_scope: + visualization_config["timesteps"] = timestep_scope + + return requested_plot_vars, visualization_config diff --git a/tests/integration/l5_full_pipeline/test_cli_interface.py b/tests/integration/l5_full_pipeline/test_cli_interface.py index 778e135..f139f1f 100644 --- a/tests/integration/l5_full_pipeline/test_cli_interface.py +++ b/tests/integration/l5_full_pipeline/test_cli_interface.py @@ -104,12 +104,13 @@ def test_main_success_exit_code(self, tmp_path): """ # Mock run_agent to return success with patch("src.main.run_agent") as mock_run: - mock_run.return_value = { - "job_status": "completed", - "mode": "proceed" - } + with patch("src.main._run_startup_preflight", return_value=None): + mock_run.return_value = { + "job_status": "completed", + "mode": "proceed" + } - main(["--prompt", "Test", "--output-dir", str(tmp_path)]) + main(["--prompt", "Test", "--output-dir", str(tmp_path)]) def test_main_failure_exit_code(self, tmp_path): """ @@ -120,16 +121,17 @@ def test_main_failure_exit_code(self, tmp_path): Then: sys.exit(1) """ with patch("src.main.run_agent") as mock_run: - mock_run.return_value = { - "job_status": "failed", - "error": "Test error", - "mode": "fail" - } + with patch("src.main._run_startup_preflight", return_value=None): + mock_run.return_value = { + "job_status": "failed", + "error": "Test error", + "mode": "fail" + } - with pytest.raises(SystemExit) as exc_info: - main(["--prompt", "Test", "--output-dir", str(tmp_path)]) + with pytest.raises(SystemExit) as exc_info: + main(["--prompt", "Test", "--output-dir", str(tmp_path)]) - assert exc_info.value.code == 1 + assert exc_info.value.code == 1 def test_json_output_format(self, tmp_path, capsys): """ @@ -142,19 +144,20 @@ def test_json_output_format(self, tmp_path, capsys): import json with patch("src.main.run_agent") as mock_run: - mock_run.return_value = { - "job_status": "completed", - "job_id": "test_123" - } + with patch("src.main._run_startup_preflight", return_value=None): + mock_run.return_value = { + "job_status": "completed", + "job_id": "test_123" + } - main(["--prompt", "Test", "--output-dir", str(tmp_path), "--json"]) + main(["--prompt", "Test", "--output-dir", str(tmp_path), "--json"]) - captured = capsys.readouterr() + captured = capsys.readouterr() - # Verify valid JSON - output = json.loads(captured.out) - assert output["job_status"] == "completed" - assert output["job_id"] == "test_123" + # Verify valid JSON + output = json.loads(captured.out) + assert output["job_status"] == "completed" + assert output["job_id"] == "test_123" def test_main_uses_short_dns_prompt_file(self, tmp_path): """ @@ -169,13 +172,14 @@ def test_main_uses_short_dns_prompt_file(self, tmp_path): assert prompt_path.exists(), f"Prompt file missing: {prompt_path}" with patch("src.main.run_agent") as mock_run: - mock_run.return_value = { - "job_status": "completed", - "mode": "proceed" - } + with patch("src.main._run_startup_preflight", return_value=None): + mock_run.return_value = { + "job_status": "completed", + "mode": "proceed" + } - main(["--prompt-path", str(prompt_path), "--output-dir", str(tmp_path), "--dry-run"]) + main(["--prompt-path", str(prompt_path), "--output-dir", str(tmp_path), "--dry-run"]) - assert mock_run.call_count == 1 - passed_prompt = mock_run.call_args[0][0] - assert "50 steps" in passed_prompt + assert mock_run.call_count == 1 + passed_prompt = mock_run.call_args[0][0] + assert "50 steps" in passed_prompt diff --git a/tests/integration/l5_full_pipeline/test_full_graph.py b/tests/integration/l5_full_pipeline/test_full_graph.py index 9d01026..1de09d0 100644 --- a/tests/integration/l5_full_pipeline/test_full_graph.py +++ b/tests/integration/l5_full_pipeline/test_full_graph.py @@ -251,6 +251,8 @@ def test_state_initialization(self, tmp_path): @pytest.mark.integration_full @pytest.mark.slow +@pytest.mark.requires_solver("PeleC") +@pytest.mark.requires_repos("PeleC") class TestVisualizationParameterExtraction: """ Visualization parameter extraction end-to-end. @@ -271,14 +273,14 @@ def _plan( ) -> SimulationPlan: return SimulationPlan( selected_solver="PeleC", - selected_case="PeleC/Exec/RegTests/PMF", + selected_case="Exec/RegTests/PMF", modifications=[], reasoning="Visualization extraction baseline test", baseline_confidence=0.9, prompt=prompt, baseline={ "code_name": "PeleC", - "repo_path": str(baseline_dir.parents[3]), + "repo_path": str(baseline_dir.parents[2]), "case_path": "Exec/RegTests/PMF", "local_path": str(baseline_dir), }, @@ -286,8 +288,25 @@ def _plan( ) def _make_baseline_dir(self, tmp_path: Path) -> Path: + repo_root = tmp_path / "PeleC" baseline = tmp_path / "PeleC" / "Exec" / "RegTests" / "PMF" baseline.mkdir(parents=True, exist_ok=True) + source_dir = repo_root / "Source" + source_dir.mkdir(parents=True, exist_ok=True) + (source_dir / "Setup.cpp").write_text( + "\n".join( + [ + "void setup() {", + ' name[cnt] = "density";', + ' name[cnt] = "Temp";', + ' derive_lst.add("magvel");', + ' derive_lst.add("magvort");', + ' derive_lst.add("z_velocity");', + "}", + "", + ] + ) + ) (baseline / "AMReX.ex").write_text("#!/bin/bash\nexit 0\n") (baseline / "inputs").write_text( "\n".join( @@ -307,7 +326,7 @@ def _run_pipeline(self, prompt: str, tmp_path: Path, visualization: dict | None config = AMReXAgentConfig() config.output_dir = tmp_path / "output" config.environment = "perlmutter" - config.repositories = {"PeleC": baseline_dir.parents[3]} + config.repositories = {"PeleC": baseline_dir.parents[2]} config.run_mode = "dry_run" config.dry_run = True @@ -399,7 +418,7 @@ def test_temperature_in_prompt_produces_plotfile_var( visualization={"quantities": ["temperature"]}, ) plot_vars = self._plot_vars(self._read_inputs_text(final_state)) - assert "temperature" in plot_vars + assert "Temp" in plot_vars def test_multiple_quantities_all_in_plotfile_vars( self, tmp_path): @@ -420,9 +439,9 @@ def test_multiple_quantities_all_in_plotfile_vars( }, ) plot_vars = self._plot_vars(self._read_inputs_text(final_state)) - assert "temperature" in plot_vars - assert "velocity" in plot_vars - assert "vorticity" in plot_vars + assert "Temp" in plot_vars + assert "magvel" in plot_vars + assert "magvort" in plot_vars def test_log_scale_in_prompt_sets_viz_metadata( self, tmp_path): @@ -492,5 +511,99 @@ def test_squall_line_with_viz_params(self, tmp_path): }, ) plot_vars = self._plot_vars(self._read_inputs_text(final_state)) - assert "vertical_velocity" in plot_vars - assert "temperature" in plot_vars + assert "z_velocity" in plot_vars + assert "Temp" in plot_vars + + +@pytest.mark.integration_full +class TestVisualizationCatalogHardFail: + def test_missing_solver_catalog_hard_fails_before_inputs_write(self, tmp_path): + baseline = tmp_path / "PeleC" / "Exec" / "RegTests" / "PMF" + baseline.mkdir(parents=True, exist_ok=True) + (baseline / "inputs").write_text("amr.plot_vars = density pressure\n") + (baseline / "AMReX.ex").write_text("#!/bin/bash\nexit 0\n") + + config = AMReXAgentConfig() + config.output_dir = tmp_path / "output" + config.environment = "perlmutter" + config.repositories = {"PeleC": baseline.parents[2]} + config.run_mode = "dry_run" + config.dry_run = True + + class DummyEmbeddingService: + embeddings = None + + class DummyRunner: + def __init__(self, _config): + pass + + def setup_job(self, output_dir, case_dir, inputs_path=None): + return {"run_dir": output_dir, "executable": "AMReX.ex"} + + def submit(self, run_directory, nodes=None, run_mode=None, dry_run=None, case_dir=None): + return { + "job_id": "viz_catalog_fail_123", + "method": "sbatch", + "script_path": str(Path(run_directory) / "submit.sh"), + "job_status": "completed", + } + + with patch("src.services.embedding_service_factory.get_embedding_service", return_value=DummyEmbeddingService()), \ + patch("src.nodes.architect_node.ArchitectService") as MockArch, \ + patch("src.nodes.reviewer_node.ReviewerOrchestrator") as MockRev, \ + patch("src.services.cases.AMReXCasesService", return_value=object()), \ + patch("src.nodes.runner_node.SuperfacilityRunner", DummyRunner), \ + patch("src.nodes.analysis_node.AnalysisService") as MockAnalysis: + + MockArch.return_value.execute_planning.return_value = SimulationPlan( + selected_solver="PeleC", + selected_case="Exec/RegTests/PMF", + modifications=[], + reasoning="catalog hard-fail integration test", + baseline_confidence=0.9, + prompt="plot temperature", + baseline={ + "code_name": "PeleC", + "repo_path": str(baseline.parents[2]), + "case_path": "Exec/RegTests/PMF", + "local_path": str(baseline), + }, + visualization={"quantities": ["temperature"]}, + ) + MockRev.return_value.validate_plan.return_value = ValidationResult( + mode="proceed", + violations=[], + summary="ok", + available_schema_params=[], + ) + MockAnalysis.return_value.analyze_simulation.return_value = { + "status": "success", + "total_steps": 1, + "final_time": 0.01, + "issues": [], + "warnings": [], + "completed": True, + } + + final_state = run_agent( + user_requirement="Run PMF and plot temperature.", + config=config, + ) + + assert final_state.get("inputs_file_path") is None + errors_active = [str(err) for err in final_state.get("errors_active", [])] + assert any( + "Visualization mapping requires solver code-derived catalog" in err + for err in errors_active + ) + input_writer_entries = [ + entry + for entry in final_state.get("workflow_history", []) + if entry.get("node") == "input_writer" + ] + assert input_writer_entries + detail_errors = [str(err) for err in input_writer_entries[-1].get("details", {}).get("errors", [])] + assert any( + "Visualization mapping requires solver code-derived catalog" in err + for err in detail_errors + ) diff --git a/tests/integration/test_first_run_git_integration.py b/tests/integration/test_first_run_git_integration.py new file mode 100644 index 0000000..29dbcf2 --- /dev/null +++ b/tests/integration/test_first_run_git_integration.py @@ -0,0 +1,108 @@ +"""Integration checks for startup-readiness git alignment logic. + +This file intentionally uses real git commands in tmp_path-backed repos. +""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + +from src.first_run import check_dependency_commit_alignment +from src.first_run import resolve_readiness_issues_noninteractive + + +def _run(cmd: list[str], cwd: Path) -> str: + completed = subprocess.run(cmd, cwd=cwd, check=True, text=True, capture_output=True) + return completed.stdout.strip() + + +def _extract_issues(result: dict) -> list[dict]: + for key in ("issues", "readiness_issues", "blocking_issues"): + value = result.get(key) + if isinstance(value, list): + return [item for item in value if isinstance(item, dict)] + return [] + + +def test_dependency_commit_alignment_detects_real_git_head_mismatch(tmp_path: Path) -> None: + source_repo = tmp_path / "ERF_source" + source_repo.mkdir(parents=True) + _run(["git", "init", "-q"], cwd=source_repo) + _run(["git", "config", "user.email", "test@example.com"], cwd=source_repo) + _run(["git", "config", "user.name", "Test User"], cwd=source_repo) + + (source_repo / "README.txt").write_text("integration fixture\n", encoding="utf-8") + _run(["git", "add", "README.txt"], cwd=source_repo) + _run(["git", "commit", "-q", "-m", "fixture commit"], cwd=source_repo) + + erf_repo = tmp_path / "ERF" + _run(["git", "clone", "-q", str(source_repo), str(erf_repo)], cwd=tmp_path) + + actual_head = _run(["git", "rev-parse", "HEAD"], cwd=erf_repo) + expected_sha = "0" * 40 + assert actual_head != expected_sha + + result = check_dependency_commit_alignment( + repo_root=tmp_path, + erf_repo_path=erf_repo, + expected_dependencies={"repos": {"erf": {"commit": expected_sha}}}, + ) + + issues = _extract_issues(result) + mismatch = None + for issue in issues: + if (issue.get("code") or issue.get("issue_code")) == "ERF_COMMIT_MISMATCH": + mismatch = issue + break + + assert mismatch is not None + assert (mismatch.get("severity") or "") + assert (mismatch.get("suggested_action") or mismatch.get("action") or "") + + +def test_noninteractive_clone_missing_uses_real_local_git_clone(tmp_path: Path) -> None: + """Exercise clone-missing style behavior using real local git clone in /tmp.""" + source_repo = tmp_path / "ERF_source" + source_repo.mkdir(parents=True) + _run(["git", "init", "-q"], cwd=source_repo) + _run(["git", "config", "user.email", "test@example.com"], cwd=source_repo) + _run(["git", "config", "user.name", "Test User"], cwd=source_repo) + (source_repo / "README.txt").write_text("clone-missing fixture\n", encoding="utf-8") + _run(["git", "add", "README.txt"], cwd=source_repo) + _run(["git", "commit", "-q", "-m", "fixture commit"], cwd=source_repo) + expected_sha = _run(["git", "rev-parse", "HEAD"], cwd=source_repo) + + missing_target = tmp_path / "ERF" + assert not missing_target.exists() + + issues = [ + { + "code": "ERF_REPO_MISSING", + "severity": "error", + "suggested_action": "clone missing ERF repo", + "repo_name": "erf", + "target_path": str(missing_target), + } + ] + + result = resolve_readiness_issues_noninteractive( + repo_root=tmp_path, + issues=issues, + allow_clone_missing=True, + expected_dependencies={ + "repos": { + "erf": { + "url": str(source_repo), + "branch": "master", + "commit": expected_sha, + } + } + }, + ) + + assert missing_target.exists() + cloned_head = _run(["git", "rev-parse", "HEAD"], cwd=missing_target) + assert cloned_head == expected_sha + unresolved = result.get("unresolved", []) + assert unresolved == [] diff --git a/tests/integration/test_first_run_main_hook_integration.py b/tests/integration/test_first_run_main_hook_integration.py new file mode 100644 index 0000000..cdc0275 --- /dev/null +++ b/tests/integration/test_first_run_main_hook_integration.py @@ -0,0 +1,118 @@ +from __future__ import annotations + +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import patch + +import pytest + +from src.main import main + + +def _mock_config() -> SimpleNamespace: + return SimpleNamespace( + output_dir=Path("/tmp/amrex-agent-test-output"), + dry_run=False, + run_mode="full", + environment="local", + preconfirm_gate=False, + llm_gate_strategy="off", + indexing_strategy="simple", + inputs_file_strategy="newest", + inputs_file_override=None, + remap_strategy=None, + baseline_override=None, + baseline_switch_after_retries=3, + use_mpi=True, + mpi_ranks=1, + amrex_agent_root=Path("."), + non_interactive=False, + disabled_validators=[], + ) + + +def test_main_non_tty_preflight_blocks_before_agent_run() -> None: + config = _mock_config() + with patch("src.main.load_config", return_value=config): + with patch("src.main.run_agent") as run_agent_mock: + with patch("src.main.run_startup_readiness_checks") as preflight_mock: + with patch("src.main.apply_interactive_fixes") as apply_mock: + with patch("sys.stdin.isatty", return_value=False): + with patch("sys.stdout.isatty", return_value=False): + preflight_mock.return_value = { + "mode": "noninteractive", + "issues": [ + { + "code": "ERF_REPO_MISSING", + "severity": "error", + "suggested_action": "Set ERF_REPO_PATH or clone sibling ERF.", + } + ], + "unresolved": [ + { + "code": "ERF_REPO_MISSING", + "severity": "error", + "suggested_action": "Set ERF_REPO_PATH or clone sibling ERF.", + } + ], + "exit_code": 1, + } + with pytest.raises(SystemExit) as exc: + main(args=["--prompt", "run test"]) + + assert exc.value.code == 1 + run_agent_mock.assert_not_called() + apply_mock.assert_not_called() + preflight_mock.assert_called_once() + + +def test_main_tty_preflight_uses_interactive_fix_path_then_runs_agent() -> None: + config = _mock_config() + with patch("src.main.load_config", return_value=config): + with patch("src.main.run_agent") as run_agent_mock: + with patch("src.main.run_startup_readiness_checks") as preflight_mock: + with patch("src.main.apply_interactive_fixes") as apply_mock: + with patch("sys.stdin.isatty", return_value=True): + with patch("sys.stdout.isatty", return_value=True): + preflight_issue = { + "code": "ERF_REPO_MISSING", + "severity": "error", + "suggested_action": "Choose clone/custom path", + } + preflight_mock.return_value = { + "mode": "interactive", + "issues": [preflight_issue], + "unresolved": [preflight_issue], + "exit_code": 0, + } + preflight_mock.side_effect = [ + { + "mode": "interactive", + "issues": [preflight_issue], + "unresolved": [preflight_issue], + "exit_code": 0, + }, + { + "mode": "noninteractive", + "issues": [], + "unresolved": [], + "exit_code": 0, + }, + ] + apply_mock.return_value = { + "mode": "interactive", + "attempted_actions": ["clone_missing:erf"], + "resolved": [preflight_issue], + "unresolved": [], + "exit_code": 0, + } + run_agent_mock.return_value = { + "job_status": "completed", + "job_id": "test", + } + + main(args=["--prompt", "run test"]) + + assert preflight_mock.call_count == 2 + apply_mock.assert_called_once() + run_agent_mock.assert_called_once() diff --git a/tests/unit/test_build_tools.py b/tests/unit/test_build_tools.py new file mode 100644 index 0000000..72ba1e2 --- /dev/null +++ b/tests/unit/test_build_tools.py @@ -0,0 +1,69 @@ +from types import SimpleNamespace + +from src.services.build_tools import compile_solver + + +class _Result: + def __init__(self, returncode: int = 0, stdout: str = "", stderr: str = ""): + self.returncode = returncode + self.stdout = stdout + self.stderr = stderr + + +def test_compile_solver_erf_prefers_cmake(tmp_path, monkeypatch): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Case" + case_dir.mkdir(parents=True) + + calls = [] + + def _run(cmd, cwd, capture_output, text, timeout): # noqa: ARG001 + calls.append(cmd) + return _Result(returncode=0) + + monkeypatch.setattr("src.services.build_tools.subprocess.run", _run) + + config = SimpleNamespace(erf_repo_path=repo_root) + assert compile_solver(case_dir=case_dir, solver_code="ERF", runtime_config=config, use_cuda=False) + assert calls[0][:3] == ["cmake", "-S", str(repo_root)] + assert calls[1][:2] == ["cmake", "--build"] + assert all(cmd[0] != "make" and cmd[0] != "nice" for cmd in calls) + + +def test_compile_solver_erf_falls_back_to_gnumake_when_cmake_fails(tmp_path, monkeypatch): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Case" + case_dir.mkdir(parents=True) + (case_dir / "GNUmakefile").write_text("all:\n\t@echo ok\n") + + calls = [] + + def _run(cmd, cwd, capture_output, text, timeout): # noqa: ARG001 + calls.append(cmd) + if cmd[0] == "cmake": + return _Result(returncode=1, stderr="cmake failed") + return _Result(returncode=0) + + monkeypatch.setattr("src.services.build_tools.subprocess.run", _run) + + config = SimpleNamespace(erf_repo_path=repo_root) + assert compile_solver(case_dir=case_dir, solver_code="ERF", runtime_config=config, use_cuda=False) + assert calls[0][0] == "cmake" + assert any(cmd[0] in {"make", "nice"} for cmd in calls) + + +def test_compile_solver_non_erf_uses_gnumake_first(tmp_path, monkeypatch): + case_dir = tmp_path / "PeleC" / "Exec" / "RegTests" / "Case" + case_dir.mkdir(parents=True) + (case_dir / "GNUmakefile").write_text("all:\n\t@echo ok\n") + + calls = [] + + def _run(cmd, cwd, capture_output, text, timeout): # noqa: ARG001 + calls.append(cmd) + return _Result(returncode=0) + + monkeypatch.setattr("src.services.build_tools.subprocess.run", _run) + + assert compile_solver(case_dir=case_dir, solver_code="PeleC", runtime_config=SimpleNamespace(), use_cuda=False) + assert calls[0][0] in {"make", "nice"} diff --git a/tests/unit/test_clarification_handler.py b/tests/unit/test_clarification_handler.py index 5e384bd..a030ae4 100644 --- a/tests/unit/test_clarification_handler.py +++ b/tests/unit/test_clarification_handler.py @@ -145,6 +145,24 @@ def test_level_4_response_updates_plot_vars(self): assert record["answered_by"] == "human" assert record["resolved_value"] == "temperature vorticity" + def test_level_4_ai_answer_must_match_candidate_set(self): + record = _pending_record( + "requested_plot_vars", + decision_level=4, + fallback_tier="amrex_generic", + ) + record["question"]["context"] = { + "token": "velocity", + "candidates": ["x_velocity", "y_velocity"], + } + state = _base_state( + clarification_history=[record], + ai_agent_response="z_velocity", + ) + updates = clarification_handler_node(state) + assert updates["clarification_history"][0]["answered_by"] == "pending" + assert updates["clarification_needed"] is True + def test_fallback_tier_faiss_empty_response(self): """ Given: pending record with diff --git a/tests/unit/test_clarification_node.py b/tests/unit/test_clarification_node.py index dcc93cc..01e4bea 100644 --- a/tests/unit/test_clarification_node.py +++ b/tests/unit/test_clarification_node.py @@ -309,6 +309,22 @@ def test_level_4_viz_preference_missing(self): updates = clarification_node(state) assert any(q["decision_level"] == 4 for q in _questions(updates)) + def test_level_4_visualization_ambiguity_includes_candidates(self): + state = _base_state( + requested_plot_vars=[], + visualization_mapping_candidates={ + "velocity": [ + {"name": "x_velocity", "aliases": ["velocity"]}, + {"name": "y_velocity", "aliases": ["velocity"]}, + ] + }, + visualization_mapping_unresolved=[], + ) + updates = clarification_node(state) + q = next(q for q in _questions(updates) if q["decision_level"] == 4) + assert q["context"]["token"] == "velocity" + assert q["context"]["candidates"] == ["x_velocity", "y_velocity"] + def test_level_5_optional_refinement(self): """ Given: required fields present diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py index 9b5f391..31522b3 100644 --- a/tests/unit/test_cli.py +++ b/tests/unit/test_cli.py @@ -52,6 +52,21 @@ def mock_load_config(self): mock.return_value = config yield mock + @pytest.fixture(autouse=True) + def mock_preflight(self): + """Default preflight behavior for CLI tests.""" + with patch("src.main.run_startup_readiness_checks") as mock_check: + with patch("src.main.apply_interactive_fixes") as mock_apply: + mock_check.return_value = {"exit_code": 0, "issues": []} + mock_apply.return_value = { + "mode": "interactive", + "attempted_actions": [], + "resolved": [], + "unresolved": [], + "exit_code": 0, + } + yield {"check": mock_check, "apply": mock_apply} + def test_parses_inline_prompt(self, mock_run_agent, mock_load_config): """ GIVEN: --prompt with inline text diff --git a/tests/unit/test_component5f_standards.py b/tests/unit/test_component5f_standards.py index ae09448..e5e8bfa 100644 --- a/tests/unit/test_component5f_standards.py +++ b/tests/unit/test_component5f_standards.py @@ -17,8 +17,9 @@ import ast import json import math -import sys +import subprocess import pytest +import sys from pathlib import Path from typing import Set, Dict, Any @@ -579,16 +580,21 @@ def test_feature_block_validators_share_normalized_behavior(): def _load_v2605_prd_text() -> str: - candidates = [ - Path("docs/PRD/PRD_v2605.md"), - Path("docs/PRD/PRD_v2605.md~"), - ] - for path in candidates: - if path.exists(): - return path.read_text(encoding="utf-8") - pytest.skip( - "Missing v26.05 PRD source (expected docs/PRD/PRD_v2605.md or .md~)" + prd_path = Path("docs/PRD/PRD_v2605.md") + if not prd_path.exists(): + pytest.skip(f"PRD document not found: {prd_path}") + + # Avoid passing/failing based on untracked local files; only run when tracked. + tracked = subprocess.run( + ["git", "ls-files", "--error-unmatch", str(prd_path)], + capture_output=True, + text=True, + check=False, ) + if tracked.returncode != 0: + pytest.skip(f"PRD document is not tracked in git: {prd_path}") + + return prd_path.read_text(encoding="utf-8") def test_v2605_required_capability_contract_is_present(): diff --git a/tests/unit/test_config_model_factory_plot_var_arrays.py b/tests/unit/test_config_model_factory_plot_var_arrays.py new file mode 100644 index 0000000..bca9ef9 --- /dev/null +++ b/tests/unit/test_config_model_factory_plot_var_arrays.py @@ -0,0 +1,79 @@ +"""ParmParse list coercion tests for visualization plot variable parameters.""" + +from src.services.config_model_factory import ConfigModelFactory + + +def _schema_with_plot_var_arrays() -> dict: + return { + "amr.plot_vars": { + "type": "string", + "is_array": True, + "required": False, + "default": None, + }, + "erf.plot_vars_1": { + "type": "string", + "is_array": True, + "required": False, + "default": None, + }, + "peleLM.derive_plot_vars": { + "type": "string", + "is_array": True, + "required": False, + "default": None, + }, + } + + +def test_hydrate_plot_var_arrays_from_whitespace_values(): + model_class = ConfigModelFactory.create_from_schema( + schema=_schema_with_plot_var_arrays(), + build_config={}, + ) + hydrated = ConfigModelFactory.hydrate( + model_class, + "amr.plot_vars = density temperature\n" + "erf.plot_vars_1 = qv qc\n" + "peleLM.derive_plot_vars = temperature heat_release\n", + ) + assert hydrated.amr_plot_vars == ["density", "temperature"] + assert hydrated.erf_plot_vars_1 == ["qv", "qc"] + assert hydrated.peleLM_derive_plot_vars == ["temperature", "heat_release"] + + +def test_apply_modifications_dedupes_plot_var_array_append_order(): + model_class = ConfigModelFactory.create_from_schema( + schema=_schema_with_plot_var_arrays(), + build_config={}, + ) + model = model_class() + + class _Cfg: + remap_strategy = "append" + + updated = ConfigModelFactory.apply_modifications( + model, + [ + ("amr.plot_vars", "density temperature"), + ("amr.plot_vars", "temperature pressure"), + ], + config_service=_Cfg(), + ) + assert updated.amr_plot_vars == ["density", "temperature", "pressure"] + + +def test_apply_modifications_plot_var_scalar_to_array_and_last_write(): + model_class = ConfigModelFactory.create_from_schema( + schema=_schema_with_plot_var_arrays(), + build_config={}, + ) + model = model_class() + updated = ConfigModelFactory.apply_modifications( + model, + [ + ("erf.plot_vars_1", "qc"), + ("erf.plot_vars_1", "qv qc"), + ], + ) + assert updated.erf_plot_vars_1 == ["qv", "qc"] diff --git a/tests/unit/test_erf_cases.py b/tests/unit/test_erf_cases.py index e39bbfb..d887baf 100644 --- a/tests/unit/test_erf_cases.py +++ b/tests/unit/test_erf_cases.py @@ -50,7 +50,7 @@ def test_config_override_precedence() -> None: ) case = matcher.match("canonical squall line") assert case is not None - assert case.relative_path.startswith("Exec/CanonicalFlows/") + assert case.relative_path.startswith(("Exec/CanonicalFlows/", "Exec/CanonicalTests/")) @pytest.mark.skip(reason="Known false-negative in reachability prompt synthesis; may be spurious work.") diff --git a/tests/unit/test_execution_intent_model.py b/tests/unit/test_execution_intent_model.py new file mode 100644 index 0000000..b444d65 --- /dev/null +++ b/tests/unit/test_execution_intent_model.py @@ -0,0 +1,58 @@ +from src.nodes.execution_intent_node import ( + build_execution_intent, + resolve_execution_intent, +) + + +def test_build_execution_intent_from_prompt_runtime_fields() -> None: + intent = build_execution_intent( + prompt="Run on perlmutter with 4 procs in dry run for 2 hours.", + resolved_config={}, + prior_intent=None, + ) + + assert intent.environment == "perlmutter" + assert intent.total_procs == 4 + assert intent.run_mode == "dry" + assert intent.walltime == "02:00:00" + assert intent.source == "prompt" + + +def test_build_execution_intent_prefers_resolved_config_values() -> None: + intent = build_execution_intent( + prompt="Run local with 4 procs", + resolved_config={"execution": {"environment": "mcp", "run_mode": "submit", "run_ntasks": 8}}, + prior_intent=None, + ) + + assert intent.environment == "mcp" + assert intent.run_mode == "submit" + assert intent.total_procs == 8 + assert intent.source == "clarification" + + +def test_resolve_execution_intent_accepts_existing_payload() -> None: + state = { + "execution_intent": { + "environment": "local", + "run_mode": "full", + "total_procs": 2, + "source": "prompt", + "adjustments": [], + "execution_config": {"total_procs": 2}, + } + } + resolved = resolve_execution_intent(state) + + assert resolved["environment"] == "local" + assert resolved["total_procs"] == 2 + + +def test_build_execution_intent_rejects_non_positive_proc_values() -> None: + intent = build_execution_intent( + prompt="run with 0 procs", + resolved_config={}, + prior_intent=None, + ) + + assert intent.total_procs is None diff --git a/tests/unit/test_first_run.py b/tests/unit/test_first_run.py new file mode 100644 index 0000000..379889a --- /dev/null +++ b/tests/unit/test_first_run.py @@ -0,0 +1,714 @@ +"""Red-phase contract tests for startup readiness checks. + +These tests intentionally define the expected behavior of ``src.first_run`` +before implementation exists. +""" + +from __future__ import annotations + +import importlib +import subprocess +from pathlib import Path +from types import SimpleNamespace +from typing import Any + +import pytest + + +EXPECTED_ISSUE_CODES = { + "missing_erf_repo": "ERF_REPO_MISSING", + "erf_commit_mismatch": "ERF_COMMIT_MISMATCH", + "faiss_missing": "FAISS_INDEX_MISSING", + "manifest_mismatch": "FAISS_MANIFEST_MISMATCH", + "schema_stale": "SCHEMA_STALE", + "noninteractive_blocking": "NONINTERACTIVE_BLOCKING", + "build_policy": "ERF_BUILD_POLICY", +} + + +def _extract_issues(result: Any) -> list[dict[str, Any]]: + if isinstance(result, list): + return [item for item in result if isinstance(item, dict)] + if not isinstance(result, dict): + return [] + for key in ("issues", "readiness_issues", "blocking_issues"): + value = result.get(key) + if isinstance(value, list): + return [item for item in value if isinstance(item, dict)] + return [] + + +def _find_issue(issues: list[dict[str, Any]], code: str) -> dict[str, Any] | None: + for issue in issues: + issue_code = issue.get("code") or issue.get("issue_code") + if issue_code == code: + return issue + return None + + +def _assert_issue_contract(issue: dict[str, Any], code: str) -> None: + issue_code = issue.get("code") or issue.get("issue_code") + severity = issue.get("severity") + suggested_action = issue.get("suggested_action") or issue.get("action") + + assert issue_code == code + assert isinstance(severity, str) and severity + assert isinstance(suggested_action, str) and suggested_action + + +@pytest.fixture +def first_run_module() -> Any: + return importlib.import_module("src.first_run") + + +@pytest.fixture +def no_real_subprocess(monkeypatch: pytest.MonkeyPatch) -> None: + def _fail(*_args: Any, **_kwargs: Any) -> Any: + raise AssertionError("Real subprocess execution is forbidden in first_run tests") + + monkeypatch.setattr(subprocess, "run", _fail) + monkeypatch.setattr(subprocess, "Popen", _fail) + + +def test_missing_erf_repo_path_reports_blocking_issue( + first_run_module: Any, + tmp_path: Path, + no_real_subprocess: None, +) -> None: + result = first_run_module.check_repo_readiness( + repo_root=tmp_path, + erf_repo_path=tmp_path / "ERF", + ) + issues = _extract_issues(result) + issue = _find_issue(issues, EXPECTED_ISSUE_CODES["missing_erf_repo"]) + assert issue is not None + _assert_issue_contract(issue, EXPECTED_ISSUE_CODES["missing_erf_repo"]) + + +def test_repo_exists_but_commit_mismatch_reports_issue( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + + monkeypatch.setattr(first_run_module, "_get_git_head_sha", lambda _p: "actual-sha") + + result = first_run_module.check_dependency_commit_alignment( + repo_root=tmp_path, + erf_repo_path=erf_repo, + expected_dependencies={"repos": {"erf": {"commit": "expected-sha"}}}, + ) + issues = _extract_issues(result) + issue = _find_issue(issues, EXPECTED_ISSUE_CODES["erf_commit_mismatch"]) + assert issue is not None + _assert_issue_contract(issue, EXPECTED_ISSUE_CODES["erf_commit_mismatch"]) + + +def test_missing_faiss_indices_for_provider_model_reports_issue( + first_run_module: Any, + tmp_path: Path, + no_real_subprocess: None, +) -> None: + faiss_root = tmp_path / "database" / "faiss" + faiss_root.mkdir(parents=True) + + result = first_run_module.check_faiss_readiness( + faiss_root=faiss_root, + provider="cborg", + embedding_model="nomic-embed-text-v1", + ) + issues = _extract_issues(result) + issue = _find_issue(issues, EXPECTED_ISSUE_CODES["faiss_missing"]) + assert issue is not None + _assert_issue_contract(issue, EXPECTED_ISSUE_CODES["faiss_missing"]) + + +def test_manifest_endpoint_model_mismatch_reports_issue( + first_run_module: Any, + tmp_path: Path, + no_real_subprocess: None, +) -> None: + manifest = { + "provider": "openai", + "embedding_model": "text-embedding-3-large", + } + + result = first_run_module.check_manifest_compatibility( + manifest=manifest, + configured_provider="cborg", + configured_embedding_model="nomic-embed-text-v1", + ) + issues = _extract_issues(result) + issue = _find_issue(issues, EXPECTED_ISSUE_CODES["manifest_mismatch"]) + assert issue is not None + _assert_issue_contract(issue, EXPECTED_ISSUE_CODES["manifest_mismatch"]) + + +def test_schema_staleness_detected_reports_issue( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + monkeypatch.setattr(first_run_module, "_detect_schema_staleness", lambda **_kwargs: True) + + result = first_run_module.check_schema_staleness_readiness( + schema_root=tmp_path / "database" / "schemas", + repo_root=tmp_path, + ) + issues = _extract_issues(result) + issue = _find_issue(issues, EXPECTED_ISSUE_CODES["schema_stale"]) + assert issue is not None + _assert_issue_contract(issue, EXPECTED_ISSUE_CODES["schema_stale"]) + + +def test_tty_interactive_vs_non_tty_fail_fast_behavior( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + blocking_issue = { + "code": EXPECTED_ISSUE_CODES["noninteractive_blocking"], + "severity": "error", + "suggested_action": "Set ERF_REPO_PATH or clone sibling ERF repo", + } + monkeypatch.setattr(first_run_module, "_collect_readiness_issues", lambda **_kwargs: [blocking_issue]) + + non_tty_result = first_run_module.run_startup_readiness_checks( + config=SimpleNamespace(non_interactive=True), + repo_root=tmp_path, + is_tty=False, + ) + interactive_result = first_run_module.run_startup_readiness_checks( + config=SimpleNamespace(non_interactive=False), + repo_root=tmp_path, + is_tty=True, + ) + + non_tty_exit = non_tty_result.get("exit_code") if isinstance(non_tty_result, dict) else None + interactive_exit = interactive_result.get("exit_code") if isinstance(interactive_result, dict) else None + assert non_tty_exit not in (None, 0) + assert interactive_exit in (None, 0) + + +def test_clean_environment_passes_without_prompts( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + monkeypatch.setattr(first_run_module, "_collect_readiness_issues", lambda **_kwargs: []) + + def _prompt_called(*_args: Any, **_kwargs: Any) -> Any: + raise AssertionError("No prompts expected for clean environment") + + monkeypatch.setattr("builtins.input", _prompt_called) + + result = first_run_module.run_startup_readiness_checks( + config=SimpleNamespace(non_interactive=True), + repo_root=tmp_path, + is_tty=False, + ) + assert isinstance(result, dict) + assert result.get("exit_code", 0) == 0 + assert result.get("issues") in ([], None) + + +def test_erf_build_readiness_prefers_cmake_with_explicit_fallback( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + + monkeypatch.setattr(first_run_module, "_cmake_available", lambda: False) + + result = first_run_module.check_erf_build_readiness(erf_repo_path=erf_repo) + issues = _extract_issues(result) + issue = _find_issue(issues, EXPECTED_ISSUE_CODES["build_policy"]) + assert issue is not None + _assert_issue_contract(issue, EXPECTED_ISSUE_CODES["build_policy"]) + + fallback = issue.get("fallback") or issue.get("fallback_policy") + assert isinstance(fallback, str) and "gnu" in fallback.lower() + + +def test_noninteractive_resolver_fail_fast_when_clone_disabled( + first_run_module: Any, + tmp_path: Path, + no_real_subprocess: None, +) -> None: + issues = [ + { + "code": EXPECTED_ISSUE_CODES["missing_erf_repo"], + "severity": "error", + "suggested_action": "Clone ERF into sibling path", + "repo_name": "erf", + "target_path": str(tmp_path / "ERF"), + } + ] + result = first_run_module.resolve_readiness_issues_noninteractive( + repo_root=tmp_path, + issues=issues, + allow_clone_missing=False, + ) + assert isinstance(result, dict) + # Require explicit, actionable fail-fast contract (not implicit truthy fallback). + assert result.get("mode") == "noninteractive" + assert result.get("attempted_actions") == [] + assert result.get("exit_code") == 1 + unresolved = result.get("unresolved", []) + assert isinstance(unresolved, list) and unresolved + unresolved_codes = {item.get("code") or item.get("issue_code") for item in unresolved} + assert EXPECTED_ISSUE_CODES["missing_erf_repo"] in unresolved_codes + + +def test_noninteractive_resolver_clone_missing_attempt_marks_issue_resolved( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + target = tmp_path / "ERF" + issues = [ + { + "code": EXPECTED_ISSUE_CODES["missing_erf_repo"], + "severity": "error", + "suggested_action": "Clone ERF into sibling path", + "repo_name": "erf", + "target_path": str(target), + } + ] + + monkeypatch.setattr( + first_run_module, + "_clone_missing_repo", + lambda **_kwargs: {"ok": True, "path": str(target)}, + raising=False, + ) + + result = first_run_module.resolve_readiness_issues_noninteractive( + repo_root=tmp_path, + issues=issues, + allow_clone_missing=True, + expected_dependencies={"repos": {"erf": {"url": "file:///tmp/ERF_source"}}}, + ) + assert isinstance(result, dict) + resolved = result.get("resolved", []) + assert isinstance(resolved, list) and resolved + assert result.get("unresolved", []) == [] + + +def test_noninteractive_resolver_accepts_valid_custom_path( + first_run_module: Any, + tmp_path: Path, + no_real_subprocess: None, +) -> None: + custom_repo = tmp_path / "custom_erf" + custom_repo.mkdir(parents=True) + (custom_repo / ".git").mkdir() + + issues = [ + { + "code": EXPECTED_ISSUE_CODES["missing_erf_repo"], + "severity": "error", + "suggested_action": "Provide custom ERF path", + "repo_name": "erf", + } + ] + + result = first_run_module.resolve_readiness_issues_noninteractive( + repo_root=tmp_path, + issues=issues, + allow_clone_missing=False, + custom_repo_paths={"erf": str(custom_repo)}, + ) + assert isinstance(result, dict) + assert result.get("unresolved", []) == [] + resolved = result.get("resolved", []) + assert isinstance(resolved, list) and resolved + + +def test_interactive_resolver_can_resolve_via_prompted_action( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + issues = [ + { + "code": EXPECTED_ISSUE_CODES["missing_erf_repo"], + "severity": "error", + "suggested_action": "Choose clone/custom path", + "repo_name": "erf", + } + ] + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "clone") + monkeypatch.setattr( + first_run_module, + "_clone_missing_repo", + lambda **_kwargs: {"ok": True, "path": str(tmp_path / "ERF")}, + raising=False, + ) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=issues, + expected_dependencies={"repos": {"erf": {"url": "file:///tmp/ERF_source"}}}, + ) + assert isinstance(result, dict) + assert result.get("unresolved", []) == [] + resolved = result.get("resolved", []) + assert isinstance(resolved, list) and resolved + + +def test_run_startup_readiness_checks_orchestrates_resolution_usefully( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + """Verify full startup-readiness orchestration performs meaningful work.""" + issue = { + "code": EXPECTED_ISSUE_CODES["missing_erf_repo"], + "severity": "error", + "suggested_action": "Clone ERF into sibling path", + } + calls: dict[str, Any] = {"collect_called": False, "resolve_called_with": None} + + def _collect(**_kwargs: Any) -> list[dict[str, Any]]: + calls["collect_called"] = True + return [issue] + + def _resolve_noninteractive(**kwargs: Any) -> dict[str, Any]: + calls["resolve_called_with"] = kwargs + return { + "mode": "noninteractive", + "attempted_actions": ["clone_missing:erf"], + "resolved": [issue], + "unresolved": [], + "exit_code": 0, + } + + monkeypatch.setattr(first_run_module, "_collect_readiness_issues", _collect) + monkeypatch.setattr( + first_run_module, + "resolve_readiness_issues_noninteractive", + _resolve_noninteractive, + ) + + result = first_run_module.run_startup_readiness_checks( + repo_root=tmp_path, + config=SimpleNamespace(non_interactive=True), + is_tty=False, + ) + + assert calls["collect_called"] is True + assert isinstance(calls["resolve_called_with"], dict) + assert calls["resolve_called_with"].get("issues") == [issue] + assert isinstance(result, dict) + assert result.get("mode") == "noninteractive" + assert result.get("attempted_actions") == ["clone_missing:erf"] + assert result.get("resolved") == [issue] + assert result.get("unresolved") == [] + assert result.get("exit_code") == 0 + + +def test_interactive_commit_mismatch_checkout_resolves_issue( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + (erf_repo / ".git").mkdir() + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "repo_path": str(erf_repo), + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "checkout") + monkeypatch.setattr(first_run_module, "_checkout_repo_commit", lambda *_args, **_kwargs: True) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [issue] + assert result.get("unresolved") == [] + assert "checkout_pinned_commit:erf" in (result.get("attempted_actions") or []) + + +def test_interactive_commit_mismatch_continue_marks_resolved( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "continue") + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [issue] + assert result.get("unresolved") == [] + assert "continue_with_current_commit:erf" in (result.get("attempted_actions") or []) + + +def test_interactive_commit_mismatch_abort_leaves_issue_unresolved( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "abort") + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [] + assert result.get("unresolved") == [issue] + assert "abort_commit_mismatch:erf" in (result.get("attempted_actions") or []) + + +def test_interactive_commit_mismatch_development_rebuild_resolves_issue( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + (erf_repo / ".git").mkdir() + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "repo_path": str(erf_repo), + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "development_rebuild") + monkeypatch.setattr( + first_run_module, + "_checkout_development_and_rebuild", + lambda *_args, **_kwargs: True, + ) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [issue] + assert result.get("unresolved") == [] + assert "checkout_development_rebuild:erf" in (result.get("attempted_actions") or []) + + +def test_interactive_commit_mismatch_development_rebuild_failure_unresolved( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + (erf_repo / ".git").mkdir() + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "repo_path": str(erf_repo), + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "development_rebuild") + monkeypatch.setattr( + first_run_module, + "_checkout_development_and_rebuild", + lambda *_args, **_kwargs: False, + ) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [] + assert result.get("unresolved") == [issue] + assert "checkout_development_rebuild:erf" in (result.get("attempted_actions") or []) + + +def test_interactive_commit_mismatch_continue_rebuild_resolves_issue( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + (erf_repo / ".git").mkdir() + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "repo_path": str(erf_repo), + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "continue_rebuild") + monkeypatch.setattr( + first_run_module, + "_run_rebuild_chain", + lambda *_args, **_kwargs: True, + ) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [issue] + assert result.get("unresolved") == [] + assert "continue_with_current_commit_rebuild:erf" in (result.get("attempted_actions") or []) + + +def test_interactive_commit_mismatch_continue_rebuild_failure_unresolved( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + erf_repo = tmp_path / "ERF" + erf_repo.mkdir(parents=True) + (erf_repo / ".git").mkdir() + issue = { + "code": EXPECTED_ISSUE_CODES["erf_commit_mismatch"], + "severity": "error", + "suggested_action": "Checkout pinned commit or rebuild", + "repo_name": "erf", + "repo_path": str(erf_repo), + "expected_commit": "expected-sha", + "actual_commit": "actual-sha", + } + + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: "continue_rebuild") + monkeypatch.setattr( + first_run_module, + "_run_rebuild_chain", + lambda *_args, **_kwargs: False, + ) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [] + assert result.get("unresolved") == [issue] + assert "continue_with_current_commit_rebuild:erf" in (result.get("attempted_actions") or []) + + +def test_discover_local_repo_candidates_finds_sibling_and_child_erf_git_repos( + first_run_module: Any, + tmp_path: Path, + no_real_subprocess: None, +) -> None: + sibling_repo = tmp_path.parent / "ERF_sibling" + sibling_repo.mkdir(parents=True) + (sibling_repo / ".git").mkdir() + + child_repo = tmp_path / "my_erf_repo" + child_repo.mkdir(parents=True) + (child_repo / ".git").mkdir() + + not_git = tmp_path / "ERF_not_git" + not_git.mkdir(parents=True) + + candidates = first_run_module._discover_local_repo_candidates(tmp_path, "erf") + as_paths = {str(path) for path in candidates} + + assert str(sibling_repo) in as_paths + assert str(child_repo) in as_paths + assert str(not_git) not in as_paths + + +def test_interactive_missing_repo_select_uses_discovered_candidate( + first_run_module: Any, + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + no_real_subprocess: None, +) -> None: + selected_repo = tmp_path.parent / "ERF_selected" + selected_repo.mkdir(parents=True) + (selected_repo / ".git").mkdir() + + issue = { + "code": EXPECTED_ISSUE_CODES["missing_erf_repo"], + "severity": "error", + "suggested_action": "Choose clone/custom/select path", + "repo_name": "erf", + } + inputs = iter(["select", "1"]) + monkeypatch.setattr("builtins.input", lambda *_args, **_kwargs: next(inputs)) + monkeypatch.setattr( + first_run_module, + "_discover_local_repo_candidates", + lambda *_args, **_kwargs: [selected_repo], + ) + monkeypatch.setattr( + first_run_module, + "_get_git_head_sha", + lambda *_args, **_kwargs: "5613ec3943a33d5f0b4f954e34c4e3ff5559a945", + ) + + result = first_run_module.resolve_readiness_issues_interactive( + repo_root=tmp_path, + issues=[issue], + ) + assert isinstance(result, dict) + assert result.get("resolved") == [issue] + assert result.get("unresolved") == [] + assert "use_discovered_repo:erf" in (result.get("attempted_actions") or []) diff --git a/tests/unit/test_graph_state_init.py b/tests/unit/test_graph_state_init.py index 3cd656c..9fd1bfe 100644 --- a/tests/unit/test_graph_state_init.py +++ b/tests/unit/test_graph_state_init.py @@ -115,6 +115,8 @@ def test_schema_has_node_required_fields(mock_config: Mock) -> None: assert "retry_count" in state assert "modifications" in state assert "workflow_history" in state + assert "execution_intent" in state + assert "visualization_intent" in state def test_validates_empty_prompt(mock_config: Mock) -> None: diff --git a/tests/unit/test_graph_wiring.py b/tests/unit/test_graph_wiring.py index 6cf8921..97eb278 100644 --- a/tests/unit/test_graph_wiring.py +++ b/tests/unit/test_graph_wiring.py @@ -137,21 +137,27 @@ def test_analysis_routes_to_visualization_or_reviewer(self, compiled_app): assert expected_destinations.issubset(destinations), \ f"Analysis should route to {expected_destinations}, got {destinations}" - def test_input_writer_to_runner_edge_exists(self, compiled_app): + def test_input_writer_to_execution_intent_edge_exists(self, compiled_app): """ GIVEN: Graph with linear execution path WHEN: Checking edges - THEN: input_writer→runner edge exists + THEN: input_writer→execution_intent edge exists """ graph_def = compiled_app.get_graph() - + writer_edges = [edge for edge in graph_def.edges if edge[0] == "input_writer"] - + destinations = {edge[1] for edge in writer_edges} - - assert "runner" in destinations, \ - "Input writer should route to runner" + + assert "execution_intent" in destinations, \ + "Input writer should route to execution_intent" + + def test_execution_intent_to_runner_edge_exists(self, compiled_app): + graph_def = compiled_app.get_graph() + intent_edges = [edge for edge in graph_def.edges if edge[0] == "execution_intent"] + destinations = {edge[1] for edge in intent_edges} + assert "runner" in destinations, "execution_intent should route to runner" def test_runner_to_analysis_edge_exists(self, compiled_app): """ @@ -198,7 +204,7 @@ def test_all_nodes_reachable_from_start(self, compiled_app): expected_nodes = { "__start__", "architect", "reviewer", - "input_writer", "runner", "analysis", + "input_writer", "execution_intent", "runner", "analysis", "visualization", "__end__" } diff --git a/tests/unit/test_input_writer_viz_plotfile.py b/tests/unit/test_input_writer_viz_plotfile.py index 2285731..ada6098 100644 --- a/tests/unit/test_input_writer_viz_plotfile.py +++ b/tests/unit/test_input_writer_viz_plotfile.py @@ -9,7 +9,9 @@ from src.nodes.input_writer_node import input_writer_node from src.services.input_writer import ( _resolve_plotfile_vars, + _resolve_plotfile_period_settings, apply_plotfile_vars_to_inputs_text, + upsert_inputs_param, ) @@ -101,6 +103,66 @@ def test_code_specific_param_used_for_pelelmex( assert "peleLM.derive_plot_vars = temperature" in updated assert "amr.plot_vars = temperature" not in updated + def test_code_specific_param_used_for_erf(self, tmp_path): + baseline = "erf.plot_vars_1 = density pressure\n" + setting = _resolve_plotfile_vars(["qc"], baseline, "ERF") + updated = apply_plotfile_vars_to_inputs_text(baseline, setting) + assert "erf.plot_vars_1 = qc" in updated + assert "amr.plot_vars = qc" not in updated + + def test_resolve_plotfile_vars_uses_candidate_contract_order(self, monkeypatch): + class _MockConfig: + @classmethod + def get_plot_var_param_candidates(cls): + return ["erf.plot_vars_1", "amr.plot_vars"] + + monkeypatch.setattr( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ) + + baseline = "amr.plot_vars = density pressure\nerf.plot_vars_1 = qv qc\n" + setting = _resolve_plotfile_vars([], baseline, "ERF") + assert setting == ("erf.plot_vars_1", "qv qc") + + def test_cadence_settings_for_erf_use_time_period_and_disable_step_interval(self): + settings = _resolve_plotfile_period_settings( + visualization_config={"plot_interval_seconds": 120}, + code_name="ERF", + ) + assert ("erf.plot_per_1", "120") in settings + assert ("erf.plot_int_1", "-1") in settings + + def test_cadence_settings_for_pelelmex_use_amr_keys(self): + settings = _resolve_plotfile_period_settings( + visualization_config={"plot_interval_seconds": 15}, + code_name="PeleLMeX", + ) + assert ("amr.plot_per", "15") in settings + assert ("amr.plot_int", "-1") in settings + + def test_cadence_settings_for_remora_use_remora_keys(self): + settings = _resolve_plotfile_period_settings( + visualization_config={"plot_interval_seconds": 30}, + code_name="REMORA", + ) + assert ("remora.plot_int_time", "30") in settings + assert ("remora.plot_int", "-1") in settings + + def test_cadence_settings_step_fallback_writes_step_interval_only(self): + settings = _resolve_plotfile_period_settings( + visualization_config={"cadence_solver_steps": 12}, + code_name="ERF", + ) + assert ("erf.plot_int_1", "12") in settings + assert ("erf.plot_per_1", "12") not in settings + + def test_upsert_inputs_param_replaces_existing_value(self): + original = "amr.n_cell = 64 64 64\nerf.plot_per_1 = 30\n" + updated = upsert_inputs_param(original, "erf.plot_per_1", "120") + assert "erf.plot_per_1 = 120" in updated + assert "erf.plot_per_1 = 30" not in updated + def test_input_writer_reads_state_not_prompt( self, tmp_path): """ @@ -124,9 +186,13 @@ def apply_plan( baseline, reasoning, output_dir, + user_prompt="", requested_plot_vars=None, + visualization_config=None, ): captured["requested_plot_vars"] = requested_plot_vars + captured["visualization_config"] = visualization_config + captured["user_prompt"] = user_prompt run_dir = Path(output_dir) run_dir.mkdir(parents=True, exist_ok=True) inputs = run_dir / "inputs" @@ -161,7 +227,22 @@ def apply_plan( }, } ], - "requested_plot_vars": ["temperature"], + "visualization_intent": { + "requested_fields": ["temperature"], + "cadence_prompt_seconds": 120, + "cadence_solver_time": 120.0, + "timestep_scope": "all", + "plots": [], + "solver_name": "PeleC", + "source": "prompt", + "adjustments": [], + "visualization_config": { + "plot_interval_seconds": 120, + "cadence_prompt_seconds": 120, + "cadence_solver_time": 120.0, + "timesteps": "all", + }, + }, } with patch("src.services.viz_param_extractor.extract_viz_params_from_prompt") as mock_extract, \ @@ -171,3 +252,4 @@ def apply_plan( input_writer_node(state) assert captured["requested_plot_vars"] == ["temperature"] + assert captured["visualization_config"]["plot_interval_seconds"] == 120 diff --git a/tests/unit/test_main_preflight.py b/tests/unit/test_main_preflight.py new file mode 100644 index 0000000..9182cdf --- /dev/null +++ b/tests/unit/test_main_preflight.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import patch + +import pytest + +from src.main import _run_startup_preflight + + +def test_run_startup_preflight_forwards_config_erf_repo_path() -> None: + config = SimpleNamespace( + amrex_agent_root=Path("/tmp/amrex-agent-root"), + erf_repo_path=Path("/tmp/custom-erf-path"), + ) + + with patch("src.main._is_tty_session", return_value=False): + with patch("src.main.run_startup_readiness_checks") as readiness_mock: + readiness_mock.return_value = {"exit_code": 0, "issues": []} + _run_startup_preflight(config) + + readiness_mock.assert_called_once() + kwargs = readiness_mock.call_args.kwargs + assert kwargs["repo_root"] == Path("/tmp/amrex-agent-root") + assert kwargs["is_tty"] is False + assert kwargs["allow_clone_missing"] is False + assert kwargs["erf_repo_path"] == Path("/tmp/custom-erf-path") + + +def test_run_startup_preflight_logs_interactive_hint_for_non_tty_failure( + caplog: pytest.LogCaptureFixture, +) -> None: + config = SimpleNamespace( + amrex_agent_root=Path("/tmp/amrex-agent-root"), + erf_repo_path=Path("/tmp/custom-erf-path"), + ) + + with patch("src.main._is_tty_session", return_value=False): + with patch("src.main.run_startup_readiness_checks") as readiness_mock: + readiness_mock.return_value = { + "exit_code": 1, + "unresolved": [ + { + "code": "ERF_COMMIT_MISMATCH", + "severity": "error", + "suggested_action": "Fix commit alignment.", + } + ], + } + with pytest.raises(ValueError, match="Startup readiness preflight failed"): + _run_startup_preflight(config) + + assert "Interactive remediation is disabled in non-TTY mode" in caplog.text diff --git a/tests/unit/test_noninteractive_gate_permissions.py b/tests/unit/test_noninteractive_gate_permissions.py new file mode 100644 index 0000000..e6aee12 --- /dev/null +++ b/tests/unit/test_noninteractive_gate_permissions.py @@ -0,0 +1,24 @@ +from src.policy.gate_policy import evaluate_gate_policy + + +def test_gate_approved_flag_without_source_does_not_grant_permission() -> None: + decision = evaluate_gate_policy( + tool_name="run_simulation", + context={"gate_approved": True}, + caller_action=None, + ) + + assert decision.gate_required is True + assert decision.allowed is False + assert decision.reason_code == "approval_required" + + +def test_gate_approved_with_human_source_allows_permission() -> None: + decision = evaluate_gate_policy( + tool_name="run_simulation", + context={"gate_approved": True, "approval_source": "human"}, + caller_action=None, + ) + + assert decision.allowed is True + assert decision.reason_code == "approved" diff --git a/tests/unit/test_prd_feature_mapping_references.py b/tests/unit/test_prd_feature_mapping_references.py index 7776e72..9899b36 100644 --- a/tests/unit/test_prd_feature_mapping_references.py +++ b/tests/unit/test_prd_feature_mapping_references.py @@ -2,6 +2,7 @@ from __future__ import annotations +import subprocess import sys from pathlib import Path from types import SimpleNamespace @@ -29,6 +30,16 @@ def _read_prd_or_skip() -> str: if not PRD_PATH.exists(): pytest.skip(f"PRD document not found: {PRD_PATH}") + + tracked = subprocess.run( + ["git", "ls-files", "--error-unmatch", str(PRD_PATH)], + capture_output=True, + text=True, + check=False, + ) + if tracked.returncode != 0: + pytest.skip(f"PRD document is not tracked in git: {PRD_PATH}") + return PRD_PATH.read_text(encoding="utf-8") diff --git a/tests/unit/test_run_local.py b/tests/unit/test_run_local.py index 8067908..94664c7 100644 --- a/tests/unit/test_run_local.py +++ b/tests/unit/test_run_local.py @@ -117,7 +117,7 @@ def fake_find(_case_dir, require_mpi=True, require_cuda=True): return None if calls["count"] == 1 else compiled_exe monkeypatch.setattr(runner, "_find_exe_in_dir", fake_find) - monkeypatch.setattr("src.services.run_local.compile_amrex", lambda **kwargs: True) + monkeypatch.setattr("src.services.run_local.compile_solver", lambda **kwargs: True) exe_path = runner.find_or_compile_executable(case_dir=case_dir, require_mpi=True, require_cuda=False) assert Path(exe_path) == compiled_exe @@ -130,7 +130,7 @@ def test_non_erf_compile_failure_raises(tmp_path, monkeypatch): runner = LocalRunner(config) monkeypatch.setattr(runner, "_find_exe_in_dir", lambda *args, **kwargs: None) - monkeypatch.setattr("src.services.run_local.compile_amrex", lambda **kwargs: False) + monkeypatch.setattr("src.services.run_local.compile_solver", lambda **kwargs: False) with pytest.raises(RuntimeError, match="Compilation failed"): runner.find_or_compile_executable(case_dir=case_dir) @@ -143,7 +143,7 @@ def test_non_erf_compiled_but_missing_executable_raises(tmp_path, monkeypatch): runner = LocalRunner(config) monkeypatch.setattr(runner, "_find_exe_in_dir", lambda *args, **kwargs: None) - monkeypatch.setattr("src.services.run_local.compile_amrex", lambda **kwargs: True) + monkeypatch.setattr("src.services.run_local.compile_solver", lambda **kwargs: True) with pytest.raises(RuntimeError, match="Compiled but no executable found"): runner.find_or_compile_executable(case_dir=case_dir) @@ -238,6 +238,26 @@ def wait(): assert result["exit_code"] == 2 +def test_submit_accepts_policy_named_executable_without_ex_suffix(tmp_path): + run_dir = tmp_path / "run_local_erf_exec" + run_dir.mkdir() + exe = run_dir / "erf_exec" + exe.write_text("binary") + + config = SimpleNamespace( + default_solver="ERF", + output_dir=tmp_path, + use_mpi=True, + ) + runner = LocalRunner(config) + + result = runner.submit(run_dir, nodes=2, dry_run=True) + script_path = Path(result["script_path"]) + assert result["method"] == "dry_run" + assert script_path.exists() + assert "mpirun -np 2 erf_exec inputs" in script_path.read_text() + + def test_find_or_compile_returns_existing_executable_without_compile(tmp_path): case_dir = tmp_path / "case" case_dir.mkdir() @@ -380,4 +400,46 @@ def test_resolve_erf_fallback_prefers_case_group_over_configured_regtests(tmp_pa exe, checked = runner._resolve_erf_executable_fallbacks(case_dir=case_dir) assert exe == abl_exe - assert checked[1] == abl_dir + assert abl_dir in checked + + +def test_erf_fallback_prefers_cmake_build_exec_when_present(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Scaling" / "Perlmutter" + case_dir.mkdir(parents=True) + cmake_exe = repo_root / "build" / "Exec" / "erf_exec" + cmake_exe.parent.mkdir(parents=True) + cmake_exe.write_text("binary") + + gnumake_exe = repo_root / "Exec" / "ABL" / "ERF3d.gnu.TEST.MPI.ex" + gnumake_exe.parent.mkdir(parents=True, exist_ok=True) + gnumake_exe.write_text("binary") + + config = SimpleNamespace( + default_solver="ERF", + output_dir=tmp_path, + use_mpi=True, + erf_executable_path=None, + erf_repo_path=repo_root, + erf_central_build_dir=repo_root / "Exec" / "ABL", + ) + runner = LocalRunner(config) + + exe, _ = runner._resolve_erf_executable_fallbacks(case_dir=case_dir) + assert exe == cmake_exe + + +def test_active_solver_prefers_case_repo_path_over_default_solver(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "CanonicalTests" / "SquallLine_2D" + case_dir.mkdir(parents=True) + + config = SimpleNamespace( + default_solver="AMREX", + output_dir=tmp_path, + use_mpi=True, + erf_repo_path=repo_root, + ) + runner = LocalRunner(config) + + assert runner._active_solver_code(case_dir) == "ERF" diff --git a/tests/unit/test_run_superfacility.py b/tests/unit/test_run_superfacility.py index 2a2d99e..b4113bf 100644 --- a/tests/unit/test_run_superfacility.py +++ b/tests/unit/test_run_superfacility.py @@ -163,7 +163,49 @@ def test_erf_fallback_prefers_case_group_over_configured_regtests(tmp_path): exe, checked = runner._resolve_erf_executable_fallbacks(case_dir=case_dir, require_mpi=True, require_cuda=True) assert exe == abl_exe - assert checked[1] == abl_dir + assert abl_dir in checked + + +def test_erf_fallback_prefers_cmake_build_exec_when_present(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Scaling" / "Perlmutter" + case_dir.mkdir(parents=True) + cmake_exe = repo_root / "build" / "Exec" / "erf_exec" + cmake_exe.parent.mkdir(parents=True) + cmake_exe.write_text("binary") + + gnumake_exe = repo_root / "Exec" / "ABL" / "ERF3d.gnu.TEST.MPI.CUDA.ex" + gnumake_exe.parent.mkdir(parents=True, exist_ok=True) + gnumake_exe.write_text("binary") + + config = SimpleNamespace( + default_solver="ERF", + output_dir=tmp_path, + superfacility_account="acct", + erf_executable_path=None, + erf_repo_path=repo_root, + erf_central_build_dir=repo_root / "Exec" / "ABL", + ) + runner = SuperfacilityRunner(config) + + exe, _ = runner._resolve_erf_executable_fallbacks(case_dir=case_dir, require_mpi=True, require_cuda=True) + assert exe == cmake_exe + + +def test_active_solver_prefers_case_repo_path_over_default_solver(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "CanonicalTests" / "SquallLine_2D" + case_dir.mkdir(parents=True) + + config = SimpleNamespace( + default_solver="AMREX", + output_dir=tmp_path, + superfacility_account="acct", + erf_repo_path=repo_root, + ) + runner = SuperfacilityRunner(config) + + assert runner._active_solver_code(case_dir) == "ERF" def test_non_erf_compile_failure_raises(tmp_path, monkeypatch): @@ -173,7 +215,7 @@ def test_non_erf_compile_failure_raises(tmp_path, monkeypatch): runner = SuperfacilityRunner(config) monkeypatch.setattr(runner, "_find_exe_in_dir", lambda *args, **kwargs: None) - monkeypatch.setattr("src.services.run_superfacility.compile_amrex", lambda **kwargs: False) + monkeypatch.setattr("src.services.run_superfacility.compile_solver", lambda **kwargs: False) with pytest.raises(RuntimeError, match="Compilation failed"): runner.find_or_compile_executable(case_dir=case_dir) @@ -186,7 +228,7 @@ def test_non_erf_compiled_but_missing_executable_raises(tmp_path, monkeypatch): runner = SuperfacilityRunner(config) monkeypatch.setattr(runner, "_find_exe_in_dir", lambda *args, **kwargs: None) - monkeypatch.setattr("src.services.run_superfacility.compile_amrex", lambda **kwargs: True) + monkeypatch.setattr("src.services.run_superfacility.compile_solver", lambda **kwargs: True) with pytest.raises(RuntimeError, match="Compiled but no executable found"): runner.find_or_compile_executable(case_dir=case_dir) @@ -247,7 +289,7 @@ def test_resolve_remote_executable_template_dir_find_success(tmp_path, monkeypat monkeypatch.setattr("src.services.run_superfacility.list_remote_entries", lambda *args, **kwargs: []) monkeypatch.setattr( "src.services.run_superfacility.find_remote_executable", - lambda remote_case_dir, system=None: f"{remote_case_dir}/ERF3d.gnu.TEST.MPI.CUDA.ex", + lambda remote_case_dir, system=None, **kwargs: f"{remote_case_dir}/ERF3d.gnu.TEST.MPI.CUDA.ex", ) result = runner._resolve_remote_executable(case_dir=case_dir) assert str(result).endswith(".ex") @@ -409,7 +451,7 @@ def _find(*args, **kwargs): return None if calls["count"] == 1 else compiled monkeypatch.setattr(runner, "_find_exe_in_dir", _find) - monkeypatch.setattr("src.services.run_superfacility.compile_amrex", lambda **kwargs: True) + monkeypatch.setattr("src.services.run_superfacility.compile_solver", lambda **kwargs: True) assert Path(runner.find_or_compile_executable(case_dir=case_dir)) == compiled @@ -467,7 +509,7 @@ def _list_remote(path, system=None): monkeypatch.setattr("src.services.run_superfacility.list_remote_entries", _list_remote) monkeypatch.setattr( "src.services.run_superfacility.find_remote_executable", - lambda remote_case_dir, system=None: f"{remote_case_dir}/solver.ex", + lambda remote_case_dir, system=None, **kwargs: f"{remote_case_dir}/solver.ex", ) config = SimpleNamespace( @@ -646,7 +688,7 @@ def test_find_or_compile_force_recompile_path(tmp_path, monkeypatch): exe.write_text("binary") config = SimpleNamespace(default_solver="PeleC", output_dir=tmp_path, superfacility_account="acct") runner = SuperfacilityRunner(config) - monkeypatch.setattr("src.services.run_superfacility.compile_amrex", lambda **kwargs: True) + monkeypatch.setattr("src.services.run_superfacility.compile_solver", lambda **kwargs: True) monkeypatch.setattr(runner, "_find_exe_in_dir", lambda *args, **kwargs: exe) assert Path(runner.find_or_compile_executable(case_dir=case_dir, force_recompile=True)) == exe @@ -776,6 +818,55 @@ def test_submit_uses_resolved_remote_executable_when_template_enabled(tmp_path, assert result["params"]["executable"] == "/remote/tmpl.ex" +def test_submit_accepts_policy_named_local_executable_without_ex_suffix(tmp_path, monkeypatch): + run_dir = tmp_path / "run_sf_erf_exec" + run_dir.mkdir() + exe = run_dir / "erf_exec" + exe.write_text("binary") + + monkeypatch.setattr("src.services.run_superfacility.generate_slurm_script", lambda **kwargs: "#!/bin/bash\n") + monkeypatch.setattr("src.config.detect_environment", lambda: "local") + + config = SimpleNamespace( + default_solver="ERF", + output_dir=tmp_path, + superfacility_account="acct", + environment="local", + remote_executable_find=False, + ) + runner = SuperfacilityRunner(config) + result = runner.submit(run_dir, dry_run=True, case_dir=tmp_path / "ERF" / "Exec" / "Case") + assert result["method"] == "dry_run" + assert Path(result["script_path"]).exists() + + +def test_resolve_remote_executable_passes_policy_names_to_finder(tmp_path, monkeypatch): + case_dir = tmp_path / "ERF" / "Exec" / "Case" + case_dir.mkdir(parents=True) + config = SimpleNamespace( + default_solver="ERF", + output_dir=tmp_path, + superfacility_account="acct", + repositories={"ERF": tmp_path / "ERF"}, + remote_executable_template="/remote/{case_dir}", + remote_executable_find=True, + ) + runner = SuperfacilityRunner(config) + + captured = {} + monkeypatch.setattr("src.services.run_superfacility.list_remote_entries", lambda *args, **kwargs: []) + + def _fake_find(**kwargs): + captured.update(kwargs) + return "/remote/Exec/Case/erf_exec" + + monkeypatch.setattr("src.services.run_superfacility.find_remote_executable", _fake_find) + resolved = runner._resolve_remote_executable(case_dir=case_dir) + assert str(resolved).endswith("erf_exec") + assert captured.get("build_system_preference") == "cmake" + assert "erf_exec" in (captured.get("cmake_executable_names") or []) + + def test_submit_stage_load_sfapi_key_file_none(tmp_path, monkeypatch): run_dir = tmp_path / "run_stage_none" run_dir.mkdir() diff --git a/tests/unit/test_runner_environment_fallback.py b/tests/unit/test_runner_environment_fallback.py new file mode 100644 index 0000000..9786e5c --- /dev/null +++ b/tests/unit/test_runner_environment_fallback.py @@ -0,0 +1,44 @@ +import importlib +from types import SimpleNamespace + +runner_node_module = importlib.import_module("src.nodes.runner_node") + + +def test_effective_runtime_uses_intent_procs_when_config_default(monkeypatch) -> None: + config = SimpleNamespace(environment="local", mpi_ranks=1, run_mode="full") + state = {"execution_intent": {"total_procs": 4, "source": "prompt", "execution_config": {}}} + + monkeypatch.setattr("src.config.detect_environment", lambda: "local") + runtime, adjustments = runner_node_module._effective_runtime_from_intent(config, state) + + assert runtime["total_procs"] == 4 + assert adjustments == [] + + +def test_effective_runtime_prefers_config_procs_when_non_default(monkeypatch) -> None: + config = SimpleNamespace(environment="local", mpi_ranks=8, run_mode="full") + state = {"execution_intent": {"total_procs": 4, "source": "prompt", "execution_config": {}}} + + monkeypatch.setattr("src.config.detect_environment", lambda: "local") + runtime, _ = runner_node_module._effective_runtime_from_intent(config, state) + + assert runtime["total_procs"] == 8 + + +def test_perlmutter_unreachable_falls_back_to_local(monkeypatch) -> None: + config = SimpleNamespace(environment="local", mpi_ranks=1, run_mode="full") + state = { + "execution_intent": { + "environment": "perlmutter", + "total_procs": 4, + "source": "prompt", + "execution_config": {}, + } + } + + monkeypatch.setattr("src.config.detect_environment", lambda: "local") + monkeypatch.setattr(runner_node_module, "_is_perlmutter_reachable", lambda cfg: (False, "missing_path")) + runtime, adjustments = runner_node_module._effective_runtime_from_intent(config, state) + + assert runtime["environment"] == "local" + assert "environment_fallback_perlmutter_unreachable" in adjustments diff --git a/tests/unit/test_solver_build_policy.py b/tests/unit/test_solver_build_policy.py new file mode 100644 index 0000000..dbbc98a --- /dev/null +++ b/tests/unit/test_solver_build_policy.py @@ -0,0 +1,116 @@ +from pathlib import Path +from types import SimpleNamespace + +from src.services.solver_build_policy import get_solver_build_policy, resolve_local_executable_fallback + + +def _find_default_executable(search_dir: Path, require_mpi: bool, require_cuda: bool): + exes = sorted(search_dir.glob("*.ex")) + return exes[0] if exes else None + + +def test_erf_policy_uses_cmake_override_from_config_class(): + policy = get_solver_build_policy("ERF") + assert policy["build_system_preference"] == "cmake" + assert policy["cmake_executable_names"] == ["erf_exec"] + assert policy["cmake_executable_ignores_accel_suffix"] is True + assert policy["gnumake_executable_globs"] == ["ERF*ex"] + assert policy["compile_policy"]["cmake_build_dir_template"] == "{repo_root}/build" + assert "-DCMAKE_BUILD_TYPE=Release" in policy["compile_policy"]["cmake_configure_args"] + + +def test_runtime_override_wins_over_solver_default(): + runtime = SimpleNamespace(erf_build_system_preference="gnumake") + policy = get_solver_build_policy("ERF", runtime_config=runtime) + assert policy["build_system_preference"] == "gnumake" + + +def test_compile_policy_templates_are_resolved_with_context(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Case" + case_dir.mkdir(parents=True) + policy = get_solver_build_policy( + "ERF", + runtime_config=SimpleNamespace(), + case_dir=case_dir, + repo_root=repo_root, + central_build_dirs=[repo_root / "Exec" / "ABL"], + ) + + compile_policy = policy["compile_policy"] + assert compile_policy["cmake_source_dir"] == str(repo_root) + assert compile_policy["cmake_build_dir"] == str(repo_root / "build") + + +def test_compile_policy_runtime_overrides_apply(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Case" + case_dir.mkdir(parents=True) + runtime = SimpleNamespace( + erf_cmake_build_dir_template="{repo_root}/custom_build", + erf_gnumake_build_args=["USE_MPI=TRUE", "DEBUG=FALSE", "CUSTOM=ON"], + ) + policy = get_solver_build_policy( + "ERF", + runtime_config=runtime, + case_dir=case_dir, + repo_root=repo_root, + ) + + compile_policy = policy["compile_policy"] + assert compile_policy["cmake_build_dir"] == str(repo_root / "custom_build") + assert "CUSTOM=ON" in compile_policy["gnumake_build_args"] + + +def test_resolver_prefers_cmake_when_both_artifacts_exist(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Scaling" / "Perlmutter" + case_dir.mkdir(parents=True) + + cmake = repo_root / "build" / "Exec" / "erf_exec" + cmake.parent.mkdir(parents=True) + cmake.write_text("binary") + + gnumake = repo_root / "Exec" / "ABL" / "ERF3d.gnu.TEST.MPI.ex" + gnumake.parent.mkdir(parents=True, exist_ok=True) + gnumake.write_text("binary") + + result = resolve_local_executable_fallback( + solver_code="ERF", + runtime_config=SimpleNamespace(), + case_dir=case_dir, + repo_root=repo_root, + configured_executable_path=None, + central_build_dirs=[repo_root / "Exec" / "ABL"], + require_mpi=True, + require_cuda=True, + find_default_executable=_find_default_executable, + ) + + assert result["selected_branch"] == "cmake" + assert result["executable_path"] == cmake + + +def test_resolver_falls_back_to_gnumake_when_cmake_missing(tmp_path): + repo_root = tmp_path / "ERF" + case_dir = repo_root / "Exec" / "ABL" / "Scaling" / "Perlmutter" + case_dir.mkdir(parents=True) + + gnumake = repo_root / "Exec" / "ABL" / "ERF3d.gnu.TEST.MPI.CUDA.ex" + gnumake.parent.mkdir(parents=True, exist_ok=True) + gnumake.write_text("binary") + + result = resolve_local_executable_fallback( + solver_code="ERF", + runtime_config=SimpleNamespace(), + case_dir=case_dir, + repo_root=repo_root, + configured_executable_path=None, + central_build_dirs=[repo_root / "Exec" / "ABL"], + require_mpi=True, + require_cuda=True, + find_default_executable=_find_default_executable, + ) + + assert result["selected_branch"] == "gnumake" + assert result["executable_path"] == gnumake diff --git a/tests/unit/test_superfacility_tools.py b/tests/unit/test_superfacility_tools.py index b74d51c..573ff79 100644 --- a/tests/unit/test_superfacility_tools.py +++ b/tests/unit/test_superfacility_tools.py @@ -4,6 +4,7 @@ from src.services.run_superfacility_tools import ( create_nersc_session, + find_remote_executable, generate_slurm_script, monitor_job, resolve_remote_output_dir, @@ -159,3 +160,31 @@ def fail_call(*_args, **_kwargs): ) assert result == Path("/tmp/amrex_agent_runs") + + +def test_find_remote_executable_prefers_cmake_name_when_configured(monkeypatch): + monkeypatch.setattr( + "src.services.run_superfacility_tools.list_remote_files", + lambda *args, **kwargs: ["/remote/ERF3d.gnu.TEST.MPI.CUDA.ex", "/remote/erf_exec"], + ) + found = find_remote_executable( + remote_case_dir="/remote", + build_system_preference="cmake", + cmake_executable_names=["erf_exec"], + gnumake_executable_globs=["ERF*ex"], + ) + assert found == "/remote/erf_exec" + + +def test_find_remote_executable_falls_back_to_gnumake_glob(monkeypatch): + monkeypatch.setattr( + "src.services.run_superfacility_tools.list_remote_files", + lambda *args, **kwargs: ["/remote/ERF3d.gnu.TEST.MPI.CUDA.ex", "/remote/readme.txt"], + ) + found = find_remote_executable( + remote_case_dir="/remote", + build_system_preference="cmake", + cmake_executable_names=["erf_exec"], + gnumake_executable_globs=["ERF*ex"], + ) + assert found == "/remote/ERF3d.gnu.TEST.MPI.CUDA.ex" diff --git a/tests/unit/test_unnumbered_254.py b/tests/unit/test_unnumbered_254.py index 268eb8e..a36d4c3 100644 --- a/tests/unit/test_unnumbered_254.py +++ b/tests/unit/test_unnumbered_254.py @@ -2,6 +2,7 @@ from __future__ import annotations +import subprocess from pathlib import Path from types import SimpleNamespace @@ -44,6 +45,16 @@ def _read_prd_or_skip() -> str: prd_path = Path("docs/PRD/PRD_v2605.md") if not prd_path.exists(): pytest.skip(f"PRD document not found: {prd_path}") + + tracked = subprocess.run( + ["git", "ls-files", "--error-unmatch", str(prd_path)], + capture_output=True, + text=True, + check=False, + ) + if tracked.returncode != 0: + pytest.skip(f"PRD document is not tracked in git: {prd_path}") + return prd_path.read_text(encoding="utf-8") diff --git a/tests/unit/test_visualization_axis_defaults.py b/tests/unit/test_visualization_axis_defaults.py index 1e358e1..3fdab11 100644 --- a/tests/unit/test_visualization_axis_defaults.py +++ b/tests/unit/test_visualization_axis_defaults.py @@ -176,3 +176,26 @@ class _VizService: assert plots[1]["field"] == "pressure" assert plots[1]["lineout_axis"] == "x" assert plots[1]["position"] == 0.5 + + +def test_build_vis_config_uses_prompt_timestep_scope(): + class _Backend: + @staticmethod + def get_field_list(_plotfile): + return ["qc"] + + class _VizService: + backend = _Backend() + + vis_config = _build_vis_config( + plan={"visualization": {"plots": [{"type": "slice", "field": "qc"}]}}, + analysis_report={}, + plotfiles=[Path("plt00000")], + viz_service=_VizService(), + prompt="show cloud water every 2 minutes", + solver_name="ERF", + inputs_file_path=None, + requested_plot_vars=["cloud_water"], + prompt_visualization_config={"timesteps": "all"}, + ) + assert vis_config.get("timesteps") == "all" diff --git a/tests/unit/test_visualization_intent_model.py b/tests/unit/test_visualization_intent_model.py new file mode 100644 index 0000000..fa6d83d --- /dev/null +++ b/tests/unit/test_visualization_intent_model.py @@ -0,0 +1,164 @@ +from src.models.visualization_intent import VisualizationIntent +from src.nodes.visualization_intent_node import ( + build_visualization_intent, + resolve_visualization_intent, + visualization_intent_node, +) +from src.services.viz_param_extractor import VizMappingCatalogUnavailableError +from unittest.mock import patch + + +def test_visualization_intent_model_defaults(): + model = VisualizationIntent() + assert model.requested_fields == [] + assert model.cadence_prompt_seconds is None + assert model.cadence_solver_time is None + assert model.timestep_scope == "latest" + assert model.plots == [] + assert model.source == "default" + assert model.adjustments == [] + + +def test_build_visualization_intent_from_prompt_cadence(): + class _MockConfig: + @classmethod + def get_viz_tier1_intents(cls): + return {"cloud_water": {"aliases": ["cloud water", "cloud_water"]}} + + @classmethod + def build_viz_tier2_candidates(cls, repo_root=None): + del cls, repo_root + return { + "cloud_water": [ + {"name": "qc", "aliases": ["cloud_water", "cloud water"]}, + ] + } + + with patch( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ): + model = build_visualization_intent( + prompt="show cloud water every 2 minutes", + solver_name="ERF", + ) + assert "qc" in model.requested_fields + assert model.cadence_prompt_seconds == 120 + assert model.cadence_solver_time == 120.0 + assert model.timestep_scope == "all" + assert model.source == "prompt" + + +def test_build_visualization_intent_hard_fails_when_solver_catalog_unavailable(monkeypatch): + class _MockConfig: + @classmethod + def get_viz_tier1_intents(cls): + return {"cloud_water": {"aliases": ["cloud water"]}} + + @classmethod + def build_viz_tier2_candidates(cls, repo_root=None): + del cls, repo_root + return {} + + monkeypatch.setattr( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ) + + try: + build_visualization_intent( + prompt="show cloud water", + solver_name="ERF", + ) + except VizMappingCatalogUnavailableError: + return + assert False, "expected hard failure when solver catalog is unavailable" + + +def test_resolve_visualization_intent_uses_existing_typed_payload(): + resolved = resolve_visualization_intent( + { + "visualization_intent": { + "requested_fields": ["temperature"], + "cadence_prompt_seconds": 10, + "cadence_solver_time": 10.0, + "timestep_scope": "all", + "plots": [], + "solver_name": "PeleC", + "source": "clarification", + "adjustments": ["remote_latest_only"], + "visualization_config": {"timesteps": "all"}, + } + } + ) + assert resolved["requested_fields"] == ["temperature"] + assert resolved["source"] == "clarification" + assert resolved["timestep_scope"] == "all" + + +def test_visualization_intent_node_populates_state_and_legacy_mirror(): + updates = visualization_intent_node( + { + "prompt": "plot temperature every 5 seconds", + "requested_plot_vars": [], + "visualization_config": {}, + } + ) + assert "visualization_intent" in updates + assert updates["visualization_intent"]["requested_fields"] == ["temperature"] + assert updates["visualization_intent"]["cadence_prompt_seconds"] == 5 + assert updates["visualization_intent"]["cadence_solver_time"] is None + assert updates["visualization_intent"]["visualization_config"]["cadence_solver_steps"] == 5 + assert updates["requested_plot_vars"] == ["temperature"] + assert updates["visualization_config"]["plot_interval_seconds"] == 5 + + +def test_visualization_intent_node_routes_ambiguous_mapping_to_clarification(monkeypatch): + monkeypatch.setattr( + "src.nodes.visualization_intent_node.extract_viz_params_from_prompt", + lambda prompt, code_name=None, repo_root=None: (["velocity"], {}), + ) + + class _MockConfig: + @classmethod + def get_viz_tier1_intents(cls): + return {"velocity": {"aliases": ["velocity"]}} + + @classmethod + def build_viz_tier2_candidates(cls, repo_root=None): + del cls, repo_root + return { + "velocity": [ + {"name": "x_velocity", "aliases": ["velocity"]}, + {"name": "y_velocity", "aliases": ["velocity"]}, + ] + } + + monkeypatch.setattr( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ) + + updates = visualization_intent_node( + { + "prompt": "plot velocity", + "selected_solver": "ERF", + "requested_plot_vars": [], + "visualization_config": {}, + } + ) + assert updates["requested_plot_vars"] == [] + assert updates["visualization_intent"]["requested_fields"] == [] + assert updates["visualization_mapping_candidates"]["velocity"][0]["name"] == "x_velocity" + assert updates["visualization_mapping_unresolved"] == [] + + +def test_build_visualization_intent_falls_back_to_step_cadence_for_unknown_solver(): + model = build_visualization_intent( + prompt="plot temperature every 7 seconds", + solver_name="UnknownSolver", + ) + assert model.cadence_prompt_seconds == 7 + assert model.cadence_solver_time is None + assert "cadence_fallback_to_steps_unknown_time_units" in model.adjustments + assert model.visualization_config["cadence_solver_steps"] == 7 diff --git a/tests/unit/test_visualization_mapping_parity.py b/tests/unit/test_visualization_mapping_parity.py new file mode 100644 index 0000000..67119f9 --- /dev/null +++ b/tests/unit/test_visualization_mapping_parity.py @@ -0,0 +1,45 @@ +"""Parity test for architect visualization semantics and intent-node mapping.""" + +from types import SimpleNamespace + +from src.nodes.visualization_intent_node import visualization_intent_node +from src.services.architect import ArchitectService + + +def test_architect_and_visualization_intent_node_resolve_same_fields(monkeypatch): + class _MockConfig: + @classmethod + def get_viz_tier1_intents(cls): + return {"cloud_water": {"aliases": ["cloud water", "cloud_water"]}} + + @classmethod + def build_viz_tier2_candidates(cls, repo_root=None): + del cls, repo_root + return { + "cloud_water": [ + {"name": "qc", "aliases": ["cloud_water", "cloud water"]}, + ] + } + + monkeypatch.setattr( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ) + + architect = ArchitectService.__new__(ArchitectService) + architect.config = SimpleNamespace(environment="local") + + vis_plan = architect._plan_visualization( + {"user_prompt": "show cloud water"}, + {"code_name": "ERF", "repo_path": "/tmp/ERF"}, + ) + assert vis_plan["requested_semantic_tokens"] == ["cloud_water"] + + updates = visualization_intent_node( + { + "prompt": "show cloud water", + "selected_solver": "ERF", + "plan": {"baseline": {"repo_path": "/tmp/ERF", "code_name": "ERF"}}, + } + ) + assert updates["requested_plot_vars"] == ["qc"] diff --git a/tests/unit/test_visualization_run_directory_resolution.py b/tests/unit/test_visualization_run_directory_resolution.py new file mode 100644 index 0000000..51a591b --- /dev/null +++ b/tests/unit/test_visualization_run_directory_resolution.py @@ -0,0 +1,55 @@ +"""Unit tests for visualization run-directory resolution.""" + +from src.nodes.visualization_node import get_run_directory_and_analysis + + +def test_prefers_latest_runner_run_directory_over_input_writer(): + state = { + "workflow_history": [ + {"node": "input_writer", "details": {"run_directory": "output/run_old"}}, + {"node": "runner", "details": {"run_directory": "output/run_new"}}, + ], + "run_directory": "output/run_state", + "analysis_report": {"status": "success"}, + } + + run_dir, analysis = get_run_directory_and_analysis(state) # type: ignore[arg-type] + assert run_dir == "output/run_new" + assert analysis.get("status") == "success" + + +def test_falls_back_to_latest_input_writer_then_state(): + state_with_input_writer = { + "workflow_history": [ + {"node": "input_writer", "details": {"run_directory": "output/run_iw_old"}}, + {"node": "input_writer", "details": {"run_directory": "output/run_iw_new"}}, + ], + "run_directory": "output/run_state", + "analysis_report": {}, + } + run_dir, _ = get_run_directory_and_analysis(state_with_input_writer) # type: ignore[arg-type] + assert run_dir == "output/run_iw_new" + + state_with_state_only = { + "workflow_history": [], + "run_directory": "output/run_state_only", + "analysis_report": {}, + } + run_dir, _ = get_run_directory_and_analysis(state_with_state_only) # type: ignore[arg-type] + assert run_dir == "output/run_state_only" + + +def test_loads_analysis_report_from_history_when_state_missing(): + state = { + "workflow_history": [ + { + "node": "analysis", + "details": {"report": {"status": "success", "issues": []}}, + } + ], + "run_directory": "output/run_state", + "analysis_report": {}, + } + + _, analysis = get_run_directory_and_analysis(state) # type: ignore[arg-type] + assert analysis.get("status") == "success" diff --git a/tests/unit/test_visualization_service_timesteps.py b/tests/unit/test_visualization_service_timesteps.py new file mode 100644 index 0000000..f86abac --- /dev/null +++ b/tests/unit/test_visualization_service_timesteps.py @@ -0,0 +1,61 @@ +from pathlib import Path + +from src.services.visualization import VisualizationService + + +class _FakeBackend: + def available(self) -> bool: + return True + + def get_field_list(self, plotfile: Path) -> list[str]: + del plotfile + return ["qc"] + + def create_slice_plot( + self, + plotfile: Path, + field: str, + axis: str, + output_path: Path, + **kwargs, + ) -> Path: + del plotfile, field, axis, kwargs + output_path.write_text("fake image") + return output_path + + +def _make_service(monkeypatch): + monkeypatch.setattr(VisualizationService, "_select_backend", lambda self: _FakeBackend()) + config = type("Cfg", (), {"container_mode": False, "visualization_backend": "yt"})() + return VisualizationService(config) + + +def test_create_standard_plots_latest_only(monkeypatch, tmp_path): + service = _make_service(monkeypatch) + run_dir = tmp_path / "run" + (run_dir / "plt00001").mkdir(parents=True) + (run_dir / "plt00002").mkdir(parents=True) + + images = service.create_standard_plots( + run_dir=run_dir, + vis_config={"plots": [{"type": "slice", "field": "qc", "axis": "y"}], "timesteps": "latest"}, + ) + + assert len(images) == 1 + assert images[0].name == "qc_slice.png" + + +def test_create_standard_plots_all_timesteps(monkeypatch, tmp_path): + service = _make_service(monkeypatch) + run_dir = tmp_path / "run" + (run_dir / "plt00001").mkdir(parents=True) + (run_dir / "plt00002").mkdir(parents=True) + + images = service.create_standard_plots( + run_dir=run_dir, + vis_config={"plots": [{"type": "slice", "field": "qc", "axis": "y"}], "timesteps": "all"}, + ) + + assert len(images) == 2 + names = sorted(image.name for image in images) + assert names == ["plt00001_qc_slice.png", "plt00002_qc_slice.png"] diff --git a/tests/unit/test_viz_param_extractor.py b/tests/unit/test_viz_param_extractor.py index 9a3348a..77d0e4c 100644 --- a/tests/unit/test_viz_param_extractor.py +++ b/tests/unit/test_viz_param_extractor.py @@ -10,6 +10,8 @@ canonicalize_requested_plot_vars, extract_viz_params_from_prompt, get_plotfile_var_param, + resolve_viz_field_mapping, + VizMappingCatalogUnavailableError, ) @@ -156,6 +158,56 @@ def get_viz_variable_catalog(cls, repo_root=None): mapped = canonicalize_requested_plot_vars(["cloud_water"], code_name="ERF") assert mapped == ["qc"] + def test_resolve_viz_field_mapping_reports_ambiguity(self, monkeypatch): + class _MockConfig: + @classmethod + def get_viz_tier1_intents(cls): + return { + "velocity": { + "aliases": ["velocity", "speed"], + } + } + + @classmethod + def build_viz_tier2_candidates(cls, repo_root=None): + del cls, repo_root + return { + "velocity": [ + {"name": "x_velocity", "aliases": ["velocity"]}, + {"name": "y_velocity", "aliases": ["velocity"]}, + ] + } + + monkeypatch.setattr( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ) + + result = resolve_viz_field_mapping(["velocity"], code_name="ERF") + assert result["resolved_fields"] == [] + assert result["ambiguous_tokens"] == ["velocity"] + assert result["candidate_fields_by_token"]["velocity"][0]["name"] == "x_velocity" + assert result["mapping_source"] == "solver_catalog" + + def test_resolve_viz_field_mapping_hard_fails_when_catalog_missing(self, monkeypatch): + class _MockConfig: + @classmethod + def get_viz_tier1_intents(cls): + return {"cloud_water": {"aliases": ["cloud water"]}} + + @classmethod + def build_viz_tier2_candidates(cls, repo_root=None): + del cls, repo_root + return {} + + monkeypatch.setattr( + "database.configs.registry.get_config_class", + lambda code_name: _MockConfig, + ) + + with pytest.raises(VizMappingCatalogUnavailableError): + resolve_viz_field_mapping(["cloud_water"], code_name="ERF") + class TestPlotfileParamLookup: """ @@ -193,9 +245,9 @@ def test_erf_returns_amr_plot_vars(self): """ Given: code_name = 'ERF' When: get_plotfile_var_param(code_name) runs - Then: returns 'amr.plot_vars' + Then: returns ERF plot vars key """ - assert get_plotfile_var_param("ERF") == "amr.plot_vars" + assert get_plotfile_var_param("ERF") == "erf.plot_vars_1" def test_remora_returns_correct_param(self): """ @@ -211,8 +263,15 @@ def test_unknown_solver_returns_amr_plot_vars(self, caplog): Given: code_name = 'UnknownSolver' When: get_plotfile_var_param(code_name) runs Then: returns 'amr.plot_vars' as safe fallback - logs a warning about unknown solver """ caplog.set_level(logging.WARNING) assert get_plotfile_var_param("UnknownSolver") == "amr.plot_vars" - assert "Unknown solver" in caplog.text + + +def test_extract_plot_interval_seconds_from_minutes_prompt(): + requested_plot_vars, visualization_config = extract_viz_params_from_prompt( + "I'd like snapshots of cloud water every 2 minutes." + ) + assert "cloud_water" in requested_plot_vars + assert visualization_config["plot_interval_seconds"] == 120 + assert visualization_config["timesteps"] == "all"