Setup API
FerriteAssembly.DomainSpec — TypeDomainSpec(sdh::SubDofHandler, material, fe_values; set=getcellset(sdh), colors_or_chunks=nothing, user_data=nothing)
DomainSpec(dh::DofHandler, material, fe_values; set=1:getncells(dh), colors=nothing, chunks=nothing, user_data=nothing)Create a DomainSpec that can be used to set up a domain buffer.
sdh/dh: Give theDofHandlerfor the domain in question, or aSubDofHandlerin case there are more than one inDofHandler(SeeFerrite.jl's documentation)material: Used for dispatch on the utilizedworker's function.fe_values:CellValuesorFaceValuesdepending on the type of domain.set: The items in the domain, the element type determines the type of domain- Cell domain:
Int - Face domain:
FaceIndex
- Cell domain:
colors::Vector{Vector{I}}: used to avoid race conditions when multithreading. For cell domains,I=Int, and for face domains,Ican be eitherInt(denoting cell numbers) orFaceIndexfor actual faces. IfI=Int, it will be converted toFaceIndexinternally. Ifcolors=nothingandchunks=nothing,Ferrite.jl's default coloring algorithm is used.chunks::Vector{Vector{Vector{I}}}. During multithreading, each task works with items in onechunk::Vector{I}at a time. Items inchunks[k][i]andchunks[k][j]should be independent (i.e. not share dofs). If given, this input takes precidence overcolors. Forchunks,Imust beIntfor cell domains andFaceIndexfor face domains.user_data: Can be whatever the user wants to and is passed along by reference everywhere. It is accessible from theItemBuffer(e.g.CellBuffer) given to theworker's function via theget_user_datafunction. However, since it is passed by reference, modifying values during work, care must be taken to ensure thread safety. To avoid allocations, caches can be created separately withallocate_cell_cacheandallocate_face_cache.
FerriteAssembly.setup_domainbuffer — Functionsetup_domainbuffer(domain::DomainSpec; a=nothing, threading=false, autodiffbuffer=false)Setup a domain buffer for a single grid domain, domain.
a::Vector: The global degree of freedom values are used to pass the local element dof values to thecreate_cell_statefunction, making it possible to create the initial state dependent on the initial conditions for the field variables.threading: Should aThreadedDomainBufferbe created to work the grid multithreaded if supported by the usedworker?autodiffbuffer: Should a custom itembuffer be used to speed up the automatic differentiation (if supported by the itembuffer)
FerriteAssembly.setup_domainbuffers — Functionsetup_domainbuffers(domains::Dict{String,DomainSpec}; kwargs...)Setup multiple domain buffers, one for each DomainSpec in domains. See setup_domainbuffer for description of the keyword arguments.
AbstractDomainBuffer
The domain buffer be a DomainBuffer, ThreadedDomainBuffer, or a Dict{String} with eltype of one of the former. The following functions are defined for these buffers:
FerriteAssembly.get_material — Methodget_material(dbs::Dict{String,AbstractDomainBuffer}, domain::String)
get_material(db::AbstractDomainBuffer)Get the material for the domain represented by db or dbs[domain].
FerriteAssembly.get_dofhandler — Methodget_dofhandler(dbs::Dict{String,AbstractDomainBuffer})
get_dofhandler(db::AbstractDomainBuffer)Get the dofhandler stored in db. Note that this is the global dofhandler, and not the SubDofHandler that is local to a specific domain.
FerriteAssembly.get_state — Methodget_state(dbs::Dict{String,AbstractDomainBuffer}, domain::String)
get_state(db::Union{AbstractDomainBuffer,Dict{String,AbstractDomainBuffer}})Get the states::Dict{Int,S}, where S type of the state for each entity in the domain, stored in the db or dbs[domain]. If no domain is given for multiple domains, a Dict{String} is returned with state variables for each domain
FerriteAssembly.get_old_state — Methodget_old_state(dbs::Dict{String,AbstractDomainBuffer}, domain::String)
get_old_state(db::Union{AbstractDomainBuffer,Dict{String,AbstractDomainBuffer}})Get the states::Dict{Int,S}, where S type of the state for each entity in the domain, stored in the db or dbs[domain]. If no domain is given for multiple domains, a Dict{String} is returned with state variables for each domain
FerriteAssembly.getset — Functiongetset(dbs::Dict{String,AbstractDomainBuffer}, domain::String)
getset(db::AbstractDomainBuffer)Get the set of items stored in db or dbs[domain]
FerriteAssembly.update_states! — Methodupdate_states!(db::Dict{String,AbstractDomainBuffer})
update_states!(db::AbstractDomainBuffer)Update the states such that old_states = states for the states stored in db.
This method tries to avoid allocating new values where possible. Currently, if create_cell_state returns T or Vector{T} where isbitstype(T), this works. If needed/wanted, it should be relatively easy to provide an interface to make it possible to have allocation free for custom cell states.
FerriteAssembly.set_time_increment! — Methodset_time_increment!(db::Dict{String,AbstractDomainBuffer}, Δt)
set_time_increment!(db::AbstractDomainBuffer, Δt)Update the time increment stored in db, which is passed on to the stored AbstractItemBuffer