Skip to content

Commit 33180ca

Browse files
authored
Speeding up the stress tensor jacobian using ForwardDiff per element (#180)
* speedup stress tensor jacobian using ForwardDiff per element * explicitly define variables as global in stress example * bump version
1 parent eeec617 commit 33180ca

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "TopOpt"
22
uuid = "53a1e1a5-51bb-58a9-8a02-02056cc81109"
33
authors = ["mohamed82008 <[email protected]>", "yijiangh <[email protected]>"]
4-
version = "0.9.1"
4+
version = "0.9.2"
55

66
[deps]
77
AbstractDifferentiation = "c29ec348-61ec-40c8-8164-b8c60e9d9f3d"

src/Functions/stress_tensor.jl

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,15 @@ function (f::ElementStressTensor)(u::DisplacementResult; element_dofs=false)
5555
st = f.stress_tensor
5656
reinit!(f, f.cellidx)
5757
if element_dofs
58-
cellu = u.u
58+
return _element_stres_tensor(f, u)
5959
else
60-
cellu = u.u[copy(st.global_dofs)]
60+
return _element_stress_tensor(f, DisplacementResult(u.u[copy(st.global_dofs)]))
6161
end
62+
end
63+
64+
function _element_stress_tensor(f::ElementStressTensor, u::DisplacementResult)
65+
st = f.stress_tensor
66+
cellu = u.u
6267
n_basefuncs = getnbasefunctions(st.cellvalues)
6368
n_quad = getnquadpoints(st.cellvalues)
6469
dim = TopOptProblems.getdim(st.problem)
@@ -76,6 +81,18 @@ function (f::ElementStressTensor)(u::DisplacementResult; element_dofs=false)
7681
) ./ V
7782
end
7883

84+
function ChainRulesCore.rrule(
85+
::typeof(_element_stress_tensor), f::ElementStressTensor, u::DisplacementResult
86+
)
87+
J = ForwardDiff.jacobian(
88+
vec (u -> _element_stress_tensor(f, DisplacementResult(u))), u.u
89+
)
90+
return _element_stress_tensor(f, u),
91+
Δ -> begin
92+
NoTangent(), NoTangent(), Tangent{typeof(u)}(; u=J' * vec(Δ))
93+
end
94+
end
95+
7996
struct ElementStressTensorKernel{T,Tc} <: AbstractFunction{T}
8097
E::T
8198
ν::T

test/examples/local_stress.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ threshold = 3 * maximum(stress(filter(PseudoDensities(x0))))
3939
x = copy(x0)
4040
x .= 1
4141
for p in 1.0:1.0:3.0
42-
global x
42+
global x, solver, stress, filter, volfrac, obj, constr, alg, options, model, r
4343
penalty = TopOpt.PowerPenalty(p)
4444
# Define a finite element solver
4545
solver = FEASolver(Direct, problem; xmin=xmin, penalty=penalty)

0 commit comments

Comments
 (0)