From 6d2c8445b6fea07728e7528ecc4c7dea96dc0f8a Mon Sep 17 00:00:00 2001 From: Evgeny Mortikov <evgeny.mortikov@gmail.com> Date: Wed, 18 Sep 2024 00:26:13 +0300 Subject: [PATCH] moving model and dataset definitions in separate module --- CMakeLists.txt | 1 + srcF/sfx_config.f90 | 129 ++++++++++++++++++++++++++++++++++++++++++++ srcF/sfx_main.f90 | 129 ++++++++++++-------------------------------- 3 files changed, 163 insertions(+), 96 deletions(-) create mode 100644 srcF/sfx_config.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index dc1cd0e..62c8256 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,7 @@ set(SOURCES_F srcF/sfx_io.f90 srcF/sfx_data.f90 srcF/sfx_common.f90 + srcF/sfx_config.f90 srcF/sfx_esm.f90 srcF/sfx_esm_param.f90 srcF/sfx_log.f90 diff --git a/srcF/sfx_config.f90 b/srcF/sfx_config.f90 new file mode 100644 index 0000000..e7b0a6e --- /dev/null +++ b/srcF/sfx_config.f90 @@ -0,0 +1,129 @@ +!> @brief surface flux model config subroutines +module sfx_config + + ! modules used + ! -------------------------------------------------------------------------------- + ! -------------------------------------------------------------------------------- + + ! directives list + ! -------------------------------------------------------------------------------- + implicit none + ! -------------------------------------------------------------------------------- + + public + + !> @brief model enum def. + integer, parameter :: model_esm = 0 !< ESM model + integer, parameter :: model_log = 1 !< LOG simplified model + integer, parameter :: model_most = 2 !< MOST simplified model + integer, parameter :: model_sheba = 3 !< SHEBA simplified model + + character(len = 16), parameter :: model_esm_tag = 'esm' + character(len = 16), parameter :: model_log_tag = 'log' + character(len = 16), parameter :: model_most_tag = 'most' + character(len = 16), parameter :: model_sheba_tag = 'sheba' + + !> @brief dataset enum def. + integer, parameter :: dataset_mosaic = 1 !< MOSAiC campaign + integer, parameter :: dataset_irgason = 2 !< IRGASON data + integer, parameter :: dataset_sheba = 3 !< please spell 'SHIBA' + integer, parameter :: dataset_lake = 4 !< Kuivajarvi data + integer, parameter :: dataset_papa = 5 !< Papa station (ocean) data + integer, parameter :: dataset_toga = 6 !< Toga (ocean) data + integer, parameter :: dataset_user = 7 !< used defined dataset + + character(len = 16), parameter :: dataset_mosaic_tag = 'mosaic' + character(len = 16), parameter :: dataset_irgason_tag = 'irgason' + character(len = 16), parameter :: dataset_sheba_tag = 'sheba' + character(len = 16), parameter :: dataset_lake_tag = 'lake' + character(len = 16), parameter :: dataset_papa_tag = 'papa' + character(len = 16), parameter :: dataset_toga_tag = 'toga' + character(len = 16), parameter :: dataset_user_tag = 'user' + +contains + + function get_model_id(tag) result(id) + implicit none + character(len=*), intent(in) :: tag + integer :: id + + id = - 1 + if (trim(tag) == trim(model_esm_tag)) then + id = model_esm + else if (trim(tag) == trim(model_log_tag)) then + id = model_log + else if (trim(tag) == trim(model_most_tag)) then + id = model_most + else if (trim(tag) == trim(model_sheba_tag)) then + id = model_sheba + endif + + end function + + function get_model_tag(id) result(tag) + implicit none + integer :: id + character(len=:), allocatable :: tag + + tag = "undefined" + if (id == model_esm) then + tag = model_esm_tag + else if (id == model_log) then + tag = model_log_tag + else if (id == model_most) then + tag = model_most_tag + else if (id == model_sheba) then + tag = model_sheba_tag + endif + + end function + + function get_dataset_id(tag) result(id) + implicit none + character(len=*), intent(in) :: tag + integer :: id + + id = - 1 + if (trim(tag) == trim(dataset_mosaic_tag)) then + id = dataset_mosaic + else if (trim(tag) == trim(dataset_irgason_tag)) then + id = dataset_irgason + else if (trim(tag) == trim(dataset_sheba_tag)) then + id = dataset_sheba + else if (trim(tag) == trim(dataset_lake_tag)) then + id = dataset_lake + else if (trim(tag) == trim(dataset_papa_tag)) then + id = dataset_papa + else if (trim(tag) == trim(dataset_toga_tag)) then + id = dataset_toga + else if (trim(tag) == trim(dataset_user_tag)) then + id = dataset_user + endif + + end function + + function get_dataset_tag(id) result(tag) + implicit none + integer :: id + character(len=:), allocatable :: tag + + tag = "undefined" + if (id == dataset_mosaic) then + tag = dataset_mosaic_tag + else if (id == dataset_irgason) then + tag = dataset_irgason_tag + else if (id == dataset_sheba) then + tag = dataset_sheba_tag + else if (id == dataset_lake) then + tag = dataset_lake_tag + else if (id == dataset_papa) then + tag = dataset_papa_tag + else if (id == dataset_toga) then + tag = dataset_toga_tag + else if (id == dataset_user) then + tag = dataset_user_tag + endif + + end function + +end module sfx_config diff --git a/srcF/sfx_main.f90 b/srcF/sfx_main.f90 index 31ca983..08e627f 100644 --- a/srcF/sfx_main.f90 +++ b/srcF/sfx_main.f90 @@ -11,6 +11,7 @@ program sfx_main use sfx_phys_const use sfx_common + use sfx_config use sfx_io use sfx_data @@ -36,21 +37,9 @@ program sfx_main integer :: dataset_id !< dataset ID: character(len = 256) :: dataset_name - integer, parameter :: dataset_MOSAiC = 1 !< MOSAiC campaign - integer, parameter :: dataset_IRGASON = 2 !< IRGASON data - integer, parameter :: dataset_SHEBA = 3 !< please spell 'SHIBA' - integer, parameter :: dataset_LAKE = 4 !< Kuivajarvi data - integer, parameter :: dataset_PAPA = 5 !< Papa station (ocean) data - integer, parameter :: dataset_TOGA = 6 !< Toga (ocean) data - integer, parameter :: dataset_USER = 7 !< used defined dataset - - integer :: model_id !< sfx model ID: + integer :: model_id !< sfx model ID character(len = 256) :: model_name - integer, parameter :: model_esm = 0 !< ESM model - integer, parameter :: model_log = 1 !< LOG simplified model - integer, parameter :: model_most = 2 !< MOST simplified model - integer, parameter :: model_sheba = 3 !< SHEBA simplified model ! input/output data ! -------------------------------------------------------------------------------- @@ -84,19 +73,6 @@ program sfx_main character(len = 128), parameter :: arg_key_nmax = '--nmax' character(len = 128), parameter :: arg_key_help = '--help' - character(len = 128), parameter :: arg_key_model_esm = 'esm' - character(len = 128), parameter :: arg_key_model_log = 'log' - character(len = 128), parameter :: arg_key_model_most = 'most' - character(len = 128), parameter :: arg_key_model_sheba = 'sheba' - - character(len = 128), parameter :: arg_key_dataset_mosaic = 'mosaic' - character(len = 128), parameter :: arg_key_dataset_irgason = 'irgason' - character(len = 128), parameter :: arg_key_dataset_sheba = 'sheba' - character(len = 128), parameter :: arg_key_dataset_lake = 'lake' - character(len = 128), parameter :: arg_key_dataset_papa = 'papa' - character(len = 128), parameter :: arg_key_dataset_toga = 'toga' - character(len = 128), parameter :: arg_key_dataset_user = 'user' - integer :: is_output_set integer :: nmax ! -------------------------------------------------------------------------------- @@ -119,7 +95,7 @@ program sfx_main !< @brief define model & dataset model_id = model_esm !< default = ESM - dataset_id = dataset_MOSAiC !< default = MOSAiC + dataset_id = dataset_mosaic !< default = MOSAiC is_output_set = 0 nmax = 0 @@ -148,15 +124,8 @@ program sfx_main stop end if call get_command_argument(i + 1, arg) - if (trim(arg) == trim(arg_key_model_esm)) then - model_id = model_esm - else if (trim(arg) == trim(arg_key_model_log)) then - model_id = model_log - else if (trim(arg) == trim(arg_key_model_most)) then - model_id = model_most - else if (trim(arg) == trim(arg_key_model_sheba)) then - model_id = model_sheba - else + model_id = get_model_id(arg) + if (model_id == -1) then write(*, *) ' FAILURE! > unknown model [key]: ', trim(arg) stop end if @@ -167,20 +136,13 @@ program sfx_main stop end if call get_command_argument(i + 1, arg) - if (trim(arg) == trim(arg_key_dataset_mosaic)) then - dataset_id = dataset_MOSAiC - else if (trim(arg) == trim(arg_key_dataset_irgason)) then - dataset_id = dataset_IRGASON - else if (trim(arg) == trim(arg_key_dataset_sheba)) then - dataset_id = dataset_SHEBA - else if (trim(arg) == trim(arg_key_dataset_lake)) then - dataset_id = dataset_LAKE - else if (trim(arg) == trim(arg_key_dataset_papa)) then - dataset_id = dataset_PAPA - else if (trim(arg) == trim(arg_key_dataset_toga)) then - dataset_id = dataset_TOGA - else if (trim(arg) == trim(arg_key_dataset_user)) then - dataset_id = dataset_USER + dataset_id = get_dataset_id(arg) + if (dataset_id == -1) then + write(*, *) ' FAILURE! > unknown dataset [key]: ', trim(arg) + stop + end if + + if (dataset_id == dataset_user) then if (i + 4 > num_args) then write(*, *) ' FAILURE! > incorrect arguments for [user] dataset' stop @@ -188,9 +150,6 @@ program sfx_main call get_command_argument(i + 2, filename_in_common) call get_command_argument(i + 3, filename_in) call get_command_argument(i + 4, filename_out) - else - write(*, *) ' FAILURE! > unknown dataset [key]: ', trim(arg) - stop end if end if if (trim(arg) == trim(arg_key_output)) then @@ -223,13 +182,13 @@ program sfx_main call run("config.txt"//C_NULL_CHAR) call get_charf("model.type"//C_NULL_CHAR, config_model_name) - if (compare_char_arrays(config_model_name, trim(arg_key_model_esm))) then + if (compare_char_arrays(config_model_name, trim(model_esm_tag))) then model_id = model_esm - else if (compare_char_arrays(config_model_name, trim(arg_key_model_log))) then + else if (compare_char_arrays(config_model_name, trim(model_log_tag))) then model_id = model_log - else if (compare_char_arrays(config_model_name, trim(arg_key_model_most))) then + else if (compare_char_arrays(config_model_name, trim(model_most_tag))) then model_id = model_most - else if (compare_char_arrays(config_model_name, trim(arg_key_model_sheba))) then + else if (compare_char_arrays(config_model_name, trim(model_sheba_tag))) then model_id = model_sheba else write(*, *) ' FAILURE! > unknown model [key]: ', config_model_name @@ -237,19 +196,19 @@ program sfx_main end if call get_charf("dataset.type"//C_NULL_CHAR, config_dataset_name) - if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_mosaic))) then + if (compare_char_arrays(config_dataset_name, trim(dataset_mosaic_tag))) then dataset_id = dataset_MOSAiC - else if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_irgason))) then + else if (compare_char_arrays(config_dataset_name, trim(dataset_irgason_tag))) then dataset_id = dataset_IRGASON - else if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_sheba))) then + else if (compare_char_arrays(config_dataset_name, trim(dataset_sheba_tag))) then dataset_id = dataset_SHEBA - else if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_lake))) then + else if (compare_char_arrays(config_dataset_name, trim(dataset_lake_tag))) then dataset_id = dataset_LAKE - else if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_papa))) then + else if (compare_char_arrays(config_dataset_name, trim(dataset_papa_tag))) then dataset_id = dataset_PAPA - else if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_toga))) then + else if (compare_char_arrays(config_dataset_name, trim(dataset_toga_tag))) then dataset_id = dataset_TOGA - else if (compare_char_arrays(config_dataset_name, trim(arg_key_dataset_user))) then + else if (compare_char_arrays(config_dataset_name, trim(dataset_user_tag))) then dataset_id = dataset_USER !call get_charf("dataset.filename"//C_NULL_CHAR, config_dataset_filename) @@ -285,58 +244,36 @@ program sfx_main #endif !< @brief set name for specific model - if (model_id == model_esm) then - model_name = "ESM" - else if (model_id == model_log) then - model_name = "LOG" - else if (model_id == model_most) then - model_name = "MOST" - else if (model_id == model_sheba) then - model_name = "SHEBA" - else - write(*, *) ' FAILURE! > unknown model id: ', model_id - stop - end if + model_name = get_model_tag(model_id) !< @brief set name & filenames for specific dataset - if (dataset_id == dataset_MOSAiC) then - dataset_name = 'MOSAiC' - + dataset_name = get_dataset_tag(dataset_id) + if (dataset_id == dataset_mosaic) then filename_in_common = 'data/MOSAiC_zh.txt' filename_in = 'data/MOSAiC.txt' if (is_output_set == 0) filename_out = 'out_MOSAiC.txt' - else if (dataset_id == dataset_IRGASON) then - dataset_name = 'IRGASON' - + else if (dataset_id == dataset_irgason) then filename_in_common = 'data/IRGASON_zh.txt' filename_in = 'data/Irgason1.txt' if (is_output_set == 0) filename_out = 'out_IRGASON1.txt' - else if (dataset_id == dataset_SHEBA) then - dataset_name = 'SHEBA' - + else if (dataset_id == dataset_sheba) then filename_in_common = 'data/Sheba1_zh.txt' filename_in = 'data/Sheba1.txt' if (is_output_set == 0) filename_out = 'out_Sheba.txt' - else if (dataset_id == dataset_LAKE) then - dataset_name = 'LAKE' - + else if (dataset_id == dataset_lake) then filename_in_common = 'data/Kuivajarvi_zh.txt' filename_in = 'data/Kuivajarvi.txt' if (is_output_set == 0) filename_out = 'out_Kuivajarvi.txt' - else if (dataset_id == dataset_PAPA) then - dataset_name = 'PAPA' - + else if (dataset_id == dataset_papa) then filename_in_common = 'data/Papa_zh.txt' filename_in = 'data/Papa.txt' if (is_output_set == 0) filename_out = 'out_Papa.txt' - else if (dataset_id == dataset_TOGA) then - dataset_name = 'TOGA' - + else if (dataset_id == dataset_toga) then filename_in_common = 'data/Toga_zh.txt' filename_in = 'data/Toga.txt' if (is_output_set == 0) filename_out = 'out_Toga.txt' - else if (dataset_id == dataset_USER) then - dataset_name = 'USER' + else if (dataset_id == dataset_user) then + ! ---> skipping else write(*, *) ' FAILURE! > unknown dataset id: ', dataset_id stop -- GitLab