Skip to content
Open
Show file tree
Hide file tree
Changes from 136 commits
Commits
Show all changes
198 commits
Select commit Hold shift + click to select a range
3e046af
elementary tagging
nchristensen Oct 25, 2020
cd80428
use tag rather than string
nchristensen Nov 10, 2020
a7581e3
add blank lines
nchristensen Nov 10, 2020
0815303
remove typo
nchristensen Nov 10, 2020
c04f46c
Merge branch 'master' into dof_tagging
nchristensen Nov 16, 2020
4dd15cd
setup.py
nchristensen Nov 16, 2020
fbc329d
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen Nov 16, 2020
ac2cd1b
add documentation
nchristensen Nov 16, 2020
6f0a97a
update required Loopy version
nchristensen Nov 16, 2020
3f727b5
remove spaces
nchristensen Nov 16, 2020
ee54dea
only import auto and GlobalArg
nchristensen Nov 16, 2020
7828ec1
remove redundant import
nchristensen Nov 16, 2020
759d34d
blank line
nchristensen Nov 16, 2020
7048d2a
remove white space
nchristensen Nov 16, 2020
1942d6f
Merge branch 'master' into dof_tagging
nchristensen Nov 24, 2020
4feed77
requirements.txt
nchristensen Dec 1, 2020
bafd4e7
update required version
nchristensen Dec 1, 2020
5e43f1e
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen Dec 1, 2020
ddbdf71
redundant import
nchristensen Dec 1, 2020
8d2d563
remove redundant import
nchristensen Dec 1, 2020
cf1ac13
requirements.txt
nchristensen Dec 1, 2020
0861aef
Merge remote-tracking branch 'upstream/master' into dof_tagging
nchristensen Dec 1, 2020
33ec3a7
update version number
nchristensen Dec 1, 2020
0f67d1a
requirements.txt pytential version
nchristensen Dec 1, 2020
7cb9124
not the problem
nchristensen Dec 1, 2020
847eb1e
missing egg?
nchristensen Dec 1, 2020
a895671
point firedrake to fork
nchristensen Dec 1, 2020
d1700e9
Trigger CI
nchristensen Dec 1, 2020
5d8a14c
back down pytools and loopy versions for firedrake
nchristensen Dec 1, 2020
09c8fe1
fix setup.py
nchristensen Dec 1, 2020
1d50cf5
Update meshmode/dof_array.py
nchristensen Dec 7, 2020
866b52b
DOFTag -> IsDOFArray
nchristensen Dec 7, 2020
068f71e
Use IsDOFArray
nchristensen Dec 7, 2020
cc3eb65
use tag in transform code
nchristensen Dec 7, 2020
c106e24
flake8
nchristensen Dec 7, 2020
b7b1662
more flake8
nchristensen Dec 7, 2020
610bc1f
Add exception handling to transform function
nchristensen Dec 11, 2020
82bd6c3
bump required pytools version
nchristensen Dec 15, 2020
3cd9323
Merge remote-tracking branch 'upstream/master' into dof_tagging
nchristensen Dec 15, 2020
1cf6d72
trigger GitHub actions
nchristensen Dec 15, 2020
d72a388
add tag to oversample_mat kernel
nchristensen Dec 15, 2020
fb57d6d
tag IsDOFArray in unflatten
nchristensen Dec 15, 2020
d182c82
add IsDOFTag
nchristensen Dec 15, 2020
a0f3982
fix import
nchristensen Dec 15, 2020
dd6a8bc
specify array shape
nchristensen Dec 15, 2020
1849c35
handle math operations first
nchristensen Jan 1, 2021
7cad457
parameterize test generation by array context
nchristensen Jan 8, 2021
834bec0
Merge branch 'master' into dof_tagging
nchristensen Jan 11, 2021
bc87918
flake8 fix
nchristensen Jan 11, 2021
3f6bc98
update requirements
nchristensen Jan 11, 2021
a00bf08
add coord_dtype parameter to generate_regular_rect_mesh
nchristensen Jan 23, 2021
0ba40f8
add documentation for coord_dtype
nchristensen Feb 16, 2021
34c75ec
Allow for specifying shape in scalar loopy function generator
nchristensen Feb 16, 2021
5e28e74
Merge branch 'master' into dof_tagging
nchristensen Feb 16, 2021
c4ff43f
pass coord_dtype to box generator
nchristensen Feb 16, 2021
9028a79
Index into tuple returned from call_loopy
nchristensen Feb 16, 2021
192998c
Index into return tuple
nchristensen Feb 16, 2021
5c2a52a
Specify not the shape in elwise kernel for now
nchristensen Feb 16, 2021
a5fac08
Trigger CI
nchristensen Feb 16, 2021
2c9161e
update requirements.txt
nchristensen Feb 16, 2021
1d0f360
Add missing underscore to _array_context
nchristensen Mar 22, 2021
0a5cbd4
remove shape argument from special function generator
nchristensen Mar 24, 2021
c193ece
move ParameterValue to meshmode
nchristensen Apr 6, 2021
c21de15
add ParameterValues to nodes
nchristensen May 3, 2021
022b67e
fix parameters with tag values
nchristensen May 4, 2021
07690d7
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen May 4, 2021
8e5c5d2
taggable numpy array, undo shape specification for nodes
nchristensen May 4, 2021
d487fa7
push memory usage
nchristensen May 22, 2021
8273bd4
Merge up to 6bab0e7
nchristensen May 22, 2021
8143728
remove coord_dtype, add return statement
nchristensen May 24, 2021
16fd54c
fix return indexing
nchristensen May 24, 2021
9b3d265
More support for coord_dtype
nchristensen May 24, 2021
423df31
Add IsOpArry tag
nchristensen Jun 1, 2021
55e913d
pass shape and dtype into special function generator
nchristensen Jun 9, 2021
5e4332a
Pass sizes to nodes function
nchristensen Jun 10, 2021
09e0122
Fix special function datatype specification
nchristensen Jun 11, 2021
dbef82f
add missing imports
nchristensen Jun 11, 2021
58f3791
merge changes from main branch
nchristensen Jun 21, 2021
66174b1
enable resample_by_mat autotuning
nchristensen Jul 16, 2021
b8a97a0
Indirection permutation code
nchristensen Aug 23, 2021
82b68e2
merge upstream changes
nchristensen Aug 23, 2021
63dbbea
wrap tags in list
nchristensen Aug 25, 2021
075493e
Merge commit '956f7ddaa7805db89b752494203adc11b77481c8' into dof_tagg…
nchristensen Sep 20, 2021
fba968c
wrap tags in list
nchristensen Sep 20, 2021
08cabf2
Kernel tags, variable name updates
nchristensen Sep 20, 2021
249b673
remove commented code
nchristensen Oct 5, 2021
4cdff69
Event now in returned dictionary
nchristensen Oct 11, 2021
151bbf5
merge upstream changes
nchristensen Nov 13, 2021
d221782
Add kernel data tags
nchristensen Nov 13, 2021
54f9966
Define resample_mat object
nchristensen Nov 13, 2021
c379d42
Specify parameters to vandermonde applicator
nchristensen Nov 16, 2021
4b192c2
Disable sqrt for now, raises error
nchristensen Dec 1, 2021
06bac74
Merge remote-tracking branch 'upstream/main' into dof_tagging_updated
nchristensen Dec 1, 2021
689b826
merge upstream changes
nchristensen Jan 10, 2022
bbb3f6d
Reorganize tags
nchristensen Jan 11, 2022
855842c
Merge branch 'dof_tagging_updated' of github.com:nchristensen/meshmod…
nchristensen Jan 11, 2022
8b0c6b4
add egg=pytools
nchristensen Jan 11, 2022
6209f7d
remove whitespace
nchristensen Jan 11, 2022
7f30a60
remove unneeded file
nchristensen Jan 11, 2022
3d53647
Remove more redundant files
nchristensen Jan 11, 2022
1a7bdc2
Remove unneeded IsDOFArray import
nchristensen Jan 11, 2022
ee83e3c
Remove more unused imports
nchristensen Jan 11, 2022
755f06a
remove redundant import
nchristensen Jan 11, 2022
ed3db7c
flake8 fixes
nchristensen Jan 11, 2022
08da82f
Merge remote-tracking branch 'upstream/main' into dof_tagging_updated
nchristensen Jan 16, 2022
e173643
Move more tags from arraycontext
nchristensen Jan 16, 2022
0f3e482
remove white space
nchristensen Jan 18, 2022
b6853f1
flake8 errors in transform_metadata.py
nchristensen Jan 18, 2022
d7ad0af
Simplify projection.py imports
nchristensen Jan 18, 2022
0ceff61
simplify modal.py imports
nchristensen Jan 18, 2022
40b6f4d
dof_array.py flake8 fixes
nchristensen Jan 18, 2022
5024a47
Remove indexing into returned value
nchristensen Jan 18, 2022
195c2ba
Uncomment sqrt call
nchristensen Jan 18, 2022
ad5479e
Remove allocation tracking code
nchristensen Jan 18, 2022
50ed17f
Simplify imports
nchristensen Jan 18, 2022
b4b4968
Simpify discretization __init__.py imports
nchristensen Jan 18, 2022
bad1322
Remove now unnecessary indexing
nchristensen Jan 18, 2022
12415b3
flake8 fixes
nchristensen Jan 18, 2022
940c8b8
Simplify direct.py imports
nchristensen Jan 18, 2022
7a78af9
Delete commented code
nchristensen Jan 24, 2022
8ed6673
Remove unused permutation code
nchristensen Jan 24, 2022
572f639
Remove more commented code
nchristensen Jan 24, 2022
3e7419f
Remove more unused code
nchristensen Jan 25, 2022
04735e5
Remove unused pick_knl_rhs
nchristensen Jan 25, 2022
8838308
remove untested changes to _apply_without_inplace_updates
nchristensen Jan 25, 2022
24e7065
Remove comment
nchristensen Jan 25, 2022
1e134b0
flake8 fixes
nchristensen Jan 25, 2022
7882870
Use upstream arraycontext.py
nchristensen Jan 25, 2022
f207d96
flake8 fixes
nchristensen Jan 25, 2022
e2c4390
specify ValueArg datatypes
nchristensen Jan 25, 2022
fe04d4d
Fixes to pass tests
nchristensen Jan 25, 2022
567c99e
Delete unneeded print statement
nchristensen Jan 25, 2022
243aeb9
Delete redundant return
nchristensen Jan 25, 2022
28b8c55
Pass data types of all arrays into kernel
nchristensen Jan 25, 2022
d49b2dd
Merge branch 'main' into dof_tagging
nchristensen Jan 25, 2022
22acdb5
Remove comment
nchristensen Jan 30, 2022
25a6670
Only pass tags to einsum
nchristensen Jan 31, 2022
6a613b9
Use iterator instead of appending to list
nchristensen Jan 31, 2022
86a4590
Merge branch 'main' into dof_tagging
nchristensen Jan 31, 2022
f150cf0
remove redundant tuple conversion
nchristensen Jan 31, 2022
ef8c10d
Remove redundant list declaration
nchristensen Jan 31, 2022
aa2d762
Improve documentation, remove unused argument
nchristensen Jan 31, 2022
4fa3658
use type hint instead of assertion in transform_metadata
nchristensen Jan 31, 2022
bdebcdb
add autoclass comments
nchristensen Jan 31, 2022
5a2eb9f
Use immutables.Map instead of frozendict
nchristensen Feb 7, 2022
368ed94
Fix doc error
nchristensen Feb 7, 2022
9c02e7a
Delete unneeded file
nchristensen Feb 7, 2022
8e85fef
Update documentation
nchristensen Feb 7, 2022
fe5d865
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen Feb 7, 2022
4a29b8a
Merge branch 'main' into dof_tagging
nchristensen Feb 9, 2022
da69c01
Do type conversion inside constructor
nchristensen Feb 9, 2022
3ec5afa
Merge branch 'main' into dof_tagging
nchristensen Feb 13, 2022
a1be7d0
Flake8 fix
nchristensen Feb 14, 2022
fa3e20a
Make tags classes dataclasses
nchristensen Feb 15, 2022
42f2117
Merge remote-tracking branch 'upstream/main' into dof_tagging
nchristensen Feb 15, 2022
049061b
Merge branch 'main' into dof_tagging
nchristensen Feb 25, 2022
d733584
fix merge conflicts
nchristensen Mar 8, 2022
322cd4a
kernel_data for kernels
nchristensen Mar 14, 2022
0c80f6a
resolve merge conflicts
nchristensen Mar 14, 2022
f3ee308
extraneous bracket
nchristensen Mar 14, 2022
ea4d73f
Merge branch 'main' into dof_tagging
nchristensen Mar 20, 2022
404f709
test_element_orientation_via_single_elements (from @lukeolson)
inducer Mar 25, 2022
0fd56b2
Merge remote-tracking branch 'upstream/orientation-check' into dof_ta…
nchristensen Mar 28, 2022
a2d1cfb
Revert "add types and some docs to meshmode.mesh.visualization"
nchristensen Mar 30, 2022
4871b2f
Support for new picking kernels
nchristensen Apr 7, 2022
710dadb
Merge branch 'main' into dof_tagging_updated
nchristensen Apr 24, 2022
1d64425
remove binary file
nchristensen Apr 24, 2022
bc83cd8
Remove test code
nchristensen Apr 24, 2022
13cfd7a
visualization.py from main
nchristensen Apr 24, 2022
b1d9bad
opposite_face.py from main
nchristensen Apr 24, 2022
975ce41
Merge branch 'main' into dof_tagging
nchristensen Apr 24, 2022
ba3f5a9
flake8 fixes
nchristensen Apr 24, 2022
cee96cd
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen Apr 24, 2022
aac4556
remove comments and print statements
nchristensen Apr 24, 2022
bf86224
remove debugging print statement
nchristensen Apr 24, 2022
9caa675
Point requirements.txt toward specific loopy branch
nchristensen Apr 24, 2022
dcbc29f
fix requirements.txt
nchristensen Apr 24, 2022
156d529
Merge branch 'main' into dof_tagging
nchristensen Apr 25, 2022
0341f39
Merge remote-tracking branch 'upstream/main' into dof_tagging
nchristensen May 2, 2022
fddbc34
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen May 2, 2022
71f701a
update requirements.txt
nchristensen May 22, 2022
3d35bc8
Merge remote-tracking branch 'upstream/main' into dof_tagging
nchristensen Jun 1, 2022
14583bb
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen Jun 1, 2022
3d29155
Merge upstream changes
nchristensen Jun 14, 2022
0ba5fd5
CHERRY-PICK: SingleGridPytatoArrayContext
kaushikcfd Mar 12, 2022
a7036d7
Adds more pytato utils: Axes types unification
kaushikcfd Mar 12, 2022
9ebdf05
Implements FusionContractorArrayContext
kaushikcfd Mar 12, 2022
5d98d87
adds feinsum, kanren to deps
kaushikcfd Mar 12, 2022
1306122
add mpi_distribute
majosm Mar 16, 2022
dc3051f
add type hints to mpi_distribute
majosm Jun 29, 2022
23c305b
Merge branch 'mpi-distribute' into production
majosm Jul 5, 2022
8612826
Add single indirection resampling code
nchristensen Jul 8, 2022
6881694
Delete numpy version of single indirection code
nchristensen Jul 8, 2022
4f62ee2
update requirements.txt
nchristensen Jul 8, 2022
4f9c8dd
Merge upstream
nchristensen Jul 8, 2022
a9db0c7
Fix incorrect variable names
nchristensen Jul 12, 2022
d46d9d4
Merge remote-tracking branch 'matt/production' into dof_tagging
nchristensen Jul 12, 2022
a3b2cc1
Merge branch 'dof_tagging' of github.com:nchristensen/meshmode into d…
nchristensen Jul 12, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 56 additions & 8 deletions meshmode/discretization/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@

