IO: Saving and loading simulations
The FerriteProblems.jl package includes support for saving simulation data using JLD2.jl. This examples shows some examples of how this can be done. Specifically, we use the data saved during the plasticity example:
using Ferrite, FerriteProblems
import FerriteProblems as FP
include("plasticity.jl");In that example, the displacements and state variables were saved in each time step. In this example, we use the data saved in the folder B (using the AdaptiveTimeStepper) and plot a few interesting cases:
- Maximum von Mises stress as function of time
- Export the final displacements and stress to
vtk
To calculate average element stresses, we will employ the Integrator from FerriteAssembly.
struct CellStress{T}
σvm::Vector{T}
end
CellStress(grid::Grid) = CellStress(zeros(getncells(grid)))
von_mises(σ) = (s=dev(σ); sqrt((3/2)*s⊡s))
function FerriteAssembly.integrate_cell!(cs::CellStress, state, ae, m::J2Plasticity, cv, buffer)
σvm = 0.0
V = 0.0
for q_point in 1:getnquadpoints(cv)
dΩ = getdetJdV(cv, q_point)
ϵ = function_symmetric_gradient(cv, q_point, ae)
σ = m.D ⊡ (ϵ - state[q_point].ϵp)
σvm += von_mises(σ)*dΩ
V += dΩ
end
cs.σvm[cellid(buffer)] = σvm/V
endWhile it is possible to have a code that is structured like
io = FerriteIO("B/FerriteIO.jld2")
# do whatever
close(io)We do everything inside a do-block to ensure everything is closed at the end (even if an error is thrown)
plts = FerriteIO("B/FerriteIO.jld2") do io
def = FP.getdef(io)
buf = FP.FEBuffer(def)
post = FP.getpost(io);
# Then, we get the time history and the displacement data saved to the `post` struct
t_history = FP.gettimedata(io)
u_mag = post.umag
plt1 = plot()
plot!(plt1, t_history, u_mag*1e3)
title!(plt1, "maximum displacement")
xlabel!(plt1, "time [s]")
ylabel!(plt1, "umax [mm]")
# The maximum von Mises stress for each step is calculated next. Note that `step` refers
# to the count of saved steps, and not the actual simulation steps.
function get_max_vm_stress(cs, buffer, io, step)
states = FP.getipdata(io, step, "state") # ::Dict{Int,Vector{J2PlasticityMaterialState}}
FerriteAssembly.update_states!(FerriteAssembly.get_state(buffer), states)
work!(Integrator(cs), buffer; a=FP.getdofdata(io, step))
return maximum(cs.σvm)
end
dh = FerriteAssembly.get_dofhandler(def)
cs = CellStress(dh.grid)
buffer = FP.getassemblybuffer(buf)
σ_vm_max = Float64[]
for step in 1:length(t_history)
push!(σ_vm_max, get_max_vm_stress(cs, buffer, io, step))
end
# Plot the analyzed results
plt2=plot()
plot!(plt2, t_history, σ_vm_max*1e-6)
title!(plt2, "Maximum von Mises stress")
xlabel!(plt2, "time [s]")
ylabel!(plt2, "stress [MPa]")
# Finally, cs now contains the von mises stress
# of each cell at the last step, which we save to vtk.
u = FP.getdofdata(io, length(t_history))
vtk_grid("plasticity", dh) do vtkfile
vtk_point_data(vtkfile, dh, u) # displacement field
vtk_cell_data(vtkfile, cs.σvm, "von Mises [Pa]")
end;
# Return the plots
(plt1, plt2)
end(Plot{Plots.GRBackend() n=1}, Plot{Plots.GRBackend() n=1})Display the plots by running display(plts[1]) or display(plts[2])
This page was generated using Literate.jl.