2015-06-25 19:50:34 +03:00
|
|
|
# This file is a part of JuliaFEM.
|
|
|
|
|
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
2015-12-01 16:03:23 +02:00
|
|
|
using JuliaFEM
|
2015-12-01 20:21:54 +02:00
|
|
|
using JuliaFEM.Core
|
2015-12-01 16:03:23 +02:00
|
|
|
using JuliaFEM.API: Model
|
|
|
|
|
|
2015-12-01 20:21:54 +02:00
|
|
|
"""
|
|
|
|
|
This needs this a bit honing ...
|
|
|
|
|
"""
|
2015-12-03 16:28:35 +02:00
|
|
|
function get_solver(model::Model, case_name::ASCIIString, time::Float64)
|
2015-12-01 16:03:23 +02:00
|
|
|
element_ids = keys(model.elements)
|
2015-12-01 20:21:54 +02:00
|
|
|
all_elements = model.elements
|
2015-12-01 16:03:23 +02:00
|
|
|
case = model.load_cases[case_name]
|
2015-12-01 20:21:54 +02:00
|
|
|
neumann_bcs = case.neumann_boundary_conditions
|
|
|
|
|
dirichlet_bcs = case.dirichlet_boundary_conditions
|
2015-12-01 16:03:23 +02:00
|
|
|
nodes = model.nodes
|
|
|
|
|
field_problem = JuliaFEM.Core.(case.problem)()
|
2015-12-01 20:21:54 +02:00
|
|
|
core_elements = Dict()
|
2015-12-01 16:03:23 +02:00
|
|
|
|
2015-12-01 20:21:54 +02:00
|
|
|
# luodaan core elementit
|
|
|
|
|
for el_id in element_ids
|
|
|
|
|
element = all_elements[el_id]
|
|
|
|
|
el_type = element.element_type
|
|
|
|
|
el_id = element.id
|
|
|
|
|
mat = element.material
|
|
|
|
|
conn = element.connectivity
|
|
|
|
|
core_element = JuliaFEM.Core.(el_type)(conn)
|
2015-12-03 14:55:05 +02:00
|
|
|
core_element["geometry"] = map(x->nodes[x].coords, conn)
|
2015-12-01 20:21:54 +02:00
|
|
|
for each in keys(mat.scalar_data)
|
|
|
|
|
core_element[each] = mat.scalar_data[each]
|
|
|
|
|
end
|
|
|
|
|
core_elements[el_id] = core_element
|
|
|
|
|
model.elements[el_id].results = core_element
|
|
|
|
|
end
|
|
|
|
|
|
2015-12-01 21:11:10 +02:00
|
|
|
# Add Neumann boundary conditions to elements
|
2015-12-01 20:21:54 +02:00
|
|
|
for each in neumann_bcs
|
|
|
|
|
set_for_bc = each.set_name
|
|
|
|
|
set_ids = model.elsets[set_for_bc]
|
|
|
|
|
bc = each.value
|
|
|
|
|
for el_id in set_ids.elements
|
|
|
|
|
core_element = core_elements[el_id]
|
|
|
|
|
core_element[bc[1]] = bc[2]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
dirile_arr = Any[]
|
2015-12-01 21:11:10 +02:00
|
|
|
# Create Dirichlet boundary conditions
|
2015-12-01 20:21:54 +02:00
|
|
|
for each in dirichlet_bcs
|
|
|
|
|
set_name = each.set_name
|
|
|
|
|
value = each.value
|
2015-12-01 21:11:10 +02:00
|
|
|
problem = JuliaFEM.Core.DirichletProblem(
|
|
|
|
|
JuliaFEM.Core.get_unknown_field_name(field_problem),
|
|
|
|
|
JuliaFEM.Core.get_unknown_field_dimension(field_problem))
|
2015-12-01 20:21:54 +02:00
|
|
|
set_for_bc = each.set_name
|
|
|
|
|
set_ids = model.elsets[set_for_bc]
|
|
|
|
|
bc = each.value
|
|
|
|
|
for el_id in set_ids.elements
|
|
|
|
|
core_element = core_elements[el_id]
|
|
|
|
|
core_element[bc[1]] = bc[2]
|
|
|
|
|
push!(problem, core_element)
|
|
|
|
|
end
|
|
|
|
|
push!(dirile_arr, problem)
|
|
|
|
|
end
|
2015-12-01 21:11:10 +02:00
|
|
|
|
|
|
|
|
# Push all the elements, where the field problem is solved into the field_problem
|
2015-12-03 14:55:05 +02:00
|
|
|
for element_set in case.sets
|
|
|
|
|
el_ids = model.elsets[element_set].elements
|
|
|
|
|
for each in el_ids
|
|
|
|
|
push!(field_problem, core_elements[each])
|
|
|
|
|
end
|
2015-12-01 20:21:54 +02:00
|
|
|
end
|
2015-12-01 16:03:23 +02:00
|
|
|
|
2015-12-01 21:11:10 +02:00
|
|
|
# Creating the solver
|
2015-12-04 08:27:59 +02:00
|
|
|
if case.solver == :LinearSolver
|
|
|
|
|
solver = JuliaFEM.Core.(case.solver)(field_problem, dirile_arr...)
|
|
|
|
|
else
|
|
|
|
|
solver = JuliaFEM.Core.(case.solver)()
|
|
|
|
|
push!(solver, field_problem)
|
|
|
|
|
for d in dirile_arr
|
|
|
|
|
push!(solver, d)
|
|
|
|
|
end
|
|
|
|
|
end
|
2015-12-03 16:28:35 +02:00
|
|
|
return solver
|
|
|
|
|
end
|
2015-12-01 16:03:23 +02:00
|
|
|
|
2015-12-03 16:28:35 +02:00
|
|
|
function solve!(model::Model, case_name::ASCIIString, time::Float64)
|
|
|
|
|
solver = get_solver(model, case_name, time)
|
2015-12-01 21:11:10 +02:00
|
|
|
# Solving
|
|
|
|
|
solver(time)
|
2015-12-03 16:28:35 +02:00
|
|
|
end
|