Skip to content

Commit

Permalink
Merge branch 'main' into jordi-dev
Browse files Browse the repository at this point in the history
  • Loading branch information
zjwegert authored Mar 14, 2024
2 parents 30837bf + dac40c6 commit 1837961
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 21 deletions.
18 changes: 7 additions & 11 deletions scripts/MPI/3d_inverse_homenisation_ALM.jl
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,12 @@ function main(mesh_partition,distribute,el_size)
l = [(v,φ,dΩ) -> (-(I φ) * C εᴹ[i] ε(v))dΩ for i in 1:6]

## Optimisation functionals
_C(C,ε_p,ε_q) = C ε_p ε_q;

_K(C,u,εᴹ) = (_C(C,ε(u[1])+εᴹ[1],εᴹ[1]) + _C(C,ε(u[2])+εᴹ[2],εᴹ[2]) + _C(C,ε(u[3])+εᴹ[3],εᴹ[3]) +
2(_C(C,ε(u[1])+εᴹ[1],εᴹ[2]) + _C(C,ε(u[1])+εᴹ[1],εᴹ[3]) + _C(C,ε(u[2])+εᴹ[2],εᴹ[3])))/9

_v_K(C,u,εᴹ) = (_C(C,ε(u[1])+εᴹ[1],ε(u[1])+εᴹ[1]) + _C(C,ε(u[2])+εᴹ[2],ε(u[2])+εᴹ[2]) + _C(C,ε(u[3])+εᴹ[3],ε(u[3])+εᴹ[3]) +
2(_C(C,ε(u[1])+εᴹ[1],ε(u[2])+εᴹ[2]) + _C(C,ε(u[1])+εᴹ[1],ε(u[3])+εᴹ[3]) + _C(C,ε(u[2])+εᴹ[2],ε(u[3])+εᴹ[3])))/9

J(u,φ,dΩ) = (-(I φ)*_K(C,u,εᴹ))dΩ
dJ(q,u,φ,dΩ) = (_v_K(C,u,εᴹ)*q*(DH φ)*(norm (φ)))dΩ
Cᴴ(r,s,u,φ,dΩ) = ((I φ)*(C (ε(u[r])+εᴹ[r]) εᴹ[s]))dΩ
dCᴴ(r,s,q,u,φ,dΩ) = (q*(C (ε(u[r])+εᴹ[r]) (ε(u[s])+εᴹ[s]))*(DH φ)*(norm (φ)))dΩ
κ(u,φ,dΩ) = -1/9*(Cᴴ(1,1,u,φ,dΩ)+Cᴴ(2,2,u,φ,dΩ)+Cᴴ(3,3,u,φ,dΩ)+
2*(Cᴴ(1,2,u,φ,dΩ)+Cᴴ(1,3,u,φ,dΩ)+Cᴴ(2,3,u,φ,dΩ)))
(q,u,φ,dΩ) = 1/9*(dCᴴ(1,1,q,u,φ,dΩ)+dCᴴ(2,2,q,u,φ,dΩ)+dCᴴ(3,3,q,u,φ,dΩ)+
2*(dCᴴ(1,2,q,u,φ,dΩ)+dCᴴ(1,3,q,u,φ,dΩ)+dCᴴ(2,3,q,u,φ,dΩ)))
Vol(u,φ,dΩ) = (((ρ φ) - vf)/vol_D)dΩ;
dVol(q,u,φ,dΩ) = (-1/vol_D*q*(DH φ)*(norm (φ)))dΩ

Expand All @@ -95,7 +91,7 @@ function main(mesh_partition,distribute,el_size)
assem_deriv = SparseMatrixAssembler(Tm,Tv,U_reg,U_reg),
ls = solver, adjoint_ls = solver
)
pcfs = PDEConstrainedFunctionals(J,[Vol],state_map;analytic_dJ=dJ,analytic_dC=[dVol])
pcfs = PDEConstrainedFunctionals(κ,[Vol],state_map;analytic_dJ=,analytic_dC=[dVol])

