From db90883b2540ea817e02217c8ea7ac77f0611db6 Mon Sep 17 00:00:00 2001 From: CEgerer93 Date: Fri, 15 Sep 2023 14:52:32 -0400 Subject: [PATCH 1/4] To access ensemble members --- .../geos_atmosphere/task_questions.yaml | 3 + src/swell/tasks/base/task_registry.py | 1 + src/swell/tasks/get_ensemble.py | 69 +++++++++++++++++++ src/swell/tasks/task_questions.yaml | 10 +++ 4 files changed, 83 insertions(+) create mode 100644 src/swell/tasks/get_ensemble.py diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml index 813fd3e2..5b00d445 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml @@ -153,6 +153,9 @@ observations: - omi_aura - ompsnm_npp +path_to_ensemble: + default_value: /discover/nobackup/drholdaw/SwellTestData/letk/ensemble/Y%Y/M%m/D%d/H%H + path_to_geos_adas_background: default_value: /discover/nobackup/drholdaw/SwellTestData/geosadas/bkg/*bkg_clcv_rst* diff --git a/src/swell/tasks/base/task_registry.py b/src/swell/tasks/base/task_registry.py index ff5a6219..80a7d8ce 100644 --- a/src/swell/tasks/base/task_registry.py +++ b/src/swell/tasks/base/task_registry.py @@ -18,6 +18,7 @@ 'GenerateBClimatology', 'GetBackgroundGeosExperiment', 'GetBackground', + 'GetEnsemble', 'GetGeosAdasBackground', 'GetGeosRestart', 'GetGeovals', diff --git a/src/swell/tasks/get_ensemble.py b/src/swell/tasks/get_ensemble.py new file mode 100644 index 00000000..23f70807 --- /dev/null +++ b/src/swell/tasks/get_ensemble.py @@ -0,0 +1,69 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import datetime +import glob +import os +import re + +from swell.tasks.base.task_base import taskBase + + +# -------------------------------------------------------------------------------------------------- + + +class GetEnsemble(taskBase): + + def execute(self): + + # Get the path and pattern for the background files + # ------------------------------------------------- + ensemble_path = self.config.path_to_ensemble() + + # Fetch list of ensemble members + # -------------------------------- + ensemble_members = glob.glob(ensemble_path) + + # Assert at least one ensemble member was found + # ----------------------------------------------- + self.logger.assert_abort(len(ensemble_members) != 0, f'No ensemble member ' + + f'files found in the source directory ' + + f'\'{ensemble_path}\'') + + # Loop over all the ensemble members found + # ----------------------------------------- + for ensemble_member in ensemble_members: + + # Get filename from full path + member_file = os.path.basename(ensemble_member) + + # Extract the datetime part from the string + datetime_part = re.search(r"\d{8}_\d{4}\w", member_file).group() + + # Get datetime for the file from the filename + member_file_datetime = datetime.datetime.strptime(datetime_part, '%Y%m%d_%H%Mz') + + # Create target filename using the datetime format + member_file_target = member_file_datetime.strftime('geos.mem002.%Y%m%d_%H%M%Sz.nc4') + + # Target path and filename + ensemble_path_file_target = os.path.join(self.cycle_dir(), member_file_target) + + # Remove target file if it exists (might be a link) + if os.path.exists(ensemble_path_file_target): + os.remove(ensemble_path_file_target) + + # Create symlink from target to source + self.logger.info(f'Creating sym link from {ensemble_member} to ' + f'{ensemble_path_file_target}') + os.symlink(ensemble_member, ensemble_path_file_target) + + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/task_questions.yaml b/src/swell/tasks/task_questions.yaml index 785aed8b..23185523 100644 --- a/src/swell/tasks/task_questions.yaml +++ b/src/swell/tasks/task_questions.yaml @@ -442,6 +442,16 @@ observations: - SaveObsDiags type: string-check-list +path_to_ensemble: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + prompt: What is the path to where ensemble members are stored? + tasks: + - GetEnsemble + type: string + path_to_geos_adas_background: ask_question: true default_value: defer_to_model From e9d198b7f059438ed37490212337bf48a11f209c Mon Sep 17 00:00:00 2001 From: CEgerer93 Date: Fri, 15 Sep 2023 16:25:15 -0400 Subject: [PATCH 2/4] Basic features establishing LETKF as a future component of geos_atmosphere in Swell. --- .../geos_atmosphere/task_questions.yaml | 3 + src/swell/deployment/prep_suite.py | 1 + src/swell/suites/letkf/flow.cylc | 155 ++++++++++++++++++ src/swell/suites/letkf/suite_questions.yaml | 26 +++ src/swell/tasks/base/task_registry.py | 1 + src/swell/tasks/get_ensemble.py | 2 +- src/swell/tasks/run_jedi_letkf_executable.py | 118 +++++++++++++ src/swell/tasks/task_questions.yaml | 23 +++ 8 files changed, 328 insertions(+), 1 deletion(-) create mode 100644 src/swell/suites/letkf/flow.cylc create mode 100644 src/swell/suites/letkf/suite_questions.yaml create mode 100644 src/swell/tasks/run_jedi_letkf_executable.py diff --git a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml index 5b00d445..5944b0a0 100644 --- a/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml +++ b/src/swell/configuration/jedi/interfaces/geos_atmosphere/task_questions.yaml @@ -32,6 +32,9 @@ clean_patterns: - '*.txt' - logfile.*.out +ensemble_num_members: + default_value: 10 + geos_background_restart_offset: default_value: TODO diff --git a/src/swell/deployment/prep_suite.py b/src/swell/deployment/prep_suite.py index 7b147130..33e4587f 100644 --- a/src/swell/deployment/prep_suite.py +++ b/src/swell/deployment/prep_suite.py @@ -123,6 +123,7 @@ def prepare_cylc_suite_jinja2(logger, swell_suite_path, exp_suite_path, experime 'BuildGeos', 'GenerateBClimatology', 'RunJediHofxExecutable', + 'RunJediLetkfExecutable', 'RunJediVariationalExecutable', 'RunJediUfoTestsExecutable', 'RunGeosExecutable', diff --git a/src/swell/suites/letkf/flow.cylc b/src/swell/suites/letkf/flow.cylc new file mode 100644 index 00000000..07ca8d10 --- /dev/null +++ b/src/swell/suites/letkf/flow.cylc @@ -0,0 +1,155 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + +# -------------------------------------------------------------------------------------------------- + +# Cylc suite for executing JEDI-based h(x) + +# -------------------------------------------------------------------------------------------------- + +[scheduler] + UTC mode = True + allow implicit tasks = False + +# -------------------------------------------------------------------------------------------------- + +[scheduling] + + initial cycle point = {{start_cycle_point}} + final cycle point = {{final_cycle_point}} + runahead limit = {{runahead_limit}} + + [[graph]] + R1 = """ + # Triggers for non cycle time dependent tasks + # ------------------------------------------- + # Clone JEDI source code + CloneJedi + + # Build JEDI source code by linking + CloneJedi => BuildJediByLinking? + + # If not able to link to build create the build + BuildJediByLinking:fail? => BuildJedi + + {% for model_component in model_components %} + # Stage JEDI static files + CloneJedi => StageJedi-{{model_component}} + {% endfor %} + """ + + {% for cycle_time in cycle_times %} + {{cycle_time.cycle_time}} = """ + {% for model_component in model_components %} + {% if cycle_time[model_component] %} + # Task triggers for: {{model_component}} + # ------------------ + # Get ensemble + GetEnsemble-{{model_component}} + + # Get observations + GetObservations-{{model_component}} + + # Perform staging that is cycle dependent + StageJediCycle-{{model_component}} + + # Run Jedi hofx executable + BuildJediByLinking[^]? | BuildJedi[^] => RunJediLetkfExecutable-{{model_component}} + StageJedi-{{model_component}}[^] => RunJediLetkfExecutable-{{model_component}} + StageJediCycle-{{model_component}} => RunJediLetkfExecutable-{{model_component}} + GetEnsemble-{{model_component}} => RunJediLetkfExecutable-{{model_component}} + GetObservations-{{model_component}} => RunJediLetkfExecutable-{{model_component}} + + # EvaObservations + RunJediLetkfExecutable-{{model_component}} => EvaObservations-{{model_component}} + + # Save observations + RunJediLetkfExecutable-{{model_component}} => SaveObsDiags-{{model_component}} + + # Clean up large files + EvaObservations-{{model_component}} & SaveObsDiags-{{model_component}} => + CleanCycle-{{model_component}} + + {% endif %} + {% endfor %} + """ + {% endfor %} + +# -------------------------------------------------------------------------------------------------- + +[runtime] + + # Task defaults + # ------------- + [[root]] + pre-script = "source $CYLC_SUITE_DEF_PATH/modules" + + [[[environment]]] + datetime = $CYLC_TASK_CYCLE_POINT + config = $CYLC_SUITE_DEF_PATH/experiment.yaml + + # Tasks + # ----- + [[CloneJedi]] + script = "swell_task CloneJedi $config" + + [[BuildJediByLinking]] + script = "swell_task BuildJediByLinking $config" + + [[BuildJedi]] + script = "swell_task BuildJedi $config" + platform = {{platform}} + execution time limit = {{scheduling["BuildJedi"]["execution_time_limit"]}} + [[[directives]]] + --account = {{scheduling["BuildJedi"]["account"]}} + --qos = {{scheduling["BuildJedi"]["qos"]}} + --job-name = BuildJedi + --nodes={{scheduling["BuildJedi"]["nodes"]}} + --ntasks-per-node={{scheduling["BuildJedi"]["ntasks_per_node"]}} + --constraint={{scheduling["BuildJedi"]["constraint"]}} + {% if scheduling["BuildJedi"]["partition"] %} + --partition={{scheduling["BuildJedi"]["partition"]}} + {% endif %} + + {% for model_component in model_components %} + [[StageJedi-{{model_component}}]] + script = "swell_task StageJedi $config -m {{model_component}}" + + [[StageJediCycle-{{model_component}}]] + script = "swell_task StageJedi $config -d $datetime -m {{model_component}}" + + [[ GetEnsemble-{{model_component}} ]] + script = "swell_task GetEnsemble $config -d $datetime -m {{model_component}}" + + [[GetObservations-{{model_component}}]] + script = "swell_task GetObservations $config -d $datetime -m {{model_component}}" + + [[RunJediLetkfExecutable-{{model_component}}]] + script = "swell_task RunJediLetkfExecutable $config -d $datetime -m {{model_component}}" + platform = {{platform}} + execution time limit = {{scheduling["RunJediLetkfExecutable"]["execution_time_limit"]}} + [[[directives]]] + --account = {{scheduling["RunJediLetkfExecutable"]["account"]}} + --qos = {{scheduling["RunJediLetkfExecutable"]["qos"]}} + --job-name = RunJediLetkfExecutable + --nodes={{scheduling["RunJediLetkfExecutable"]["nodes"]}} + --ntasks-per-node={{scheduling["RunJediLetkfExecutable"]["ntasks_per_node"]}} + --constraint={{scheduling["RunJediLetkfExecutable"]["constraint"]}} + {% if scheduling["RunJediLetkfExecutable"]["partition"] %} + --partition={{scheduling["RunJediLetkfExecutable"]["partition"]}} + {% endif %} + + [[EvaObservations-{{model_component}}]] + script = "swell_task EvaObservations $config -d $datetime -m {{model_component}}" + + [[SaveObsDiags-{{model_component}}]] + script = "swell_task SaveObsDiags $config -d $datetime -m {{model_component}}" + + [[CleanCycle-{{model_component}}]] + script = "swell_task CleanCycle $config -d $datetime -m {{model_component}}" + {% endfor %} + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/suites/letkf/suite_questions.yaml b/src/swell/suites/letkf/suite_questions.yaml new file mode 100644 index 00000000..f7598997 --- /dev/null +++ b/src/swell/suites/letkf/suite_questions.yaml @@ -0,0 +1,26 @@ +start_cycle_point: + ask_question: True + default_value: '2021-12-12T00:00:00Z' + prompt: What is the time of the first cycle (middle of the window)? + type: iso-datetime + +final_cycle_point: + ask_question: True + default_value: '2021-12-12T06:00:00Z' + prompt: What is the time of the final cycle (middle of the window)? + type: iso-datetime + +runahead_limit: + ask_question: True + default_value: 'P4' + prompt: Since this suite is non-cycling choose how many hours the workflow can run ahead? + type: string + +cycle_times: + ask_question: True + default_value: defer_to_model + options: defer_to_model + models: + - all + prompt: Enter the cycle times for this model. + type: string-check-list diff --git a/src/swell/tasks/base/task_registry.py b/src/swell/tasks/base/task_registry.py index 80a7d8ce..4683e87a 100644 --- a/src/swell/tasks/base/task_registry.py +++ b/src/swell/tasks/base/task_registry.py @@ -36,6 +36,7 @@ 'RemoveForecastDir', 'RunGeosExecutable', 'RunJediHofxExecutable', + 'RunJediLetkfExecutable', 'RunJediUfoTestsExecutable', 'RunJediVariationalExecutable', 'SaveObsDiags', diff --git a/src/swell/tasks/get_ensemble.py b/src/swell/tasks/get_ensemble.py index 23f70807..db99c0e2 100644 --- a/src/swell/tasks/get_ensemble.py +++ b/src/swell/tasks/get_ensemble.py @@ -51,7 +51,7 @@ def execute(self): member_file_datetime = datetime.datetime.strptime(datetime_part, '%Y%m%d_%H%Mz') # Create target filename using the datetime format - member_file_target = member_file_datetime.strftime('geos.mem002.%Y%m%d_%H%M%Sz.nc4') + member_file_target = member_file_datetime.strftime('geos.mem001.%Y%m%d_%H%M%Sz.nc4') # Target path and filename ensemble_path_file_target = os.path.join(self.cycle_dir(), member_file_target) diff --git a/src/swell/tasks/run_jedi_letkf_executable.py b/src/swell/tasks/run_jedi_letkf_executable.py new file mode 100644 index 00000000..48edd913 --- /dev/null +++ b/src/swell/tasks/run_jedi_letkf_executable.py @@ -0,0 +1,118 @@ +# (C) Copyright 2021- United States Government as represented by the Administrator of the +# National Aeronautics and Space Administration. All Rights Reserved. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + + +# -------------------------------------------------------------------------------------------------- + + +import os +import yaml + +from swell.tasks.base.task_base import taskBase +from swell.utilities.run_jedi_executables import jedi_dictionary_iterator, run_executable + + +# -------------------------------------------------------------------------------------------------- + + +class RunJediLetkfExecutable(taskBase): + + # ---------------------------------------------------------------------------------------------- + + def execute(self): + + # Jedi application name + # --------------------- + jedi_application = 'letkf' + + # Parse configuration + # ------------------- + window_type = self.config.window_type() + window_offset = self.config.window_offset() + background_time_offset = self.config.background_time_offset() + observations = self.config.observations() + jedi_forecast_model = self.config.jedi_forecast_model(None) + generate_yaml_and_exit = self.config.generate_yaml_and_exit(False) + + # Compute data assimilation window parameters + background_time = self.da_window_params.background_time(window_offset, + background_time_offset) + local_background_time = self.da_window_params.local_background_time(window_offset, + window_type) + local_background_time_iso = self.da_window_params.local_background_time_iso(window_offset, + window_type) + window_begin = self.da_window_params.window_begin(window_offset) + window_begin_iso = self.da_window_params.window_begin_iso(window_offset) + + # Populate jedi interface templates dictionary + # -------------------------------------------- + self.jedi_rendering.add_key('window_begin_iso', window_begin_iso) + self.jedi_rendering.add_key('window_length', self.config.window_length()) + + # Background + self.jedi_rendering.add_key('horizontal_resolution', self.config.horizontal_resolution()) + self.jedi_rendering.add_key('local_background_time', local_background_time) + self.jedi_rendering.add_key('local_background_time_iso', local_background_time_iso) + self.jedi_rendering.add_key('ensemble_num_members', self.config.ensemble_num_members()) + + # Geometry + self.jedi_rendering.add_key('vertical_resolution', self.config.vertical_resolution()) + self.jedi_rendering.add_key('npx_proc', self.config.npx_proc(None)) + self.jedi_rendering.add_key('npy_proc', self.config.npy_proc(None)) + self.jedi_rendering.add_key('total_processors', self.config.total_processors(None)) + + # Observations + self.jedi_rendering.add_key('background_time', background_time) + self.jedi_rendering.add_key('crtm_coeff_dir', self.config.crtm_coeff_dir(None)) + self.jedi_rendering.add_key('window_begin', window_begin) + + + # Jedi configuration file + # ----------------------- + jedi_config_file = os.path.join(self.cycle_dir(), f'jedi_{jedi_application}_config.yaml') + + # Output log file + # --------------- + output_log_file = os.path.join(self.cycle_dir(), f'jedi_{jedi_application}_log.log') + + # Open the JEDI config file and fill initial templates + # ---------------------------------------------------- + jedi_config_dict = self.jedi_rendering.render_oops_file(f'{jedi_application}{window_type}') + + # Perform complete template rendering + # ----------------------------------- + jedi_dictionary_iterator(jedi_config_dict, self.jedi_rendering, window_type, observations, + jedi_forecast_model) + + # Write the expanded dictionary to YAML file + # ------------------------------------------ + with open(jedi_config_file, 'w') as jedi_config_file_open: + yaml.dump(jedi_config_dict, jedi_config_file_open, default_flow_style=False) + + # Get the JEDI interface metadata + # ------------------------------- + model_component_meta = self.jedi_rendering.render_interface_meta() + + # Compute number of processors + # ---------------------------- + np = eval(str(model_component_meta['total_processors'])) + + # Jedi executable name + # -------------------- + jedi_executable = model_component_meta['executables'][f'{jedi_application}{window_type}'] + jedi_executable_path = os.path.join(self.experiment_path(), 'jedi_bundle', 'build', 'bin', + jedi_executable) + + # Run the JEDI executable + # ----------------------- + if not generate_yaml_and_exit: + self.logger.info('Running '+jedi_executable_path+' with '+str(np)+' processors.') + run_executable(self.logger, self.cycle_dir(), np, jedi_executable_path, + jedi_config_file, output_log_file) + else: + self.logger.info('YAML generated, now exiting.') + +# -------------------------------------------------------------------------------------------------- diff --git a/src/swell/tasks/task_questions.yaml b/src/swell/tasks/task_questions.yaml index 23185523..a9d67e54 100644 --- a/src/swell/tasks/task_questions.yaml +++ b/src/swell/tasks/task_questions.yaml @@ -76,6 +76,7 @@ background_time_offset: - GetObservations - GsiBcToIoda - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags @@ -127,11 +128,22 @@ crtm_coeff_dir: - GetObservations - GsiBcToIoda - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags type: string +ensemble_num_members: + ask_question: true + default_value: defer_to_model + models: + - geos_atmosphere + prompt: How many members comprise the ensemble? + tasks: + - RunJediLetkfExecutable + type: integer + existing_geos_gcm_build_path: ask_question: true default_value: defer_to_platform @@ -194,6 +206,7 @@ generate_yaml_and_exit: prompt: Generate JEDI executable YAML and exit? tasks: - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediUfoTestsExecutable - RunJediVariationalExecutable type: boolean @@ -312,6 +325,7 @@ horizontal_resolution: - GenerateBClimatologyByLinking - GetBackground - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable - StageJedi - StoreBackground @@ -352,6 +366,7 @@ jedi_forecast_model: prompt: What forecast model should be used within JEDI for 4D window propagation? tasks: - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable type: string-drop-list @@ -376,6 +391,7 @@ npx_proc: - GenerateBClimatology - GenerateBClimatologyByLinking - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable type: integer @@ -389,6 +405,7 @@ npy_proc: - GenerateBClimatology - GenerateBClimatologyByLinking - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable type: integer @@ -437,6 +454,7 @@ observations: - GsiBcToIoda - GsiNcdiagToIoda - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags @@ -527,6 +545,7 @@ total_processors: - GenerateBClimatology - GenerateBClimatologyByLinking - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable type: integer @@ -541,6 +560,7 @@ vertical_resolution: - GenerateBClimatology - GenerateBClimatologyByLinking - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable - StageJedi type: string-drop-list @@ -558,6 +578,7 @@ window_length: - GetObservations - MoveDaRestart - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediUfoTestsExecutable - RunJediVariationalExecutable - StoreBackground @@ -578,6 +599,7 @@ window_offset: - GsiBcToIoda - GsiNcdiagToIoda - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediUfoTestsExecutable - RunJediVariationalExecutable - SaveObsDiags @@ -597,6 +619,7 @@ window_type: - GenerateBClimatology - GetBackground - RunJediHofxExecutable + - RunJediLetkfExecutable - RunJediVariationalExecutable - StoreBackground type: string-drop-list From 18b938af13c1f03691ffb4c4554683e67fcbfb08 Mon Sep 17 00:00:00 2001 From: Colin Egerer Date: Mon, 18 Sep 2023 10:35:10 -0400 Subject: [PATCH 3/4] Update run_jedi_letkf_executable.py --- src/swell/tasks/run_jedi_letkf_executable.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/swell/tasks/run_jedi_letkf_executable.py b/src/swell/tasks/run_jedi_letkf_executable.py index 48edd913..043bab96 100644 --- a/src/swell/tasks/run_jedi_letkf_executable.py +++ b/src/swell/tasks/run_jedi_letkf_executable.py @@ -69,7 +69,6 @@ def execute(self): self.jedi_rendering.add_key('crtm_coeff_dir', self.config.crtm_coeff_dir(None)) self.jedi_rendering.add_key('window_begin', window_begin) - # Jedi configuration file # ----------------------- jedi_config_file = os.path.join(self.cycle_dir(), f'jedi_{jedi_application}_config.yaml') From b508bb3347395f347ad1f0b30e8136e3c0bbd131 Mon Sep 17 00:00:00 2001 From: Colin Egerer Date: Tue, 19 Sep 2023 11:48:43 -0400 Subject: [PATCH 4/4] Update task_questions.yaml --- src/swell/tasks/task_questions.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/swell/tasks/task_questions.yaml b/src/swell/tasks/task_questions.yaml index a9d67e54..d7bf42e6 100644 --- a/src/swell/tasks/task_questions.yaml +++ b/src/swell/tasks/task_questions.yaml @@ -135,7 +135,7 @@ crtm_coeff_dir: type: string ensemble_num_members: - ask_question: true + ask_question: false default_value: defer_to_model models: - geos_atmosphere