Skip to content

Commit 23d236e

Browse files
single weakform model working.
1 parent f1aa3d3 commit 23d236e

File tree

2 files changed

+38
-43
lines changed

2 files changed

+38
-43
lines changed

examples/fem/basis.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ def transform(self, detJ, Jinv, orig):
8585
soln.update(basis.transform(detJ, Jinv, orig))
8686
return soln
8787

88+
def compute_transform(self, geo):
89+
return self.basis[0].compute_transform(geo)
90+
8891

8992
class Basis:
9093
def __init__(self, names, nnodes=1, kind="input"):
@@ -95,6 +98,9 @@ def __init__(self, names, nnodes=1, kind="input"):
9598
self.nnodes = nnodes
9699
self.kind = kind
97100

101+
if not (self.kind == "input" or self.kind == "data"):
102+
raise ValueError(f"{self.kind} not recognized")
103+
98104
def add_declarations(self, comp):
99105
"""Add the declarations to the component"""
100106

@@ -390,4 +396,7 @@ def get_spaces(self):
390396
return list(self.names.keys())
391397

392398
def get_names(self, space):
393-
return self.names[space]
399+
if space in self.names:
400+
return self.names[space]
401+
else:
402+
return []

examples/fem/fem.py

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@
1111

1212

1313
class DofSource(am.Component):
14-
def __init__(self, input_names=[], geo_names=[], data_names=[], con_names=[]):
14+
def __init__(self, input_names=[], data_names=[], con_names=[]):
1515
super().__init__()
1616

1717
# Geo and data added as data to the component
1818
for name in data_names:
1919
self.add_data(name)
20-
for name in geo_names:
21-
self.add_data(name)
2220

2321
# Add inputs and constraints
2422
for name in input_names:
@@ -30,23 +28,15 @@ def __init__(self, input_names=[], geo_names=[], data_names=[], con_names=[]):
3028

3129

3230
class DegreesOfFreedom:
33-
def __init__(self, mesh, space, kind="input"):
31+
def __init__(self, mesh, space, kind="input", name="src"):
3432
"""
3533
Allocate the degrees of freedom on the mesh
3634
"""
3735

3836
self.mesh = mesh
3937
self.space = space
4038
self.kind = kind
41-
42-
return
43-
44-
def _initialize(self):
45-
"""
46-
Initialize the degrees of freedom associated with this mesh
47-
"""
48-
49-
# Allocate degrees of freedom for each of the nodes/
39+
self.name = name
5040

5141
return
5242

@@ -56,29 +46,25 @@ def add_source(self, model):
5646

5747
# Create amigo source component with input names and geo names
5848
input_names = []
59-
geo_names = []
6049
data_names = []
6150
if self.kind == "input":
6251
input_names = names
6352
elif self.kind == "data":
6453
data_names = names
65-
elif self.kind == "geo":
66-
geo_names = names
6754

68-
dof_src = DofSource(
69-
input_names=input_names, geo_names=geo_names, data_names=data_names
70-
)
55+
dof_src = DofSource(input_names=input_names, data_names=data_names)
7156

7257
# Add global mesh source component
7358
nnodes = mesh.get_num_nodes()
74-
model.add_component(f"src_{self.kind}", nnodes, dof_src)
59+
model.add_component(f"src_{self.name}", nnodes, dof_src)
60+
# src_soln, src_data, src_geo
7561

7662
def link_dof(self, model, domain, etype, elem_name):
7763
names = self.space.get_names("H1")
7864
conn = self.mesh.get_conn(domain, etype)
7965
for name in names:
8066
model.link(
81-
f"src_{self.kind}.{name}", f"{elem_name}.{name}", src_indices=conn
67+
f"src_{self.name}.{name}", f"{elem_name}.{name}", src_indices=conn
8268
)
8369
return
8470

