Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
48d95a0
fundamental functions for face properties and cyl mesh averaging.
dccowan Feb 3, 2023
aaa39f0
Revert "fundamental functions for face properties and cyl mesh averag…
dccowan Feb 3, 2023
29f0b77
Starting Mass matrix funs
dccowan Feb 3, 2023
a716702
basic face properties implementation
dccowan Mar 16, 2023
cbd8e18
Merge branch 'main' into face_props_mass_matrices
dccowan Mar 16, 2023
df15517
Merge branch 'main' into face_props_mass_matrices
dccowan Mar 19, 2023
103014c
Merge branch 'main' into face_props_mass_matrices
dccowan Jun 10, 2023
7064873
re-add property
dccowan Jun 12, 2023
6f1d107
remove average edge to face by component
dccowan Jun 16, 2023
021ba3d
Test tensor for inner products with face properties
dccowan Jun 17, 2023
6118afa
Merge branch 'main' into face_props_mass_matrices
dccowan Jun 17, 2023
e115854
face/edge properties for tree meshes
dccowan Jun 19, 2023
166358e
add 2D tensor and tree tests for face and edge property inner products
dccowan Jun 19, 2023
df9ca18
add derivative tests for face and edge properties (TENSOR and TREE)
dccowan Jun 20, 2023
f4fc514
Add analytic, order and derivative tests for cyl mesh (face properties)
dccowan Jun 21, 2023
3dae379
finalize new inner product names, black and flake8
dccowan Jun 22, 2023
60559fb
add documentation
dccowan Jun 23, 2023
1129e0b
review and bug fixes
dccowan Jun 24, 2023
a4d2d49
Merge branch 'main' into face_props_mass_matrices
dccowan Jun 24, 2023
acf55f5
Merge branch 'main' into face_props_mass_matrices
dccowan Jun 29, 2023
f894add
add ignore lambda fun for flake8 in tests
dccowan Jun 29, 2023
6ba8477
Eliminate 'fast inner products' for face and edge properties. Done na…
dccowan Jul 4, 2023
f8862fb
final style check
dccowan Jul 4, 2023
1e42b16
base mesh tests
dccowan Jul 5, 2023
9380206
code coverage and error raise tests
dccowan Jul 5, 2023
8cac8f7
post Joe comments
dccowan Jul 5, 2023
6cad723
More coverage tests
dccowan Jul 6, 2023
73d6b64
fix broken examples
dccowan Jul 6, 2023
a8dbe89
fix broken example
dccowan Jul 6, 2023
e360437
Merge branch 'main' into face_props_mass_matrices
dccowan Jul 17, 2023
51c16c0
remove main from tests
dccowan Jul 17, 2023
0246f5e
style check
dccowan Jul 17, 2023
e729631
style checks
dccowan Jul 17, 2023
df6fce6
one more format...sigh
dccowan Jul 17, 2023
990cca1
remove NOQA E731
dccowan Jul 18, 2023
76581e3
Merge branch 'main' into face_props_mass_matrices
dccowan Jul 18, 2023
861080b
Address latest round of review
dccowan Jul 18, 2023
97bc7cb
add correct exception
dccowan Jul 18, 2023
76bb3a9
replace `eval` of string
jcapriot Jul 18, 2023
e6c2ce9
Remove `eval` call on tensor test
jcapriot Jul 18, 2023
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
683 changes: 679 additions & 4 deletions discretize/base/base_mesh.py

Large diffs are not rendered by default.

