The following settings are available for forcing_windstress_u_type and forcing_windstress_v_type

|============================================================================
| VALUE ! ACTION
|============================================================================
|  0    ! NO FORCING, SET TO ZERO ========================================
|   windstress = 0.0_wp
|============================================================================
| 1:100 ! FILE INPUT, DONE ELSEWHERE ============================
|----------------------------------------------------------------------------
|101:200! ANALYTIC SETUP ========================================
|============================================================================
|   101 ! constant amplitude
|     windstress = amplitude
|----------------------------------------------------------------------------
|   102 ! basin setup, zonally changed
|         CALL basin_zonalsubset,mask,threshold,windstress,amplitude,length
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno
|----------------------------------------------------------------------------
|   103 ! basin setup, meridionally changed
|     CALL basin_meridionalsubset,mask,threshold,windstress,amplitude,length
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_merid_waveno
|----------------------------------------------------------------------------
|   104 ! zonally periodic, nonzero at pols, meridionally constant
|     CALL zonal_periodic_nonzero_around_center_zero_at_polssubset, mask, threshold, windstress, amplitude
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno
|----------------------------------------------------------------------------
|   105
|     CALL meridional_periodic_around_center_zero_at_polssubset,mask,threshold,windstress, amplitude
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_merid_waveno
|----------------------------------------------------------------------------
|   106 ! zonally periodic around a given center, zero at pols, meridionally constant
|     CALL zonal_periodic_zero_at_polssubset,mask,threshold,windstress,amplitude,zonal_waveno
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno
|----------------------------------------------------------------------------
|   107 | latteral cells, zonal period only
|     CALL cells_zonal_periodicsubset,mask,threshold,windstress,amplitude,zonal_waveno
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno
|----------------------------------------------------------------------------
|   108 | latteral cells, zonally and meridionally periodic
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno, forcing_windstress_merid_waveno
|----------------------------------------------------------------------------
|   109 | CALL cells_zonal_and_meridional_periodic_constant_amplitude_sin(subset, mask, threshold, windstress, amplitude)
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno, forcing_windstress_merid_waveno
|----------------------------------------------------------------------------
|   110 | CALL cells_zonal_and_meridional_periodic_constant_amplitude_cosin(subset, mask, threshold, windstress, amplitude)
|         params: forcing_windStress_u_amplitude, forcing_windStress_v_amplitude, forcing_windstress_zonal_waveno, forcing_windstress_merid_waveno
|----------------------------------------------------------------------------



  !-------------------------------------------------------------------------
  !-------------------------------------------------------------------------
  INITIAL CONDITIONS


  !-------------------------------------------------------------------------------
  init_ocean_bathymetry

    SELECT CASE (topography_type)
    CASE (200)
      ! constant depth given by topography_height_reference
      CALL depth_uniform(patch_3d, cells_bathymetry)

    CASE (201)
      CALL mountain_orography_Williamson_test5(patch_3d, cells_bathymetry)

    CASE default
      CALL finish(method_name, "unknown topography_type")
    END SELECT

  END init_ocean_bathymetry
  !-------------------------------------------------------------------------------


  !-------------------------------------------------------------------------------
  init_ocean_salinity(patch_3d, ocean_salinity)

    SELECT CASE (initial_salinity_type)
    !------------------------------
    CASE (200)
      ! uniform salinity or vertically linarly increasing
      CALL message(TRIM(method_name), ': horizontally homogenous, vertically linear')
      CALL tracer_VerticallyLinearly(patch_3d=patch_3d, ocean_tracer=ocean_salinity, &
        & top_value=initial_salinity_top, bottom_value=initial_salinity_bottom)

    !------------------------------
    CASE (201)
      ! simulates the salinity_profile_20levels array, but for any number of levels
      CALL salinity_Uniform_SpecialArea(patch_3d, ocean_salinity)

    !------------------------------
    CASE (202)
      CALL salinity_AnalyticSmoothVerticalProfile(patch_3d, ocean_salinity)

    !------------------------------
    CASE (401)
      ! assign from adhoc array values
      IF (n_zlev==4) THEN
        CALL fill_FromVerticalArrayProfile(patch_3d, ocean_salinity, VerticalProfileValue=sprof_4layerstommel)
      ELSEIF  (n_zlev <= 20) THEN
        CALL fill_FromVerticalArrayProfile(patch_3d, ocean_salinity, VerticalProfileValue=sprof)
      ELSE
        CALL finish(TRIM(method_name), 'Number of vertical levels to small or to big: >=4 and <=20')
      ENDIF

    !------------------------------
    CASE (402)
      IF  (n_zlev <= 20) THEN
        CALL fill_FromVerticalArrayProfile(patch_3d, ocean_salinity, VerticalProfileValue=salinity_profile_20levels)
      ELSE
        CALL finish(TRIM(method_name), 'Number of vertical levels > 20')
      ENDIF

  END init_ocean_salinity
  !-------------------------------------------------------------------------------

  !-------------------------------------------------------------------------------
  init_ocean_temperature

    SELECT CASE (initial_temperature_type)
    !------------------------------
    CASE (200)
      ! uniform or linearly decreasing temperature
      ! Temperature is homogeneous in each layer.
      CALL message(TRIM(method_name), ': horizontally homogenous, vertically linear')
      CALL tracer_VerticallyLinearly(patch_3d=patch_3d, ocean_tracer=ocean_temperature, &
        & top_value=initial_temperature_top, bottom_value=initial_temperature_bottom)

    !------------------------------
    CASE (201)
      CALL temperature_CollapsingDensityFront_StuhnePeltier(patch_3d, ocean_temperature)

    !------------------------------
    CASE (202)
      CALL temperature_BasinWithVerticalWall(patch_3d, ocean_temperature)

    !------------------------------
    CASE (203)
      CALL temperature_DanilovsMunkGyre(patch_3d, ocean_temperature)

    !------------------------------
    CASE (204)
      CALL temperature_TropicsPolar(patch_3d, ocean_temperature)

    !------------------------------
    CASE (205)
      CALL temperature_CollapsingDensityFront_WeakGrad(patch_3d, ocean_temperature)

    !------------------------------
    CASE (206)
      CALL temperature_Uniform_SpecialArea(patch_3d, ocean_temperature)

    !------------------------------
    CASE (207)
      CALL temperature_APE(patch_3d, ocean_temperature)

    !------------------------------
    CASE (208)
      CALL message(TRIM(method_name), ': horizontally non-homogenous, local pertubation')
      ! first create linearly vertically decreasing temperature, uniform horizontally
      CALL tracer_VerticallyLinearly(patch_3d=patch_3d, ocean_tracer=ocean_temperature, &
        & top_value=initial_temperature_top, bottom_value=initial_temperature_bottom)
      !Add horizontal variation
      CALL temperature_AddHorizontalVariation(patch_3d, ocean_temperature)
      !Add local perturbation
      CALL temperature_AddLocalPerturbation(patch_3d, ocean_temperature)

    !------------------------------
    CASE (209)
      CALL temperature_uniform_SeparationAtLon(patch_3d, ocean_temperature, wallLonDeg=0.0_wp)

    !------------------------------
    CASE (210)
      CALL temperature_uniform_SeparationAtLat(patch_3d, ocean_temperature, wallLatDeg=basin_center_lat)

    !------------------------------
    CASE (211)
      CALL temperature_circularLonLatPerturbation(patch_3d, ocean_temperature)

    !------------------------------
    CASE (401)
      ! assign from adhoc array values
      IF(n_zlev==4)THEN
        CALL fill_FromVerticalArrayProfile(patch_3d, ocean_temperature, VerticalProfileValue=tprof_4layerstommel)
      ELSE
        CALL fill_FromVerticalArrayProfile(patch_3d, ocean_temperature, VerticalProfileValue=tprof)
      ENDIF

    !------------------------------
    CASE (402)
       CALL fill_FromVerticalArrayProfile(patch_3d, ocean_temperature, VerticalProfileValue=tprof_var)

  END init_ocean_temperature
  !-------------------------------------------------------------------------------

  !-------------------------------------------------------------------------------
  init_ocean_velocity

    SELECT CASE (initial_velocity_type)
    !------------------------------
    CASE (200)
      ! uniform velocity
      CALL message(TRIM(method_name), ': uniform velocity')

    !------------------------------
    CASE (201)
      CALL velocity_LauterRotation(patch_3d, normal_velocity)

    !------------------------------
    CASE (202)
      CALL message(TRIM(method_name), 'Williamson Test 2 ')
      CALL velocity_WilliamsonTest_2_5(patch_3d, normal_velocity, velocity_amplitude=u0)

    !------------------------------
    CASE (203)
      CALL message(TRIM(method_name), 'Williamson Test 5 ')
      CALL velocity_WilliamsonTest_2_5(patch_3d, normal_velocity, velocity_amplitude=initial_velocity_amplitude)

  END init_ocean_velocity
  !-------------------------------------------------------------------------------

  !-------------------------------------------------------------------------------
  init_ocean_surface_height

    SELECT CASE (sea_surface_height_type)
    !------------------------------
    CASE (200)
      ! 0 height, this is the initialization value,
      ! so no need to explicilty define this case
      ocean_height(:,:) = 0.0_wp

    !------------------------------
    CASE (201)
      CALL height_sinLon_cosLat(patch_3d, ocean_height)

    !------------------------------
    CASE (202)
      CALL height_exponentialDistance(patch_3d, ocean_height)

    !------------------------------
    CASE (203)
      CALL height_LauterRotation(patch_3d, ocean_height)

    !------------------------------
    CASE (204)
      CALL height_WilliamsonTest2(patch_3d, ocean_height)

    !------------------------------
    CASE (205)
      CALL height_WilliamsonTest5(patch_3d, ocean_height)

  END init_ocean_surface_height
  !-------------------------------------------------------------------------------



  !-------------------------------------------------------------------------
  !-------------------------------------------------------------------------
  OLD testcases initial conditions and the corresponding new values

  !-------------------------------------------------------------------------
  !>
  !! Initialization of test cases for the hydrostatic ocean model.
  !! Currently only some simple test value are set.
  !! Finally the prognostic state should be initialized from some restart file.
  !
  !
  !-------------------------------------------------------------------------
  SUBROUTINE init_ocean_analytically(patch_3d, ocean_state)

    !IF shallow-water option is NOT selected then)
    IF ( iswm_oce /= 1 )THEN

      SELECT CASE (itestcase_oce)

      CASE (oce_testcase_zero)
        CALL message(TRIM(method_name), 'you have selected the "no-testcase" option')
      CASE (oce_testcase_init)

      CASE (oce_testcase_file)
        CALL finish(TRIM(method_name), 'Initialization from file NOT SUPPORTED YET - TERMINATE')
        !CALL init_from_file(patch_2D)

      CASE (30, 31)
        CALL message(TRIM(method_name), 'Simple Initialization of testcases (30, 31)')
        CALL message(TRIM(method_name), ' - here: horizontally homogen, vertical profile for T and S')
        CALL message(TRIM(method_name), ' - Add forcing / restoring / wave for dynamic test')

        !Ocean at rest
        ocean_state%p_prog(nold(1))%vn(:,:,:) = 0.0_wp

        !init temperature and salinity with vertical profiles
        ! use initial_salinity_type    = 401
        ! use initial_temperature_type = 401

        IF (itestcase_oce == 31) THEN
          CALL message(TRIM(method_name), 'Simple Initialization of testcases (31)')
          CALL message(TRIM(method_name), ' - here: external gravity wave')

          ! set sea_surface_height_type = 201

        END IF

      CASE (33)
        ! collapsing density front testcase, taken from Stuhne-Peltier (JCP, 2006)
        CALL message(TRIM(method_name), 'Initialization of testcases (33)')
        CALL message(TRIM(method_name), ' - here: Collapsing density front, Stuhne-Peltier')
        ! use initial_salinity_type    = 401
        ! use initial_temperature_type = 201


      CASE (34)
        ! Adjusting density front in a basin: vertical wall at basin_center_lon
        CALL message(TRIM(method_name), 'Initialization of testcases (34)')
        CALL message(TRIM(method_name),' - here: Adjusting density front in a basin with vertical wall')
        ! use initial_temperature_type = 202


      CASE (32) !from Sergy Danilov
        CALL message(TRIM(method_name), 'Simple Initialization of testcases (32)')
        CALL message(TRIM(method_name), ' - here: Danilovs Munk gyre flow')
        ! use initial_temperature_type = 203
        ! use sea_surface_height_type = 202

      CASE (40)
        ! Temperature profile depends on latitude and depth
        ! Construct temperature profile
        !   ttrop for lat<ltrop; tpol for lat>lpol; cos for transition zone
        !   for maximum tropical temperature see values above
        CALL message(TRIM(method_name), 'Simple Initialization of testcases (40)')
        CALL message(TRIM(method_name), ' - here: simple tropics-pol/vertical temperature profile')
        ! use initial_temperature_type = 204


      CASE (41)
        ! #slo 2011-10-05#
        !  incorrect (for n_zlev>9) old testcase 40 with z_tpol=0.0 at poles saved for reference
        CALL message(TRIM(method_name), 'Simple Initialization of testcases (41)')
        CALL message(TRIM(method_name), ' - here: old erroneous profile saved for reference')


      CASE (43)
        ! #slo# collapsing density front with much weaker gradient than testcase 33
        ! without temperature restoring / relaxation
        CALL message(TRIM(method_name), 'Initialization of testcases (43)')
        CALL message(TRIM(method_name), ' - here: Collapsing density front with weaker gradient')

        ! use initial_temperature_type = 205
        ! use initial_salinity_type = 401

      CASE (44)
        ! Temperature is homogeneous in each layer. Varies from 30.5 in top to 0.5 in bottom layer
        CALL message(TRIM(method_name), 'Initialization of testcases (44)')
        CALL message(TRIM(method_name), ' - here: horizontally homogen, stable vertical profile')

        ! use initial_temperature_type = 200

      CASE (45)
        ! T and S are horizontally homegeneous. Values are taken from t_prof[_var] and s_prof[_var]
        CALL message(TRIM(method_name), 'Initialization of testcases (45)')
        CALL message(TRIM(method_name), &
          & ' - here: horizontally homogen, use tprof_var and salinity_profile_20levels vertical profiles')
        ! use initial_temperature_type = 402
        ! use initial_salinity_type = 402

      CASE (46,461)
        ! T and S are horizontally and vertically homegeneous
        ! Values are taken from namelist and used for comparison with MPIOM; default: t=16 C, s=35 psu
        CALL message(TRIM(method_name), 'Initialization of testcases (46)')
        CALL message(TRIM(method_name), &
          & ' - here: horizontally and vertically homogen')
        ! use initial_temperature_type = 200
        ! use initial_salinity_type = 200

      CASE (47)
        ! T and S are horizontally and vertically homegeneous
        ! include some special init - here Indonesia set to warm/salty surface
        CALL message(TRIM(method_name), 'Initialization of testcases (47)')
        CALL message(TRIM(method_name), &
          & ' - here: horizontally and vertically homogen+warm/salty Indonesia')

        ! use initial_temperature_type = 206
        ! use initial_salinity_type = 201


      CASE (50)
        ! Testcase for coupled Aquaplanet:
        !  - following APE_ATLAS Equations (2.1) - (2.5)
        !  - use function ape_sst for initializing SST
        !  - decrease maximum temperature vertically by z_temp_incr
        !  - use parameter 'sst_qobs' - maximum temperature = 27, minimum polar temperature = 0 deg C
        CALL message(TRIM(method_name), 'Initialization of testcases (50)')
        CALL message(TRIM(method_name), ' - here: testcase for coupled aquaplanet, using sst_qobs')

        ! use initial_salinity_type = 402
        ! use initial_temperature_type = 207
        ! use initial_sst_type='sst1'

        ! Important:
        !   use initial_temperature_top=27.0 initial_temperature_bottom=0.0
        !   to be consistent with the old setup

      CASE (1050)
        ! as 50, but salinity is analytically calculated
        CALL message(TRIM(method_name), 'Initialization of testcase (1050)')
        CALL message(TRIM(method_name), ' - here: testcase for coupled aquaplanet, using analytic s')

        ! use initial_temperature_type = 200 top_temperature = bottom_temperature = 10
        ! use initial_salinity_type = 202    top_salinity = 34.1, bottom_salinity = 35.0


      CASE (52)
        ! Testcase for coupled Aquaplanet:
        !  - following APE_ATLAS Equations (2.1) - (2.5)
        !  - use function ape_sst for initializing SST
        !  - decrease maximum temperature vertically by z_temp_incr
        !  - now warmer init to avoid growing of sea ice:
        !    maximum temperature = 27, minimum polar temperature = 10 deg C
        CALL message(TRIM(method_name), 'Initialization of testcases (52)')
        CALL message(TRIM(method_name), &
          & ' - here: testcase for coupled aquaplanet, using sst_qobs, min=10 deg C')

        ! use initial_salinity_type = 402
        ! use initial_temperature_type = 207
        ! use initial_sst_type='sst_qobs'

        ! Important:
        !   use initial_temperature_top=27.0 initial_temperature_bottom=10.0
        !   to be consistent with the old setup


       CASE (51)
        CALL message(TRIM(method_name), 'Simple Initialization of testcases (51)')
        CALL message(TRIM(method_name), &
          & ' - here: horizontally varying T with local perturbation')

        ! use initial_temperature_type = 208, top_temperature = 30.5,  bottom_temperature = 0,5

      CASE(53)
        CALL message(TRIM(method_name), 'LOCK exchange (53)')
        ! use initial_temperature_type = 209

      CASE default
        WRITE(0,*)'testcase',itestcase_oce
        CALL finish(TRIM(method_name), 'CHOSEN INITIALIZATION NOT SUPPORTED - TERMINATE')
      END SELECT

      ! Shallow water testcases:
    ELSEIF( iswm_oce == 1 )THEN

      SELECT CASE (itestcase_oce)

      CASE (oce_testcase_zero)

        CALL message(TRIM(method_name), 'you have selected the "no-testcase" option')

      CASE (24)

        CALL message(TRIM(method_name), 'Shallow-Water-Testcase (24)')
        CALL message(TRIM(method_name), ' - here: h and bathy for solid body rotation (Laeuter Test)')
        ! use topography_type = 200, topography_height_reference = 0
        ! use sea_surface_height_type = 203
        ! use initial_velocity_type = 201

      CASE (25)
        CALL message(TRIM(method_name), 'Shallow-Water-Testcase (25)')
        CALL message(TRIM(method_name), ' - here: h and bathy of Williamson Test 2')
        ! use topography_type = 200, topography_height_reference = 0
        ! use sea_surface_height_type = 204
        ! use initial_velocity_type = 202

      CASE (26)
        CALL message(TRIM(method_name), 'Shallow-Water-Testcase (26)')
        CALL message(TRIM(method_name), ' - here: h and bathy of Williamson Test 5')

        ! use topography_type = 201 (test5_oro)
        ! use sea_surface_height_type = 205
        ! use initial_velocity_type = 203, initial_velocity_amplitude = 20.0

      CASE(27)!temperature ditribution
        CALL message(TRIM(method_name), 'Shallow-Water-Testcase (27)')

        ! use topography_type = 200, topography_height_reference = -200
        ! use initial_temperature_type = 210

      CASE(28)
        CALL message(TRIM(method_name), 'Shallow-Water-Testcase (28)')

        ! use initial_velocity_type = 203, initial_velocity_amplitude = 20.0
        ! use initial_temperature_type = 210

      CASE(29)!State at rest, forced by wind
        CALL message(TRIM(method_name), 'Shallow-Water-Testcase (29)')

      CASE default
        WRITE(0,*)'testcase',itestcase_oce
        CALL finish(TRIM(method_name), 'CHOSEN INITIALIZATION NOT SUPPORTED in SW MODE - TERMINATE')
      END SELECT
    ENDIF  !  iswm_oce

    !---------------------------------------------------

  END SUBROUTINE init_ocean_analytically
  !-------------------------------------------------------------------------------
