Ignore:
Timestamp:
Jul 9, 2020 12:48:18 PM (4 years ago)
Author:
suehring
Message:

Surface flux calculation: Pre-calculate ln(z/z0) at each timestep in order to reduce the number of log-calculations; Bugfix - add missing density to fluxes of passive-scalars, chemistry and cloud-phyiscal quantities at upward-facing surfaces; Move if-statement out of inner loop; Remove unnecessary index referencing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/surface_mod.f90

    r4586 r4593  
    2525! -----------------
    2626! $Id$
     27! Add arrays for pre-calculated ln(z/z0)
     28!
     29! 4586 2020-07-01 16:16:43Z gronemeier
    2730! renamed Richardson flux number into gradient Richardson number (1D model)
    2831!
     
    248251
    249252       REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  css    !< scaling parameter chemical species
     253!
     254!--    Pre-defined arrays for ln(z/z0)
     255       REAL(wp), DIMENSION(:), ALLOCATABLE ::  ln_z_z0  !< ln(z/z0)
     256       REAL(wp), DIMENSION(:), ALLOCATABLE ::  ln_z_z0h !< ln(z/z0h)
     257       REAL(wp), DIMENSION(:), ALLOCATABLE ::  ln_z_z0q !< ln(z/z0q)
    250258!
    251259!--    Define arrays for surface fluxes
     
    12811289    DEALLOCATE ( surfaces%uvw_abs )
    12821290!
     1291!-- Pre-calculated ln(z/z0)
     1292    DEALLOCATE ( surfaces%ln_z_z0  )
     1293    DEALLOCATE ( surfaces%ln_z_z0h )
     1294    DEALLOCATE ( surfaces%ln_z_z0q )
     1295!
    12831296!-- Roughness
    12841297    DEALLOCATE ( surfaces%z0 )
     
    14111424    ALLOCATE ( surfaces%uvw_abs(1:surfaces%ns) )
    14121425!
     1426!-- Precalculated ln(z/z0)
     1427    ALLOCATE( surfaces%ln_z_z0(1:surfaces%ns)  )
     1428    ALLOCATE( surfaces%ln_z_z0h(1:surfaces%ns) )
     1429    ALLOCATE( surfaces%ln_z_z0q(1:surfaces%ns) )
     1430!
    14131431!-- Roughness
    14141432    ALLOCATE ( surfaces%z0(1:surfaces%ns)  )
     
    15201538    !$ACC DELETE(surfaces%z_mo(1:surfaces%ns)) &
    15211539    !$ACC DELETE(surfaces%uvw_abs(1:surfaces%ns)) &
     1540    !$ACC DELETE(surfaces%ln_z_z0(1:surfaces%ns)) &
     1541    !$ACC DELETE(surfaces%ln_z_z0h(1:surfaces%ns)) &
     1542    !$ACC DELETE(surfaces%ln_z_z0q(1:surfaces%ns)) &
    15221543    !$ACC DELETE(surfaces%z0(1:surfaces%ns)) &
    15231544    !$ACC COPYOUT(surfaces%us(1:surfaces%ns)) &
     
    15611582    !$ACC COPYIN(surfaces%z_mo(1:surfaces%ns)) &
    15621583    !$ACC COPYIN(surfaces%uvw_abs(1:surfaces%ns)) &
     1584    !$ACC COPYIN(surfaces%ln_z_z0(1:surfaces%ns)) &
     1585    !$ACC COPYIN(surfaces%ln_z_z0h(1:surfaces%ns)) &
     1586    !$ACC COPYIN(surfaces%ln_z_z0q(1:surfaces%ns)) &
    15631587    !$ACC COPYIN(surfaces%z0(1:surfaces%ns)) &
    15641588    !$ACC COPYIN(surfaces%us(1:surfaces%ns)) &
     
    18301854    DEALLOCATE ( surfaces%uvw_abs )
    18311855!
     1856!-- Precalculated ln(z/z0)
     1857    DEALLOCATE ( surfaces%ln_z_z0  )
     1858    DEALLOCATE ( surfaces%ln_z_z0h )
     1859    DEALLOCATE ( surfaces%ln_z_z0q )
     1860!
    18321861!-- Roughness
    18331862    DEALLOCATE ( surfaces%z0 )
    18341863    DEALLOCATE ( surfaces%z0h )
    18351864    DEALLOCATE ( surfaces%z0q )
    1836 
    18371865!
    18381866!-- Friction velocity
     
    18791907!-- Scaling parameter (cs*) and surface flux of chemical species
    18801908    IF ( air_chemistry )  THEN
    1881           DEALLOCATE ( surfaces%css )
    1882           DEALLOCATE ( surfaces%cssws )
     1909       DEALLOCATE ( surfaces%css )
     1910       DEALLOCATE ( surfaces%cssws )
    18831911    ENDIF
    18841912!
     
    19581986    ALLOCATE ( surfaces%uvw_abs(1:surfaces%ns) )
    19591987!
     1988!-- Precalculated ln(z/z0)
     1989    ALLOCATE( surfaces%ln_z_z0(1:surfaces%ns) )
     1990    ALLOCATE( surfaces%ln_z_z0h(1:surfaces%ns) )
     1991    ALLOCATE( surfaces%ln_z_z0q(1:surfaces%ns) )
     1992!
    19601993!-- Roughness
    19611994    ALLOCATE ( surfaces%z0(1:surfaces%ns)  )
     
    20072040!-- Scaling parameter (cs*) and surface flux of chemical species
    20082041    IF ( air_chemistry )  THEN
    2009           ALLOCATE ( surfaces%css(1:nvar,1:surfaces%ns) )
    2010           ALLOCATE ( surfaces%cssws(1:nvar,1:surfaces%ns) )
     2042       ALLOCATE ( surfaces%css(1:nvar,1:surfaces%ns) )
     2043       ALLOCATE ( surfaces%cssws(1:nvar,1:surfaces%ns) )
    20112044    ENDIF
    20122045!
     
    20622095    !$ACC DELETE(surfaces%k(1:surfaces%ns)) &
    20632096    !$ACC DELETE(surfaces%uvw_abs(1:surfaces%ns)) &
     2097    !$ACC DELETE(surfaces%ln_z_z0(1:surfaces%ns) ) &
     2098    !$ACC DELETE(surfaces%ln_z_z0h(1:surfaces%ns) ) &
     2099    !$ACC DELETE(surfaces%ln_z_z0q(1:surfaces%ns) ) &
    20642100    !$ACC DELETE(surfaces%z0(1:surfaces%ns)) &
    20652101    !$ACC DELETE(surfaces%rib(1:surfaces%ns)) &
     
    20942130    !$ACC COPYIN(surfaces%k(1:surfaces%ns)) &
    20952131    !$ACC COPYIN(surfaces%uvw_abs(1:surfaces%ns)) &
     2132    !$ACC COPYIN(surfaces%ln_z_z0(1:surfaces%ns) ) &
     2133    !$ACC COPYIN(surfaces%ln_z_z0h(1:surfaces%ns) ) &
     2134    !$ACC COPYIN(surfaces%ln_z_z0q(1:surfaces%ns) ) &
    20962135    !$ACC COPYIN(surfaces%z0(1:surfaces%ns)) &
    20972136    !$ACC COPYIN(surfaces%rib(1:surfaces%ns)) &
     
    25692608    surf%rib(num_h)     = 0.0_wp
    25702609    surf%uvw_abs(num_h) = 0.0_wp
     2610!
     2611!-- Initialize ln(z/z0)
     2612    surf%ln_z_z0(num_h)  = LOG( surf%z_mo(num_h) / surf%z0(num_h) )
     2613    surf%ln_z_z0h(num_h) = LOG( surf%z_mo(num_h) / surf%z0h(num_h) )
     2614    surf%ln_z_z0q(num_h) = LOG( surf%z_mo(num_h) / surf%z0q(num_h) )
    25712615
    25722616    IF ( .NOT. constant_diffusion )  THEN
     
    28712915
    28722916    surf%us(num_v)  = 0.0_wp
     2917!
     2918!-- Initialize ln(z/z0)
     2919    surf%ln_z_z0(num_v)  = LOG( surf%z_mo(num_v) / surf%z0(num_v)  )
     2920    surf%ln_z_z0h(num_v) = LOG( surf%z_mo(num_v) / surf%z0h(num_v) )
     2921    surf%ln_z_z0q(num_v) = LOG( surf%z_mo(num_v) / surf%z0q(num_v) )
    28732922!
    28742923!-- If required, initialize Obukhov length
     
    51065155    ENDIF
    51075156    IF ( INDEX( restart_string(1:length), '%cssws' ) /= 0 )  THEN
    5108        IF ( ALLOCATED( surf_target%cssws )  .AND.  ALLOCATED( surf_file%cssws   ) )  THEN
     5157       IF ( ALLOCATED( surf_target%cssws )  .AND.  ALLOCATED( surf_file%cssws ) )  THEN
    51095158          DO  lsp = 1, nvar
    51105159             surf_target%cssws(lsp,m_target) = surf_file%cssws(lsp,m_file)
     
    55075556!
    55085557!-- Redistribute surface elements on its respective type.
    5509 
    55105558    DO  l = 0, 2
    55115559       CALL restore_surface_elements( surf_def_h(l), surf_h(l) )
    5512        CALL restore_surface_elements( surf_lsm_h, surf_h(l) )
    5513        CALL restore_surface_elements( surf_usm_h, surf_h(l) )
    55145560    ENDDO
     5561    CALL restore_surface_elements( surf_lsm_h, surf_h(0) )
     5562    CALL restore_surface_elements( surf_usm_h, surf_h(0) )
    55155563
    55165564    DO  l = 0, 3
Note: See TracChangeset for help on using the changeset viewer.