Browse Source

This in combination with 877ec0c0b0 fixes #1.

Variables which are not sent uniformly to the bottom model
are not uniformly sent to the atmosphere. In that case they are averaged.

Since commit 877ec0c0b0 the averaging
is done directly before sending.
Thus it is now removed from flux-calculating routines.

The averaging is also done on the u- and v-grid. For that purpose
the fraction of area variable has to be regridded.
This should be switched on the flux_calculator.nml from now on.
3-reduce-debug-output
Sven Karsten 2 years ago
parent
commit
dae0261616
  1. 23
      src/flux_calculator.F90
  2. 21
      src/flux_calculator_calculate.F90

23
src/flux_calculator.F90

@ -689,8 +689,13 @@ ENDIF
myname = name_send_t(j)
IF (trim(myname) /= 'none') THEN
IF (send_to_atmos_t(j)) THEN
CALL add_output_field(myname, 'A', 0, 1, num_surface_types, grid_size(1), .TRUE., val_flux_t(j), &
IF (send_to_bottom_t(my_bottom_model,j)) THEN
CALL add_output_field(myname, 'A', 0, 1, num_surface_types, grid_size(1), send_uniform_t(my_bottom_model,j), val_flux_t(j), &
local_field, num_input_fields, input_field, num_output_fields, output_field)
ELSE
CALL add_output_field(myname, 'A', 0, 1, num_surface_types, grid_size(1), .FALSE., val_flux_t(j), &
local_field, num_input_fields, input_field, num_output_fields, output_field)
ENDIF
ENDIF
IF (send_to_bottom_t(my_bottom_model,j)) THEN
IF (send_uniform_t(my_bottom_model,j)) THEN
@ -707,8 +712,13 @@ ENDIF
myname = name_send_u(j)
IF (trim(myname) /= 'none') THEN
IF (send_to_atmos_u(j)) THEN
CALL add_output_field(myname, 'A', 0, 2, num_surface_types, grid_size(2), .TRUE., val_flux_u(j), &
IF (send_to_bottom_u(my_bottom_model,j)) THEN
CALL add_output_field(myname, 'A', 0, 2, num_surface_types, grid_size(2), send_uniform_u(my_bottom_model,j), val_flux_u(j), &
local_field, num_input_fields, input_field, num_output_fields, output_field)
ELSE
CALL add_output_field(myname, 'A', 0, 2, num_surface_types, grid_size(2), .TRUE., val_flux_u(j), &
local_field, num_input_fields, input_field, num_output_fields, output_field)
ENDIF
ENDIF
IF (send_to_bottom_u(my_bottom_model,j)) THEN
IF (send_uniform_u(my_bottom_model,j)) THEN
@ -725,8 +735,13 @@ ENDIF
myname = name_send_v(j)
IF (trim(myname) /= 'none') THEN
IF (send_to_atmos_v(j)) THEN
CALL add_output_field(myname, 'A', 0, 3, num_surface_types, grid_size(3), .TRUE., val_flux_v(j), &
IF (send_to_bottom_v(my_bottom_model,j)) THEN
CALL add_output_field(myname, 'A', 0, 3, num_surface_types, grid_size(3), send_uniform_v(my_bottom_model,j), val_flux_v(j), &
local_field, num_input_fields, input_field, num_output_fields, output_field)
ELSE
CALL add_output_field(myname, 'A', 0, 3, num_surface_types, grid_size(3), .TRUE., val_flux_v(j), &
local_field, num_input_fields, input_field, num_output_fields, output_field)
ENDIF
ENDIF
IF (send_to_bottom_v(my_bottom_model,j)) THEN
IF (send_uniform_v(my_bottom_model,j)) THEN
@ -975,8 +990,8 @@ ENDIF
IF (output_field(j)%surface_type == 0) THEN
IF (ASSOCIATED(local_field(0,i)%var(output_field(j)%idx)%field) .AND. &
ASSOCIATED(local_field(2,i)%var(output_field(j)%idx)%field) ) THEN
CALL average_across_surface_types(i,output_field(j)%idx,num_surface_types,grid_size,local_field)
WRITE (w_unit,*) ' Averaging ',output_field(j)%name,' at runtime=',current_time,' seconds.'
CALL average_across_surface_types(i,output_field(j)%idx,num_surface_types,grid_size,local_field)
ENDIF
ENDIF
IF (verbosity_level >= 2) THEN

21
src/flux_calculator_calculate.F90

@ -77,7 +77,7 @@ MODULE flux_calculator_calculate
ENDIF
ENDIF
ENDDO
CALL average_across_surface_types(1,idx_MEVA,num_surface_types,grid_size,local_field)
!CALL average_across_surface_types(1,idx_MEVA,num_surface_types,grid_size,local_field)
END SUBROUTINE calc_flux_mass_evap
!!!!!!!!!! HEAT FLUXES !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -111,7 +111,7 @@ MODULE flux_calculator_calculate
ENDIF
ENDIF
ENDDO
CALL average_across_surface_types(1,idx_HLAT,num_surface_types,grid_size,local_field)
!CALL average_across_surface_types(1,idx_HLAT,num_surface_types,grid_size,local_field)
END SUBROUTINE calc_flux_heat_latent
SUBROUTINE calc_flux_heat_sensible(my_bottom_model, num_surface_types, methods, grid_size, local_field)
@ -145,7 +145,7 @@ MODULE flux_calculator_calculate
ENDIF
ENDIF
ENDDO
CALL average_across_surface_types(1,idx_HSEN,num_surface_types,grid_size,local_field)
!CALL average_across_surface_types(1,idx_HSEN,num_surface_types,grid_size,local_field)
END SUBROUTINE calc_flux_heat_sensible
!!!!!!!!!! MOMENTUM FLUXES !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -182,7 +182,7 @@ MODULE flux_calculator_calculate
ENDIF
ENDIF
ENDDO
CALL average_across_surface_types(1,idx_UMOM,num_surface_types,grid_size,local_field)
!CALL average_across_surface_types(1,idx_UMOM,num_surface_types,grid_size,local_field)
END SUBROUTINE calc_flux_momentum_east
SUBROUTINE calc_flux_momentum_north(my_bottom_model, num_surface_types, which_grid, methods, grid_size, local_field)
@ -217,7 +217,7 @@ MODULE flux_calculator_calculate
ENDIF
ENDIF
ENDDO
CALL average_across_surface_types(1,idx_VMOM,num_surface_types,grid_size,local_field)
!CALL average_across_surface_types(1,idx_VMOM,num_surface_types,grid_size,local_field)
END SUBROUTINE calc_flux_momentum_north
!!!!!!!!!! RADIATION FLUXES !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -246,7 +246,7 @@ MODULE flux_calculator_calculate
ENDIF
ENDIF
ENDDO
CALL average_across_surface_types(1,idx_RBBR,num_surface_types,grid_size,local_field)
!CALL average_across_surface_types(1,idx_RBBR,num_surface_types,grid_size,local_field)
END SUBROUTINE calc_flux_radiation_blackbody
SUBROUTINE distribute_shortwave_radiation_flux(my_bottom_model, num_surface_types, grid_size, local_field)
@ -279,13 +279,12 @@ MODULE flux_calculator_calculate
TYPE(local_fields_type), DIMENSION(0:,:), INTENT(INOUT) :: local_field
INTEGER :: i,j
IF (local_field(0,1)%var(my_idx)%allocated) THEN
WRITE (w_unit,*) "Really averaging"
local_field(0,1)%var(my_idx)%field=0.0
IF (local_field(0,which_grid)%var(my_idx)%allocated) THEN
local_field(0,which_grid)%var(my_idx)%field=0.0
DO i=1,num_surface_types
DO j=1,grid_size(which_grid)
local_field(0,1)%var(my_idx)%field(j) = local_field(0,1)%var(my_idx)%field(j) + &
local_field(i,1)%var(my_idx)%field(j)*local_field(i,1)%var(idx_FARE)%field(j)
local_field(0,which_grid)%var(my_idx)%field(j) = local_field(0,which_grid)%var(my_idx)%field(j) + &
local_field(i,which_grid)%var(my_idx)%field(j)*local_field(i,which_grid)%var(idx_FARE)%field(j)
ENDDO
ENDDO
ENDIF

Loading…
Cancel
Save