2016-07-07 18:04:09 +03:00
|
|
|
|
# This file is a part of JuliaFEM.
|
|
|
|
|
|
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
2016-07-10 04:26:21 +03:00
|
|
|
|
|
2016-07-07 18:04:09 +03:00
|
|
|
|
using JuliaFEM
|
|
|
|
|
|
using JuliaFEM.Preprocess
|
|
|
|
|
|
using JuliaFEM.Postprocess
|
2016-07-10 04:26:21 +03:00
|
|
|
|
using JuliaFEM.Testing
|
2016-07-07 18:04:09 +03:00
|
|
|
|
|
|
|
|
|
|
@testset "2d poisson problem with known analytical solution" begin
|
|
|
|
|
|
# from FENiCS tutorial, u(x,y) = 1 + x² + 2y² on [0x1]×[0,1]
|
|
|
|
|
|
# and u₀(x,y) = 1 + x² + 2y², f(x,y) = -6
|
|
|
|
|
|
|
2017-08-05 04:17:44 -04:00
|
|
|
|
mesh_file = @__DIR__()*"/testdata/primitives.med"
|
2016-07-07 18:04:09 +03:00
|
|
|
|
mesh = aster_read_mesh(mesh_file, "UNITSQUARE_6X4")
|
|
|
|
|
|
|
|
|
|
|
|
field = Problem(Heat, "unit square, 6x4 triangular mesh", 1)
|
|
|
|
|
|
field.elements = create_elements(mesh, "UNITSQUARE")
|
|
|
|
|
|
field.properties.formulation = "2D"
|
2016-07-10 04:26:21 +03:00
|
|
|
|
update!(field, "thermal conductivity", 1.0)
|
|
|
|
|
|
update!(field, "heat source", -6.0)
|
2016-07-07 18:04:09 +03:00
|
|
|
|
|
|
|
|
|
|
bc = Problem(Dirichlet, "u₀(x,y) = 1 + x² + 2y²", 1, "temperature")
|
|
|
|
|
|
#bc.properties.order = 2
|
|
|
|
|
|
#bc.properties.dual_basis = true
|
|
|
|
|
|
bc.properties.variational = false
|
|
|
|
|
|
bc.elements = create_elements(mesh, "FACE1", "FACE2", "FACE3", "FACE4")
|
|
|
|
|
|
function u0(element, ip, time)
|
|
|
|
|
|
x, y = element("geometry", ip, time)
|
|
|
|
|
|
return 1 + x^2 + 2*y^2
|
|
|
|
|
|
end
|
|
|
|
|
|
update!(bc, "temperature 1", u0)
|
|
|
|
|
|
|
|
|
|
|
|
solver = LinearSolver(field, bc)
|
|
|
|
|
|
solver()
|
|
|
|
|
|
|
|
|
|
|
|
T_fem = Float64[]
|
|
|
|
|
|
T_acc = Float64[]
|
|
|
|
|
|
for (nid, X) in field("geometry")
|
|
|
|
|
|
push!(T_fem, field("temperature", X)[1])
|
|
|
|
|
|
push!(T_acc, 1.0 + X[1]^2 + 2*X[2]^2)
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2017-08-18 17:13:25 +03:00
|
|
|
|
@test maximum(abs.(T_fem-T_acc)) < 1.0e-12
|
2016-07-10 04:26:21 +03:00
|
|
|
|
|
|
|
|
|
|
# gradient of field is
|
|
|
|
|
|
gradT(X) = [2*X[1] 4*X[2]]
|
|
|
|
|
|
X = [0.5, 0.5]
|
|
|
|
|
|
gradT1 = gradT(X)
|
|
|
|
|
|
gradT2 = field("temperature", X, solver.time, Val{:Grad})
|
|
|
|
|
|
info("gradT1 = $gradT1, gradT2 = $gradT2")
|
|
|
|
|
|
# [1.1666666666666625 1.5000000000000018] quite big difference ..?
|
|
|
|
|
|
@test isapprox(gradT1, gradT2; rtol=25.0e-2)
|
2016-07-07 18:04:09 +03:00
|
|
|
|
end
|