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/buoyancy.f90

    r1011 r1015  
    44! Currrent revisions:
    55! -----------------
    6 !
     6! accelerator version (*_acc) added
    77!
    88! Former revisions:
     
    5555
    5656    PRIVATE
    57     PUBLIC buoyancy, calc_mean_profile
     57    PUBLIC buoyancy, buoyancy_acc, calc_mean_profile
    5858
    5959    INTERFACE buoyancy
     
    6161       MODULE PROCEDURE buoyancy_ij
    6262    END INTERFACE buoyancy
     63
     64    INTERFACE buoyancy_acc
     65       MODULE PROCEDURE buoyancy_acc
     66    END INTERFACE buoyancy_acc
    6367
    6468    INTERFACE calc_mean_profile
     
    164168
    165169    END SUBROUTINE buoyancy
     170
     171
     172!------------------------------------------------------------------------------!
     173! Call for all grid points - accelerator version
     174!------------------------------------------------------------------------------!
     175    SUBROUTINE buoyancy_acc( var, var_reference, wind_component, pr )
     176
     177       USE arrays_3d
     178       USE control_parameters
     179       USE indices
     180       USE pegrid
     181       USE statistics
     182
     183       IMPLICIT NONE
     184
     185       INTEGER ::  i, j, k, pr, wind_component
     186       REAL    ::  var_reference
     187#if defined( __nopointer )
     188       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  var
     189#else
     190       REAL, DIMENSION(:,:,:), POINTER ::  var
     191#endif
     192
     193
     194       IF ( .NOT. sloping_surface )  THEN
     195!
     196!--       Normal case: horizontal surface
     197          IF ( use_reference )  THEN
     198             DO  i = nxl, nxr
     199                DO  j = nys, nyn
     200                   DO  k = nzb_s_inner(j,i)+1, nzt-1
     201                      tend(k,j,i) = tend(k,j,i) + atmos_ocean_sign * g * 0.5 * &
     202                                                            (                  &
     203                          ( var(k,j,i)   - hom(k,1,pr,0)   ) / var_reference + &
     204                          ( var(k+1,j,i) - hom(k+1,1,pr,0) ) / var_reference   &
     205                                                            )
     206                   ENDDO
     207                ENDDO
     208             ENDDO
     209          ELSE
     210             !$acc kernels present( nzb_s_inner, hom, tend, var )
     211             !$acc loop
     212             DO  i = nxl, nxr
     213                DO  j = nys, nyn
     214                   !$acc loop vector(32)
     215                   DO  k = 1, nzt-1
     216                      IF ( k > nzb_s_inner(j,i) )  THEN
     217                         tend(k,j,i) = tend(k,j,i) + atmos_ocean_sign * g * 0.5 * &
     218                                                               (                  &
     219                             ( var(k,j,i)   - hom(k,1,pr,0)   ) / hom(k,1,pr,0) + &
     220                             ( var(k+1,j,i) - hom(k+1,1,pr,0) ) / hom(k+1,1,pr,0) &
     221                                                               )
     222                      ENDIF
     223                   ENDDO
     224                ENDDO
     225             ENDDO
     226             !$acc end kernels
     227          ENDIF
     228
     229       ELSE
     230!
     231!--       Buoyancy term for a surface with a slope in x-direction. The equations
     232!--       for both the u and w velocity-component contain proportionate terms.
     233!--       Temperature field at time t=0 serves as environmental temperature.
     234!--       Reference temperature (pt_surface) is the one at the lower left corner
     235!--       of the total domain.
     236          IF ( wind_component == 1 )  THEN
     237
     238             DO  i = nxlu, nxr
     239                DO  j = nys, nyn
     240                   DO  k = nzb_s_inner(j,i)+1, nzt-1
     241                      tend(k,j,i) = tend(k,j,i) + g * sin_alpha_surface *      &
     242                           0.5 * ( ( pt(k,j,i-1)         + pt(k,j,i)         ) &
     243                                 - ( pt_slope_ref(k,i-1) + pt_slope_ref(k,i) ) &
     244                                 ) / pt_surface
     245                   ENDDO
     246                ENDDO
     247             ENDDO
     248
     249          ELSEIF ( wind_component == 3 )  THEN
     250
     251             DO  i = nxl, nxr
     252                DO  j = nys, nyn
     253                   DO  k = nzb_s_inner(j,i)+1, nzt-1
     254                      tend(k,j,i) = tend(k,j,i) + g * cos_alpha_surface *      &
     255                           0.5 * ( ( pt(k,j,i)         + pt(k+1,j,i)         ) &
     256                                 - ( pt_slope_ref(k,i) + pt_slope_ref(k+1,i) ) &
     257                                 ) / pt_surface
     258                   ENDDO
     259                ENDDO
     260            ENDDO
     261
     262          ELSE
     263
     264             WRITE( message_string, * ) 'no term for component "',&
     265                                       wind_component,'"'
     266             CALL message( 'buoyancy', 'PA0159', 1, 2, 0, 6, 0 )
     267
     268          ENDIF
     269
     270       ENDIF
     271
     272    END SUBROUTINE buoyancy_acc
    166273
    167274
Note: See TracChangeset for help on using the changeset viewer.