Browse Source

Renamed albedo sent from atmosphere as workaround.

Seemingly the flux_calculator has a problem if it sends and receives a
variable with the same name to/from atmosphere.
Maybe this problem can be solved more elegantly.
distribute-radiation-on-surface-types
Sven Karsten 2 years ago
parent
commit
225cab436a
  1. 16
      src/flux_calculator_basic.F90
  2. 3
      src/flux_calculator_calculate.F90

16
src/flux_calculator_basic.F90

@ -39,9 +39,9 @@ MODULE flux_calculator_basic
! (3) declare idx_varname !
! (4) add a line in init_varname_idx !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
INTEGER, PARAMETER :: MAX_VARNAMES = 30
INTEGER, PARAMETER :: MAX_VARNAMES = 31
CHARACTER(len=4), PARAMETER, DIMENSION(MAX_VARNAMES) :: varnames = [ &
'ALBE', 'AMOI', 'AMOM', 'FARE', 'FICE', 'PATM', 'PSUR', &
'ALBE', 'ALBA', 'AMOI', 'AMOM', 'FARE', 'FICE', 'PATM', 'PSUR', &
'QATM', 'TATM', 'TSUR', 'UATM', 'VATM', 'U10M', 'V10M', & ! variables read in
'QSUR', & ! auxiliary variables calculated
'HLAT', 'HSEN', & ! heat fluxes
@ -49,7 +49,7 @@ MODULE flux_calculator_basic
'RBBR', 'RLWD', 'RLWU', 'RSID', 'RSIU', 'RSIN', 'RSDD', & ! radiation fluxes, the last are: Shortwave_Indirect_Down, Shortwave_Indirect_Up, Shortwave_Indirect_Net, Shortwave_Direct_Down
'UMOM', 'VMOM'] ! momentum fluxes
INTEGER :: idx_ALBE, idx_AMOI, idx_AMOM, idx_FARE, idx_FICE, idx_PATM, idx_PSUR
INTEGER :: idx_ALBE, idx_ALBA, idx_AMOI, idx_AMOM, idx_FARE, idx_FICE, idx_PATM, idx_PSUR
INTEGER :: idx_QATM, idx_TATM, idx_TSUR, idx_UATM, idx_VATM, idx_U10M, idx_V10M
INTEGER :: idx_QSUR
INTEGER :: idx_HLAT, idx_HSEN
@ -133,7 +133,7 @@ MODULE flux_calculator_basic
input_field(num_input_fields)%which_grid = which_grid
input_field(num_input_fields)%field => local_field%var(i)%field
input_field(num_input_fields)%early=.FALSE.
IF ((myname=="FARE") .OR. (myname=="TSUR") .OR. (myname=="FICE") .OR. ((myname=="ALBE") .AND. (my_letter /= 'A'))) THEN
IF ((myname=="FARE") .OR. (myname=="TSUR") .OR. (myname=="ALBE")) THEN
input_field(num_input_fields)%early=.TRUE.
ENDIF
input_field(num_input_fields)%surface_type = surface_type
@ -173,11 +173,6 @@ MODULE flux_calculator_basic
DO i=1,num_input_fields
IF (trim(input_field(i)%name)=="R"//my_letter//myname//appendstring) found=.TRUE.
ENDDO
IF (found) THEN
IF((trim(myname) == "ALBE") .AND. (trim(my_letter) == 'A')) THEN
found = .FALSE.
ENDIF
ENDIF
IF (.NOT. found) THEN ! Okay field does not come as input
DO i=1,MAX_VARNAMES
IF (varnames(i) == myname) THEN
@ -258,6 +253,8 @@ MODULE flux_calculator_basic
IF ((myname=="RBBR") .OR. (myname=="TSUR") .OR. (myname=="FICE") .OR. (myname=="ALBE")) THEN
output_field(num_output_fields)%early=.TRUE.
ENDIF
output_field(num_output_fields)%surface_type = surface_type
output_field(num_output_fields)%idx = i
ENDIF
ENDIF
ENDDO
@ -513,6 +510,7 @@ MODULE flux_calculator_basic
DO i=1,MAX_VARNAMES
! INPUT VARIABLES:
IF (varnames(i) == 'ALBE') idx_ALBE = i ! Albedo of the surface (1)
IF (varnames(i) == 'ALBA') idx_ALBA = i ! averaged Albedo from atmosphere (1)
IF (varnames(i) == 'AMOI') idx_AMOI = i ! Diffusion coefficient for moisture (1)
IF (varnames(i) == 'AMOM') idx_AMOM = i ! Diffusion coefficient for momentum (1)
IF (varnames(i) == 'FARE') idx_FARE = i ! Fraction of grid cell area covered by this surface_type (1)

3
src/flux_calculator_calculate.F90

@ -262,7 +262,7 @@ MODULE flux_calculator_calculate
DO j=1,grid_size(1)
CALL distribute_radiation_flux(local_field(i,1)%var(idx_RSDD)%field(j), &
local_field(0,1)%var(idx_RSDD)%field(j), &
local_field(0,1)%var(idx_ALBE)%field(j), &
local_field(0,1)%var(idx_ALBA)%field(j), &
local_field(i,1)%var(idx_ALBE)%field(j), &
local_field(i,1)%var(idx_FARE)%field(j))
ENDDO
@ -281,6 +281,7 @@ MODULE flux_calculator_calculate
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
DO i=1,num_surface_types
DO j=1,grid_size(which_grid)

Loading…
Cancel
Save