1
1
import ClimaCore: DataLayouts, Topologies, Spaces, Fields
2
- import ClimaCore. DataLayouts: getindex_field, setindex_field!
2
+ import ClimaCore. DataLayouts: CartesianFieldIndex
3
3
using CUDA
4
4
import ClimaCore. Topologies
5
5
import ClimaCore. Topologies: perimeter_vertex_node_index
@@ -44,13 +44,13 @@ function dss_load_perimeter_data_kernel!(
44
44
(nperimeter, _, _, nlevels, nelems) = size (perimeter_data)
45
45
nfidx = DataLayouts. ncomponents (perimeter_data)
46
46
sizep = (nlevels, nperimeter, nfidx, nelems) # assume VIFH order
47
- CI = CartesianIndex
47
+ CI = CartesianFieldIndex
48
48
49
49
if gidx ≤ prod (sizep)
50
50
(level, p, fidx, elem) = cart_ind (sizep, gidx). I
51
51
(ip, jp) = perimeter[p]
52
- val = getindex_field (data, CI (ip, jp , fidx, level, elem))
53
- setindex_field! (perimeter_data, val, CI (p, 1 , fidx, level, elem))
52
+ perimeter_data[ CI (p, 1 , fidx, level, elem)] =
53
+ data[ CI (ip, jp , fidx, level, elem)]
54
54
end
55
55
return nothing
56
56
end
@@ -84,13 +84,13 @@ function dss_unload_perimeter_data_kernel!(
84
84
(nperimeter, _, _, nlevels, nelems) = size (perimeter_data)
85
85
nfidx = DataLayouts. ncomponents (perimeter_data)
86
86
sizep = (nlevels, nperimeter, nfidx, nelems) # assume VIFH order
87
- CI = CartesianIndex
87
+ CI = CartesianFieldIndex
88
88
89
89
if gidx ≤ prod (sizep)
90
90
(level, p, fidx, elem) = cart_ind (sizep, gidx). I
91
91
(ip, jp) = perimeter[p]
92
- val = getindex_field (perimeter_data, CI (p, 1 , fidx, level, elem))
93
- setindex_field! (data, val, CI (ip, jp , fidx, level, elem))
92
+ data[ CI (ip, jp , fidx, level, elem)] =
93
+ perimeter_data[ CI (p, 1 , fidx, level, elem)]
94
94
end
95
95
return nothing
96
96
end
@@ -139,7 +139,7 @@ function dss_local_kernel!(
139
139
nlocalfaces = length (interior_faces)
140
140
(nperimeter, _, _, nlevels, _) = size (perimeter_data)
141
141
nfidx = DataLayouts. ncomponents (perimeter_data)
142
- CI = CartesianIndex
142
+ CI = CartesianFieldIndex
143
143
if gidx ≤ nlevels * nfidx * nlocalvertices # local vertices
144
144
sizev = (nlevels, nfidx, nlocalvertices)
145
145
(level, fidx, vertexid) = cart_ind (sizev, gidx). I
@@ -149,17 +149,12 @@ function dss_local_kernel!(
149
149
for idx in st: (en - 1 )
150
150
(lidx, vert) = local_vertices[idx]
151
151
ip = perimeter_vertex_node_index (vert)
152
- sum_data +=
153
- getindex_field (perimeter_data, CI (ip, 1 , fidx, level, lidx))
152
+ sum_data += perimeter_data[CI (ip, 1 , fidx, level, lidx)]
154
153
end
155
154
for idx in st: (en - 1 )
156
155
(lidx, vert) = local_vertices[idx]
157
156
ip = perimeter_vertex_node_index (vert)
158
- setindex_field! (
159
- perimeter_data,
160
- sum_data,
161
- CI (ip, 1 , fidx, level, lidx),
162
- )
157
+ perimeter_data[CI (ip, 1 , fidx, level, lidx)] = sum_data
163
158
end
164
159
elseif gidx ≤ nlevels * nfidx * (nlocalvertices + nlocalfaces) # interior faces
165
160
nfacedof = div (nperimeter - 4 , 4 )
@@ -176,11 +171,9 @@ function dss_local_kernel!(
176
171
ip2 = inc2 == 1 ? first2 + i - 1 : first2 - i + 1
177
172
idx1 = CI (ip1, 1 , fidx, level, lidx1)
178
173
idx2 = CI (ip2, 1 , fidx, level, lidx2)
179
- val =
180
- getindex_field (perimeter_data, idx1) +
181
- getindex_field (perimeter_data, idx2)
182
- setindex_field! (perimeter_data, val, idx1)
183
- setindex_field! (perimeter_data, val, idx2)
174
+ val = perimeter_data[idx1] + perimeter_data[idx2]
175
+ perimeter_data[idx1] = val
176
+ perimeter_data[idx2] = val
184
177
end
185
178
end
186
179
@@ -353,7 +346,7 @@ function dss_local_ghost_kernel!(
353
346
FT = eltype (parent (perimeter_data))
354
347
(nperimeter, _, _, nlevels, _) = size (perimeter_data)
355
348
nfidx = DataLayouts. ncomponents (perimeter_data)
356
- CI = CartesianIndex
349
+ CI = CartesianFieldIndex
357
350
nghostvertices = length (ghost_vertex_offset) - 1
358
351
if gidx ≤ nlevels * nfidx * nghostvertices
359
352
sizev = (nlevels, nfidx, nghostvertices)
@@ -365,19 +358,14 @@ function dss_local_ghost_kernel!(
365
358
isghost, lidx, vert = ghost_vertices[idx]
366
359
if ! isghost
367
360
ip = perimeter_vertex_node_index (vert)
368
- sum_data +=
369
- getindex_field (perimeter_data, CI (ip, 1 , fidx, level, lidx))
361
+ sum_data += perimeter_data[CI (ip, 1 , fidx, level, lidx)]
370
362
end
371
363
end
372
364
for idx in st: (en - 1 )
373
365
isghost, lidx, vert = ghost_vertices[idx]
374
366
if ! isghost
375
367
ip = perimeter_vertex_node_index (vert)
376
- setindex_field! (
377
- perimeter_data,
378
- sum_data,
379
- CI (ip, 1 , fidx, level, lidx),
380
- )
368
+ perimeter_data[CI (ip, 1 , fidx, level, lidx)] = sum_data
381
369
end
382
370
end
383
371
end
@@ -421,14 +409,13 @@ function fill_send_buffer_kernel!(
421
409
(_, _, _, nlevels, nelems) = size (perimeter_data)
422
410
nfid = DataLayouts. ncomponents (perimeter_data)
423
411
sizet = (nlevels, nfid, nsend)
424
- CI = CartesianIndex
412
+ CI = CartesianFieldIndex
425
413
if gidx ≤ nlevels * nfid * nsend
426
414
(level, fidx, isend) = cart_ind (sizet, gidx). I
427
415
lidx = send_buf_idx[isend, 1 ]
428
416
ip = send_buf_idx[isend, 2 ]
429
417
idx = level + ((fidx - 1 ) + (isend - 1 ) * nfid) * nlevels
430
- send_data[idx] =
431
- getindex_field (perimeter_data, CI (ip, 1 , fidx, level, lidx))
418
+ send_data[idx] = perimeter_data[CI (ip, 1 , fidx, level, lidx)]
432
419
end
433
420
return nothing
434
421
end
@@ -527,27 +514,20 @@ function dss_ghost_kernel!(
527
514
(_, _, _, nlevels, _) = size (perimeter_data)
528
515
nfidx = DataLayouts. ncomponents (perimeter_data)
529
516
nghostvertices = length (ghost_vertex_offset) - 1
530
- CI = CartesianIndex
517
+ CI = CartesianFieldIndex
531
518
if gidx ≤ nlevels * nfidx * nghostvertices
532
519
(level, fidx, ghostvertexidx) =
533
520
cart_ind ((nlevels, nfidx, nghostvertices), gidx). I
534
521
idxresult, lvertresult = repr_ghost_vertex[ghostvertexidx]
535
522
ipresult = perimeter_vertex_node_index (lvertresult)
536
- result = getindex_field (
537
- perimeter_data,
538
- CI (ipresult, 1 , fidx, level, idxresult),
539
- )
523
+ result = perimeter_data[CI (ipresult, 1 , fidx, level, idxresult)]
540
524
st, en = ghost_vertex_offset[ghostvertexidx],
541
525
ghost_vertex_offset[ghostvertexidx + 1 ]
542
526
for vertexidx in st: (en - 1 )
543
527
isghost, eidx, lvert = ghost_vertices[vertexidx]
544
528
if ! isghost
545
529
ip = perimeter_vertex_node_index (lvert)
546
- setindex_field! (
547
- perimeter_data,
548
- result,
549
- CI (ip, 1 , fidx, level, eidx),
550
- )
530
+ perimeter_data[CI (ip, 1 , fidx, level, eidx)] = result
551
531
end
552
532
end
553
533
end
0 commit comments