Index: /palm/trunk/SOURCE/flow_statistics.f90
===================================================================
--- /palm/trunk/SOURCE/flow_statistics.f90	(revision 2752)
+++ /palm/trunk/SOURCE/flow_statistics.f90	(revision 2753)
@@ -25,4 +25,7 @@
 ! -----------------
 ! $Id$
+! Tile approach for spectral albedo implemented. 
+! 
+! 2718 2018-01-02 08:49:38Z maronga
 ! Corrected "Former revisions" section
 ! 
@@ -1165,11 +1168,11 @@
                       m = surf_def_h(0)%start_index(j,i)
                       sums_l(nzb,108,tn)  = sums_l(nzb,108,tn)  +              &
-                                           surf_def_h(0)%rrtm_aldif(m) * rmask(j,i,sr)
+                                   surf_def_h(0)%rrtm_aldif(0,m) * rmask(j,i,sr)
                       sums_l(nzb,109,tn) = sums_l(nzb,109,tn)  +               &
-                                           surf_def_h(0)%rrtm_aldir(m) * rmask(j,i,sr)
+                                   surf_def_h(0)%rrtm_aldir(0,m) * rmask(j,i,sr)
                       sums_l(nzb,110,tn) = sums_l(nzb,110,tn)  +               &
-                                           surf_def_h(0)%rrtm_asdif(m) * rmask(j,i,sr)
+                                   surf_def_h(0)%rrtm_asdif(0,m) * rmask(j,i,sr)
                       sums_l(nzb,111,tn) = sums_l(nzb,111,tn)  +               &