16 changes: 5 additions & 11 deletions discretize/base/base_tensor_mesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -797,18 +797,12 @@ def _fastInnerProduct(

Parameters
----------
model : numpy.ndarray
material property (tensor properties are possible) at each cell center (nC, (1, 3, or 6))

projection_type : str
'edges' or 'faces'

returnP : bool
returns the projection matrices

model : numpy.ndarray
material property (tensor properties are possible) at each cell center (nC, (1, 3, or 6))
invert_model : bool
inverts the material property

invert_matrix : bool
inverts the matrix

Expand Down Expand Up @@ -875,9 +869,9 @@ def _fastInnerProductDeriv(
Parameters
----------
projection_type : str
'E' or 'F'
tensorType : TensorType
type of the tensor
'edges' or 'faces'
model : numpy.ndarray
material property (tensor properties are possible) at each cell center (nC, (1, 3, or 6))
invert_model : bool
inverts the material property
invert_matrix : bool
Expand Down
129 changes: 129 additions & 0 deletions discretize/operators/inner_products.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
inverse_3x3_block_diagonal,
spzeros,
sdinv,
mkvc,
is_scalar,
)
import numpy as np

Expand Down Expand Up @@ -95,6 +97,52 @@ def get_edge_inner_product( # NOQA D102
do_fast=do_fast,
)

def get_edge_inner_product_surface( # NOQA D102
self, model=None, invert_model=False, invert_matrix=False, **kwargs
):
# Inherited documentation from discretize.base.BaseMesh
if model is None:
model = np.ones(self.nF)

if invert_model:
model = 1.0 / model

if is_scalar(model):
model = model * np.ones(self.nF)
# COULD ADD THIS CASE IF DESIRED
# elif len(model) == self.dim:
# model = np.r_[
# [model[ii]*self.vnF[ii] for ii in range(0, self.dim)]
# ]

# Isotropic case only
if model.size != self.nF:
raise ValueError(
"Unexpected shape of tensor: {}".format(model.shape),
"Must be scalar or have length equal to total number of faces.",
)

# number of elements we are averaging (equals dim for regular
# meshes, but for cyl, where we use symmetry, it is 1 for edge
# variables and 2 for face variables)
if self._meshType == "CYL":
shape = self.vnE
if self.is_symmetric:
n_elements = 1
else:
n_elements = sum([1 if x != 0 else 0 for x in shape]) - 1
else:
n_elements = self.dim - 1

Aprop = self.face_areas * mkvc(model)
Av = self.average_edge_to_face
M = n_elements * sdiag(Av.T * Aprop)

if invert_matrix:
return sdinv(M)
else:
return M

def _getInnerProduct(
self,
projection_type,
Expand Down Expand Up @@ -276,6 +324,87 @@ def get_edge_inner_product_deriv( # NOQA D102
invert_matrix=invert_matrix,
)

def get_edge_inner_product_surface_deriv( # NOQA D102
self, model, invert_model=False, invert_matrix=False, **kwargs
):
# Inherited documentation from discretize.base.BaseMesh
if model is None:
tensorType = -1
elif is_scalar(model):
tensorType = 0
elif model.size == self.nF:
tensorType = 1
else:
raise ValueError(
"Unexpected shape of tensor: {}".format(model.shape),
"Must be scalar or have length equal to total number of faces.",
)

dMdprop = None

if invert_matrix or invert_model:
MI = self.get_edge_inner_product_surface(
model,
invert_model=invert_model,
invert_matrix=invert_matrix,
)

# number of elements we are averaging (equals dim for regular
# meshes, but for cyl, where we use symmetry, it is 1 for edge
# variables and 2 for face variables)
if self._meshType == "CYL":
shape = self.vnE
if self.is_symmetric:
n_elements = 1
else:
n_elements = sum([1 if x != 0 else 0 for x in shape]) - 1
else:
n_elements = self.dim - 1

A = sdiag(self.face_areas)
Av = self.average_edge_to_face

if tensorType == 0: # isotropic, constant
ones = sp.csr_matrix(
(np.ones(self.nF), (range(self.nF), np.zeros(self.nF))),
shape=(self.nF, 1),
)
if not invert_matrix and not invert_model:
dMdprop = n_elements * Av.T * A * ones
elif invert_matrix and invert_model:
dMdprop = n_elements * (
sdiag(MI.diagonal() ** 2)
* Av.T
* A
* ones
* sdiag(1.0 / model**2)
)
elif invert_model:
dMdprop = n_elements * Av.T * A * sdiag(-1.0 / model**2)
elif invert_matrix:
dMdprop = n_elements * (sdiag(-MI.diagonal() ** 2) * Av.T * A)

elif tensorType == 1: # isotropic, variable in space
if not invert_matrix and not invert_model:
dMdprop = n_elements * Av.T * A
elif invert_matrix and invert_model:
dMdprop = n_elements * (
sdiag(MI.diagonal() ** 2) * Av.T * A * sdiag(1.0 / model**2)
)
elif invert_model:
dMdprop = n_elements * Av.T * A * sdiag(-1.0 / model**2)
elif invert_matrix:
dMdprop = n_elements * (sdiag(-MI.diagonal() ** 2) * Av.T * A)

if dMdprop is not None:

def innerProductDeriv(v):
return sdiag(v) * dMdprop

return innerProductDeriv
else:
return None

def _getInnerProductDeriv(
self,
model,
Expand Down
6 changes: 6 additions & 0 deletions tests/base/test_basemesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,14 @@ class TestBaseMesh(unittest.TestCase):
not_implemented_functions = [
"get_face_inner_product",
"get_edge_inner_product",
"get_face_inner_product_surface",
"get_edge_inner_product_surface",
"get_edge_inner_product_line",
"get_face_inner_product_deriv",
"get_edge_inner_product_deriv",
"get_face_inner_product_surface_deriv",
"get_edge_inner_product_surface_deriv",
"get_edge_inner_product_line_deriv",
"point2index",
"get_interpolation_matrix",
]
Expand Down
Loading