import loopy as lp
from meshmode.transform_metadata import (
ConcurrentElementInameTag, ConcurrentDOFInameTag, FirstAxisIsElementsTag)
ConcurrentElementInameTag, ConcurrentDOFInameTag, FirstAxisIsElementsTag,
IsDOFArray, ParameterValue, IsOpArray, KernelDataTag)

from warnings import warn

Expand Down Expand Up @@ -553,6 +554,10 @@ def prg():
t_unit = make_loopy_program(
"{[iel,idof]: 0<=iel<nelements and 0<=idof<nunit_dofs}",
"result[iel,idof] = weights[idof]",
kernel_data=[
lp.GlobalArg("result", None, shape=lp.auto, tags=[IsDOFArray()]),
...
],
name="quad_weights")
return lp.tag_inames(t_unit, {
"iel": ConcurrentElementInameTag(),
Expand Down Expand Up @@ -601,10 +606,30 @@ def resample_mesh_nodes(grp, iaxis):
and np.linalg.norm(grp_unit_nodes - meg_unit_nodes) < tol):
return nodes

mat = actx.from_numpy(grp.from_mesh_interp_matrix())
fp_format = nodes.dtype
ne, nj = nodes.shape
ni, nj = mat.shape

kernel_data = [
lp.GlobalArg("arg1", fp_format, shape=(ne, nj),
offset=lp.auto), # In default data layout apparently
lp.GlobalArg("arg0", fp_format, shape=(ni, nj), offset=lp.auto,
tags=[IsOpArray()]),
lp.GlobalArg("out", fp_format, shape=(ne, ni), offset=lp.auto,
tags=[IsDOFArray()], is_output=True),
lp.ValueArg("Ni", tags=[ParameterValue(ni)]),
lp.ValueArg("Nj", tags=[ParameterValue(nj)]),
lp.ValueArg("Ne", tags=[ParameterValue(ne)]),
...
]
Comment thread
nchristensen marked this conversation as resolved.
Outdated

kd_tag = KernelDataTag(kernel_data)

return actx.einsum("ij,ej->ei",
actx.from_numpy(grp.from_mesh_interp_matrix()),
mat,
nodes,
tagged=(FirstAxisIsElementsTag(),))
tagged=(FirstAxisIsElementsTag(), kd_tag,))

