Changeset 1015 for palm/trunk/SOURCE/diffusion_s.f90
- Timestamp:
- Sep 27, 2012 9:23:24 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/diffusion_s.f90
r1011 r1015 4 4 ! Current revisions: 5 5 ! ------------------ 6 ! 6 ! accelerator version (*_acc) added 7 7 ! 8 8 ! Former revisions: … … 48 48 49 49 PRIVATE 50 PUBLIC diffusion_s 50 PUBLIC diffusion_s, diffusion_s_acc 51 51 52 52 INTERFACE diffusion_s … … 54 54 MODULE PROCEDURE diffusion_s_ij 55 55 END INTERFACE diffusion_s 56 57 INTERFACE diffusion_s_acc 58 MODULE PROCEDURE diffusion_s_acc 59 END INTERFACE diffusion_s_acc 56 60 57 61 CONTAINS … … 173 177 174 178 !------------------------------------------------------------------------------! 175 ! Call for grid point i,j176 !------------------------------------------------------------------------------! 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 ) 178 182 179 183 USE arrays_3d … … 194 198 #endif 195 199 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 196 321 ! 197 322 !-- Compute horizontal diffusion
Note: See TracChangeset
for help on using the changeset viewer.