@@ -300,25 +300,57 @@ function mpas_atm_get_bdy_tend(clock, block, vertDim, horizDim, field, delta_t)
300
300
real (kind= RKIND), dimension (vertDim,horizDim+1 ) :: return_tend
301
301
302
302
type (mpas_pool_type), pointer :: lbc
303
- integer , pointer :: idx
303
+ integer , pointer :: idx_ptr
304
304
real (kind= RKIND), dimension (:,:), pointer :: tend
305
305
real (kind= RKIND), dimension (:,:,:), pointer :: tend_scalars
306
- integer :: ierr
306
+ integer :: idx, i, j
307
307
308
308
309
309
call mpas_pool_get_subpool(block % structs, ' lbc' , lbc)
310
310
311
311
nullify(tend)
312
312
call mpas_pool_get_array(lbc, ' lbc_' // trim (field), tend, 1 )
313
313
314
+ MPAS_ACC_TIMER_START(' mpas_atm_get_bdy_tend [ACC_data_xfer]' )
315
+ !$acc enter data create(return_tend)
314
316
if (associated(tend)) then
315
- return_tend(:,:) = tend(:,: )
317
+ !$acc enter data copyin(tend )
316
318
else
317
319
call mpas_pool_get_array(lbc, ' lbc_scalars' , tend_scalars, 1 )
318
- call mpas_pool_get_dimension(lbc, ' index_' // trim (field), idx)
320
+ !$acc enter data copyin(tend_scalars)
321
+
322
+ ! Ensure the integer pointed to by idx_ptr is copied to the gpu device
323
+ call mpas_pool_get_dimension(lbc, ' index_' // trim (field), idx_ptr)
324
+ idx = idx_ptr
325
+ end if
326
+ MPAS_ACC_TIMER_STOP(' mpas_atm_get_bdy_tend [ACC_data_xfer]' )
319
327
320
- return_tend(:,:) = tend_scalars(idx,:,:)
328
+ !$acc parallel default(present)
329
+ if (associated(tend)) then
330
+ !$acc loop gang vector collapse(2 )
331
+ do j= 1 ,horizDim+1
332
+ do i= 1 ,vertDim
333
+ return_tend(i,j) = tend(i,j)
334
+ end do
335
+ end do
336
+ else
337
+ !$acc loop gang vector collapse(2 )
338
+ do j= 1 ,horizDim+1
339
+ do i= 1 ,vertDim
340
+ return_tend(i,j) = tend_scalars(idx,i,j)
341
+ end do
342
+ end do
343
+ end if
344
+ !$acc end parallel
345
+
346
+ MPAS_ACC_TIMER_START(' mpas_atm_get_bdy_tend [ACC_data_xfer]' )
347
+ !$acc exit data copyout(return_tend)
348
+ if (associated(tend)) then
349
+ !$acc exit data delete(tend)
350
+ else
351
+ !$acc exit data delete(tend_scalars)
321
352
end if
353
+ MPAS_ACC_TIMER_STOP(' mpas_atm_get_bdy_tend [ACC_data_xfer]' )
322
354
323
355
end function mpas_atm_get_bdy_tend
324
356
0 commit comments