result = make_obj_array([
_DOFArray(None, tuple([
Expand Down Expand Up @@ -660,12 +685,35 @@ def get_mat(grp, gref_axes):

return actx.from_numpy(mat)

return _DOFArray(actx, tuple(
actx.einsum("ij,ej->ei",
get_mat(grp, ref_axes),
data = []
for grp in discr.groups:

mat = get_mat(grp, ref_axes)
fp_format = vec[grp.index].dtype
ne, nj = vec[grp.index].shape
ni, nj = mat.shape

kernel_data = [
lp.GlobalArg("arg1", fp_format, shape=(ne, nj), offset=lp.auto,
tags=[IsDOFArray()]),
lp.GlobalArg("arg0", fp_format, shape=(ni, nj), offset=lp.auto,
tags=[IsOpArray()]),
lp.GlobalArg("out", fp_format, shape=(ne, ni), offset=lp.auto,
tags=[IsDOFArray()], is_output=True),
lp.ValueArg("Ni", tags=[ParameterValue(ni)]),
lp.ValueArg("Nj", tags=[ParameterValue(nj)]),
lp.ValueArg("Ne", tags=[ParameterValue(ne)]),
...
]

kd_tag = KernelDataTag(kernel_data)

data.append(actx.einsum("ij,ej->ei",
mat,
vec[grp.index],
tagged=(FirstAxisIsElementsTag(),))
for grp in discr.groups))
tagged=(FirstAxisIsElementsTag(), kd_tag,)))

return _DOFArray(actx, tuple(data))

# }}}

Expand Down
56 changes: 40 additions & 16 deletions meshmode/discretization/connection/direct.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@

import loopy as lp
from meshmode.transform_metadata import (
ConcurrentElementInameTag, ConcurrentDOFInameTag)
ConcurrentElementInameTag, ConcurrentDOFInameTag,
IsOpArray, IsDOFArray, ParameterValue)
from pytools import memoize_in, keyed_memoize_method
from arraycontext import (
ArrayContext, NotAnArrayContainerError,
Expand Down Expand Up @@ -504,7 +505,8 @@ def _apply_with_inplace_updates(self, ary):

@memoize_in(actx, (DirectDiscretizationConnection,
"resample_by_mat_knl_inplace"))
def mat_knl():
def mat_knl(nelements_vec, nelements_result, n_to_nodes, n_from_nodes,
result_dtype, rmat_dtype, ary_dtype, index_dtype):
t_unit = make_loopy_program(
"""{[iel, idof, j]:
0<=iel<nelements and
Expand All @@ -514,14 +516,23 @@ def mat_knl():
= sum(j, resample_mat[idof, j] \
* ary[from_element_indices[iel], j])",
[
lp.GlobalArg("result", None,
lp.GlobalArg("result", result_dtype,
shape="nelements_result, n_to_nodes",
offset=lp.auto),
lp.GlobalArg("ary", None,
offset=lp.auto, tags=[IsDOFArray()]),
lp.GlobalArg("resample_mat", rmat_dtype,
shape="n_to_nodes, n_from_nodes",
offset=lp.auto, tags=[IsOpArray()]),
lp.GlobalArg("ary", ary_dtype,
shape="nelements_vec, n_from_nodes",
offset=lp.auto),
lp.ValueArg("nelements_result", np.int32),
lp.ValueArg("nelements_vec", np.int32),
offset=lp.auto, tags=[IsDOFArray()]),
lp.ValueArg("n_to_nodes", np.int32,
tags=[ParameterValue(n_to_nodes)]),
lp.ValueArg("n_from_nodes", np.int32,
tags=[ParameterValue(n_from_nodes)]),
lp.ValueArg("nelements_result", np.int32,
tags=[ParameterValue(nelements_result)]),
lp.ValueArg("nelements_vec", np.int32,
tags=[ParameterValue(nelements_vec)]),
"...",
],
name="resample_by_mat_inplace")
Expand All @@ -532,7 +543,7 @@ def mat_knl():

@memoize_in(actx,
(DirectDiscretizationConnection, "resample_by_picking_knl_inplace"))
def pick_knl():
def pick_knl(n_to_nodes):
t_unit = make_loopy_program(
"""{[iel, idof]:
0<=iel<nelements and
Expand All @@ -542,13 +553,15 @@ def pick_knl():
[
lp.GlobalArg("result", None,
shape="nelements_result, n_to_nodes",
offset=lp.auto),
offset=lp.auto, tags=[IsDOFArray()]),
lp.GlobalArg("ary", None,
shape="nelements_vec, n_from_nodes",
offset=lp.auto),
offset=lp.auto, tags=[IsDOFArray()]),
lp.ValueArg("nelements_result", np.int32),
lp.ValueArg("nelements_vec", np.int32),
lp.ValueArg("n_from_nodes", np.int32),
lp.ValueArg("n_to_nodes", np.int32,
tags=[ParameterValue(n_to_nodes)]),
"...",
],
name="resample_by_picking_inplace")
Expand All @@ -571,16 +584,27 @@ def pick_knl():
actx, i_tgrp, i_batch)

if point_pick_indices is None:
actx.call_loopy(mat_knl(),
resample_mat=self._resample_matrix(
actx, i_tgrp, i_batch),
resample_mat = self._resample_matrix(actx, i_tgrp, i_batch)
n_to_nodes, n_from_nodes = resample_mat.shape
nelements_result, _ = result[i_tgrp].shape
nelements_vec, _ = ary[batch.from_group_index].shape
index_dtype = batch.from_element_indices.dtype
result_dtype = result[i_tgrp].dtype
rmat_dtype = resample_mat.dtype
ary_dtype = ary[batch.from_group_index].dtype

actx.call_loopy(mat_knl(nelements_vec, nelements_result,
n_to_nodes, n_from_nodes,
result_dtype, rmat_dtype, ary_dtype, index_dtype),
resample_mat=resample_mat,
result=result[i_tgrp],
ary=ary[batch.from_group_index],
from_element_indices=batch.from_element_indices,
to_element_indices=batch.to_element_indices)

else:
actx.call_loopy(pick_knl(),
nelements, n_to_nodes = result[i_tgrp].shape
actx.call_loopy(pick_knl(n_to_nodes),
pick_list=point_pick_indices,
result=result[i_tgrp],
ary=ary[batch.from_group_index],
Expand Down Expand Up @@ -639,7 +663,7 @@ def knl():
[
lp.GlobalArg("result", None,
shape="nnodes_tgt, nnodes_src",
offset=lp.auto),
offset=lp.auto, tags=[IsDOFArray()]),
lp.ValueArg("itgt_base, isrc_base", np.int32),
lp.ValueArg("nnodes_tgt, nnodes_src", np.int32),
"...",
Expand Down
31 changes: 26 additions & 5 deletions meshmode/discretization/connection/modal.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@
import numpy.linalg as la
import modepy as mp

from arraycontext import (
NotAnArrayContainerError, serialize_container, deserialize_container)
from meshmode.transform_metadata import FirstAxisIsElementsTag
from arraycontext import (NotAnArrayContainerError,
serialize_container, deserialize_container,)
from meshmode.transform_metadata import (FirstAxisIsElementsTag,
KernelDataTag, IsDOFArray, IsOpArray, ParameterValue)
from meshmode.discretization import InterpolatoryElementGroupBase
from meshmode.discretization.poly_element import QuadratureSimplexElementGroup
from meshmode.discretization.connection.direct import DiscretizationConnection
Expand Down Expand Up @@ -162,10 +163,30 @@ def vandermonde_inverse(grp):
vdm_inv = la.inv(vdm)
return actx.from_numpy(vdm_inv)

fp_format = ary[grp.index].dtype
vi_mat = vandermonde_inverse(grp)
ne, nj = ary[grp.index].shape
ni, nj = vi_mat.shape

import loopy as lp
kernel_data = [
lp.GlobalArg("arg1", fp_format, shape=(ne, nj), offset=lp.auto,
tags=[IsDOFArray()]),
lp.GlobalArg("arg0", fp_format, shape=(ni, nj), offset=lp.auto,
tags=[IsOpArray()]),
lp.GlobalArg("out", fp_format, shape=(ne, ni), offset=lp.auto,
tags=[IsDOFArray()], is_output=True),
lp.ValueArg("Ni", tags=[ParameterValue(ni)]),
lp.ValueArg("Nj", tags=[ParameterValue(nj)]),
lp.ValueArg("Ne", tags=[ParameterValue(ne)]),
...
]
kd_tag = KernelDataTag(kernel_data)

return actx.einsum("ij,ej->ei",
vandermonde_inverse(grp),
vi_mat,
ary[grp.index],
tagged=(FirstAxisIsElementsTag(),))
tagged=(FirstAxisIsElementsTag(), kd_tag,))

def __call__(self, ary):
"""Computes modal coefficients data from a functions
Expand Down
4 changes: 2 additions & 2 deletions meshmode/discretization/connection/projection.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from arraycontext import (
NotAnArrayContainerError,
make_loopy_program, serialize_container, deserialize_container)
from meshmode.transform_metadata import FirstAxisIsElementsTag
from meshmode.transform_metadata import FirstAxisIsElementsTag, IsDOFArray
from meshmode.discretization.connection.direct import (
DiscretizationConnection,
DirectDiscretizationConnection)
Expand Down Expand Up @@ -172,7 +172,7 @@ def kproj():
shape=("n_from_elements", "n_from_nodes")),
lp.GlobalArg("result", None,
shape=("n_to_elements", "n_to_nodes"),
is_input=False),
is_input=False, tags=[IsDOFArray()]),
lp.GlobalArg("basis_tabulation", None,
shape=("n_to_nodes", "n_to_nodes")),
lp.GlobalArg("weights", None,
Expand Down
13 changes: 9 additions & 4 deletions meshmode/dof_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
from pytools import single_valued, memoize_in

from meshmode.transform_metadata import (
ConcurrentElementInameTag, ConcurrentDOFInameTag)
ConcurrentElementInameTag, ConcurrentDOFInameTag,
IsDOFArray)
from arraycontext import (
ArrayContext, NotAnArrayContainerError,
make_loopy_program, with_container_arithmetic,
Expand All @@ -61,9 +62,9 @@
.. autofunction:: check_dofarray_against_discr
"""


# {{{ DOFArray


@with_container_arithmetic(
bcast_obj_array=True,
bcast_numpy_array=True,
Expand Down Expand Up @@ -431,9 +432,9 @@ def prg():
""",
[
lp.GlobalArg("result", None,
shape="nelements * ndofs_per_element"),
shape="nelements * ndofs_per_element"),
lp.GlobalArg("grp_ary", None,
shape=("nelements", "ndofs_per_element")),
shape=("nelements", "ndofs_per_element"), tags=[IsDOFArray()]),
lp.ValueArg("nelements", np.int32),
lp.ValueArg("ndofs_per_element", np.int32),
"..."
Expand Down Expand Up @@ -508,6 +509,10 @@ def prg():
t_unit = make_loopy_program(
"{[iel,idof]: 0<=iel<nelements and 0<=idof<ndofs_per_element}",
"result[iel, idof] = ary[grp_start + iel*ndofs_per_element + idof]",
kernel_data=[
lp.GlobalArg("result", None, shape=lp.auto, tags=[IsDOFArray()]),
...
],
name="unflatten")
return lp.tag_inames(t_unit, {
"iel": ConcurrentElementInameTag(),
Expand Down
1 change: 1 addition & 0 deletions meshmode/mesh/generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -1226,6 +1226,7 @@ def generate_regular_rect_mesh(a=(0, 0), b=(1, 1), *, nelements_per_axis=None,
npoints_per_axis=None,
periodic=None,
order=1,
coord_dtype=np.float32,
boundary_tag_to_face=None,
group_cls=None,
mesh_type=None,
Expand Down
38 changes: 37 additions & 1 deletion meshmode/transform_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
THE SOFTWARE.
"""

from pytools.tag import Tag
from pytools.tag import Tag, UniqueTag


class FirstAxisIsElementsTag(Tag):
Expand Down Expand Up @@ -57,3 +57,39 @@ class ConcurrentDOFInameTag(Tag):
computations for all DOFs within each element may be performed
concurrently.
"""


class ParameterValue(UniqueTag):
"""A tag that applies to :class:`loopy.ValueArg`. Instances of this tag
are initialized with the value of the parameter and this value may be
later retrieved
for use with `loopy.fix_parameter` in `transform_loopy_program`. This allows
the fixing of parameters whose values cannot be set during the creation of the
program/kernel. This is useful for fixing the loop parameters of einsum kernels
for instance.
"""

def __init__(self, value):
self.value = value


class IsDOFArray(Tag):
"""A tag that is applicable to :class:`loopy.ArrayArg` indicating the content of the
array comprises element DOFs.
"""
pass


class IsOpArray(Tag):
"""A tag that is applicable to arrays indicating the array is an
operator (as opposed, for instance, to a DOF array)."""
pass


class KernelDataTag(Tag):
"""A tag that applies to :class:`loopy.LoopKernel`. Kernel data provided
with this tag can be later applied to the kernel. This is used, for
instance, to specify kernel data in einsum kernels."""

def __init__(self, kernel_data):
self.kernel_data = kernel_data
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,13 @@ def main():
"numpy",
"modepy>=2020.2",
"gmsh_interop",
"pytools>=2020.4.1",
"pytools>=2020.4.5",
"pytest>=2.3",

# 2019.1 is required for the Firedrake CIs, which use an very specific
# version of Loopy.
"loopy>=2019.1",
#"loopy>=2019.1",
"loopy>=2020.2.2",

"arraycontext",

Expand Down