-                                           surf_def_h(0)%rrtm_asdir(m) * rmask(j,i,sr)
+                                   surf_def_h(0)%rrtm_asdir(0,m) * rmask(j,i,sr)
                    ENDIF
                    IF ( surf_lsm_h%end_index(j,i) >=                           &
@@ -1177,11 +1180,15 @@
                       m = surf_lsm_h%start_index(j,i)
                       sums_l(nzb,108,tn)  = sums_l(nzb,108,tn)  +              &
-                                           surf_lsm_h%rrtm_aldif(m) * rmask(j,i,sr)
+                               SUM( surf_lsm_h%frac(:,m) *                     &
+                                    surf_lsm_h%rrtm_aldif(:,m) ) * rmask(j,i,sr)
                       sums_l(nzb,109,tn) = sums_l(nzb,109,tn)  +               &
-                                           surf_lsm_h%rrtm_aldir(m) * rmask(j,i,sr)
+                               SUM( surf_lsm_h%frac(:,m) *                     &
+                                    surf_lsm_h%rrtm_aldir(:,m) ) * rmask(j,i,sr)
                       sums_l(nzb,110,tn) = sums_l(nzb,110,tn)  +               &
-                                           surf_lsm_h%rrtm_asdif(m) * rmask(j,i,sr)
+                               SUM( surf_lsm_h%frac(:,m) *                     &
+                                    surf_lsm_h%rrtm_asdif(:,m) ) * rmask(j,i,sr)
                       sums_l(nzb,111,tn) = sums_l(nzb,111,tn)  +               &
-                                           surf_lsm_h%rrtm_asdir(m) * rmask(j,i,sr)
+                               SUM( surf_lsm_h%frac(:,m) *                     &
+                                    surf_lsm_h%rrtm_asdir(:,m) ) * rmask(j,i,sr)
                    ENDIF
                    IF ( surf_usm_h%end_index(j,i) >=                           &
@@ -1189,11 +1196,15 @@
                       m = surf_usm_h%start_index(j,i)
                       sums_l(nzb,108,tn)  = sums_l(nzb,108,tn)  +              &
-                                           surf_usm_h%rrtm_aldif(m) * rmask(j,i,sr)
+                               SUM( surf_usm_h%frac(:,m) *                     &
+                                    surf_usm_h%rrtm_aldif(:,m) ) * rmask(j,i,sr)
                       sums_l(nzb,109,tn) = sums_l(nzb,109,tn)  +               &
-                                           surf_usm_h%rrtm_aldir(m) * rmask(j,i,sr)
+                               SUM( surf_usm_h%frac(:,m) *                     &
+                                    surf_usm_h%rrtm_aldir(:,m) ) * rmask(j,i,sr)
                       sums_l(nzb,110,tn) = sums_l(nzb,110,tn)  +               &
-                                           surf_usm_h%rrtm_asdif(m) * rmask(j,i,sr)
+                               SUM( surf_usm_h%frac(:,m) *                     &
+                                    surf_usm_h%rrtm_asdif(:,m) ) * rmask(j,i,sr)
                       sums_l(nzb,111,tn) = sums_l(nzb,111,tn)  +               &
-                                           surf_usm_h%rrtm_asdir(m) * rmask(j,i,sr)
+                               SUM( surf_usm_h%frac(:,m) *                     &
+                                    surf_usm_h%rrtm_asdir(:,m) ) * rmask(j,i,sr)
                    ENDIF
 
Index: /palm/trunk/SOURCE/radiation_model_mod.f90
===================================================================
--- /palm/trunk/SOURCE/radiation_model_mod.f90	(revision 2752)
+++ /palm/trunk/SOURCE/radiation_model_mod.f90	(revision 2753)
@@ -25,4 +25,7 @@
 ! -----------------
 ! $Id$
+! Tile approach for spectral albedo implemented. 
+! 
+! 2746 2018-01-15 12:06:04Z suehring
 ! Move flag plant canopy to modules
 ! 
@@ -1245,5 +1248,5 @@
 
        INTEGER(iwp) ::  i         !< running index x-direction 
-       INTEGER(iwp) ::  ind_type  !< index of natural land-surface type with respect to albedo array 
+       INTEGER(iwp) ::  ind_type  !< running index for subgrid-surface tiles 
        INTEGER(iwp) ::  ioff      !< offset in x between surface element reference grid point in atmosphere and actual surface 
        INTEGER(iwp) ::  j         !< running index y-direction 
@@ -1669,31 +1672,34 @@
 #if defined ( __rrtmg )
 !
-!--       Allocate albedos for short/longwave radiation, horizontal surfaces.
-          ALLOCATE ( surf_def_h(0)%aldif(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%aldir(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%asdif(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%asdir(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%rrtm_aldif(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%rrtm_aldir(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%rrtm_asdif(1:surf_def_h(0)%ns) )
-          ALLOCATE ( surf_def_h(0)%rrtm_asdir(1:surf_def_h(0)%ns) )
-
-          ALLOCATE ( surf_lsm_h%aldif(1:surf_lsm_h%ns)       )
-          ALLOCATE ( surf_lsm_h%aldir(1:surf_lsm_h%ns)       )
-          ALLOCATE ( surf_lsm_h%asdif(1:surf_lsm_h%ns)       )
-          ALLOCATE ( surf_lsm_h%asdir(1:surf_lsm_h%ns)       )
-          ALLOCATE ( surf_lsm_h%rrtm_aldif(1:surf_lsm_h%ns)  )
-          ALLOCATE ( surf_lsm_h%rrtm_aldir(1:surf_lsm_h%ns)  )
-          ALLOCATE ( surf_lsm_h%rrtm_asdif(1:surf_lsm_h%ns)  )
-          ALLOCATE ( surf_lsm_h%rrtm_asdir(1:surf_lsm_h%ns)  )
-
-          ALLOCATE ( surf_usm_h%aldif(1:surf_usm_h%ns)       )
-          ALLOCATE ( surf_usm_h%aldir(1:surf_usm_h%ns)       )
-          ALLOCATE ( surf_usm_h%asdif(1:surf_usm_h%ns)       )
-          ALLOCATE ( surf_usm_h%asdir(1:surf_usm_h%ns)       )
-          ALLOCATE ( surf_usm_h%rrtm_aldif(1:surf_usm_h%ns)  )
-          ALLOCATE ( surf_usm_h%rrtm_aldir(1:surf_usm_h%ns)  )
-          ALLOCATE ( surf_usm_h%rrtm_asdif(1:surf_usm_h%ns)  )
-          ALLOCATE ( surf_usm_h%rrtm_asdir(1:surf_usm_h%ns)  )
+!--       Allocate albedos for short/longwave radiation, horizontal surfaces
+!--       for wall/green/window (USM) or vegetation/pavement/water surfaces
+!--       (LSM). Please note, for default-type surfaces no tile approach is 
+!--       applied. 
+          ALLOCATE ( surf_def_h(0)%aldif(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%aldir(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%asdif(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%asdir(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%rrtm_aldif(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%rrtm_aldir(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%rrtm_asdif(0:0,1:surf_def_h(0)%ns) )
+          ALLOCATE ( surf_def_h(0)%rrtm_asdir(0:0,1:surf_def_h(0)%ns) )
+
+          ALLOCATE ( surf_lsm_h%aldif(0:2,1:surf_lsm_h%ns)       )
+          ALLOCATE ( surf_lsm_h%aldir(0:2,1:surf_lsm_h%ns)       )
+          ALLOCATE ( surf_lsm_h%asdif(0:2,1:surf_lsm_h%ns)       )
+          ALLOCATE ( surf_lsm_h%asdir(0:2,1:surf_lsm_h%ns)       )
+          ALLOCATE ( surf_lsm_h%rrtm_aldif(0:2,1:surf_lsm_h%ns)  )
+          ALLOCATE ( surf_lsm_h%rrtm_aldir(0:2,1:surf_lsm_h%ns)  )
+          ALLOCATE ( surf_lsm_h%rrtm_asdif(0:2,1:surf_lsm_h%ns)  )
+          ALLOCATE ( surf_lsm_h%rrtm_asdir(0:2,1:surf_lsm_h%ns)  )
+
+          ALLOCATE ( surf_usm_h%aldif(0:2,1:surf_usm_h%ns)       )
+          ALLOCATE ( surf_usm_h%aldir(0:2,1:surf_usm_h%ns)       )
+          ALLOCATE ( surf_usm_h%asdif(0:2,1:surf_usm_h%ns)       )
+          ALLOCATE ( surf_usm_h%asdir(0:2,1:surf_usm_h%ns)       )
+          ALLOCATE ( surf_usm_h%rrtm_aldif(0:2,1:surf_usm_h%ns)  )
+          ALLOCATE ( surf_usm_h%rrtm_aldir(0:2,1:surf_usm_h%ns)  )
+          ALLOCATE ( surf_usm_h%rrtm_asdif(0:2,1:surf_usm_h%ns)  )
+          ALLOCATE ( surf_usm_h%rrtm_asdir(0:2,1:surf_usm_h%ns)  )
 
 !
@@ -1710,38 +1716,38 @@
 !--       Allocate albedos for short/longwave radiation, vertical surfaces 
           DO  l = 0, 3
-             ALLOCATE ( surf_def_v(l)%aldif(1:surf_def_v(l)%ns)      )
-             ALLOCATE ( surf_def_v(l)%aldir(1:surf_def_v(l)%ns)      )
-             ALLOCATE ( surf_def_v(l)%asdif(1:surf_def_v(l)%ns)      )
-             ALLOCATE ( surf_def_v(l)%asdir(1:surf_def_v(l)%ns)      )
-
-             ALLOCATE ( surf_def_v(l)%rrtm_aldif(1:surf_def_v(l)%ns) )
-             ALLOCATE ( surf_def_v(l)%rrtm_aldir(1:surf_def_v(l)%ns) )
-             ALLOCATE ( surf_def_v(l)%rrtm_asdif(1:surf_def_v(l)%ns) )
-             ALLOCATE ( surf_def_v(l)%rrtm_asdir(1:surf_def_v(l)%ns) )
-
-             ALLOCATE ( surf_lsm_v(l)%aldif(1:surf_lsm_v(l)%ns)      )
-             ALLOCATE ( surf_lsm_v(l)%aldir(1:surf_lsm_v(l)%ns)      )
-             ALLOCATE ( surf_lsm_v(l)%asdif(1:surf_lsm_v(l)%ns)      )
-             ALLOCATE ( surf_lsm_v(l)%asdir(1:surf_lsm_v(l)%ns)      )
-
-             ALLOCATE ( surf_lsm_v(l)%rrtm_aldif(1:surf_lsm_v(l)%ns) )
-             ALLOCATE ( surf_lsm_v(l)%rrtm_aldir(1:surf_lsm_v(l)%ns) )
-             ALLOCATE ( surf_lsm_v(l)%rrtm_asdif(1:surf_lsm_v(l)%ns) )
-             ALLOCATE ( surf_lsm_v(l)%rrtm_asdir(1:surf_lsm_v(l)%ns) )
-
-             ALLOCATE ( surf_usm_v(l)%aldif(1:surf_usm_v(l)%ns)      )
-             ALLOCATE ( surf_usm_v(l)%aldir(1:surf_usm_v(l)%ns)      )
-             ALLOCATE ( surf_usm_v(l)%asdif(1:surf_usm_v(l)%ns)      )
-             ALLOCATE ( surf_usm_v(l)%asdir(1:surf_usm_v(l)%ns)      )
-
-             ALLOCATE ( surf_usm_v(l)%rrtm_aldif(1:surf_usm_v(l)%ns) )
-             ALLOCATE ( surf_usm_v(l)%rrtm_aldir(1:surf_usm_v(l)%ns) )
-             ALLOCATE ( surf_usm_v(l)%rrtm_asdif(1:surf_usm_v(l)%ns) )
-             ALLOCATE ( surf_usm_v(l)%rrtm_asdir(1:surf_usm_v(l)%ns) )
+             ALLOCATE ( surf_def_v(l)%aldif(0:0,1:surf_def_v(l)%ns)      )
+             ALLOCATE ( surf_def_v(l)%aldir(0:0,1:surf_def_v(l)%ns)      )
+             ALLOCATE ( surf_def_v(l)%asdif(0:0,1:surf_def_v(l)%ns)      )
+             ALLOCATE ( surf_def_v(l)%asdir(0:0,1:surf_def_v(l)%ns)      )
+
+             ALLOCATE ( surf_def_v(l)%rrtm_aldif(0:0,1:surf_def_v(l)%ns) )
+             ALLOCATE ( surf_def_v(l)%rrtm_aldir(0:0,1:surf_def_v(l)%ns) )
+             ALLOCATE ( surf_def_v(l)%rrtm_asdif(0:0,1:surf_def_v(l)%ns) )
+             ALLOCATE ( surf_def_v(l)%rrtm_asdir(0:0,1:surf_def_v(l)%ns) )
+
+             ALLOCATE ( surf_lsm_v(l)%aldif(0:2,1:surf_lsm_v(l)%ns)      )
+             ALLOCATE ( surf_lsm_v(l)%aldir(0:2,1:surf_lsm_v(l)%ns)      )
+             ALLOCATE ( surf_lsm_v(l)%asdif(0:2,1:surf_lsm_v(l)%ns)      )
+             ALLOCATE ( surf_lsm_v(l)%asdir(0:2,1:surf_lsm_v(l)%ns)      )
+
+             ALLOCATE ( surf_lsm_v(l)%rrtm_aldif(0:2,1:surf_lsm_v(l)%ns) )
+             ALLOCATE ( surf_lsm_v(l)%rrtm_aldir(0:2,1:surf_lsm_v(l)%ns) )
+             ALLOCATE ( surf_lsm_v(l)%rrtm_asdif(0:2,1:surf_lsm_v(l)%ns) )
+             ALLOCATE ( surf_lsm_v(l)%rrtm_asdir(0:2,1:surf_lsm_v(l)%ns) )
+
+             ALLOCATE ( surf_usm_v(l)%aldif(0:2,1:surf_usm_v(l)%ns)      )
+             ALLOCATE ( surf_usm_v(l)%aldir(0:2,1:surf_usm_v(l)%ns)      )
+             ALLOCATE ( surf_usm_v(l)%asdif(0:2,1:surf_usm_v(l)%ns)      )
+             ALLOCATE ( surf_usm_v(l)%asdir(0:2,1:surf_usm_v(l)%ns)      )
+
+             ALLOCATE ( surf_usm_v(l)%rrtm_aldif(0:2,1:surf_usm_v(l)%ns) )
+             ALLOCATE ( surf_usm_v(l)%rrtm_aldir(0:2,1:surf_usm_v(l)%ns) )
+             ALLOCATE ( surf_usm_v(l)%rrtm_asdif(0:2,1:surf_usm_v(l)%ns) )
+             ALLOCATE ( surf_usm_v(l)%rrtm_asdir(0:2,1:surf_usm_v(l)%ns) )
 !
 !--          Allocate broadband albedo (temporary for the current radiation
 !--          implementations)
              IF ( .NOT. ALLOCATED( surf_def_v(l)%albedo ) )                    &
-                ALLOCATE( surf_def_v(l)%albedo(0,1:surf_def_v(l)%ns) )
+                ALLOCATE( surf_def_v(l)%albedo(0:0,1:surf_def_v(l)%ns) )
              IF ( .NOT. ALLOCATED( surf_lsm_v(l)%albedo ) )                    &
                 ALLOCATE( surf_lsm_v(l)%albedo(0:2,1:surf_lsm_v(l)%ns) )
@@ -1752,5 +1758,6 @@
 !
 !--       Level 1 initialization of spectral albedos via namelist 
-!--       paramters
+!--       paramters. Please note, this case all surface tiles are initialized 
+!--       the same. 
           IF ( surf_def_h(0)%ns > 0 )  THEN
              surf_def_h(0)%aldif  = albedo_lw_dif
@@ -1803,14 +1810,16 @@
 !
 !--       Level 2 initialization of spectral albedos via albedo_type. 
-!--       Only diffusive albedos (why?)
+!--       Please note, for natural- and urban-type surfaces, a tile approach 
+!--       is applied so that the resulting albedo is calculated via the weighted 
+!--       average of respective surface fractions. 
           DO  m = 1, surf_def_h(0)%ns
              IF ( surf_def_h(0)%albedo_type(0,m) /= 0 )  THEN
-                surf_def_h(0)%aldif(m) =                                       &
+                surf_def_h(0)%aldif(0,m) =                                     &
                                 albedo_pars(0,surf_def_h(0)%albedo_type(0,m))
-                surf_def_h(0)%asdif(m) =                                       &
+                surf_def_h(0)%asdif(0,m) =                                     &
                                 albedo_pars(1,surf_def_h(0)%albedo_type(0,m))
-                surf_def_h(0)%aldir(m) =                                       &
+                surf_def_h(0)%aldir(0,m) =                                     &
                                 albedo_pars(0,surf_def_h(0)%albedo_type(0,m))
-                surf_def_h(0)%asdir(m) =                                       &
+                surf_def_h(0)%asdir(0,m) =                                     &
                                 albedo_pars(1,surf_def_h(0)%albedo_type(0,m))
                 surf_def_h(0)%albedo(0,m) =                                    &
@@ -1818,23 +1827,22 @@
              ENDIF
           ENDDO
+
           DO  m = 1, surf_lsm_h%ns
 !
-!--          Determine surface type
-             IF ( surf_lsm_h%vegetation_surface(m) )  ind_type = 0
-             IF ( surf_lsm_h%pavement_surface(m)   )  ind_type = 1
-             IF ( surf_lsm_h%water_surface(m)      )  ind_type = 2
-
-             IF ( surf_lsm_h%albedo_type(ind_type,m) /= 0 )  THEN
-                surf_lsm_h%aldif(m) =                                          &
+!--          Spectral albedos for vegetation/pavement/water surfaces
+             DO  ind_type = 0, 2
+                IF ( surf_lsm_h%albedo_type(ind_type,m) /= 0 )  THEN
+                   surf_lsm_h%aldif(ind_type,m) =                              &
                                albedo_pars(0,surf_lsm_h%albedo_type(ind_type,m))
-                surf_lsm_h%asdif(m) =                                          &
+                   surf_lsm_h%asdif(ind_type,m) =                              &
                                albedo_pars(1,surf_lsm_h%albedo_type(ind_type,m))
-                surf_lsm_h%aldir(m) =                                          &
+                   surf_lsm_h%aldir(ind_type,m) =                              &
                                albedo_pars(0,surf_lsm_h%albedo_type(ind_type,m))
-                surf_lsm_h%asdir(m) =                                          &
+                   surf_lsm_h%asdir(ind_type,m) =                              &
                                albedo_pars(1,surf_lsm_h%albedo_type(ind_type,m))
-                surf_lsm_h%albedo(:,m) =                                       &
+                   surf_lsm_h%albedo(ind_type,m) =                             &
                                albedo_pars(2,surf_lsm_h%albedo_type(ind_type,m))
-             ENDIF
+                ENDIF
+             ENDDO
 
           ENDDO
@@ -1842,77 +1850,77 @@
           DO  m = 1, surf_usm_h%ns
 !
-!--          Initialize spectral albedos for urban-type surfaces. Please note,
-!--          for urban surfaces a tile approach is applied, so that the 
-!--          resulting albedo should be calculated via the weighted average of  
-!--          respective surface fractions. However, for the moment the albedo
-!--          is set to the wall-surface value. 
-             IF ( surf_usm_h%albedo_type(0,m) /= 0 )  THEN
-                surf_usm_h%aldif(m) =                                          &
-                                albedo_pars(0,surf_usm_h%albedo_type(0,m))
-                surf_usm_h%asdif(m) =                                          &
-                                albedo_pars(1,surf_usm_h%albedo_type(0,m))
-                surf_usm_h%aldir(m) =                                          &
-                               albedo_pars(0,surf_usm_h%albedo_type(0,m))
-                surf_usm_h%asdir(m) =                                          &
-                               albedo_pars(1,surf_usm_h%albedo_type(0,m))
-                surf_usm_h%albedo(:,m) =                                       &
-                                albedo_pars(2,surf_usm_h%albedo_type(0,m))
-             ENDIF
+!--          Spectral albedos for wall/green/window surfaces
+             DO  ind_type = 0, 2
+                IF ( surf_usm_h%albedo_type(ind_type,m) /= 0 )  THEN
+                   surf_usm_h%aldif(ind_type,m) =                              &
+                               albedo_pars(0,surf_usm_h%albedo_type(ind_type,m))
+                   surf_usm_h%asdif(ind_type,m) =                              &
+                               albedo_pars(1,surf_usm_h%albedo_type(ind_type,m))
+                   surf_usm_h%aldir(ind_type,m) =                              &
+                               albedo_pars(0,surf_usm_h%albedo_type(ind_type,m))
+                   surf_usm_h%asdir(ind_type,m) =                              &
+                               albedo_pars(1,surf_usm_h%albedo_type(ind_type,m))
+                   surf_usm_h%albedo(ind_type,m) =                             &
+                               albedo_pars(2,surf_usm_h%albedo_type(ind_type,m))
+                ENDIF
+             ENDDO
+
           ENDDO
 
           DO l = 0, 3
+
              DO  m = 1, surf_def_v(l)%ns
                 IF ( surf_def_v(l)%albedo_type(0,m) /= 0 )  THEN
-                    surf_def_v(l)%aldif(m) =                                   &
+                    surf_def_v(l)%aldif(0,m) =                                 &
                                albedo_pars(0,surf_def_v(l)%albedo_type(0,m))
-                    surf_def_v(l)%asdif(m) =                                   &
+                    surf_def_v(l)%asdif(0,m) =                                 &
                                albedo_pars(1,surf_def_v(l)%albedo_type(0,m))
-                    surf_def_v(l)%aldir(m) =                                   &
+                    surf_def_v(l)%aldir(0,m) =                                 &
                                albedo_pars(0,surf_def_v(l)%albedo_type(0,m))
-                    surf_def_v(l)%asdir(m) =                                   &
+                    surf_def_v(l)%asdir(0,m) =                                 &
                                albedo_pars(1,surf_def_v(l)%albedo_type(0,m))
-                    surf_def_v(l)%albedo(:,m) =                                &
+                    surf_def_v(l)%albedo(0,m) =                                &
                                albedo_pars(2,surf_def_v(l)%albedo_type(0,m))
                 ENDIF
              ENDDO
+
              DO  m = 1, surf_lsm_v(l)%ns
-                IF ( surf_lsm_v(l)%vegetation_surface(m) )  ind_type = 0
-                IF ( surf_lsm_v(l)%pavement_surface(m)   )  ind_type = 1
-                IF ( surf_lsm_v(l)%water_surface(m)      )  ind_type = 2
-
-                IF ( surf_lsm_v(l)%albedo_type(0,m) /= 0 )  THEN
-                   surf_lsm_v(l)%aldif(m) =                                    &
+!
+!--             Spectral albedos for vegetation/pavement/water surfaces
+                DO  ind_type = 0, 2
+                   IF ( surf_lsm_v(l)%albedo_type(ind_type,m) /= 0 )  THEN
+                      surf_lsm_v(l)%aldif(ind_type,m) =                        &
                             albedo_pars(0,surf_lsm_v(l)%albedo_type(ind_type,m))
-                   surf_lsm_v(l)%asdif(m) =                                    &
+                      surf_lsm_v(l)%asdif(ind_type,m) =                        &
                             albedo_pars(1,surf_lsm_v(l)%albedo_type(ind_type,m))
-                   surf_lsm_v(l)%aldir(m) =                                    &
+                      surf_lsm_v(l)%aldir(ind_type,m) =                        &
                             albedo_pars(0,surf_lsm_v(l)%albedo_type(ind_type,m))
-                   surf_lsm_v(l)%asdir(m) =                                    &
+                      surf_lsm_v(l)%asdir(ind_type,m) =                        &
                             albedo_pars(1,surf_lsm_v(l)%albedo_type(ind_type,m))
-                   surf_lsm_v(l)%albedo(:,m) =                                 &
+                      surf_lsm_v(l)%albedo(ind_type,m) =                       &
                             albedo_pars(2,surf_lsm_v(l)%albedo_type(ind_type,m))
-                ENDIF
-            ENDDO
-
-            DO  m = 1, surf_usm_v(l)%ns
-!
-!--            Initialize spectral albedos for urban-type surfaces. Please note,
-!--            for urban surfaces a tile approach is applied, so that the 
-!--            resulting albedo should be calculated via the weighted average of  
-!--            respective surface fractions. However, for the moment the albedo
-!--            is set to the wall-surface value. 
-               IF ( surf_usm_v(l)%albedo_type(0,m) /= 0 )  THEN
-                  surf_usm_v(l)%aldif(m) =                                    &
-                               albedo_pars(0,surf_usm_v(l)%albedo_type(0,m))
-                  surf_usm_v(l)%asdif(m) =                                    &
-                               albedo_pars(1,surf_usm_v(l)%albedo_type(0,m))
-                  surf_usm_v(l)%aldir(m) =                                    &
-                               albedo_pars(0,surf_usm_v(l)%albedo_type(0,m))
-                  surf_usm_v(l)%asdir(m) =                                    &
-                               albedo_pars(1,surf_usm_v(l)%albedo_type(0,m))
-                  surf_usm_v(l)%albedo(:,m) =                                 &
-                               albedo_pars(2,surf_usm_v(l)%albedo_type(0,m))
-               ENDIF
-            ENDDO
+                   ENDIF
+                ENDDO
+             ENDDO
+
+             DO  m = 1, surf_usm_v(l)%ns
+!
+!--             Spectral albedos for wall/green/window surfaces
+                DO  ind_type = 0, 2
+                   IF ( surf_usm_v(l)%albedo_type(ind_type,m) /= 0 )  THEN
+                      surf_usm_v(l)%aldif(ind_type,m) =                        &
+                            albedo_pars(0,surf_usm_v(l)%albedo_type(ind_type,m))
+                      surf_usm_v(l)%asdif(ind_type,m) =                        &
+                            albedo_pars(1,surf_usm_v(l)%albedo_type(ind_type,m))
+                      surf_usm_v(l)%aldir(ind_type,m) =                        &
+                            albedo_pars(0,surf_usm_v(l)%albedo_type(ind_type,m))
+                      surf_usm_v(l)%asdir(ind_type,m) =                        &
+                            albedo_pars(1,surf_usm_v(l)%albedo_type(ind_type,m))
+                      surf_usm_v(l)%albedo(ind_type,m) =                       &
+                            albedo_pars(2,surf_usm_v(l)%albedo_type(ind_type,m))
+                   ENDIF
+                ENDDO
+
+             ENDDO
           ENDDO
 !
@@ -1930,11 +1938,11 @@
                       surf_def_h(0)%albedo(0,m) = albedo_pars_f%pars_xy(1,j,i)
                    IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )   &
-                      surf_def_h(0)%aldir(m) = albedo_pars_f%pars_xy(1,j,i)
+                      surf_def_h(0)%aldir(0,m) = albedo_pars_f%pars_xy(1,j,i)
                    IF ( albedo_pars_f%pars_xy(2,j,i) /= albedo_pars_f%fill )   &
-                      surf_def_h(0)%aldif(m) = albedo_pars_f%pars_xy(2,j,i)
+                      surf_def_h(0)%aldif(0,m) = albedo_pars_f%pars_xy(2,j,i)
                    IF ( albedo_pars_f%pars_xy(3,j,i) /= albedo_pars_f%fill )   &
-                      surf_def_h(0)%asdir(m) = albedo_pars_f%pars_xy(3,j,i)
+                      surf_def_h(0)%asdir(0,m) = albedo_pars_f%pars_xy(3,j,i)
                    IF ( albedo_pars_f%pars_xy(4,j,i) /= albedo_pars_f%fill )   &
-                      surf_def_h(0)%asdif(m) = albedo_pars_f%pars_xy(4,j,i)
+                      surf_def_h(0)%asdif(0,m) = albedo_pars_f%pars_xy(4,j,i)
                 ENDIF
              ENDDO
@@ -1943,21 +1951,25 @@
                 i = surf_lsm_h%i(m)
                 j = surf_lsm_h%j(m)
-
-                IF ( surf_lsm_h%vegetation_surface(m) )  ind_type = 0
-                IF ( surf_lsm_h%pavement_surface(m)   )  ind_type = 1
-                IF ( surf_lsm_h%water_surface(m)      )  ind_type = 2
-
-                IF ( surf_lsm_h%albedo_type(ind_type,m) == 0 )  THEN
-                   IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )   &
-                      surf_lsm_h%albedo(ind_type,m) = albedo_pars_f%pars_xy(1,j,i)
-                   IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )   &
-                      surf_lsm_h%aldir(m) = albedo_pars_f%pars_xy(1,j,i)
-                   IF ( albedo_pars_f%pars_xy(2,j,i) /= albedo_pars_f%fill )   &
-                      surf_lsm_h%aldif(m) = albedo_pars_f%pars_xy(2,j,i)
-                   IF ( albedo_pars_f%pars_xy(3,j,i) /= albedo_pars_f%fill )   &
-                      surf_lsm_h%asdir(m) = albedo_pars_f%pars_xy(3,j,i)
-                   IF ( albedo_pars_f%pars_xy(4,j,i) /= albedo_pars_f%fill )   &
-                      surf_lsm_h%asdif(m) = albedo_pars_f%pars_xy(4,j,i)
-                ENDIF
+!
+!--             Spectral albedos for vegetation/pavement/water surfaces
+                DO  ind_type = 0, 2
+                   IF ( surf_lsm_h%albedo_type(ind_type,m) == 0 )  THEN
+                      IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )&
+                         surf_lsm_h%albedo(ind_type,m) =                       &
+                                                albedo_pars_f%pars_xy(1,j,i)
+                      IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )&
+                         surf_lsm_h%aldir(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(1,j,i)
+                      IF ( albedo_pars_f%pars_xy(2,j,i) /= albedo_pars_f%fill )&
+                         surf_lsm_h%aldif(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(2,j,i)
+                      IF ( albedo_pars_f%pars_xy(3,j,i) /= albedo_pars_f%fill )&
+                         surf_lsm_h%asdir(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(3,j,i)
+                      IF ( albedo_pars_f%pars_xy(4,j,i) /= albedo_pars_f%fill )&
+                         surf_lsm_h%asdif(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(4,j,i)
+                   ENDIF
+                ENDDO
              ENDDO
 
@@ -1966,17 +1978,25 @@
                 j = surf_usm_h%j(m)
 !
-!--             At the moment, consider only wall surfaces (index 0)
-                IF ( surf_usm_h%albedo_type(0,m) == 0 )  THEN
-                   IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )   &
-                      surf_usm_h%albedo(:,m) = albedo_pars_f%pars_xy(1,j,i)
-                   IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )   &
-                      surf_usm_h%aldir(m) = albedo_pars_f%pars_xy(1,j,i)
-                   IF ( albedo_pars_f%pars_xy(2,j,i) /= albedo_pars_f%fill )   &
-                      surf_usm_h%aldif(m) = albedo_pars_f%pars_xy(2,j,i)
-                   IF ( albedo_pars_f%pars_xy(3,j,i) /= albedo_pars_f%fill )   &
-                      surf_usm_h%asdir(m) = albedo_pars_f%pars_xy(3,j,i)
-                   IF ( albedo_pars_f%pars_xy(4,j,i) /= albedo_pars_f%fill )   &
-                      surf_usm_h%asdif(m) = albedo_pars_f%pars_xy(4,j,i)
-                ENDIF
+!--             Spectral albedos for wall/green/window surfaces
+                DO  ind_type = 0, 2
+                   IF ( surf_usm_h%albedo_type(ind_type,m) == 0 )  THEN
+                      IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )&
+                         surf_usm_h%albedo(ind_type,m) =                       &
+                                                albedo_pars_f%pars_xy(1,j,i)
+                      IF ( albedo_pars_f%pars_xy(1,j,i) /= albedo_pars_f%fill )&
+                         surf_usm_h%aldir(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(1,j,i)
+                      IF ( albedo_pars_f%pars_xy(2,j,i) /= albedo_pars_f%fill )&
+                         surf_usm_h%aldif(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(2,j,i)
+                      IF ( albedo_pars_f%pars_xy(3,j,i) /= albedo_pars_f%fill )&
+                         surf_usm_h%asdir(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(3,j,i)
+                      IF ( albedo_pars_f%pars_xy(4,j,i) /= albedo_pars_f%fill )&
+                         surf_usm_h%asdif(ind_type,m) =                        &
+                                                albedo_pars_f%pars_xy(4,j,i)
+                   ENDIF
+                ENDDO
+
              ENDDO
 !
@@ -1987,6 +2007,8 @@
 
                 DO  m = 1, surf_def_v(l)%ns
+
                    i = surf_def_v(l)%i(m)
                    j = surf_def_v(l)%j(m)
+
                    IF ( surf_def_v(l)%albedo_type(0,m) == 0 )  THEN
 
@@ -1997,17 +2019,17 @@
                       IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=           &
                            albedo_pars_f%fill )                                &
-                         surf_def_v(l)%aldir(m) =                              &
+                         surf_def_v(l)%aldir(0,m) =                            &
                                           albedo_pars_f%pars_xy(1,j+joff,i+ioff)
                       IF ( albedo_pars_f%pars_xy(2,j+joff,i+ioff) /=           &
                            albedo_pars_f%fill )                                &
-                         surf_def_v(l)%aldif(m) =                              &
+                         surf_def_v(l)%aldif(0,m) =                            &
                                           albedo_pars_f%pars_xy(2,j+joff,i+ioff)
                       IF ( albedo_pars_f%pars_xy(3,j+joff,i+ioff) /=           &
                            albedo_pars_f%fill )                                &
-                         surf_def_v(l)%asdir(m) =                              &
+                         surf_def_v(l)%asdir(0,m) =                            &
                                           albedo_pars_f%pars_xy(3,j+joff,i+ioff)
                       IF ( albedo_pars_f%pars_xy(4,j+joff,i+ioff) /=           &
                            albedo_pars_f%fill )                                &
-                         surf_def_v(l)%asdif(m) =                              &
+                         surf_def_v(l)%asdif(0,m) =                            &
                                           albedo_pars_f%pars_xy(4,j+joff,i+ioff)
                    ENDIF
@@ -2016,65 +2038,69 @@
                 ioff = surf_lsm_v(l)%ioff
                 joff = surf_lsm_v(l)%joff
+
                 DO  m = 1, surf_lsm_v(l)%ns
                    i = surf_lsm_v(l)%i(m)
                    j = surf_lsm_v(l)%j(m)
-
-                   IF ( surf_lsm_v(l)%vegetation_surface(m) )  ind_type = 0
-                   IF ( surf_lsm_v(l)%pavement_surface(m)   )  ind_type = 1
-                   IF ( surf_lsm_v(l)%water_surface(m)      )  ind_type = 2
-
-                   IF ( surf_lsm_v(l)%albedo_type(ind_type,m) == 0 )  THEN
-                      IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_lsm_v(l)%albedo(:,m) =                           &
+!
+!--                Spectral albedos for vegetation/pavement/water surfaces
+                   DO  ind_type = 0, 2
+                      IF ( surf_lsm_v(l)%albedo_type(ind_type,m) == 0 )  THEN
+                         IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_lsm_v(l)%albedo(ind_type,m) =                 &
                                           albedo_pars_f%pars_xy(1,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_lsm_v(l)%aldir(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_lsm_v(l)%aldir(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(1,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(2,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_lsm_v(l)%aldif(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(2,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_lsm_v(l)%aldif(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(2,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(3,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_lsm_v(l)%asdir(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(3,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_lsm_v(l)%asdir(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(3,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(4,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_lsm_v(l)%asdif(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(4,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_lsm_v(l)%asdif(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(4,j+joff,i+ioff)
-                   ENDIF
+                      ENDIF
+                   ENDDO
                 ENDDO
 
                 ioff = surf_usm_v(l)%ioff
                 joff = surf_usm_v(l)%joff
+
                 DO  m = 1, surf_usm_v(l)%ns
                    i = surf_usm_v(l)%i(m)
                    j = surf_usm_v(l)%j(m)
-
-!--                At the moment, consider only wall surfaces (index 0)
-                   IF ( surf_usm_v(l)%albedo_type(0,m) == 0 )  THEN
-                      IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_usm_v(l)%albedo(:,m) =                           &
+!
+!--                Spectral albedos for wall/green/window surfaces
+                   DO  ind_type = 0, 2
+                      IF ( surf_usm_v(l)%albedo_type(ind_type,m) == 0 )  THEN
+                         IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_usm_v(l)%albedo(ind_type,m) =                 &
                                           albedo_pars_f%pars_xy(1,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_usm_v(l)%aldir(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(1,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_usm_v(l)%aldir(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(1,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(2,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_usm_v(l)%aldif(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(2,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_usm_v(l)%aldif(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(2,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(3,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_usm_v(l)%asdir(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(3,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_usm_v(l)%asdir(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(3,j+joff,i+ioff)
-                      IF ( albedo_pars_f%pars_xy(4,j+joff,i+ioff) /=           &
-                           albedo_pars_f%fill )                                &
-                         surf_usm_v(l)%asdif(m) =                              &
+                         IF ( albedo_pars_f%pars_xy(4,j+joff,i+ioff) /=        &
+                              albedo_pars_f%fill )                             &
+                            surf_usm_v(l)%asdif(ind_type,m) =                  &
                                           albedo_pars_f%pars_xy(4,j+joff,i+ioff)
-                   ENDIF
+                      ENDIF
+                   ENDDO
+
                 ENDDO
              ENDDO
@@ -3397,22 +3423,30 @@
                    DO  m = surf_def_h(0)%start_index(j,i),                     &
                            surf_def_h(0)%end_index(j,i)
-                      rrtm_asdir(1)  = surf_def_h(0)%rrtm_asdir(m)
-                      rrtm_asdif(1)  = surf_def_h(0)%rrtm_asdif(m)
-                      rrtm_aldir(1)  = surf_def_h(0)%rrtm_aldir(m)
-                      rrtm_aldif(1)  = surf_def_h(0)%rrtm_aldif(m)
+                      rrtm_asdir(1)  = surf_def_h(0)%rrtm_asdir(0,m)
+                      rrtm_asdif(1)  = surf_def_h(0)%rrtm_asdif(0,m)
+                      rrtm_aldir(1)  = surf_def_h(0)%rrtm_aldir(0,m)
+                      rrtm_aldif(1)  = surf_def_h(0)%rrtm_aldif(0,m)
                    ENDDO
                    DO  m = surf_lsm_h%start_index(j,i),                        &
                            surf_lsm_h%end_index(j,i)
-                      rrtm_asdir(1)  = surf_lsm_h%rrtm_asdir(m)
-                      rrtm_asdif(1)  = surf_lsm_h%rrtm_asdif(m)
-                      rrtm_aldir(1)  = surf_lsm_h%rrtm_aldir(m)
-                      rrtm_aldif(1)  = surf_lsm_h%rrtm_aldif(m)
+                      rrtm_asdir(1)  = SUM( surf_lsm_h%frac(:,m) *             &
+                                            surf_lsm_h%rrtm_asdir(:,m) )
+                      rrtm_asdif(1)  = SUM( surf_lsm_h%frac(:,m) *             &
+                                            surf_lsm_h%rrtm_asdif(:,m) )
+                      rrtm_aldir(1)  = SUM( surf_lsm_h%frac(:,m) *             &
+                                            surf_lsm_h%rrtm_aldir(:,m) )
+                      rrtm_aldif(1)  = SUM( surf_lsm_h%frac(:,m) *             &
+                                            surf_lsm_h%rrtm_aldif(:,m) )
                    ENDDO             
                    DO  m = surf_usm_h%start_index(j,i),                        &
                            surf_usm_h%end_index(j,i)
-                      rrtm_asdir(1)  = surf_usm_h%rrtm_asdir(m)
-                      rrtm_asdif(1)  = surf_usm_h%rrtm_asdif(m)
-                      rrtm_aldir(1)  = surf_usm_h%rrtm_aldir(m)
-                      rrtm_aldif(1)  = surf_usm_h%rrtm_aldif(m)
+                      rrtm_asdir(1)  = SUM( surf_usm_h%frac(:,m) *             &
+                                            surf_usm_h%rrtm_asdir(:,m) )
+                      rrtm_asdif(1)  = SUM( surf_usm_h%frac(:,m) *             &
+                                            surf_usm_h%rrtm_asdif(:,m) )
+                      rrtm_aldir(1)  = SUM( surf_usm_h%frac(:,m) *             &
+                                            surf_usm_h%rrtm_aldir(:,m) )
+                      rrtm_aldif(1)  = SUM( surf_usm_h%frac(:,m) *             &
+                                            surf_usm_h%rrtm_aldif(:,m) )
                    ENDDO
 !
@@ -3681,84 +3715,98 @@
         IMPLICIT NONE
 
-        INTEGER(iwp)    ::  m    !< running index surface elements
+        INTEGER(iwp)    ::  ind_type !< running index surface tiles
+        INTEGER(iwp)    ::  m        !< running index surface elements
 
         TYPE(surf_type) ::  surf !< treated surfaces
 
-        IF ( sun_up  .AND.  .NOT. average_radiation)  THEN
+        IF ( sun_up  .AND.  .NOT. average_radiation )  THEN
 
            DO  m = 1, surf%ns
 !
-!--           Ocean
-              IF ( surf%albedo_type(0,m) == 1 )  THEN
-                 surf%rrtm_aldir(m) = 0.026_wp /                               &
-                                             ( zenith(0)**1.7_wp + 0.065_wp )  &
-                                  + 0.15_wp * ( zenith(0) - 0.1_wp )           &
-                                            * ( zenith(0) - 0.5_wp )           &
-                                            * ( zenith(0) - 1.0_wp )
-                 surf%rrtm_asdir(m) = surf%rrtm_aldir(m)
-!
-!--           Snow
-              ELSEIF ( surf%albedo_type(0,m) == 16 )  THEN
-                 IF ( zenith(0) < 0.5_wp )  THEN
-                    surf%rrtm_aldir(m) = 0.5_wp * (1.0_wp - surf%aldif(m))     &
-                                     * ( 3.0_wp / (1.0_wp + 4.0_wp             &
-                                     * zenith(0))) - 1.0_wp
-                    surf%rrtm_asdir(m) = 0.5_wp * (1.0_wp - surf%asdif(m))     &
-                                     * ( 3.0_wp / (1.0_wp + 4.0_wp             &
-                                     * zenith(0))) - 1.0_wp
-
-                    surf%rrtm_aldir(m) = MIN(0.98_wp, surf%rrtm_aldir(m))
-                    surf%rrtm_asdir(m) = MIN(0.98_wp, surf%rrtm_asdir(m))
+!--           Loop over surface elements
+              DO  ind_type = 0, SIZE( surf%albedo_type, 1 ) - 1
+           
+!
+!--              Ocean
+                 IF ( surf%albedo_type(ind_type,m) == 1 )  THEN
+                    surf%rrtm_aldir(ind_type,m) = 0.026_wp /                    &
+                                                ( zenith(0)**1.7_wp + 0.065_wp )&
+                                     + 0.15_wp * ( zenith(0) - 0.1_wp )         &
+                                               * ( zenith(0) - 0.5_wp )         &
+                                               * ( zenith(0) - 1.0_wp )
+                    surf%rrtm_asdir(ind_type,m) = surf%rrtm_aldir(ind_type,m)
+!
+!--              Snow
+                 ELSEIF ( surf%albedo_type(ind_type,m) == 16 )  THEN
+                    IF ( zenith(0) < 0.5_wp )  THEN
+                       surf%rrtm_aldir(ind_type,m) =                           &
+                                 0.5_wp * ( 1.0_wp - surf%aldif(ind_type,m) )  &
+                                        * ( 3.0_wp / ( 1.0_wp + 4.0_wp         &
+                                        * zenith(0) ) ) - 1.0_wp
+                       surf%rrtm_asdir(ind_type,m) =                           &
+                                 0.5_wp * ( 1.0_wp - surf%asdif(ind_type,m) )  &
+                                        * ( 3.0_wp / ( 1.0_wp + 4.0_wp         &
+                                        * zenith(0) ) ) - 1.0_wp
+
+                       surf%rrtm_aldir(ind_type,m) =                           &
+                                       MIN(0.98_wp, surf%rrtm_aldir(ind_type,m))
+                       surf%rrtm_asdir(ind_type,m) =                           &
+                                       MIN(0.98_wp, surf%rrtm_asdir(ind_type,m))
+                    ELSE
+                       surf%rrtm_aldir(ind_type,m) = surf%aldif(ind_type,m)
+                       surf%rrtm_asdir(ind_type,m) = surf%asdif(ind_type,m)
+                    ENDIF
+!
+!--              Sea ice
+                 ELSEIF ( surf%albedo_type(ind_type,m) == 15 )  THEN
+                    surf%rrtm_aldir(ind_type,m) = surf%aldif(ind_type,m)
+                    surf%rrtm_asdir(ind_type,m) = surf%asdif(ind_type,m)
+
+!
+!--              Asphalt
+                 ELSEIF ( surf%albedo_type(ind_type,m) == 17 )  THEN
+                    surf%rrtm_aldir(ind_type,m) = surf%aldif(ind_type,m)
+                    surf%rrtm_asdir(ind_type,m) = surf%asdif(ind_type,m)
+
+
+!
+!--              Bare soil
+                 ELSEIF ( surf%albedo_type(ind_type,m) == 18 )  THEN
+                    surf%rrtm_aldir(ind_type,m) = surf%aldif(ind_type,m)
+                    surf%rrtm_asdir(ind_type,m) = surf%asdif(ind_type,m)
+
+!
+!--              Land surfaces
                  ELSE
-                    surf%rrtm_aldir(m) = surf%aldif(m)
-                    surf%rrtm_asdir(m) = surf%asdif(m)
+                    SELECT CASE ( surf%albedo_type(ind_type,m) )
+
+!
+!--                    Surface types with strong zenith dependence
+                       CASE ( 1, 2, 3, 4, 11, 12, 13 )
+                          surf%rrtm_aldir(ind_type,m) =                        &
+                                surf%aldif(ind_type,m) * 1.4_wp /              &
+                                           ( 1.0_wp + 0.8_wp * zenith(0) )
+                          surf%rrtm_asdir(ind_type,m) =                        &
+                                surf%asdif(ind_type,m) * 1.4_wp /              &
+                                           ( 1.0_wp + 0.8_wp * zenith(0) )
+!
+!--                    Surface types with weak zenith dependence
+                       CASE ( 5, 6, 7, 8, 9, 10, 14 )
+                          surf%rrtm_aldir(ind_type,m) =                        &
+                                surf%aldif(ind_type,m) * 1.1_wp /              &
+                                           ( 1.0_wp + 0.2_wp * zenith(0) )
+                          surf%rrtm_asdir(ind_type,m) =                        &
+                                surf%asdif(ind_type,m) * 1.1_wp /              &
+                                           ( 1.0_wp + 0.2_wp * zenith(0) )
+
+                       CASE DEFAULT
+
+                    END SELECT
                  ENDIF
 !
-!--           Sea ice
-              ELSEIF ( surf%albedo_type(0,m) == 15 )  THEN
-                 surf%rrtm_aldir(m) = surf%aldif(m)
-                 surf%rrtm_asdir(m) = surf%asdif(m)
-
-!
-!--           Asphalt
-              ELSEIF ( surf%albedo_type(0,m) == 17 )  THEN
-                 surf%rrtm_aldir(m) = surf%aldif(m)
-                 surf%rrtm_asdir(m) = surf%asdif(m)
-
-
-!
-!--           Bare soil
-              ELSEIF ( surf%albedo_type(0,m) == 18 )  THEN
-                 surf%rrtm_aldir(m) = surf%aldif(m)
-                 surf%rrtm_asdir(m) = surf%asdif(m)
-
-!
-!--           Land surfaces
-              ELSE
-                 SELECT CASE ( surf%albedo_type(0,m) )
-
-!
-!--                 Surface types with strong zenith dependence
-                    CASE ( 1, 2, 3, 4, 11, 12, 13 )
-                       surf%rrtm_aldir(m) = surf%aldif(m) * 1.4_wp /                       &
-                                        (1.0_wp + 0.8_wp * zenith(0))
-                       surf%rrtm_asdir(m) = surf%asdif(m) * 1.4_wp /                       &
-                                        (1.0_wp + 0.8_wp * zenith(0))
-!
-!--                 Surface types with weak zenith dependence
-                    CASE ( 5, 6, 7, 8, 9, 10, 14 )
-                       surf%rrtm_aldir(m) = surf%aldif(m) * 1.1_wp /                       &
-                                        (1.0_wp + 0.2_wp * zenith(0))
-                       surf%rrtm_asdir(m) = surf%asdif(m) * 1.1_wp /                       &
-                                        (1.0_wp + 0.2_wp * zenith(0))
-
-                    CASE DEFAULT
-
-                 END SELECT
-              ENDIF
-!
-!--           Diffusive albedo is taken from Table 2
-              surf%rrtm_aldif(m) = surf%aldif(m)
-              surf%rrtm_asdif(m) = surf%asdif(m)
+!--              Diffusive albedo is taken from Table 2
+                 surf%rrtm_aldif(ind_type,m) = surf%aldif(ind_type,m)
+                 surf%rrtm_asdif(ind_type,m) = surf%asdif(ind_type,m)
+              ENDDO
            ENDDO
 !
Index: /palm/trunk/SOURCE/surface_mod.f90
===================================================================
--- /palm/trunk/SOURCE/surface_mod.f90	(revision 2752)
+++ /palm/trunk/SOURCE/surface_mod.f90	(revision 2753)
@@ -231,12 +231,12 @@
        REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  frac              !< relative surface fraction (LSM: vegetation, water, pavement; USM: wall, green, window)
 
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  aldif             !< albedo for longwave diffusive radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  aldir             !< albedo for longwave direct radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  asdif             !< albedo for shortwave diffusive radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  asdir             !< albedo for shortwave direct radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  rrtm_aldif        !< albedo for longwave diffusive radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  rrtm_aldir        !< albedo for longwave direct radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  rrtm_asdif        !< albedo for shortwave diffusive radiation, solar angle of 60Â°
-       REAL(wp), DIMENSION(:), ALLOCATABLE   ::  rrtm_asdir        !< albedo for shortwave direct radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  aldif           !< albedo for longwave diffusive radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  aldir           !< albedo for longwave direct radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  asdif           !< albedo for shortwave diffusive radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  asdir           !< albedo for shortwave direct radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  rrtm_aldif      !< albedo for longwave diffusive radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  rrtm_aldir      !< albedo for longwave direct radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  rrtm_asdif      !< albedo for shortwave diffusive radiation, solar angle of 60Â°
+       REAL(wp), DIMENSION(:,:), ALLOCATABLE   ::  rrtm_asdir      !< albedo for shortwave direct radiation, solar angle of 60Â°
 
        REAL(wp), DIMENSION(:), ALLOCATABLE   ::  pt_surface        !< skin-surface temperature
