module cable_output_definitions_mod use cable_abort_module, only: cable_abort use cable_def_types_mod, only: canopy_type use cable_def_types_mod, only: soil_parameter_type use cable_io_vars_module, only: metGrid use cable_netcdf_mod, only: CABLE_NETCDF_FLOAT use aggregator_mod, only: new_aggregator use cable_netcdf_mod, only: cable_netcdf_decomp_t use cable_netcdf_mod, only: MAX_LEN_DIM => CABLE_NETCDF_MAX_STR_LEN_DIM use cable_io_decomp_mod, only: io_decomp_t use cable_output_prototype_v2_mod, only: requires_x_y_output_grid use cable_output_prototype_v2_mod, only: requires_land_output_grid use cable_output_prototype_v2_mod, only: output, patchout use cable_output_prototype_v2_mod, only: cable_output_add_variable use cable_checks_module, only: ranges implicit none private public :: cable_output_definitions_set contains subroutine cable_output_definitions_set(io_decomp, canopy, soil) class(io_decomp_t), intent(in), target :: io_decomp type(canopy_type), intent(inout) :: canopy type(soil_parameter_type), intent(in) :: soil character(len=MAX_LEN_DIM), allocatable :: base_dims(:) class(cable_netcdf_decomp_t), pointer :: output_decomp_base_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_soil_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_soil_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_soil_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_snow_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_snow_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_snow_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_rad_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_rad_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_rad_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_plantcarbon_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_plantcarbon_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_plantcarbon_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_soilcarbon_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_soilcarbon_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_soilcarbon_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_soil_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_soil_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_soil_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_snow_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_snow_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_snow_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_rad_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_rad_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_rad_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_plantcarbon_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_plantcarbon_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_plantcarbon_real64 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_soilcarbon_int32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_soilcarbon_real32 class(cable_netcdf_decomp_t), pointer :: output_decomp_base_patch_soilcarbon_real64 if (requires_x_y_output_grid(output%grid, metGrid)) then base_dims = ["x", "y"] output_decomp_base_int32 => io_decomp%land_to_x_y_int32 output_decomp_base_real32 => io_decomp%land_to_x_y_real32 output_decomp_base_real64 => io_decomp%land_to_x_y_real64 output_decomp_base_soil_int32 => io_decomp%land_soil_to_x_y_soil_int32 output_decomp_base_soil_real32 => io_decomp%land_soil_to_x_y_soil_real32 output_decomp_base_soil_real64 => io_decomp%land_soil_to_x_y_soil_real64 output_decomp_base_snow_int32 => io_decomp%land_snow_to_x_y_snow_int32 output_decomp_base_snow_real32 => io_decomp%land_snow_to_x_y_snow_real32 output_decomp_base_snow_real64 => io_decomp%land_snow_to_x_y_snow_real64 output_decomp_base_rad_int32 => io_decomp%land_rad_to_x_y_rad_int32 output_decomp_base_rad_real32 => io_decomp%land_rad_to_x_y_rad_real32 output_decomp_base_rad_real64 => io_decomp%land_rad_to_x_y_rad_real64 output_decomp_base_plantcarbon_int32 => io_decomp%land_plantcarbon_to_x_y_plantcarbon_int32 output_decomp_base_plantcarbon_real32 => io_decomp%land_plantcarbon_to_x_y_plantcarbon_real32 output_decomp_base_plantcarbon_real64 => io_decomp%land_plantcarbon_to_x_y_plantcarbon_real64 output_decomp_base_soilcarbon_int32 => io_decomp%land_soilcarbon_to_x_y_soilcarbon_int32 output_decomp_base_soilcarbon_real32 => io_decomp%land_soilcarbon_to_x_y_soilcarbon_real32 output_decomp_base_soilcarbon_real64 => io_decomp%land_soilcarbon_to_x_y_soilcarbon_real64 output_decomp_base_patch_int32 => io_decomp%patch_to_x_y_patch_int32 output_decomp_base_patch_real32 => io_decomp%patch_to_x_y_patch_real32 output_decomp_base_patch_real64 => io_decomp%patch_to_x_y_patch_real64 output_decomp_base_patch_soil_int32 => io_decomp%patch_soil_to_x_y_patch_soil_int32 output_decomp_base_patch_soil_real32 => io_decomp%patch_soil_to_x_y_patch_soil_real32 output_decomp_base_patch_soil_real64 => io_decomp%patch_soil_to_x_y_patch_soil_real64 output_decomp_base_patch_snow_int32 => io_decomp%patch_snow_to_x_y_patch_snow_int32 output_decomp_base_patch_snow_real32 => io_decomp%patch_snow_to_x_y_patch_snow_real32 output_decomp_base_patch_snow_real64 => io_decomp%patch_snow_to_x_y_patch_snow_real64 output_decomp_base_patch_rad_int32 => io_decomp%patch_rad_to_x_y_patch_rad_int32 output_decomp_base_patch_rad_real32 => io_decomp%patch_rad_to_x_y_patch_rad_real32 output_decomp_base_patch_rad_real64 => io_decomp%patch_rad_to_x_y_patch_rad_real64 output_decomp_base_patch_plantcarbon_int32 => io_decomp%patch_plantcarbon_to_x_y_patch_plantcarbon_int32 output_decomp_base_patch_plantcarbon_real32 => io_decomp%patch_plantcarbon_to_x_y_patch_plantcarbon_real32 output_decomp_base_patch_plantcarbon_real64 => io_decomp%patch_plantcarbon_to_x_y_patch_plantcarbon_real64 output_decomp_base_patch_soilcarbon_int32 => io_decomp%patch_soilcarbon_to_x_y_patch_soilcarbon_int32 output_decomp_base_patch_soilcarbon_real32 => io_decomp%patch_soilcarbon_to_x_y_patch_soilcarbon_real32 output_decomp_base_patch_soilcarbon_real64 => io_decomp%patch_soilcarbon_to_x_y_patch_soilcarbon_real64 else if (requires_land_output_grid(output%grid, metGrid)) then base_dims = ["land"] output_decomp_base_int32 => io_decomp%land_to_land_int32 output_decomp_base_real32 => io_decomp%land_to_land_real32 output_decomp_base_real64 => io_decomp%land_to_land_real64 output_decomp_base_soil_int32 => io_decomp%land_soil_to_land_soil_int32 output_decomp_base_soil_real32 => io_decomp%land_soil_to_land_soil_real32 output_decomp_base_soil_real64 => io_decomp%land_soil_to_land_soil_real64 output_decomp_base_snow_int32 => io_decomp%land_snow_to_land_snow_int32 output_decomp_base_snow_real32 => io_decomp%land_snow_to_land_snow_real32 output_decomp_base_snow_real64 => io_decomp%land_snow_to_land_snow_real64 output_decomp_base_rad_int32 => io_decomp%land_rad_to_land_rad_int32 output_decomp_base_rad_real32 => io_decomp%land_rad_to_land_rad_real32 output_decomp_base_rad_real64 => io_decomp%land_rad_to_land_rad_real64 output_decomp_base_plantcarbon_int32 => io_decomp%land_plantcarbon_to_land_plantcarbon_int32 output_decomp_base_plantcarbon_real32 => io_decomp%land_plantcarbon_to_land_plantcarbon_real32 output_decomp_base_plantcarbon_real64 => io_decomp%land_plantcarbon_to_land_plantcarbon_real64 output_decomp_base_soilcarbon_int32 => io_decomp%land_soilcarbon_to_land_soilcarbon_int32 output_decomp_base_soilcarbon_real32 => io_decomp%land_soilcarbon_to_land_soilcarbon_real32 output_decomp_base_soilcarbon_real64 => io_decomp%land_soilcarbon_to_land_soilcarbon_real64 output_decomp_base_patch_int32 => io_decomp%patch_to_land_patch_int32 output_decomp_base_patch_real32 => io_decomp%patch_to_land_patch_real32 output_decomp_base_patch_real64 => io_decomp%patch_to_land_patch_real64 output_decomp_base_patch_soil_int32 => io_decomp%patch_soil_to_land_patch_soil_int32 output_decomp_base_patch_soil_real32 => io_decomp%patch_soil_to_land_patch_soil_real32 output_decomp_base_patch_soil_real64 => io_decomp%patch_soil_to_land_patch_soil_real64 output_decomp_base_patch_snow_int32 => io_decomp%patch_snow_to_land_patch_snow_int32 output_decomp_base_patch_snow_real32 => io_decomp%patch_snow_to_land_patch_snow_real32 output_decomp_base_patch_snow_real64 => io_decomp%patch_snow_to_land_patch_snow_real64 output_decomp_base_patch_rad_int32 => io_decomp%patch_rad_to_land_patch_rad_int32 output_decomp_base_patch_rad_real32 => io_decomp%patch_rad_to_land_patch_rad_real32 output_decomp_base_patch_rad_real64 => io_decomp%patch_rad_to_land_patch_rad_real64 output_decomp_base_patch_plantcarbon_int32 => io_decomp%patch_plantcarbon_to_land_patch_plantcarbon_int32 output_decomp_base_patch_plantcarbon_real32 => io_decomp%patch_plantcarbon_to_land_patch_plantcarbon_real32 output_decomp_base_patch_plantcarbon_real64 => io_decomp%patch_plantcarbon_to_land_patch_plantcarbon_real64 output_decomp_base_patch_soilcarbon_int32 => io_decomp%patch_soilcarbon_to_land_patch_soilcarbon_int32 output_decomp_base_patch_soilcarbon_real32 => io_decomp%patch_soilcarbon_to_land_patch_soilcarbon_real32 output_decomp_base_patch_soilcarbon_real64 => io_decomp%patch_soilcarbon_to_land_patch_soilcarbon_real64 else call cable_abort("Error: Unable to determine output grid type", __FILE__, __LINE__) end if call cable_output_add_variable( & name="swilt", & dims=[base_dims, "patch"], & var_type=CABLE_NETCDF_FLOAT, & units="1", & long_name="", & range=ranges%swilt, & active=output%swilt .and. (output%patch .OR. patchout%swilt), & parameter=.true., & decomp=output_decomp_base_patch_real32, & aggregator=new_aggregator( & source_data=soil%swilt, & method="point" & ) & ) call cable_output_add_variable( & name="swilt", & dims=[base_dims], & var_type=CABLE_NETCDF_FLOAT, & units="1", & long_name="", & range=ranges%swilt, & active=output%swilt .and. .not. (output%patch .OR. patchout%swilt), & parameter=.true., & reduction_method="grid_cell_average", & decomp=output_decomp_base_real32, & aggregator=new_aggregator( & source_data=soil%swilt, & method="point" & ) & ) call cable_output_add_variable( & name="albsoil", & dims=[base_dims, "patch", "rad"], & var_type=CABLE_NETCDF_FLOAT, & units="1", & long_name="", & range=ranges%albsoil, & active=output%albsoil .and. (output%patch .OR. patchout%albsoil), & parameter=.true., & decomp=output_decomp_base_patch_rad_real32, & aggregator=new_aggregator( & source_data=soil%albsoil, & method="point" & ) & ) call cable_output_add_variable( & name="albsoil", & dims=[base_dims, "rad"], & var_type=CABLE_NETCDF_FLOAT, & units="1", & long_name="", & range=ranges%albsoil, & active=output%albsoil .and. .not. (output%patch .OR. patchout%albsoil), & parameter=.true., & reduction_method="grid_cell_average", & decomp=output_decomp_base_rad_real32, & aggregator=new_aggregator( & source_data=soil%albsoil, & method="point" & ) & ) call cable_output_add_variable( & name="Qh", & dims=[base_dims, "patch", "time"], & var_type=CABLE_NETCDF_FLOAT, & units="W/m^2", & long_name="Surface sensible heat flux", & range=ranges%Qh, & active=output%Qh .and. (output%patch .OR. patchout%Qh), & decomp=output_decomp_base_patch_real32, & aggregator=new_aggregator( & source_data=canopy%fh, & method="mean" & ) & ) call cable_output_add_variable( & name="Qh", & dims=[base_dims, "time"], & var_type=CABLE_NETCDF_FLOAT, & units="W/m^2", & long_name="Surface sensible heat flux", & range=ranges%Qh, & active=output%Qh .and. .not. (output%patch .OR. patchout%Qh), & reduction_method="grid_cell_average", & decomp=output_decomp_base_real32, & aggregator=new_aggregator( & source_data=canopy%fh, & method="mean" & ) & ) call cable_output_add_variable( & name="Tmx", & dims=[base_dims, "patch", "time"], & var_type=CABLE_NETCDF_FLOAT, & units="oC", & long_name="averaged daily maximum screen-level T", & active=( & output%Tex .and. & output%averaging == "monthly" .and. & (output%patch .OR. patchout%Tex) & ), & decomp=output_decomp_base_patch_real32, & range=ranges%Tscrn, & accumulation_frequency="daily", & aggregator=new_aggregator( & source_data=canopy%tscrn_max_daily%aggregated_data, & method="mean" & ) & ) call cable_output_add_variable( & name="Tmx", & dims=[base_dims, "time"], & var_type=CABLE_NETCDF_FLOAT, & units="oC", & long_name="averaged daily maximum screen-level T", & active=( & output%Tex .and. & output%averaging == "monthly" .and. & .not. (output%patch .OR. patchout%Tex) & ), & reduction_method="grid_cell_average", & decomp=output_decomp_base_real32, & range=ranges%Tscrn, & accumulation_frequency="daily", & aggregator=new_aggregator( & source_data=canopy%tscrn_max_daily%aggregated_data, & method="mean" & ) & ) end subroutine cable_output_definitions_set end module