cable_restart_write.F90 Source File


Source Code

module cable_restart_write_mod
  use cable_restart_mod, only: cable_restart_write_time
  use cable_restart_mod, only: cable_restart_variable_write
  use cable_restart_mod, only: cable_restart_variable_write_darray

  use cable_common_module, only: cable_user

  use cable_def_types_mod, only: met_type
  use cable_def_types_mod, only: soil_parameter_type
  use cable_def_types_mod, only: veg_parameter_type
  use cable_def_types_mod, only: soil_snow_type
  use cable_def_types_mod, only: bgc_pool_type
  use cable_def_types_mod, only: canopy_type
  use cable_def_types_mod, only: roughness_type
  use cable_def_types_mod, only: radiation_type
  use cable_def_types_mod, only: balances_type
  use cable_def_types_mod, only: mvtype, mstype

  use cable_io_vars_module, only: latitude, longitude
  use cable_io_vars_module, only: landpt_global
  use cable_io_vars_module, only: patch

  use cable_netcdf_mod, only: CABLE_NETCDF_INT
  use cable_netcdf_mod, only: CABLE_NETCDF_FLOAT

  implicit none
  private

  public :: cable_restart_write

contains

  subroutine cable_restart_write(current_time, soil, veg, ssnow, canopy, rough, rad, bgc, bal, met)
    real, intent(in) :: current_time !! Current simulation time
    type(met_type), intent(in) :: met !! Meteorological data
    type(soil_parameter_type), intent(in) :: soil !! Soil parameters
    type(veg_parameter_type), intent(in) :: veg !! Vegetation parameters
    type(soil_snow_type), intent(in) :: ssnow !! Soil and snow variables
    type(bgc_pool_type), intent(in) :: bgc !! Carbon pool variables
    type(canopy_type), intent(in) :: canopy !! Vegetation variables
    type(roughness_type), intent(in) :: rough !! Roughness variables
    type(radiation_type), intent(in) :: rad !! Radiation variables
    type(balances_type), intent(in) :: bal !! Energy and water balance variables

    call cable_restart_write_time(current_time)

    call cable_restart_variable_write( &
      var_name="longitude", &
      var_dims=["mland"], &
      data=longitude, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="", &
      units="degrees_east" &
    )

    call cable_restart_variable_write( &
      var_name="latitude", &
      var_dims=["mland"], &
      data=latitude, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="", &
      units="degrees_north" &
    )

    call cable_restart_variable_write( &
      var_name="nap", &
      var_dims=["mland"], &
      data=landpt_global(:)%nap, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Number of active patches", &
      units="" &
    )

    call cable_restart_variable_write_darray( &
      var_name="patchfrac", &
      var_dims=["mp"], &
      data=patch(:)%frac, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Fraction of vegetated grid cell area occupied by a vegetation/soil patch", &
      units="" &
    )

    call cable_restart_variable_write( &
      var_name="mvtype", &
      data=[mvtype], &
      var_type=CABLE_NETCDF_INT, &
      long_name="Number of vegetation types", &
      units="" &
    )

    call cable_restart_variable_write( &
      var_name="mstype", &
      data=[mstype], &
      var_type=CABLE_NETCDF_INT, &
      long_name="Number of soil types", &
      units="" &
    )

    call cable_restart_variable_write_darray( &
      var_name="tgg", &
      var_dims=["mp","soil"], &
      data=ssnow%tgg, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average layer soil temperature", &
      units="K" &
    )

    call cable_restart_variable_write_darray( &
      var_name="wb", &
      var_dims=["mp", "soil"], &
      data=ssnow%wb, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average layer volumetric soil moisture", &
      units="vol/vol" &
    )

    call cable_restart_variable_write_darray( &
      var_name="wbice", &
      var_dims=["mp","soil"], &
      data=ssnow%wbice, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average layer volumetric soil ice", &
      units="vol/vol" &
    )

    call cable_restart_variable_write_darray( &
      var_name="tss", &
      var_dims=["mp"], &
      data=ssnow%tss, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Combined soil/snow temperature", &
      units="K" &
    )

    call cable_restart_variable_write_darray( &
      var_name="albsoilsn", &
      var_dims=["mp", "rad"], &
      data=ssnow%albsoilsn, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Combined soil/snow albedo", &
      units="-" &
    )

    call cable_restart_variable_write_darray( &
      var_name="rtsoil", &
      var_dims=["mp"], &
      data=ssnow%rtsoil, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Turbulent resistance for soil", &
      units="??" &
    )

    call cable_restart_variable_write_darray( &
      var_name="gammzz", &
      var_dims=["mp","soil"], &
      data=ssnow%gammzz, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Heat capacity for each soil layer", &
      units="J/kg/C" &
    )

    call cable_restart_variable_write_darray( &
      var_name="runoff", &
      var_dims=["mp"], &
      data=ssnow%runoff, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Total runoff", &
      units="mm/timestep" &
    )

    call cable_restart_variable_write_darray( &
      var_name="rnof1", &
      var_dims=["mp"], &
      data=ssnow%rnof1, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Surface runoff", &
      units="mm/timestep" &
    )

    call cable_restart_variable_write_darray( &
      var_name="rnof2", &
      var_dims=["mp"], &
      data=ssnow%rnof2, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Subsurface runoff", &
      units="mm/timestep" &
    )

    call cable_restart_variable_write_darray( &
      var_name="tggsn", &
      var_dims=["mp","snow"], &
      data=ssnow%tggsn, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average layer snow temperature", &
      units="K" &
    )

    call cable_restart_variable_write_darray( &
      var_name="ssdnn", &
      var_dims=["mp"], &
      data=ssnow%ssdnn, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average snow density", &
      units="kg/m^3" &
    )

    call cable_restart_variable_write_darray( &
      var_name="ssdn", &
      var_dims=["mp","snow"], &
      data=ssnow%ssdn, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average layer snow density", &
      units="kg/m^3" &
    )

    call cable_restart_variable_write_darray( &
      var_name="snowd", &
      var_dims=["mp"], &
      data=ssnow%snowd, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Liquid water equivalent snow depth", &
      units="mm" &
    )

    call cable_restart_variable_write_darray( &
      var_name="snage", &
      var_dims=["mp"], &
      data=ssnow%snage, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Snow age", &
      units="??" &
    )

    call cable_restart_variable_write_darray( &
      var_name="smass", &
      var_dims=["mp","snow"], &
      data=ssnow%smass, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Average layer snow mass", &
      units="kg/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="sdepth", &
      var_dims=["mp", "snow"], &
      data=ssnow%sdepth, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Snow layer depth", &
      units="m" &
    )

    call cable_restart_variable_write_darray( &
      var_name="osnowd", &
      var_dims=["mp"], &
      data=ssnow%osnowd, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Previous time step snow depth in water equivalent", &
      units="mm" &
    )

    call cable_restart_variable_write_darray( &
      var_name="isflag", &
      var_dims=["mp"], &
      data=ssnow%isflag, &
      var_type=CABLE_NETCDF_INT, &
      long_name="Snow layer scheme flag", &
      units="-" &
    )

    call cable_restart_variable_write_darray( &
      var_name="cansto", &
      var_dims=["mp"], &
      data=canopy%cansto, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Canopy surface water storage", &
      units="mm" &
    )

    call cable_restart_variable_write_darray( &
      var_name="ghflux", &
      var_dims=["mp"], &
      data=canopy%ghflux, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="????", &
      units="W/m^2?" &
    )

    call cable_restart_variable_write_darray( &
      var_name="sghflux", &
      var_dims=["mp"], &
      data=canopy%sghflux, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="????", &
      units="W/m^2?" &
    )

    call cable_restart_variable_write_darray( &
      var_name="ga", &
      var_dims=["mp"], &
      data=canopy%ga, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Ground heat flux", &
      units="W/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="dgdtg", &
      var_dims=["mp"], &
      data=canopy%dgdtg, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Derivative of ground heat flux wrt soil temperature", &
      units="W/m^2/K" &
    )

    call cable_restart_variable_write_darray( &
      var_name="fev", &
      var_dims=["mp"], &
      data=canopy%fev, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Latent heat flux from vegetation", &
      units="W/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="fes", &
      var_dims=["mp"], &
      data=canopy%fes, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Latent heat flux from soil", &
      units="W/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="fhs", &
      var_dims=["mp"], &
      data=canopy%fhs, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Sensible heat flux from soil", &
      units="W/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="cplant", &
      var_dims=["mp", "plant_carbon_pools"], &
      data=bgc%cplant, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Plant carbon stores", &
      units="gC/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="csoil", &
      var_dims=["mp", "soil_carbon_pools"], &
      data=bgc%csoil, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Soil carbon stores", &
      units="gC/m^2" &
    )

    call cable_restart_variable_write_darray( &
      var_name="wbtot0", &
      var_dims=["mp"], &
      data=bal%wbtot0, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Initial time step soil water total", &
      units="mm" &
    )

    call cable_restart_variable_write_darray( &
      var_name="osnowd0", &
      var_dims=["mp"], &
      data=bal%osnowd0, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Initial time step snow water total", &
      units="mm" &
    )

    call cable_restart_variable_write_darray( &
      var_name="albedo", &
      var_dims=["mp","rad"], &
      data=rad%albedo, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Albedo for shortwave and NIR radiation", &
      units="-" &
    )

    call cable_restart_variable_write_darray( &
      var_name="trad", &
      var_dims=["mp"], &
      data=rad%trad, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Surface radiative temperature (soil/snow/veg inclusive)", &
      units="K" &
    )

    call cable_restart_variable_write_darray( &
      var_name="iveg", &
      var_dims=["mp"], &
      data=veg%iveg, &
      var_type=CABLE_NETCDF_INT, &
      long_name="Vegetation type", &
      units="-" &
    )

    call cable_restart_variable_write_darray( &
      var_name="isoil", &
      var_dims=["mp"], &
      data=soil%isoilm, &
      var_type=CABLE_NETCDF_INT, &
      long_name="Soil type", &
      units="-" &
    )

    call cable_restart_variable_write( &
      var_name="zse", &
      var_dims=["soil"], &
      data=soil%zse, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Depth of each soil layer", &
      units="m" &
    )

    call cable_restart_variable_write_darray( &
      var_name="albsoil", &
      var_dims=["mp","rad"], &
      data=soil%albsoil, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Soil reflectance", &
      units="-" &
    )

    call cable_restart_variable_write_darray( &
      var_name="GWwb", &
      var_dims=["mp"], &
      data=ssnow%GWwb, &
      var_type=CABLE_NETCDF_FLOAT, &
      long_name="Groundwater water content", &
      units="mm3/mm3" &
    )

    if (cable_user%soil_struc == 'sli' .or. cable_user%fwsoil_switch == 'Haverd2013') then

      call cable_restart_variable_write_darray( &
        var_name="gamma", &
        var_dims=["mp"], &
        data=veg%gamma, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Parameter in root efficiency function (Lai and Katul 2000)", &
        units="-" &
      )

    end if

    if (cable_user%soil_struc == 'sli') then

      call cable_restart_variable_write_darray( &
        var_name="nhorizons", &
        var_dims=["mp"], &
        data=soil%nhorizons, &
        var_type=CABLE_NETCDF_INT, &
        long_name="Number of soil horizons", &
        units="-" &
      )

      call cable_restart_variable_write_darray( &
        var_name="ishorizon", &
        var_dims=["mp"], &
        data=soil%ishorizon, &
        var_type=CABLE_NETCDF_INT, &
        long_name="Horizon number", &
        units="-" &
      )

      call cable_restart_variable_write_darray( &
        var_name="clitt", &
        var_dims=["mp"], &
        data=veg%clitt, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Litter layer carbon content", &
        units="tC/ha" &
      )

      call cable_restart_variable_write_darray( &
        var_name="ZR", &
        var_dims=["mp"], &
        data=veg%ZR, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Maximum rooting depth", &
        units="cm" &
      )

      call cable_restart_variable_write_darray( &
        var_name="F10", &
        var_dims=["mp"], &
        data=veg%F10, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Fraction of roots in top 10 cm", &
        units="-" &
      )

      call cable_restart_variable_write_darray( &
        var_name="S", &
        var_dims=["mp"], &
        data=ssnow%S, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Fractional soil moisture content relative to saturated value", &
        units="-" &
      )

      call cable_restart_variable_write_darray( &
        var_name="Tsoil", &
        var_dims=["mp"], &
        data=ssnow%Tsoil, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Soil temperature", &
        units="degC" &
      )

      call cable_restart_variable_write_darray( &
        var_name="snowliq", &
        var_dims=["mp"], &
        data=ssnow%snowliq, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Liquid water content of snowpack", &
        units="mm" &
      )

      call cable_restart_variable_write_darray( &
        var_name="sconds", &
        var_dims=["mp"], &
        data=ssnow%sconds, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Thermal conductivity of snowpack", &
        units="W/m/K" &
      )

      call cable_restart_variable_write_darray( &
        var_name="h0", &
        var_dims=["mp"], &
        data=ssnow%h0, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Pond height above soil", &
        units="m" &
      )

      call cable_restart_variable_write_darray( &
        var_name="nsnow", &
        var_dims=["mp"], &
        data=ssnow%nsnow, &
        var_type=CABLE_NETCDF_INT, &
        long_name="Number of snow layers", &
        units="-" &
      )

      call cable_restart_variable_write_darray( &
        var_name="Tsurface", &
        var_dims=["mp"], &
        data=ssnow%Tsurface, &
        var_type=CABLE_NETCDF_FLOAT, &
        long_name="Soil or snow surface temperature", &
        units="degC" &
      )

    end if

  end subroutine cable_restart_write

end module