Ignore:
Timestamp:
Sep 27, 2012 9:23:24 AM (12 years ago)
Author:
raasch
Message:

Starting with changes required for GPU optimization. OpenACC statements for using NVIDIA GPUs added.
Adjustment of mixing length to the Prandtl mixing length at first grid point above ground removed.
mask array is set zero for ghost boundaries

File:
1 edited

Legend:

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

    r1011 r1015  
    44! Current revisions:
    55! ------------------
    6 !
     6! accelerator version (*_acc) added
    77!
    88! Former revisions:
     
    4848
    4949    PRIVATE
    50     PUBLIC diffusion_s
     50    PUBLIC diffusion_s, diffusion_s_acc
    5151
    5252    INTERFACE diffusion_s
     
    5454       MODULE PROCEDURE diffusion_s_ij
    5555    END INTERFACE diffusion_s
     56
     57    INTERFACE diffusion_s_acc
     58       MODULE PROCEDURE diffusion_s_acc
     59    END INTERFACE diffusion_s_acc
    5660
    5761 CONTAINS
     
    173177
    174178!------------------------------------------------------------------------------!
    175 ! Call for grid point i,j
    176 !------------------------------------------------------------------------------!
    177     SUBROUTINE diffusion_s_ij( i, j, s, s_flux_b, s_flux_t, wall_s_flux )
     179! Call for all grid points - accelerator version
     180!------------------------------------------------------------------------------!
     181    SUBROUTINE diffusion_s_acc( s, s_flux_b, s_flux_t, wall_s_flux )
    178182
    179183       USE arrays_3d
     
    194198#endif
    195199
     200       !$acc kernels present( ddzu, ddzw, fwxm, fwxp, fwym, fwyp, kh )        &
     201       !$acc         present( nzb_diff_s_inner, nzb_s_inner, nzb_s_outer, s ) &
     202       !$acc         present( s_flux_b, s_flux_t, tend, wall_s_flux )         &
     203       !$acc         present( wall_w_x, wall_w_y )
     204       !$acc loop
     205       DO  i = nxl, nxr
     206          DO  j = nys,nyn
     207!
     208!--          Compute horizontal diffusion
     209             !$acc loop vector( 32 )
     210             DO  k = 1, nzt
     211                IF ( k > nzb_s_outer(j,i) )  THEN
     212
     213                   tend(k,j,i) = tend(k,j,i)                                  &
     214                                          + 0.5 * (                           &
     215                        ( kh(k,j,i) + kh(k,j,i+1) ) * ( s(k,j,i+1)-s(k,j,i) ) &
     216                      - ( kh(k,j,i) + kh(k,j,i-1) ) * ( s(k,j,i)-s(k,j,i-1) ) &
     217                                                  ) * ddx2                    &
     218                                          + 0.5 * (                           &
     219                        ( kh(k,j,i) + kh(k,j+1,i) ) * ( s(k,j+1,i)-s(k,j,i) ) &
     220                      - ( kh(k,j,i) + kh(k,j-1,i) ) * ( s(k,j,i)-s(k,j-1,i) ) &
     221                                                  ) * ddy2
     222                ENDIF
     223             ENDDO
     224
     225!
     226!--          Apply prescribed horizontal wall heatflux where necessary
     227             !$acc loop vector(32)
     228             DO  k = 1, nzt
     229                IF ( k > nzb_s_inner(j,i)  .AND.  k <= nzb_s_outer(j,i)  .AND. &
     230                     ( wall_w_x(j,i) /= 0.0  .OR.  wall_w_y(j,i) /= 0.0 ) )    &
     231                THEN
     232                   tend(k,j,i) = tend(k,j,i)                                  &
     233                                                + ( fwxp(j,i) * 0.5 *         &
     234                        ( kh(k,j,i) + kh(k,j,i+1) ) * ( s(k,j,i+1)-s(k,j,i) ) &
     235                        + ( 1.0 - fwxp(j,i) ) * wall_s_flux(1)                &
     236                                                   -fwxm(j,i) * 0.5 *         &
     237                        ( kh(k,j,i) + kh(k,j,i-1) ) * ( s(k,j,i)-s(k,j,i-1) ) &
     238                        + ( 1.0 - fwxm(j,i) ) * wall_s_flux(2)                &
     239                                                  ) * ddx2                    &
     240                                                + ( fwyp(j,i) * 0.5 *         &
     241                        ( kh(k,j,i) + kh(k,j+1,i) ) * ( s(k,j+1,i)-s(k,j,i) ) &
     242                        + ( 1.0 - fwyp(j,i) ) * wall_s_flux(3)                &
     243                                                   -fwym(j,i) * 0.5 *         &
     244                        ( kh(k,j,i) + kh(k,j-1,i) ) * ( s(k,j,i)-s(k,j-1,i) ) &
     245                        + ( 1.0 - fwym(j,i) ) * wall_s_flux(4)                &
     246                                                  ) * ddy2
     247                ENDIF
     248             ENDDO
     249
     250!
     251!--          Compute vertical diffusion. In case that surface fluxes have been
     252!--          prescribed or computed at bottom and/or top, index k starts/ends at
     253!--          nzb+2 or nzt-1, respectively.
     254             !$acc loop vector( 32 )
     255             DO  k = 1, nzt_diff
     256                IF ( k >= nzb_diff_s_inner(j,i) )  THEN
     257                   tend(k,j,i) = tend(k,j,i)                                  &
     258                                       + 0.5 * (                              &
     259            ( kh(k,j,i) + kh(k+1,j,i) ) * ( s(k+1,j,i)-s(k,j,i) ) * ddzu(k+1) &
     260          - ( kh(k,j,i) + kh(k-1,j,i) ) * ( s(k,j,i)-s(k-1,j,i) ) * ddzu(k)   &
     261                                               ) * ddzw(k)
     262                ENDIF
     263             ENDDO
     264
     265!
     266!--          Vertical diffusion at the first computational gridpoint along
     267!--          z-direction
     268             !$acc loop vector( 32 )
     269             DO  k = 1, nzt
     270                IF ( use_surface_fluxes  .AND.  k == nzb_s_inner(j,i)+1 )  THEN
     271                   tend(k,j,i) = tend(k,j,i)                                  &
     272                                          + ( 0.5 * ( kh(k,j,i)+kh(k+1,j,i) ) &
     273                                                  * ( s(k+1,j,i)-s(k,j,i) )   &
     274                                                  * ddzu(k+1)                 &
     275                                              + s_flux_b(j,i)                 &
     276                                            ) * ddzw(k)
     277                ENDIF
     278
     279!
     280!--             Vertical diffusion at the last computational gridpoint along
     281!--             z-direction
     282                IF ( use_top_fluxes  .AND.  k == nzt )  THEN
     283                   tend(k,j,i) = tend(k,j,i)                                   &
     284                                          + ( - s_flux_t(j,i)                  &
     285                                              - 0.5 * ( kh(k-1,j,i)+kh(k,j,i) )&
     286                                                    * ( s(k,j,i)-s(k-1,j,i) )  &
     287                                                    * ddzu(k)                  &
     288                                            ) * ddzw(k)
     289                ENDIF
     290             ENDDO
     291
     292          ENDDO
     293       ENDDO
     294       !$acc end kernels
     295
     296    END SUBROUTINE diffusion_s_acc
     297
     298
     299!------------------------------------------------------------------------------!
     300! Call for grid point i,j
     301!------------------------------------------------------------------------------!
     302    SUBROUTINE diffusion_s_ij( i, j, s, s_flux_b, s_flux_t, wall_s_flux )
     303
     304       USE arrays_3d
     305       USE control_parameters
     306       USE grid_variables
     307       USE indices
     308
     309       IMPLICIT NONE
     310
     311       INTEGER ::  i, j, k
     312       REAL    ::  vertical_gridspace
     313       REAL    ::  wall_s_flux(0:4)
     314       REAL, DIMENSION(nysg:nyng,nxlg:nxrg) ::  s_flux_b, s_flux_t
     315#if defined( __nopointer )
     316       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  s
     317#else
     318       REAL, DIMENSION(:,:,:), POINTER ::  s
     319#endif
     320
    196321!
    197322!--    Compute horizontal diffusion
Note: See TracChangeset for help on using the changeset viewer.