Make JuliaFEM to use Analysis type from FEMBase

`Analysis` is basically doing same than `Solver` before, but has a
slighly simpler structure and is more general.
This commit is contained in:
Jukka Aho
2018-01-29 07:53:14 +02:00
parent d7bef419ed
commit dce7472cda
16 changed files with 205 additions and 213 deletions
+3
View File
@@ -45,6 +45,9 @@ using JuliaFEM.Testing
contact_master_elements = create_elements(mesh, "UPPER_BOTTOM")
update!(contact_slave_elements, "master elements", contact_master_elements)
contact.elements = [contact_master_elements; contact_slave_elements]
nnodes = length(mesh.nodes)
contact.assembly.u = zeros(2*nnodes)
contact.assembly.la = zeros(2*nnodes)
solver = NonlinearSolver(upper, lower, bc_upper, bc_lower, contact)
solver()
@@ -38,8 +38,9 @@ using JuliaFEM
update!(bc.elements[1], "displacement 2", 0.0)
update!(bc.elements[2], "displacement 1", 0.0)
solver = Solver(Linear, block, traction, bc)
solver()
solver = Solver(Linear, "solve 2d linear elasticity problem")
add_problems!(solver, [block, traction, bc])
solve!(solver, 0.0)
f = 288.0
g = 576.0
@@ -32,9 +32,9 @@ using JuliaFEM.Testing
update!(bc_elements_bottom, "displacement 2", 0.0)
push!(bc_sym, bc_elements_left..., bc_elements_bottom...)
solver = NonlinearSolver("solve block problem")
push!(solver, block, bc_sym)
solver()
solver = Solver(Nonlinear, "solve block problem")
add_problems!(solver, [block, bc_sym])
solve!(solver, 0.0)
# from code aster
u3_expected = [-4.92316106779943E-01, 7.96321884292103E-01]
+1 -1
View File
@@ -46,7 +46,7 @@ using JuliaFEM.Testing
gradT(X) = [2*X[1] 4*X[2]]
X = [0.5, 0.5]
gradT1 = gradT(X)
gradT2 = field("temperature", X, solver.time, Val{:Grad})
gradT2 = field("temperature", X, 0.0, Val{:Grad})
info("gradT1 = $gradT1, gradT2 = $gradT2")
# [1.1666666666666625 1.5000000000000018] quite big difference ..?
@test isapprox(gradT1, gradT2; rtol=25.0e-2)
+5 -13
View File
@@ -26,20 +26,16 @@ using DataFrames
push!(bc, boundary_element)
solver = Solver(Linear, problem, bc)
solver.time = 0.0
empty!(problem.assembly)
solver()
solve!(solver, 0.0)
@test isapprox(solver("temperature", 0.0)[3], 1.0)
empty!(problem.assembly)
solver()
@test isapprox(solver("temperature", 0.0)[3], 1.0)
solver.time = 1.0
empty!(problem.assembly)
solver()
solve!(solver, 1.0)
@test isapprox(solver("temperature", 1.0)[3], 2.0)
empty!(problem.assembly)
@@ -69,24 +65,20 @@ end
push!(bc, boundary_element)
solver = Solver(Nonlinear, problem, bc)
solver.time = 0.0
empty!(problem.assembly)
solver()
solve!(solver, 0.0)
@test isapprox(solver("temperature", 0.0)[3], 1.0)
empty!(problem.assembly)
solver()
@test isapprox(solver("temperature", 0.0)[3], 1.0)
solver.time = 1.0
empty!(problem.assembly)
solver()
solve!(solver, 1.0)
@test isapprox(solver("temperature", 1.0)[3], 2.0)
empty!(problem.assembly)
solver()
solve!(solver, 1.0)
@test isapprox(solver("temperature", 1.0)[3], 2.0)
end
-1
View File
@@ -144,7 +144,6 @@ numéro fréquence (HZ) norme d'erreur
solver = Solver(Modal, body, fixed1, fixed2)
solver.properties.nev = 5
solver.xdmf = Xdmf()
solver()
freqs_jf = sqrt.(solver.properties.eigvals)/(2.0*pi)
# with Tet4 elements
+4 -3
View File
@@ -11,7 +11,7 @@ datadir = first(splitext(basename(@__FILE__)))
function get_model()
meshfile = joinpath(datadir, "block_2d.med")
mesh = aster_read_mesh(meshfile)
println(mesh.nodes[1])
#error("mesh has $(length(mesh.nodes)) nodes")
upper = Problem(mesh, Elasticity, "UPPER", 2)
lower = Problem(mesh, Elasticity, "LOWER", 2)
@@ -59,6 +59,8 @@ end
solver = get_model()
interface = solver["interface"]
interface.assembly.u = zeros(48)
interface.assembly.la = zeros(48)
upper = solver["UPPER"]
lower = solver["LOWER"]
for body in [upper, lower]
@@ -70,8 +72,7 @@ end
for time in [0.0, 1/3, 2/3, 1.0]
interface.properties.iteration = 1
solver.time = time
solver()
solve!(solver, time)
end
node_ids, displacement = get_nodal_vector(interface.elements, "displacement", 1.0)
+4 -4
View File
@@ -69,7 +69,7 @@ end
@testset "small sliding contact patch test, tet4 + standard basis" begin
solver = get_model(tet4_meshfile)
solver.xdmf = Xdmf("contact_sl_lin_disp_results"; overwrite=true)
add_results_writer!(solver, Xdmf("contact_sl_lin_disp_results"; overwrite=true))
interface = solver["LOWER_TO_UPPER"]
interface.properties.dual_basis = false
solver()
@@ -91,7 +91,7 @@ end
@testset "small sliding contact patch test, tet4 + dual basis" begin
solver = get_model(tet4_meshfile)
solver.xdmf = Xdmf("contact_dl_lin_disp_results"; overwrite=true)
add_results_writer!(solver, Xdmf("contact_dl_lin_disp_results"; overwrite=true))
interface = solver["LOWER_TO_UPPER"]
interface.properties.dual_basis = true
solver()
@@ -106,7 +106,7 @@ end
@testset "small sliding contact patch test, tet10 + standard basis" begin
solver = get_model(tet10_meshfile)
solver.xdmf = Xdmf("contact_sl_quad_disp_results"; overwrite=true)
add_results_writer!(solver, Xdmf("contact_sl_quad_disp_results"; overwrite=true))
interface = solver["LOWER_TO_UPPER"]
interface.properties.dual_basis = false
solver()
@@ -121,7 +121,7 @@ end
@testset "small sliding contact patch test, tet10 + dual basis, alpha=0.2" begin
solver = get_model(tet10_meshfile)
solver.xdmf = Xdmf("contact_dl_quad_disp_results"; overwrite=true)
add_results_writer!(solver, Xdmf("contact_dl_quad_disp_results"; overwrite=true))
interface = solver["LOWER_TO_UPPER"]
interface.properties.dual_basis = true
interface.properties.alpha = 0.2
+8 -8
View File
@@ -38,7 +38,7 @@ tet10_meshfile = "test_problems_mortar_3d/tet10.inp"
JuliaFEM.diagnose_interface(interface, 0.0)
solver = LinearSolver(upper, lower, bc_upper, bc_lower, interface)
solver.xdmf = Xdmf("sl_lin_temp_results")
add_results_writer!(solver, Xdmf("sl_lin_temp_results"; overwrite=true))
solver()
@@ -92,7 +92,7 @@ end
JuliaFEM.diagnose_interface(interface, 0.0)
solver = LinearSolver(upper, lower, bc_upper, bc_lower, interface)
solver.xdmf = Xdmf("dl_lin_temp_results")
add_results_writer!(solver, Xdmf("dl_lin_temp_results"; overwrite=true))
solver()
@@ -138,7 +138,7 @@ end
# JuliaFEM.diagnose_interface(interface, 0.0)
solver = LinearSolver(upper, lower, bc_upper, bc_lower, interface)
solver.xdmf = Xdmf("sl_quad_temp_results")
add_results_writer!(solver, Xdmf("sl_quad_temp_results"; overwrite=true))
solver()
node_ids, temperature = get_nodal_vector(interface.elements, "temperature", 0.0)
@@ -185,7 +185,7 @@ end
interface.properties.alpha = 0.2
solver = LinearSolver(upper, lower, bc_upper, bc_lower, interface)
solver.xdmf = Xdmf("dl_quad_temp_results")
add_results_writer!(solver, Xdmf("dl_quad_temp_results"; overwrite=true))
solver()
node_ids, temperature = get_nodal_vector(interface.elements, "temperature", 0.0)
@@ -257,7 +257,7 @@ end
interface.properties.dual_basis = false
solver = LinearSolver(upper, lower, bc_upper, bc_lower, bc_sym13, bc_sym23, interface)
solver.xdmf = Xdmf("sl_lin_disp_results")
add_results_writer!(solver, Xdmf("sl_lin_disp_results"; overwrite=true))
solver()
node_ids, displacement = get_nodal_vector(interface.elements, "displacement", 0.0)
@@ -319,7 +319,7 @@ end
interface.properties.dual_basis = true
solver = LinearSolver(upper, lower, bc_upper, bc_lower, bc_sym13, bc_sym23, interface)
solver.xdmf = Xdmf("dl_lin_disp_results")
add_results_writer!(solver, Xdmf("dl_lin_disp_results"; overwrite=true))
solver()
node_ids, displacement = get_nodal_vector(interface.elements, "displacement", 0.0)
@@ -382,7 +382,7 @@ end
interface.properties.dual_basis = false
solver = LinearSolver(upper, lower, bc_upper, bc_lower, bc_sym13, bc_sym23, interface)
solver.xdmf = Xdmf("sl_quad_disp_results")
add_results_writer!(solver, Xdmf("sl_quad_disp_results"; overwrite=true))
solver()
node_ids, displacement = get_nodal_vector(interface.elements, "displacement", 0.0)
@@ -447,7 +447,7 @@ end
interface.properties.alpha = 0.2
solver = LinearSolver(upper, lower, bc_upper, bc_lower, bc_sym13, bc_sym23, interface)
solver.xdmf = Xdmf("dl_quad_disp_results")
add_results_writer!(solver, Xdmf("dl_quad_disp_results"; overwrite=true))
solver()
node_ids, displacement = get_nodal_vector(interface.elements, "displacement", 0.0)
+2 -1
View File
@@ -68,7 +68,8 @@ datadir = first(splitext(basename(@__FILE__)))
solver = NonlinearSolver(upper, lower, bc_upper, bc_lower, bc_sym13, bc_sym23, interface)
solver.xdmf = Xdmf("contact_two_blocks_postprocess"; overwrite=true)
xdmf = Xdmf("contact_two_blocks_postprocess"; overwrite=true)
add_results_writer!(solver, xdmf)
solver()
node_ids, displacement = get_nodal_vector(interface.elements, "displacement", 0.0)