diff --git a/CMakeLists.txt b/CMakeLists.txt index 752418b24cdba9fcbd15df44cf6f6c356a814080..f2d4ef2d87474b1f0c9a93b69ec46842bd77127f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ set(SOURCES obl_run_papa_fluxes.f90 obl_run_papa_meteo.f90 obl_run_cbl.f90 + obl_run_cyclone.f90 obl_config.f90 vermix_inmom.f90 ) diff --git a/obl_config.f90 b/obl_config.f90 index 49adfc178c5dd6a193b4046b2fe08cd10d3f86cc..24efc529eda2c1520fef9fe58e6f00ff27d655fc 100644 --- a/obl_config.f90 +++ b/obl_config.f90 @@ -23,11 +23,13 @@ module obl_config integer, parameter :: obl_config_papa_fluxes = 1 !< Papa-station (fluxes) setup integer, parameter :: obl_config_papa_meteo = 2 !< Papa-station (meteo) setup integer, parameter :: obl_config_cbl = 3 !< CBL setup + integer, parameter :: obl_config_cyclone = 4 !< cyclone setup character(len = 16), parameter :: obl_config_kato_tag = 'kato' character(len = 16), parameter :: obl_config_papa_fluxes_tag = 'papa-fluxes' character(len = 16), parameter :: obl_config_papa_meteo_tag = 'papa-meteo' character(len = 16), parameter :: obl_config_cbl_tag = 'cbl' + character(len = 16), parameter :: obl_config_cyclone_tag = 'cyclone' !> @brief model enum def. integer, parameter :: obl_model_pph = 0 !< pacanowski-philander @@ -56,6 +58,8 @@ contains id = obl_config_papa_meteo else if (trim(tag) == trim(obl_config_cbl_tag)) then id = obl_config_cbl + else if (trim(tag) == trim(obl_config_cyclone_tag)) then + id = obl_config_cyclone end if end function @@ -74,6 +78,8 @@ contains tag = obl_config_papa_meteo_tag else if (id == obl_config_cbl) then tag = obl_config_cbl_tag + else if (id == obl_config_cyclone) then + tag = obl_config_cyclone_tag end if end function @@ -120,6 +126,7 @@ contains use obl_run_papa_fluxes, only : set_grid_papa_fluxes => set_grid use obl_run_papa_meteo, only : set_grid_papa_meteo => set_grid use obl_run_cbl, only : set_grid_cbl => set_grid + use obl_run_cyclone, only : set_grid_cyclone => set_grid type (gridDataType), intent(inout) :: grid integer, intent(in) :: config_id @@ -145,6 +152,10 @@ contains call set_grid_cbl(grid) return endif + if (config_id == obl_config_cyclone) then + call set_grid_cyclone(grid) + return + endif #ifdef USE_CONFIG_PARSER block @@ -181,6 +192,7 @@ contains use obl_run_papa_fluxes, only : set_time_papa_fluxes => set_time use obl_run_papa_meteo, only : set_time_papa_meteo => set_time use obl_run_cbl, only : set_time_cbl => set_time + use obl_run_cyclone, only : set_time_cyclone => set_time real, intent(out) :: time_begin, time_end, dt integer, intent(in) :: config_id @@ -206,6 +218,10 @@ contains call set_time_cbl(time_begin, time_end, dt) return endif + if (config_id == obl_config_cyclone) then + call set_time_cyclone(time_begin, time_end, dt) + return + endif #ifdef USE_CONFIG_PARSER block @@ -245,6 +261,7 @@ contains use obl_run_papa_fluxes, only : set_phys_papa_fluxes => set_phys use obl_run_papa_meteo, only : set_phys_papa_meteo => set_phys use obl_run_cbl, only : set_phys_cbl => set_phys + use obl_run_cyclone, only : set_phys_cyclone => set_phys integer, intent(in) :: config_id integer, intent(out) :: ierr @@ -268,6 +285,10 @@ contains call set_phys_cbl return endif + if (config_id == obl_config_cyclone) then + call set_phys_cyclone + return + endif #ifdef USE_CONFIG_PARSER block @@ -320,6 +341,7 @@ contains use obl_run_papa_fluxes, only : set_forcing_papa_fluxes => set_forcing use obl_run_papa_meteo, only : set_forcing_papa_meteo => set_forcing use obl_run_cbl, only : set_forcing_cbl => set_forcing + use obl_run_cyclone, only : set_forcing_cyclone => set_forcing integer, intent(in) :: config_id integer, intent(out) :: ierr @@ -343,6 +365,10 @@ contains call set_forcing_cbl return endif + if (config_id == obl_config_cyclone) then + call set_forcing_cyclone + return + endif !< assuming that forcing def. is optional block @@ -427,6 +453,7 @@ contains use obl_run_papa_fluxes, only : set_initial_conditions_papa_fluxes => set_initial_conditions use obl_run_papa_meteo, only : set_initial_conditions_papa_meteo => set_initial_conditions use obl_run_cbl, only : set_initial_conditions_cbl => set_initial_conditions + use obl_run_cyclone, only : set_initial_conditions_cyclone => set_initial_conditions type (gridDataType), intent(in) :: grid @@ -452,6 +479,10 @@ contains call set_initial_conditions_cbl(grid) return endif + if (config_id == obl_config_cyclone) then + call set_initial_conditions_cyclone(grid) + return + endif block !< *: will fail without configuration file diff --git a/obl_main.f90 b/obl_main.f90 index 65e7bdfb42fc577e694931682a6d1c74b3bf5663..4bcf44b94dd840632b9b3160ac172d5c9ba50508 100644 --- a/obl_main.f90 +++ b/obl_main.f90 @@ -56,6 +56,7 @@ program obl_main ! = obl_config_papa_fluxes: Papa-station (fluxes) ! = obl_config_papa_meteo: Papa-station (meteo) ! = obl_config_cbl: convective boundary layer (Willis exp.) + ! = obl_config_cyclone: cyclone setup integer :: obl_model_id ! --- OBL model def. ! = obl_model_pph: pacanowski-philander @@ -122,6 +123,7 @@ program obl_main !< = obl_config_papa_fluxes !< = obl_config_papa_meteo !< = obl_config_cbl + !< = obl_config_cyclone obl_config_id = obl_config_kato !< default closure = 4, k-epsilon @@ -148,7 +150,7 @@ program obl_main write(*, *) ' --help' write(*, *) ' print usage options' write(*, *) ' --config [key] || [filename]' - write(*, *) ' builtin setup [key] = kato (default) || papa-fluxes || papa || cbl' + write(*, *) ' builtin setup [key] = kato (default) || papa-fluxes || papa || cbl || cyclone' write(*, *) ' use configuration file [filename]' write(*, *) ' --model [key]' write(*, *) ' [key] = pph || pph-dyn || k-epsilon (default)' diff --git a/obl_run_cyclone.f90 b/obl_run_cyclone.f90 new file mode 100644 index 0000000000000000000000000000000000000000..735cc292bcf44da551b8d7571e80ac58b62ecd75 --- /dev/null +++ b/obl_run_cyclone.f90 @@ -0,0 +1,153 @@ +module obl_run_cyclone + !< @brief obl scm cyclone setup + ! -------------------------------------------------------------------------------- + + ! TO DO: + ! -- *** + + ! modules used + ! -------------------------------------------------------------------------------- + + ! directives list + ! -------------------------------------------------------------------------------- + implicit none + private + + ! public interface + ! -------------------------------------------------------------------------------- + public :: set_phys + public :: set_grid + public :: set_time + public :: set_forcing + public :: set_initial_conditions + ! -------------------------------------------------------------------------------- + + ! -------------------------------------------------------------------------------- + character(len = 256), parameter :: path = 'cyclone/STARSn28/' + ! = 'cyclone/rojo60' + ! = 'cyclone/rojo62' + ! = 'cyclone/STARSn28' + ! -------------------------------------------------------------------------------- + + + contains + + ! -------------------------------------------------------------------------------- + subroutine set_phys + !> @brief phys parameters setup + ! ---------------------------------------------------------------------------- + use obl_scm + ! ---------------------------------------------------------------------------- + + !< coriolis frequency + !< *: this should be changed + f = 1.116 * 1e-4 + + !< SW extinction parameters + a_band_ratio = 0.67 + a_extinction_coeff = 1.0 + b_extinction_coeff = 1.0 / 17.0 + + !< *: this should be changed + sw_albedo = 0.3 + + end subroutine set_phys + + ! -------------------------------------------------------------------------------- + subroutine set_grid(grid) + !> @brief grid parameters setup + ! ---------------------------------------------------------------------------- + use obl_grid + + type (gridDataType), intent(inout) :: grid + ! ---------------------------------------------------------------------------- + + !< in: [zpos, height, cz] + call set_uniform_grid(grid, 0.0, 1000.0, 512) + + end subroutine set_grid + + ! -------------------------------------------------------------------------------- + subroutine set_time(time_begin, time_end, dt) + !> @brief time parameters setup + ! ---------------------------------------------------------------------------- + real, intent(out) :: time_begin, time_end, dt + ! ---------------------------------------------------------------------------- + + time_begin = 0.0 + time_end = 48.0 * 3600.0 + dt = 1.0 + + end subroutine set_time + + ! -------------------------------------------------------------------------------- + subroutine set_forcing + !> @brief forcing setup + ! ---------------------------------------------------------------------------- + use obl_fluxes + use obl_tforcing + ! ---------------------------------------------------------------------------- + + !< setting atmospheric forcing + ! ---------------------------------------------------------------------------- + !< using 'meteo' mode + is_meteo_setup = 1 + + call set_external_tforcing(Ua, 'meteo-forcing/'//trim(path)//'u-wind.dat') + call set_external_tforcing(Va, 'meteo-forcing/'//trim(path)//'v-wind.dat') + + call set_const_tforcing(salin_flux_surf, 0.0) + + call set_external_tforcing(Ta, 'meteo-forcing/'//trim(path)//'Tair.dat') + call set_external_tforcing(Pa, 'meteo-forcing/'//trim(path)//'Pair.dat') + call set_external_tforcing(RHa, 'meteo-forcing/'//trim(path)//'Qair.dat') + + call set_external_tforcing(sw_flux_surf, 'meteo-forcing/'//trim(path)//'SW-down.dat') + + call set_external_tforcing(lw_in_surf, 'meteo-forcing/'//trim(path)//'LW-down.dat') + + !< normalize time in external forcing: hrs -> sec + call normalize_time_tforcing(Ua, 3600.0) + call normalize_time_tforcing(Va, 3600.0) + + call normalize_time_tforcing(Ta, 3600.0) + call normalize_time_tforcing(Pa, 3600.0) + call normalize_time_tforcing(RHa, 3600.0) + + call normalize_time_tforcing(sw_flux_surf, 3600.0) + + call normalize_time_tforcing(lw_in_surf, 3600.0) + ! ---------------------------------------------------------------------------- + + !< setting bottom forcing + ! ---------------------------------------------------------------------------- + call set_const_tforcing(hflux_bot, 0.0) + + call set_const_tforcing(salin_flux_bot, 0.0) + + call set_const_tforcing(tau_x_bot, 0.0) + call set_const_tforcing(tau_y_bot, 0.0) + ! ---------------------------------------------------------------------------- + + end subroutine set_forcing + + ! -------------------------------------------------------------------------------- + subroutine set_initial_conditions(grid) + !> @brief initial_conditions setup + ! ---------------------------------------------------------------------------- + use obl_state + use obl_init + use obl_grid + + type (gridDataType), intent(in) :: grid + ! ---------------------------------------------------------------------------- + + call set_external_profile(Theta, 'meteo-init/'//trim(path)//'Theta.dat', grid) + call set_external_profile(Salin, 'meteo-init/'//trim(path)//'Salin.dat', grid) + + call set_const_profile(U, 0.0, grid) + call set_const_profile(V, 0.0, grid) + + end subroutine set_initial_conditions + +end module