Initialize the surface forcing module.
1540 type(time_type),
intent(in) :: time
1541 type(ocean_grid_type),
intent(in) :: g
1542 type(unit_scale_type),
intent(in) :: us
1543 type(param_file_type),
intent(in) :: param_file
1544 type(diag_ctrl),
target,
intent(inout) :: diag
1545 type(surface_forcing_cs),
pointer :: cs
1547 type(tracer_flow_control_cs),
pointer :: tracer_flow_csp
1550 type(directories) :: dirs
1552 type(time_type) :: time_frc
1554 # include "version_variable.h" 1555 real :: flux_const_default
1556 logical :: default_2018_answers
1557 character(len=40) :: mdl =
"MOM_surface_forcing" 1558 character(len=200) :: filename, gust_file
1560 if (
associated(cs))
then 1561 call mom_error(warning,
"surface_forcing_init called with an associated "// &
1562 "control structure.")
1567 id_clock_forcing=cpu_clock_id(
'(Ocean surface forcing)', grain=clock_module)
1568 call cpu_clock_begin(id_clock_forcing)
1571 if (
associated(tracer_flow_csp)) cs%tracer_flow_CSp => tracer_flow_csp
1574 call log_version(param_file, mdl, version,
'')
1575 call get_param(param_file, mdl,
"ENABLE_THERMODYNAMICS", cs%use_temperature, &
1576 "If true, Temperature and salinity are used as state "//&
1577 "variables.", default=.true.)
1578 call get_param(param_file, mdl,
"INPUTDIR", cs%inputdir, &
1579 "The directory in which all input files are found.", &
1581 cs%inputdir = slasher(cs%inputdir)
1583 call get_param(param_file, mdl,
"ADIABATIC", cs%adiabatic, &
1584 "There are no diapycnal mass fluxes if ADIABATIC is "//&
1585 "true. This assumes that KD = KDML = 0.0 and that "//&
1586 "there is no buoyancy forcing, but makes the model "//&
1587 "faster by eliminating subroutine calls.", default=.false.)
1588 call get_param(param_file, mdl,
"VARIABLE_WINDS", cs%variable_winds, &
1589 "If true, the winds vary in time after the initialization.", &
1591 call get_param(param_file, mdl,
"VARIABLE_BUOYFORCE", cs%variable_buoyforce, &
1592 "If true, the buoyancy forcing varies in time after the "//&
1593 "initialization of the model.", default=.true.)
1595 call get_param(param_file, mdl,
"BUOY_CONFIG", cs%buoy_config, &
1596 "The character string that indicates how buoyancy forcing "//&
1597 "is specified. Valid options include (file), (zero), "//&
1598 "(linear), (USER), (BFB) and (NONE).", default=
"zero")
1599 if (trim(cs%buoy_config) ==
"file")
then 1600 call get_param(param_file, mdl,
"ARCHAIC_OMIP_FORCING_FILE", cs%archaic_OMIP_file, &
1601 "If true, use the forcing variable decomposition from "//&
1602 "the old German OMIP prescription that predated CORE. If "//&
1603 "false, use the variable groupings available from MOM "//&
1604 "output diagnostics of forcing variables.", default=.true.)
1605 if (cs%archaic_OMIP_file)
then 1606 call get_param(param_file, mdl,
"LONGWAVEDOWN_FILE", cs%longwave_file, &
1607 "The file with the downward longwave heat flux, in "//&
1608 "variable lwdn_sfc.", fail_if_missing=.true.)
1609 call get_param(param_file, mdl,
"LONGWAVEUP_FILE", cs%longwaveup_file, &
1610 "The file with the upward longwave heat flux, in "//&
1611 "variable lwup_sfc.", fail_if_missing=.true.)
1612 call get_param(param_file, mdl,
"EVAPORATION_FILE", cs%evaporation_file, &
1613 "The file with the evaporative moisture flux, in "//&
1614 "variable evap.", fail_if_missing=.true.)
1615 call get_param(param_file, mdl,
"SENSIBLEHEAT_FILE", cs%sensibleheat_file, &
1616 "The file with the sensible heat flux, in "//&
1617 "variable shflx.", fail_if_missing=.true.)
1618 call get_param(param_file, mdl,
"SHORTWAVEUP_FILE", cs%shortwaveup_file, &
1619 "The file with the upward shortwave heat flux.", &
1620 fail_if_missing=.true.)
1621 call get_param(param_file, mdl,
"SHORTWAVEDOWN_FILE", cs%shortwave_file, &
1622 "The file with the downward shortwave heat flux.", &
1623 fail_if_missing=.true.)
1624 call get_param(param_file, mdl,
"SNOW_FILE", cs%snow_file, &
1625 "The file with the downward frozen precip flux, in "//&
1626 "variable snow.", fail_if_missing=.true.)
1627 call get_param(param_file, mdl,
"PRECIP_FILE", cs%rain_file, &
1628 "The file with the downward total precip flux, in "//&
1629 "variable precip.", fail_if_missing=.true.)
1630 call get_param(param_file, mdl,
"FRESHDISCHARGE_FILE", cs%runoff_file, &
1631 "The file with the fresh and frozen runoff/calving fluxes, "//&
1632 "invariables disch_w and disch_s.", fail_if_missing=.true.)
1635 cs%latentheat_file = cs%evaporation_file ; cs%latent_var =
"evap" 1636 cs%LW_var =
"lwdn_sfc"; cs%SW_var =
"swdn_sfc"; cs%sens_var =
"shflx" 1637 cs%evap_var =
"evap"; cs%rain_var =
"precip"; cs%snow_var =
"snow" 1638 cs%lrunoff_var =
"disch_w"; cs%frunoff_var =
"disch_s" 1641 call get_param(param_file, mdl,
"LONGWAVE_FILE", cs%longwave_file, &
1642 "The file with the longwave heat flux, in the variable "//&
1643 "given by LONGWAVE_FORCING_VAR.", fail_if_missing=.true.)
1644 call get_param(param_file, mdl,
"LONGWAVE_FORCING_VAR", cs%LW_var, &
1645 "The variable with the longwave forcing field.", default=
"LW")
1647 call get_param(param_file, mdl,
"SHORTWAVE_FILE", cs%shortwave_file, &
1648 "The file with the shortwave heat flux, in the variable "//&
1649 "given by SHORTWAVE_FORCING_VAR.", fail_if_missing=.true.)
1650 call get_param(param_file, mdl,
"SHORTWAVE_FORCING_VAR", cs%SW_var, &
1651 "The variable with the shortwave forcing field.", default=
"SW")
1653 call get_param(param_file, mdl,
"EVAPORATION_FILE", cs%evaporation_file, &
1654 "The file with the evaporative moisture flux, in the "//&
1655 "variable given by EVAP_FORCING_VAR.", fail_if_missing=.true.)
1656 call get_param(param_file, mdl,
"EVAP_FORCING_VAR", cs%evap_var, &
1657 "The variable with the evaporative moisture flux.", &
1660 call get_param(param_file, mdl,
"LATENTHEAT_FILE", cs%latentheat_file, &
1661 "The file with the latent heat flux, in the variable "//&
1662 "given by LATENT_FORCING_VAR.", fail_if_missing=.true.)
1663 call get_param(param_file, mdl,
"LATENT_FORCING_VAR", cs%latent_var, &
1664 "The variable with the latent heat flux.", default=
"latent")
1666 call get_param(param_file, mdl,
"SENSIBLEHEAT_FILE", cs%sensibleheat_file, &
1667 "The file with the sensible heat flux, in the variable "//&
1668 "given by SENSIBLE_FORCING_VAR.", fail_if_missing=.true.)
1669 call get_param(param_file, mdl,
"SENSIBLE_FORCING_VAR", cs%sens_var, &
1670 "The variable with the sensible heat flux.", default=
"sensible")
1672 call get_param(param_file, mdl,
"RAIN_FILE", cs%rain_file, &
1673 "The file with the liquid precipitation flux, in the "//&
1674 "variable given by RAIN_FORCING_VAR.", fail_if_missing=.true.)
1675 call get_param(param_file, mdl,
"RAIN_FORCING_VAR", cs%rain_var, &
1676 "The variable with the liquid precipitation flux.", &
1677 default=
"liq_precip")
1678 call get_param(param_file, mdl,
"SNOW_FILE", cs%snow_file, &
1679 "The file with the frozen precipitation flux, in the "//&
1680 "variable given by SNOW_FORCING_VAR.", fail_if_missing=.true.)
1681 call get_param(param_file, mdl,
"SNOW_FORCING_VAR", cs%snow_var, &
1682 "The variable with the frozen precipitation flux.", &
1683 default=
"froz_precip")
1685 call get_param(param_file, mdl,
"RUNOFF_FILE", cs%runoff_file, &
1686 "The file with the fresh and frozen runoff/calving "//&
1687 "fluxes, in variables given by LIQ_RUNOFF_FORCING_VAR "//&
1688 "and FROZ_RUNOFF_FORCING_VAR.", fail_if_missing=.true.)
1689 call get_param(param_file, mdl,
"LIQ_RUNOFF_FORCING_VAR", cs%lrunoff_var, &
1690 "The variable with the liquid runoff flux.", &
1691 default=
"liq_runoff")
1692 call get_param(param_file, mdl,
"FROZ_RUNOFF_FORCING_VAR", cs%frunoff_var, &
1693 "The variable with the frozen runoff flux.", &
1694 default=
"froz_runoff")
1697 call get_param(param_file, mdl,
"SSTRESTORE_FILE", cs%SSTrestore_file, &
1698 "The file with the SST toward which to restore in the "//&
1699 "variable given by SST_RESTORE_VAR.", fail_if_missing=.true.)
1700 call get_param(param_file, mdl,
"SALINITYRESTORE_FILE", cs%salinityrestore_file, &
1701 "The file with the surface salinity toward which to "//&
1702 "restore in the variable given by SSS_RESTORE_VAR.", &
1703 fail_if_missing=.true.)
1705 if (cs%archaic_OMIP_file)
then 1706 cs%SST_restore_var =
"TEMP" ; cs%SSS_restore_var =
"SALT" 1708 call get_param(param_file, mdl,
"SST_RESTORE_VAR", cs%SST_restore_var, &
1709 "The variable with the SST toward which to restore.", &
1711 call get_param(param_file, mdl,
"SSS_RESTORE_VAR", cs%SSS_restore_var, &
1712 "The variable with the SSS toward which to restore.", &
1717 cs%shortwave_file = trim(cs%inputdir)//trim(cs%shortwave_file)
1718 cs%longwave_file = trim(cs%inputdir)//trim(cs%longwave_file)
1719 cs%sensibleheat_file = trim(cs%inputdir)//trim(cs%sensibleheat_file)
1720 cs%latentheat_file = trim(cs%inputdir)//trim(cs%latentheat_file)
1721 cs%evaporation_file = trim(cs%inputdir)//trim(cs%evaporation_file)
1722 cs%snow_file = trim(cs%inputdir)//trim(cs%snow_file)
1723 cs%rain_file = trim(cs%inputdir)//trim(cs%rain_file)
1724 cs%runoff_file = trim(cs%inputdir)//trim(cs%runoff_file)
1726 cs%shortwaveup_file = trim(cs%inputdir)//trim(cs%shortwaveup_file)
1727 cs%longwaveup_file = trim(cs%inputdir)//trim(cs%longwaveup_file)
1729 cs%SSTrestore_file = trim(cs%inputdir)//trim(cs%SSTrestore_file)
1730 cs%salinityrestore_file = trim(cs%inputdir)//trim(cs%salinityrestore_file)
1731 elseif (trim(cs%buoy_config) ==
"const")
then 1732 call get_param(param_file, mdl,
"SENSIBLE_HEAT_FLUX", cs%constantHeatForcing, &
1733 "A constant heat forcing (positive into ocean) applied "//&
1734 "through the sensible heat flux field. ", &
1735 units=
'W/m2', scale=us%W_m2_to_QRZ_T, fail_if_missing=.true.)
1737 call get_param(param_file, mdl,
"WIND_CONFIG", cs%wind_config, &
1738 "The character string that indicates how wind forcing "//&
1739 "is specified. Valid options include (file), (2gyre), "//&
1740 "(1gyre), (gyres), (zero), and (USER).", default=
"zero")
1741 if (trim(cs%wind_config) ==
"file")
then 1742 call get_param(param_file, mdl,
"WIND_FILE", cs%wind_file, &
1743 "The file in which the wind stresses are found in "//&
1744 "variables STRESS_X and STRESS_Y.", fail_if_missing=.true.)
1745 call get_param(param_file, mdl,
"WINDSTRESS_X_VAR",cs%stress_x_var, &
1746 "The name of the x-wind stress variable in WIND_FILE.", &
1748 call get_param(param_file, mdl,
"WINDSTRESS_Y_VAR", cs%stress_y_var, &
1749 "The name of the y-wind stress variable in WIND_FILE.", &
1751 call get_param(param_file, mdl,
"WIND_STAGGER",cs%wind_stagger, &
1752 "A character indicating how the wind stress components "//&
1753 "are staggered in WIND_FILE. This may be A or C for now.", &
1755 call get_param(param_file, mdl,
"WINDSTRESS_SCALE", cs%wind_scale, &
1756 "A value by which the wind stresses in WIND_FILE are rescaled.", &
1757 default=1.0, units=
"nondim")
1758 call get_param(param_file, mdl,
"USTAR_FORCING_VAR", cs%ustar_var, &
1759 "The name of the friction velocity variable in WIND_FILE "//&
1760 "or blank to get ustar from the wind stresses plus the "//&
1761 "gustiness.", default=
" ", units=
"nondim")
1762 cs%wind_file = trim(cs%inputdir) // trim(cs%wind_file)
1764 if (trim(cs%wind_config) ==
"gyres")
then 1765 call get_param(param_file, mdl,
"TAUX_CONST", cs%gyres_taux_const, &
1766 "With the gyres wind_config, the constant offset in the "//&
1767 "zonal wind stress profile: "//&
1768 " A in taux = A + B*sin(n*pi*y/L) + C*cos(n*pi*y/L).", &
1769 units=
"Pa", default=0.0)
1770 call get_param(param_file, mdl,
"TAUX_SIN_AMP",cs%gyres_taux_sin_amp, &
1771 "With the gyres wind_config, the sine amplitude in the "//&
1772 "zonal wind stress profile: "//&
1773 " B in taux = A + B*sin(n*pi*y/L) + C*cos(n*pi*y/L).", &
1774 units=
"Pa", default=0.0)
1775 call get_param(param_file, mdl,
"TAUX_COS_AMP",cs%gyres_taux_cos_amp, &
1776 "With the gyres wind_config, the cosine amplitude in "//&
1777 "the zonal wind stress profile: "//&
1778 " C in taux = A + B*sin(n*pi*y/L) + C*cos(n*pi*y/L).", &
1779 units=
"Pa", default=0.0)
1780 call get_param(param_file, mdl,
"TAUX_N_PIS",cs%gyres_taux_n_pis, &
1781 "With the gyres wind_config, the number of gyres in "//&
1782 "the zonal wind stress profile: "//&
1783 " n in taux = A + B*sin(n*pi*y/L) + C*cos(n*pi*y/L).", &
1784 units=
"nondim", default=0.0)
1785 call get_param(param_file, mdl,
"DEFAULT_2018_ANSWERS", default_2018_answers, &
1786 "This sets the default value for the various _2018_ANSWERS parameters.", &
1788 call get_param(param_file, mdl,
"WIND_GYRES_2018_ANSWERS", cs%answers_2018, &
1789 "If true, use the order of arithmetic and expressions that recover the answers "//&
1790 "from the end of 2018. Otherwise, use expressions for the gyre friction velocities "//&
1791 "that are rotationally invariant and more likely to be the same between compilers.", &
1792 default=default_2018_answers)
1794 cs%answers_2018 = .false.
1796 if (trim(cs%wind_config) ==
"scurves")
then 1797 call get_param(param_file, mdl,
"WIND_SCURVES_LATS", cs%scurves_ydata, &
1798 "A list of latitudes defining a piecewise scurve profile "//&
1799 "for zonal wind stress.", &
1800 units=
"degrees N", fail_if_missing=.true.)
1801 call get_param(param_file, mdl,
"WIND_SCURVES_TAUX", cs%scurves_taux, &
1802 "A list of zonal wind stress values at latitudes "//&
1803 "WIND_SCURVES_LATS defining a piecewise scurve profile.", &
1804 units=
"Pa", fail_if_missing=.true.)
1806 if ((trim(cs%wind_config) ==
"2gyre") .or. &
1807 (trim(cs%wind_config) ==
"1gyre") .or. &
1808 (trim(cs%wind_config) ==
"gyres") .or. &
1809 (trim(cs%buoy_config) ==
"linear"))
then 1810 cs%south_lat = g%south_lat
1811 cs%len_lat = g%len_lat
1814 call get_param(param_file, mdl,
"RHO_0", cs%Rho0, &
1815 "The mean ocean density used with BOUSSINESQ true to "//&
1816 "calculate accelerations and the mass for conservation "//&
1817 "properties, or with BOUSSINSEQ false to convert some "//&
1818 "parameters from vertical units of m to kg m-2.", &
1819 units=
"kg m-3", default=1035.0, scale=us%kg_m3_to_R)
1820 call get_param(param_file, mdl,
"RESTOREBUOY", cs%restorebuoy, &
1821 "If true, the buoyancy fluxes drive the model back "//&
1822 "toward some specified surface state with a rate "//&
1823 "given by FLUXCONST.", default= .false.)
1824 call get_param(param_file, mdl,
"LATENT_HEAT_FUSION", cs%latent_heat_fusion, &
1825 "The latent heat of fusion.", default=hlf, &
1826 units=
"J/kg", scale=us%J_kg_to_Q)
1827 call get_param(param_file, mdl,
"LATENT_HEAT_VAPORIZATION", cs%latent_heat_vapor, &
1828 "The latent heat of fusion.", default=hlv, units=
"J/kg", scale=us%J_kg_to_Q)
1829 if (cs%restorebuoy)
then 1831 call get_param(param_file, mdl,
"FLUXCONST", cs%Flux_const, &
1832 "The constant that relates the restoring surface fluxes to the relative "//&
1833 "surface anomalies (akin to a piston velocity). Note the non-MKS units.", &
1834 default=0.0, units=
"m day-1", scale=us%m_to_Z*us%T_to_s/86400.0, &
1835 unscaled=flux_const_default)
1837 if (cs%use_temperature)
then 1838 call get_param(param_file, mdl,
"FLUXCONST_T", cs%Flux_const_T, &
1839 "The constant that relates the restoring surface temperature "//&
1840 "flux to the relative surface anomaly (akin to a piston "//&
1841 "velocity). Note the non-MKS units.", &
1842 units=
"m day-1", scale=us%m_to_Z*us%T_to_s/86400.0, &
1843 default=flux_const_default)
1844 call get_param(param_file, mdl,
"FLUXCONST_S", cs%Flux_const_S, &
1845 "The constant that relates the restoring surface salinity "//&
1846 "flux to the relative surface anomaly (akin to a piston "//&
1847 "velocity). Note the non-MKS units.", &
1848 units=
"m day-1", scale=us%m_to_Z*us%T_to_s/86400.0, &
1849 default=flux_const_default)
1852 if (trim(cs%buoy_config) ==
"linear")
then 1853 call get_param(param_file, mdl,
"SST_NORTH", cs%T_north, &
1854 "With buoy_config linear, the sea surface temperature "//&
1855 "at the northern end of the domain toward which to "//&
1856 "to restore.", units=
"deg C", default=0.0)
1857 call get_param(param_file, mdl,
"SST_SOUTH", cs%T_south, &
1858 "With buoy_config linear, the sea surface temperature "//&
1859 "at the southern end of the domain toward which to "//&
1860 "to restore.", units=
"deg C", default=0.0)
1861 call get_param(param_file, mdl,
"SSS_NORTH", cs%S_north, &
1862 "With buoy_config linear, the sea surface salinity "//&
1863 "at the northern end of the domain toward which to "//&
1864 "to restore.", units=
"PSU", default=35.0)
1865 call get_param(param_file, mdl,
"SSS_SOUTH", cs%S_south, &
1866 "With buoy_config linear, the sea surface salinity "//&
1867 "at the southern end of the domain toward which to "//&
1868 "to restore.", units=
"PSU", default=35.0)
1871 call get_param(param_file, mdl,
"G_EARTH", cs%G_Earth, &
1872 "The gravitational acceleration of the Earth.", &
1873 units=
"m s-2", default = 9.80, scale=us%m_to_L**2*us%Z_to_m*us%T_to_s**2)
1875 call get_param(param_file, mdl,
"GUST_CONST", cs%gust_const, &
1876 "The background gustiness in the winds.", &
1877 units=
"Pa", default=0.0, scale=us%kg_m3_to_R*us%m_s_to_L_T**2*us%L_to_Z)
1878 call get_param(param_file, mdl,
"FIX_USTAR_GUSTLESS_BUG", cs%fix_ustar_gustless_bug, &
1879 "If true correct a bug in the time-averaging of the gustless wind friction velocity", &
1881 call get_param(param_file, mdl,
"READ_GUST_2D", cs%read_gust_2d, &
1882 "If true, use a 2-dimensional gustiness supplied from "//&
1883 "an input file", default=.false.)
1884 if (cs%read_gust_2d)
then 1885 call get_param(param_file, mdl,
"GUST_2D_FILE", gust_file, &
1886 "The file in which the wind gustiness is found in "//&
1887 "variable gustiness.", fail_if_missing=.true.)
1888 call safe_alloc_ptr(cs%gust,g%isd,g%ied,g%jsd,g%jed)
1889 filename = trim(cs%inputdir) // trim(gust_file)
1890 call mom_read_data(filename,
'gustiness',cs%gust,g%domain, timelevel=1, &
1891 scale=us%kg_m3_to_R*us%m_s_to_L_T**2*us%L_to_Z)
1896 if (trim(cs%wind_config) ==
"USER" .or. trim(cs%buoy_config) ==
"USER" )
then 1897 call user_surface_forcing_init(time, g, us, param_file, diag, cs%user_forcing_CSp)
1898 elseif (trim(cs%buoy_config) ==
"BFB" )
then 1899 call bfb_surface_forcing_init(time, g, us, param_file, diag, cs%BFB_forcing_CSp)
1900 elseif (trim(cs%buoy_config) ==
"dumbbell" )
then 1901 call dumbbell_surface_forcing_init(time, g, us, param_file, diag, cs%dumbbell_forcing_CSp)
1902 elseif (trim(cs%wind_config) ==
"MESO" .or. trim(cs%buoy_config) ==
"MESO" )
then 1903 call meso_surface_forcing_init(time, g, us, param_file, diag, cs%MESO_forcing_CSp)
1904 elseif (trim(cs%wind_config) ==
"ideal_hurr" .or.&
1905 trim(cs%wind_config) ==
"SCM_ideal_hurr")
then 1906 call idealized_hurricane_wind_init(time, g, us, param_file, cs%idealized_hurricane_CSp)
1907 elseif (trim(cs%wind_config) ==
"const")
then 1908 call get_param(param_file, mdl,
"CONST_WIND_TAUX", cs%tau_x0, &
1909 "With wind_config const, this is the constant zonal "//&
1910 "wind-stress", units=
"Pa", fail_if_missing=.true.)
1911 call get_param(param_file, mdl,
"CONST_WIND_TAUY", cs%tau_y0, &
1912 "With wind_config const, this is the constant meridional "//&
1913 "wind-stress", units=
"Pa", fail_if_missing=.true.)
1914 elseif (trim(cs%wind_config) ==
"SCM_CVmix_tests" .or. &
1915 trim(cs%buoy_config) ==
"SCM_CVmix_tests")
then 1916 call scm_cvmix_tests_surface_forcing_init(time, g, param_file, cs%SCM_CVmix_tests_CSp)
1919 call register_forcing_type_diags(time, diag, us, cs%use_temperature, cs%handles)
1922 call restart_init(param_file, cs%restart_CSp,
"MOM_forcing.res")
1925 call restart_init_end(cs%restart_CSp)
1927 if (
associated(cs%restart_CSp))
then 1928 call get_mom_input(dirs=dirs)
1931 if ((dirs%input_filename(1:1) ==
'n') .and. &
1932 (len_trim(dirs%input_filename) == 1)) new_sim = .true.
1933 if (.not.new_sim)
then 1934 call restore_state(dirs%input_filename, dirs%restart_input_dir, time_frc, &
1940 if (trim(cs%buoy_config) ==
"file")
then 1941 cs%SW_nlev = num_timelevels(cs%shortwave_file, cs%SW_var, min_dims=3)
1942 cs%LW_nlev = num_timelevels(cs%longwave_file, cs%LW_var, min_dims=3)
1943 cs%latent_nlev = num_timelevels(cs%latentheat_file, cs%latent_var, 3)
1944 cs%sens_nlev = num_timelevels(cs%sensibleheat_file, cs%sens_var, min_dims=3)
1946 cs%evap_nlev = num_timelevels(cs%evaporation_file, cs%evap_var, min_dims=3)
1947 cs%precip_nlev = num_timelevels(cs%rain_file, cs%rain_var, min_dims=3)
1948 cs%runoff_nlev = num_timelevels(cs%runoff_file, cs%lrunoff_var, 3)
1950 cs%SST_nlev = num_timelevels(cs%SSTrestore_file, cs%SST_restore_var, 3)
1951 cs%SSS_nlev = num_timelevels(cs%salinityrestore_file, cs%SSS_restore_var, 3)
1954 if (trim(cs%wind_config) ==
"file") &
1955 cs%wind_nlev = num_timelevels(cs%wind_file, cs%stress_x_var, min_dims=3)
1959 call user_revise_forcing_init(param_file, cs%urf_CS)
1961 call cpu_clock_end(id_clock_forcing)