Skip to content
Snippets Groups Projects
sfx_config.f90 8.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • Evgeny Mortikov's avatar
    Evgeny Mortikov committed
    #include "../includeF/sfx_def.fi"
    
    
    !> @brief surface flux model config subroutines
    
     module sfx_config
    
    
        ! modules used
        ! --------------------------------------------------------------------------------
        ! --------------------------------------------------------------------------------
    
        ! directives list
        ! --------------------------------------------------------------------------------
        implicit none
        ! --------------------------------------------------------------------------------
    
        public :: set_dataset
    
        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 model
        integer, parameter :: model_sheba = 3           !< SHEBA model
    
        integer, parameter :: model_sheba_noit = 4           !< SHEBA model noniterative
    
        integer, parameter :: model_most_snow = 5       !< MOST_SNOW model
    
        integer, parameter :: model_sheba_coare = 6       !< MOST_SNOW 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'
    
        character(len = 16), parameter :: model_sheba_noit_tag = 'sheba_noit'
    
        character(len = 16), parameter :: model_most_snow_tag = 'most_snow'
    
        character(len = 16), parameter :: model_sheba_coare_tag = 'sheba_coare'
    
    
        !> @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'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
        type :: sfxDatasetType 
            integer :: id
            character(len = 256) :: filename
            integer :: nmax
    
    
            integer :: surface, surface_type
            real :: h, z0_m, z0_h, lai, depth
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
        end type
    
    
    
    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
    
            else if (trim(tag) == trim(model_sheba_noit_tag)) then
                id = model_sheba_noit
    
           else if (trim(tag) == trim(model_most_snow_tag)) then
                id = model_most_snow 
    
            else if (trim(tag) == trim(model_sheba_coare_tag)) then
                id = model_sheba_coare 
    
    
        end function
    
        function get_model_tag(id) result(tag)
            implicit none
            integer :: id
            character(len=:), allocatable :: tag
    
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            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
    
            else if (id == model_sheba_noit) then
                tag = model_sheba_noit_tag
    
            else if (id == model_most_snow) then
                tag = model_most_snow_tag
    
            else if (id == model_sheba_coare) then
                tag = model_sheba_coare_tag
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            end if 
    
    
        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
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            end if
    
    
        end function
    
        function get_dataset_tag(id) result(tag)
            implicit none
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            integer, intent(in) :: id
    
            character(len=:), allocatable :: tag
    
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            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
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            end if
    
        end function
    
    
        subroutine set_dataset(dataset, id)
    
            use sfx_surface
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            implicit none
    
            type(sfxDatasetType), intent(out) :: dataset
            integer, intent(in) :: id
            
            integer :: id_check
            
            id_check = get_dataset_id(get_dataset_tag(id))
            if (id_check == -1) return 
    
            dataset%id = id
            dataset%filename = get_dataset_filename(id)
            dataset%nmax = 0
    
            dataset%surface = surface_snow
            dataset%surface_type = surface_snow
    
            dataset%z0_h = -1.0
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            if (id == dataset_mosaic) then
    
                dataset%h = 6.0
                dataset%z0_m = 0.0078
    
                 dataset%surface_type = surface_snow
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_irgason) then
    
                dataset%h = 9.2
                dataset%z0_m = 0.01
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_sheba) then
    
                dataset%h = 3.19
                dataset%z0_m = 0.001
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_lake) then
    
                ! *: check & fix values
                dataset%h = 10.0
    
                dataset%surface = surface_lake
    
                dataset%z0_m = -1.0
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_papa) then
    
                dataset%h = 10.0
    
                dataset%surface = surface_lake
    
                dataset%z0_m = -1.0
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_toga) then
    
                ! *: check & fix values
                dataset%h = 15.0
    
                dataset%surface = surface_lake
    
                dataset%z0_m = -1.0
            end if        
    
           write (*,*) dataset%surface, 'dataset%surface'
    
        end subroutine
    
        function get_dataset_filename(id) result(filename)
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            implicit none
            integer :: id
            character(len=:), allocatable :: filename
    
        
            filename = ''
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            if (id == dataset_mosaic) then
    
                filename = DATASET_DIR // 'MOSAiC.txt'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_irgason) then
    
                filename = DATASET_DIR // 'Irgason1.txt'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_sheba) then
    
                filename = DATASET_DIR // 'Sheba1.txt'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_lake) then
    
                filename = DATASET_DIR // 'Kuivajarvi.txt'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_papa) then
    
                filename = DATASET_DIR // 'Papa.txt'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            else if (id == dataset_toga) then
    
                filename = DATASET_DIR // 'Toga.txt'
    
    Evgeny Mortikov's avatar
    Evgeny Mortikov committed
            end if