@@ -246,9 +232,13 @@ def __init__(self, mesh, soln_space, weakform, data_space=[], geo_space=[], ndim
246232

247233
# Initialize Dof's
248234
# Take in the soln space -> removes "H1" input
249-
self.soln_dof = DegreesOfFreedom(mesh, self.soln_space, "soln")
250-
self.geo_dof = DegreesOfFreedom(mesh, self.geo_space, "geo")
251-
self.data_dof = DegreesOfFreedom(mesh, self.data_space, "data")
235+
self.soln_dof = DegreesOfFreedom(
236+
mesh, self.soln_space, kind="input", name="soln"
237+
)
238+
self.geo_dof = DegreesOfFreedom(mesh, self.geo_space, kind="data", name="geo")
239+
self.data_dof = DegreesOfFreedom(
240+
mesh, self.data_space, kind="data", name="data"
241+
)
252242

253243
return
254244

@@ -311,9 +301,7 @@ def __init__(
311301
):
312302
super().__init__(name=name)
313303

314-
# NOTE: soln_basis is a dict of objectes for each input
315304
self.soln_basis = soln_basis
316-
317305
self.data_basis = data_basis
318306
self.geo_basis = geo_basis
319307
self.quadrature = quadrature
@@ -352,22 +340,20 @@ def compute(self, **args):
352340

353341

354342
def weakform(soln, data=None, geo=None):
355-
soln_u = soln["u"]
356-
soln_v = soln["v"]
343+
u = soln["u"]
344+
v = soln["v"]
357345

358-
u = soln_u["u"]
359346
uvalue = u["value"]
360347
ugrad = u["grad"]
361348

362-
v = soln_v["v"]
363349
vvalue = v["value"]
364350
vgrad = v["grad"]
365351

366352
x = geo["x"]["value"]
367353
y = geo["y"]["value"]
368354

369355
# f = am.sin(x) ** 2 * am.cos(y) ** 2
370-
# comp1 = 0.5 * (uvalue**2 + basis.dot_product(ugrad, vgrad, n=2) - 2.0 * uvalue * f)
356+
# comp1 = 0.5 * (uvalue**2 + basis.dot_product(ugrad, ugrad, n=2) - 2.0 * uvalue * f)
371357

372358
alpha = 1.0
373359
pi = 3.14159265358979
@@ -380,23 +366,23 @@ def weakform(soln, data=None, geo=None):
380366
) * am.sin(pi * y)
381367

382368
comp1 = (
383-
basis.dot_product(ugrad, vgrad, n=2)
384-
+ alpha * vvalue * uvalue
369+
basis.dot_product(ugrad, ugrad, n=2)
370+
+ alpha * uvalue * uvalue
385371
+ f1 * uvalue
386-
+ basis.dot_product(vgrad, ugrad, n=2)
387-
+ alpha * uvalue * vvalue
372+
+ basis.dot_product(vgrad, vgrad, n=2)
373+
+ alpha * vvalue * vvalue
388374
+ f2 * vvalue
389375
)
390376
return comp1
391377

392378

393379
# Initialize the spaces
394380
soln_space = basis.SolutionSpace({"u": "H1", "v": "H1"})
395-
data_space = basis.SolutionSpace({"x": "H1", "y": "H1"})
381+
data_space = basis.SolutionSpace({"rho": "H1"})
396382
geo_space = basis.SolutionSpace({"x": "H1", "y": "H1"})
397383

398-
# mesh = Mesh("magnet_order_1.inp")
399-
mesh = Mesh("plate.inp")
384+
mesh = Mesh("magnet_order_1.inp")
385+
# mesh = Mesh("plate.inp")
400386
problem = Problem(
401387
mesh,
402388
soln_space,
@@ -416,8 +402,8 @@ def weakform(soln, data=None, geo=None):
416402

417403
# Set the problem data
418404
data = model.get_data_vector()
419-
data["src.x"] = mesh.X[:, 0]
420-
data["src.y"] = mesh.X[:, 1]
405+
data["src_geo.x"] = mesh.X[:, 0]
406+
data["src_geo.y"] = mesh.X[:, 1]
421407

422408
# x = problem.create_vector()
423409
# mat = problem.create_matrix()
@@ -442,8 +428,8 @@ def weakform(soln, data=None, geo=None):
442428

443429
ans.get_array()[:] = spsolve(csr_mat, g.get_array())
444430
ans_local = ans
445-
u = ans_local.get_array()[model.get_indices("src.u")]
446-
v = ans_local.get_array()[model.get_indices("src.v")]
431+
u = ans_local.get_array()[model.get_indices("src_soln.u")]
432+
v = ans_local.get_array()[model.get_indices("src_soln.v")]
447433
print(u)
448434
print(v)
449435

0 commit comments

Comments
 (0)