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_e.f90

    r1011 r1015  
    44! Current revisions:
    55! -----------------
    6 !
     6! accelerator version (*_acc) added,
     7! adjustment of mixing length to the Prandtl mixing length at first grid point
     8! above ground removed
    79!
    810! Former revisions:
     
    5658
    5759    PRIVATE
    58     PUBLIC diffusion_e
     60    PUBLIC diffusion_e, diffusion_e_acc
    5961   
    6062
     
    6466    END INTERFACE diffusion_e
    6567 
     68    INTERFACE diffusion_e_acc
     69       MODULE PROCEDURE diffusion_e_acc
     70    END INTERFACE diffusion_e_acc
     71
    6672 CONTAINS
    6773
     
    8187
    8288       INTEGER ::  i, j, k
    83        REAL    ::  dvar_dz, l_stable, phi_m, var_reference
     89       REAL    ::  dvar_dz, l_stable, var_reference
    8490
    8591#if defined( __nopointer )
     
    98104          DO  i = nxl, nxr
    99105             DO  j = nys, nyn
    100 !
    101 !--             First, calculate phi-function for eventually adjusting the &
    102 !--             mixing length to the prandtl mixing length
    103                 IF ( adjust_mixing_length  .AND.  prandtl_layer )  THEN
    104                    IF ( rif(j,i) >= 0.0 )  THEN
    105                       phi_m = 1.0 + 5.0 * rif(j,i)
    106                    ELSE
    107                       phi_m = 1.0 / SQRT( SQRT( 1.0 - 16.0 * rif(j,i) ) )
    108                    ENDIF
    109                 ENDIF
    110 
    111106                DO  k = nzb_s_inner(j,i)+1, nzt
    112107!
     
    133128                      ll(k,j) = l_grid(k)
    134129                   ENDIF
    135                    IF ( adjust_mixing_length  .AND.  prandtl_layer )  THEN
    136                       l(k,j)  = MIN( l(k,j),  kappa *                          &
    137                                               ( zu(k) - zw(nzb_s_inner(j,i)) ) &
    138                                               / phi_m )
    139                       ll(k,j) = MIN( ll(k,j), kappa *                          &
    140                                               ( zu(k) - zw(nzb_s_inner(j,i)) ) &
    141                                               / phi_m )
    142                    ENDIF
    143130
    144131                ENDDO
     
    188175          DO  i = nxl, nxr
    189176             DO  j = nys, nyn
    190 !
    191 !--             First, calculate phi-function for eventually adjusting the &
    192 !--             mixing length to the prandtl mixing length
    193                 IF ( adjust_mixing_length  .AND.  prandtl_layer )  THEN
    194                    IF ( rif(j,i) >= 0.0 )  THEN
    195                       phi_m = 1.0 + 5.0 * rif(j,i)
    196                    ELSE
    197                       phi_m = 1.0 / SQRT( SQRT( 1.0 - 16.0 * rif(j,i) ) )
    198                    ENDIF
    199                 ENDIF
    200 
    201177                DO  k = nzb_s_inner(j,i)+1, nzt
    202178!
     
    223199                      ll(k,j) = l_grid(k)
    224200                   ENDIF
    225                    IF ( adjust_mixing_length  .AND.  prandtl_layer )  THEN
    226                       l(k,j)  = MIN( l(k,j),  kappa *                          &
    227                                               ( zu(k) - zw(nzb_s_inner(j,i)) ) &
    228                                               / phi_m )
    229                       ll(k,j) = MIN( ll(k,j), kappa *                          &
    230                                               ( zu(k) - zw(nzb_s_inner(j,i)) ) &
    231                                               / phi_m )
    232                    ENDIF
    233201
    234202                ENDDO
     
    290258
    291259!------------------------------------------------------------------------------!
    292 ! Call for grid point i,j
    293 !------------------------------------------------------------------------------!
    294     SUBROUTINE diffusion_e_ij( i, j, var, var_reference )
     260! Call for all grid points - accelerator version
     261!------------------------------------------------------------------------------!
     262    SUBROUTINE diffusion_e_acc( var, var_reference )
    295263
    296264       USE arrays_3d
     
    303271
    304272       INTEGER ::  i, j, k
    305        REAL    ::  dvar_dz, l_stable, phi_m, var_reference
     273       REAL    ::  dissipation, dvar_dz, l, ll, l_stable, var_reference
     274
     275#if defined( __nopointer )
     276       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  var
     277#else
     278       REAL, DIMENSION(:,:,:), POINTER ::  var
     279#endif
     280
     281
     282!
     283!--    This if clause must be outside the k-loop because otherwise
     284!--    runtime errors occur with -C hopt on NEC
     285       IF ( use_reference )  THEN
     286          STOP '+++ use_reference in diffusion_e not implemented'
     287!          DO  i = nxl, nxr
     288!             DO  j = nys, nyn
     289!                DO  k = nzb_s_inner(j,i)+1, nzt
     290!
     291!--                Calculate the mixing length (for dissipation)
     292!                   dvar_dz = atmos_ocean_sign * &
     293!                             ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
     294!                   IF ( dvar_dz > 0.0 ) THEN
     295!                      l_stable = 0.76 * SQRT( e(k,j,i) ) / &
     296!                                 SQRT( g / var_reference * dvar_dz ) + 1E-5
     297!                   ELSE
     298!                      l_stable = l_grid(k)
     299!                   ENDIF
     300!
     301!--                Adjustment of the mixing length
     302!                   IF ( wall_adjustment )  THEN
     303!                      l(k,j)  = MIN( wall_adjustment_factor *          &
     304!                                     ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     305!                                     l_grid(k), l_stable )
     306!                      ll(k,j) = MIN( wall_adjustment_factor *          &
     307!                                     ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     308!                                     l_grid(k) )
     309!                   ELSE
     310!                      l(k,j)  = MIN( l_grid(k), l_stable )
     311!                      ll(k,j) = l_grid(k)
     312!                   ENDIF
     313!
     314!                ENDDO
     315!             ENDDO
     316!
     317!
     318!--          Calculate the tendency terms
     319!             DO  j = nys, nyn
     320!                DO  k = nzb_s_inner(j,i)+1, nzt
     321!
     322!                    dissipation(k,j) = ( 0.19 + 0.74 * l(k,j) / ll(k,j) ) * &
     323!                                       e(k,j,i) * SQRT( e(k,j,i) ) / l(k,j)
     324!
     325!                    tend(k,j,i) = tend(k,j,i)                                  &
     326!                                        + (                                    &
     327!                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
     328!                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
     329!                                          ) * ddx2                             &
     330!                                        + (                                    &
     331!                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
     332!                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
     333!                                          ) * ddy2                             &
     334!                                        + (                                    &
     335!               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
     336!             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
     337!                                          ) * ddzw(k)                          &
     338!                             - dissipation(k,j)
     339!
     340!                ENDDO
     341!             ENDDO
     342!
     343!
     344!--          Store dissipation if needed for calculating the sgs particle
     345!--          velocities
     346!             IF ( use_sgs_for_particles  .OR.  wang_kernel )  THEN
     347!                DO  j = nys, nyn
     348!                   DO  k = nzb_s_inner(j,i)+1, nzt
     349!                      diss(k,j,i) = dissipation(k,j)
     350!                   ENDDO
     351!                ENDDO
     352!             ENDIF
     353!
     354!          ENDDO
     355!
     356       ELSE
     357
     358          !$acc kernels present( ddzu, ddzw, dd2zu, diss, e, km, l_grid ) &
     359          !$acc         present( nzb_s_inner, rif, tend, var, zu, zw )
     360          !$acc loop
     361          DO  i = nxl, nxr
     362             DO  j = nys, nyn
     363                !$acc loop vector( 32 )
     364                DO  k = 1, nzt
     365
     366                   IF ( k > nzb_s_inner(j,i) )  THEN
     367!
     368!--                   Calculate the mixing length (for dissipation)
     369                      dvar_dz = atmos_ocean_sign * &
     370                                ( var(k+1,j,i) - var(k-1,j,i) ) * dd2zu(k)
     371                      IF ( dvar_dz > 0.0 ) THEN
     372                         l_stable = 0.76 * SQRT( e(k,j,i) ) / &
     373                                           SQRT( g / var(k,j,i) * dvar_dz ) + 1E-5
     374                      ELSE
     375                         l_stable = l_grid(k)
     376                      ENDIF
     377!
     378!--                   Adjustment of the mixing length
     379                      IF ( wall_adjustment )  THEN
     380                         l  = MIN( wall_adjustment_factor *          &
     381                                   ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     382                                     l_grid(k), l_stable )
     383                         ll = MIN( wall_adjustment_factor *          &
     384                                   ( zu(k) - zw(nzb_s_inner(j,i)) ), &
     385                                   l_grid(k) )
     386                      ELSE
     387                         l  = MIN( l_grid(k), l_stable )
     388                         ll = l_grid(k)
     389                      ENDIF
     390!
     391!--                   Calculate the tendency terms
     392                      dissipation = ( 0.19 + 0.74 * l / ll ) * &
     393                                    e(k,j,i) * SQRT( e(k,j,i) ) / l
     394
     395                      tend(k,j,i) = tend(k,j,i)                                &
     396                                        + (                                    &
     397                          ( km(k,j,i)+km(k,j,i+1) ) * ( e(k,j,i+1)-e(k,j,i) )  &
     398                        - ( km(k,j,i)+km(k,j,i-1) ) * ( e(k,j,i)-e(k,j,i-1) )  &
     399                                          ) * ddx2                             &
     400                                        + (                                    &
     401                          ( km(k,j,i)+km(k,j+1,i) ) * ( e(k,j+1,i)-e(k,j,i) )  &
     402                        - ( km(k,j,i)+km(k,j-1,i) ) * ( e(k,j,i)-e(k,j-1,i) )  &
     403                                          ) * ddy2                             &
     404                                        + (                                    &
     405               ( km(k,j,i)+km(k+1,j,i) ) * ( e(k+1,j,i)-e(k,j,i) ) * ddzu(k+1) &
     406             - ( km(k,j,i)+km(k-1,j,i) ) * ( e(k,j,i)-e(k-1,j,i) ) * ddzu(k)   &
     407                                          ) * ddzw(k)                          &
     408                             - dissipation
     409
     410!
     411!--                   Store dissipation if needed for calculating the sgs
     412!--                   particle  velocities
     413                      IF ( use_sgs_for_particles  .OR.  wang_kernel )  THEN
     414                         diss(k,j,i) = dissipation
     415                      ENDIF
     416
     417                   ENDIF
     418
     419                ENDDO
     420             ENDDO
     421          ENDDO
     422          !$acc end kernels
     423
     424       ENDIF
     425
     426!
     427!--    Boundary condition for dissipation
     428       IF ( use_sgs_for_particles  .OR.  wang_kernel )  THEN
     429          !$acc kernels present( diss, nzb_s_inner )
     430          !$acc loop
     431          DO  i = nxl, nxr
     432             !$acc loop vector( 32 )
     433             DO  j = nys, nyn
     434                diss(nzb_s_inner(j,i),j,i) = diss(nzb_s_inner(j,i)+1,j,i)
     435             ENDDO
     436          ENDDO
     437          !$acc end kernels
     438       ENDIF
     439
     440    END SUBROUTINE diffusion_e_acc
     441
     442
     443!------------------------------------------------------------------------------!
     444! Call for grid point i,j
     445!------------------------------------------------------------------------------!
     446    SUBROUTINE diffusion_e_ij( i, j, var, var_reference )
     447
     448       USE arrays_3d
     449       USE control_parameters
     450       USE grid_variables
     451       USE indices
     452       USE particle_attributes
     453
     454       IMPLICIT NONE
     455
     456       INTEGER ::  i, j, k
     457       REAL    ::  dvar_dz, l_stable, var_reference
    306458
    307459#if defined( __nopointer )
     
    312464       REAL, DIMENSION(nzb+1:nzt) ::  dissipation, l, ll
    313465
    314 
    315 !
    316 !--    First, calculate phi-function for eventually adjusting the mixing length
    317 !--    to the prandtl mixing length
    318        IF ( adjust_mixing_length  .AND.  prandtl_layer )  THEN
    319           IF ( rif(j,i) >= 0.0 )  THEN
    320              phi_m = 1.0 + 5.0 * rif(j,i)
    321           ELSE
    322              phi_m = 1.0 / SQRT( SQRT( 1.0 - 16.0 * rif(j,i) ) )
    323           ENDIF
    324        ENDIF
    325466
    326467!
     
    352493             ll(k) = l_grid(k)
    353494          ENDIF
    354           IF ( adjust_mixing_length  .AND.  prandtl_layer )  THEN
    355              l(k)  = MIN( l(k),  kappa * &
    356                                  ( zu(k) - zw(nzb_s_inner(j,i)) ) / phi_m )
    357              ll(k) = MIN( ll(k), kappa * &
    358                                  ( zu(k) - zw(nzb_s_inner(j,i)) ) / phi_m )
    359           ENDIF
    360 
    361495!
    362496!--       Calculate the tendency term
Note: See TracChangeset for help on using the changeset viewer.