## Hilbertian extension-regularisation problems
α = α_coeff*maximum(el_Δ)
Expand Down
16 changes: 7 additions & 9 deletions scripts/Serial/inverse_homenisation_ALM.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ function main()
η_coeff = 2
α_coeff = 4
vf = 0.5
path = dirname(dirname(@__DIR__))*"/results/inverse_homenisation_ALM"
!isdir(path) && mkdir(path)
path = dirname(dirname(@__DIR__))*"/results/inverse_homenisation_ALM_new"
mkdir(path)

## FE Setup
model = CartesianDiscreteModel(dom,el_size,isperiodic=(true,true))
Expand Down Expand Up @@ -62,12 +62,10 @@ function main()
l = [(v,φ,dΩ) -> (-(I φ)* C εᴹ[i] ε(v))dΩ for i in 1:3]

## Optimisation functionals
_C(C,ε_p,ε_q) = C ε_p ε_q
_K(C,(u1,u2,u3),εᴹ) = (_C(C,ε(u1)+εᴹ[1],εᴹ[1]) + _C(C,ε(u2)+εᴹ[2],εᴹ[2]) + 2*_C(C,ε(u1)+εᴹ[1],εᴹ[2]))/4
_v_K(C,(u1,u2,u3),εᴹ) = (_C(C,ε(u1)+εᴹ[1],ε(u1)+εᴹ[1]) + _C(C,ε(u2)+εᴹ[2],ε(u2)+εᴹ[2]) + 2*_C(C,ε(u1)+εᴹ[1],ε(u2)+εᴹ[2]))/4

J(u,φ,dΩ) = (-(I φ)*_K(C,u,εᴹ))dΩ
dJ(q,u,φ,dΩ) = (_v_K(C,u,εᴹ)*q*(DH φ)*(norm (φ)))dΩ
Cᴴ(r,s,u,φ,dΩ) = ((I φ)*(C (ε(u[r])+εᴹ[r]) εᴹ[s]))dΩ
dCᴴ(r,s,q,u,φ,dΩ) = (q*(C (ε(u[r])+εᴹ[r]) (ε(u[s])+εᴹ[s]))*(DH φ)*(norm (φ)))dΩ
κ(u,φ,dΩ) = -1/4*(Cᴴ(1,1,u,φ,dΩ)+Cᴴ(2,2,u,φ,dΩ)+2*Cᴴ(1,2,u,φ,dΩ))
(q,u,φ,dΩ) = 1/4*(dCᴴ(1,1,q,u,φ,dΩ)+dCᴴ(2,2,q,u,φ,dΩ)+2*dCᴴ(1,2,q,u,φ,dΩ))
Vol(u,φ,dΩ) = (((ρ φ) - vf)/vol_D)dΩ
dVol(q,u,φ,dΩ) = (-1/vol_D*q*(DH φ)*(norm (φ)))dΩ

Expand All @@ -76,7 +74,7 @@ function main()

## Setup solver and FE operators
state_map = RepeatingAffineFEStateMap(3,a,l,U,V,V_φ,U_reg,φh,dΩ)
pcfs = PDEConstrainedFunctionals(J,[Vol],state_map;analytic_dJ=dJ,analytic_dC=[dVol])
pcfs = PDEConstrainedFunctionals(κ,[Vol],state_map;analytic_dJ=,analytic_dC=[dVol])

## Hilbertian extension-regularisation problems
α = α_coeff*maximum(el_Δ)
Expand Down
4 changes: 3 additions & 1 deletion src/ChainRules.jl
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ function Gridap.gradient(F::IntegrandWithMeasure,uh::Vector,K::Int)
local_fields = map(local_views,uh) |> to_parray_of_arrays
local_measures = map(local_views,F.dΩ) |> to_parray_of_arrays
contribs = map(local_measures,local_fields) do dΩ,lf
_f = u -> F.F(lf[1:K-1]...,u,lf[K+1:end]...,dΩ...)
# TODO: Remove second term below, this is a fix for the problem discussed in
# https://github.com/zjwegert/LSTO_Distributed/issues/46
_f = u -> F.F(lf[1:K-1]...,u,lf[K+1:end]...,dΩ...) #+ ∑(∫(0)dΩ[i] for i = 1:length(dΩ))
return Gridap.Fields.gradient(_f,lf[K])
end
return DistributedDomainContribution(contribs)
Expand Down

0 comments on commit 1837961

Please sign in to comment.