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