Reference manual
Constants
Muscade.noFB
— ConstantnoFB
A constant, used by elements' residual
or lagrangian
as their 3rd output if they do provide any feedback to the solver (for example, on the reduction of the barrier parameter in interior point method).
Example: return L,noχ,noFB
See also: noFB
Muscade.noχ
— Constantnoχ
A constant, used by elements' residual
or lagrangian
as their 2nd output if they do not export any material memory (for example, plastic strain).
Example: return L,noχ,noFB
See also: noFB
Muscade.ϵ
— Constantϵ (\epsilon)
an alias for Base.eps(𝕣)
.
Muscade.∞
— Constant∞ (\infty)
an alias for Base.inf
.
Types
Muscade.AbstractElement
— TypeAbstractElement
An abstract data type. An element type MyElement
must be declared as a subtype of AbstractElement
.
MyELement
must provide a constructor with interface
`eleobj = MyElement(nod::Vector{Node}; kwargs...)`
See also: coord
, Node
, lagrangian
Muscade.DofConstraint
— TypeDofConstraint{λclass,Nx,Nu,Na,xinod,xfield,uinod,ufield,ainod,
afield,λinod,λfield,Tg,Tmode} <: AbstractElement
An element to apply physical/optimisation equality/inequality constraints on dofs.
The constraints are holonomic, i.e. they apply to the values, not the time derivatives, of the involved dofs. This element is very general but not very user-friendly to construct, factory functions are provided for better useability. The sign convention is that the gap g≥0
and the Lagrange multiplier λ≥0
.
This element can generate three classes of constraints, depending on the input argument λclass
.
λclass=:X
Physical constraint. In mechanics, the Lagrange multiplier dof is a generalized force, dual of the gap. The gap function must be of the formgap(x,t,gargs...)
.λclass=:U
Time varying optimisation constraint. For example: findA
-parameters so that at all times, the response does not exceed a given criteria. The gap function must be of the formgap(x,u,a,t,gargs...)
.λclass=:A
Time invariant optimisation constraint. For example: findA
-parameters such thatA[1]+A[2]=gargs.somevalue
. The gap function must be of the formgap(a,gargs...)
.
Named arguments to the constructor
xinod::NTuple{Nx,𝕫}=()
For each X-dof to be constrained, its element-node number.xfield::NTuple{Nx,Symbol}=()
For each X-dof to be constrained, its field.uinod::NTuple{Nu,𝕫}=()
For each U-dof to be constrained, its element-node number.ufield::NTuple{Nu,Symbol}=()
For each U-dof to be constrained, its field.ainod::NTuple{Na,𝕫}=()
For each A-dof to be constrained, its element-node number.afield::NTuple{Na,Symbol}=()
For each A-dof to be constrained, its field.λinod::𝕫
The element-node number of the Lagrange multiplier.λclass::Symbol
The class (:X
,:U
or:A
) of the Lagrange multiplier. See the explanation above for classes of constraintsλfield::Symbol
The field of the Lagrange multiplier.gₛ::𝕣=1.
A scale for the gap.λₛ::𝕣=1.
A scale for the Lagrange multiplier.gap::Function
The gap function.gargs::NTuple
Additional inputs to the gap function.mode::Function
wheremode(t::ℝ) -> Symbol
, with value:equal
,:positive
or:off
at any time. An:off
constraint will set the Lagrange multiplier to zero.
Example
using Muscade
model = Model(:TestModel)
n1 = addnode!(model,𝕣[0])
e1 = addelement!(model,DofConstraint,[n1],xinod=(1,),xfield=(:t1,),
λinod=1, λclass=:X, λfield=:λ1,gap=(x,t)->x[1]+.1,
mode=positive)
e2 = addelement!(model,QuickFix ,[n1],inod=(1,),field=(:t1,),
res=(x,u,a,t)->0.4x.+.08+.5x.^2)
state = solve(staticX;model,time=[0.],verbose=false)
X = state[1].X[1]
Muscade.DofCost
— TypeDofCost{Class,Nx,Nu,Na,xinod,xfield,uinod,ufield,ainod,
afield,Tcost,Tcostargs} <: AbstractElement
An element to apply costs on combinations of dofs.
Named arguments to the constructor
xinod::NTuple{Nx,𝕫}=()
For each X-dof to entercost
, its element-node number.xfield::NTuple{Nx,Symbol}=()
For each X-dof to entercost
, its field.uinod::NTuple{Nu,𝕫}=()
For each U-dof to entercost
, its element-node number.ufield::NTuple{Nu,Symbol}=()
For each U-dof to entercost
, its field.ainod::NTuple{Na,𝕫}=()
For each A-dof to entercost
, its element-node number.afield::NTuple{Na,Symbol}=()
For each A-dof to entercost
, its field.class:Symbol
:A
for cost on A-dofs only,:I
("instant") otherwise.cost::Function
ifclass==:I
,cost(X,U,A,t,costargs...)→ℝ
ifclass==:A
,cost(A,costargs...)→ℝ
X
andU
are tuples (derivates of dofs...), and∂0(X)
,∂1(X)
,∂2(X)
must be used bycost
to access the value and derivatives ofX
(resp.U
)costargs::NTuple
Requestable internal variables
cost
, the value of the cost.
Example
ele1 = addelement!(model,DofCost,[nod1],xinod=(1,),field=(:tx1,),
class=:I,cost=(X,U,A,t)->X[1]^2
See also: SingleDofCost
, ElementCost
, addelement!
Muscade.DofLoad
— TypeDofLoad{Tvalue,Field} <: AbstractElement
An element to apply a loading term to a single X-dof.
Named arguments to the constructor
field::Symbol
.value::Function
, wherevalue(t::ℝ) → ℝ
.
Requestable internal variables
F
, the value of the load.
Examples
using Muscade
model = Model(:TestModel)
node = addnode!(model,𝕣[0,0])
e = addelement!(model,DofLoad,[node];field=:tx,value=t->3t-1)
Muscade.ElementCost
— TypeElementCost{Teleobj,Treq,Tcost,Tcostargs} <: AbstractElement
An element to apply costs on another element's element-results.
Named arguments to the constructor
req
a request for element-results forElementType
, resulting in the outputeleres
cost
a cost functioncost(eleres,X,U,A,t,costargs...)→ℝ
X
andU
are tuples (derivates of dofs...), and∂0(X)
,∂1(X)
,∂2(X)
must be used bycost
to access the value and derivatives ofX
(resp.U
)costargs=(;)
A named tuple of additional arguments to the cost functionElementType
The named of the constructor for the relevant elementelementkwargs...
Additional named arguments to theElementCost
constructor are passed on to theElementType
constructor.
Requestable internal variables
cost
, the value of the cost.
Example
@once cost(eleres,X,U,A,t) = eleres.Fh^2
ele1 = addelement!(model,ElementCost,[nod1],req=@request(Fh),
cost=cost,ElementType=AnchorLine,
Λₘtop=[5.,0,0], xₘbot=[250.,0], L=290., buoyancy=-5e3)
See also: SingleDofCost
, DofCost
, @request
Muscade.Hold
— TypeHold <: AbstractElement
An element to set a single X-dof to zero.
Named arguments to the constructor
field::Symbol
. The field of the X-dof to constraint.λfield::Symbol=Symbol(:λ,field)
. The field of the Lagrange multiplier.
Example
using Muscade
model = Model(:TestModel)
node = addnode!(model,𝕣[0,0])
e = addelement!(model,Hold,[node];field=:tx)
See also: DofConstraint
, DofLoad
, DofCost
Muscade.Model
— Typemodel = Model([ID=:my_model])
Construct a blank model
, which will be mutated to create a finite element [optimization] problem.
See also: addnode!
, addelement!
, describe
, solve
Muscade.Node
— TypeNode
The eltype of vectors handed by Muscade as first argument to element constructors.
Example: function SingleDofCost(nod::Vector{Node};class::Symbol, ... )
See also: coord
Muscade.QuickFix
— TypeQuickFix <: AbstractElement
An element for creating simple elements with "one line" of code. Elements thus created have several limitations:
- no internal state.
- no initialisation.
- physical elements with only X-dofs.
- only
R
can be espied.
The element is intended for testing. Muscade-based applications should not include this in their API.
Named arguments to the constructor
inod::NTuple{Nx,𝕫}
. The element-node numbers of the X-dofs.field::NTuple{Nx,Symbol}
. The fields of the X-dofs.res::Function
, whereres(X::ℝ1,X′::ℝ1,X″::ℝ1,t::ℝ) → ℝ1
, the residual.
Examples
A one-dimensional linear elastic spring with stiffness 2.
using Muscade
model = Model(:TestModel)
node1 = addnode!(model,𝕣[0])
node2 = addnode!(model,𝕣[1])
e = addelement!(model,QuickFix,[node1,node2];inod=(1,2),field=(:tx1,:tx1),
res=(X,X′,X″,t)->Svector{2}(2*(X[1]-X[2]),2*(X[2]-X[1])) )
Muscade.SingleDofCost
— TypeSingleDofCost{Derivative,Class,Field,Tcost} <: AbstractElement
An element with a single node, for adding a cost to a given dof.
Named arguments to the constructor
class::Symbol
, either:X
,:U
or:A
.field::Symbol
.cost::Function
, wherecost(x::ℝ,t::ℝ[,costargs...]) → ℝ
.costargs::NTuple
derivative::Int
0, 1 or 2 - which derivative of the dof enters the cost
Requestable internal variables
cost
, the value of the cost.
Example
using Muscade
model = Model(:TestModel)
node = addnode!(model,𝕣[0,0])
e = addelement!(model,SingleDofCost,[node];class=:X,field=:tx,
costargs=(3.,),cost=(x,t,three)->(x/three)^2)
See also: DofCost
, ElementCost
Muscade.StaticX
— TypeStaticX
A non-linear static solver for forward (not inverse, optimisation) FEM. The current implementation does not handle element memory.
An analysis is carried out by a call with the following syntax:
initialstate = initialize!(model)
state = solve(StaticX;initialstate=initialstate,time=[0.,1.])
Named arguments
dbg=(;)
a named tuple to trace the call tree (for debugging)verbose=true
set to false to suppress printed output (for testing)silenterror=false
set to true to suppress print out of error (for testing)initialstate
a singlestate
- obtained from a call toinitialize!
, or from a previous analysistime
anAbstractVector
vector of the times at which to compute themaxiter=50
maximum number of Newton-Raphson iteration at any given stepmaxΔx=1e-5
convergence criteria: a norm on the scaledX
incrementmaxincrement=∞
convergence criteria: a norm on the scaled residualsaveiter=false
set to true so that the outputstate
is a vector describing the states of the model at the last iteration (for debugging non-convergence)γ0=1.
an initial value of the barrier coefficient for the handling of contact using an interior point methodγfac1=0.5
at each iteration, the barrier parameter γ is multipliedγfac2=100.
by γfac1*exp(-min(αᵢ)/γfac2)^2), where αᵢ is computed by the i-th interior point savvy element as αᵢ=abs(λ-g)/γ
Output
A vector of length equal to that of time
containing the state of the model at each of these steps
See also: solve
, StaticXUA
, initialize!
Muscade.StaticXUA
— TypeStaticXUA
A non-linear static solver for optimisation FEM. The current algorithm does not handle element memory.
An analysis is carried out by a call with the following syntax:
initialstate = initialize!(model)
stateX = solve(StaticX ;initialstate=initialstate,time=[0.,1.])
stateXUA = solve(StaticXUA;initialstate=stateX)
Named arguments
dbg=(;)
a named tuple to trace the call tree (for debugging)verbose=true
set to false to suppress printed output (for testing)silenterror=false
set to true to suppress print out of error (for testing)initialstate
a vector ofstate
s, one for each load case in the optimization problem, obtained from one or several previousStaticX
analysesmaxAiter=50
maximum number of "outer" Newton-Raphson iterations overA
maxΔa=1e-5
"outer" convergence criteria: a norm on the scaledA
incrementmaxLa=∞
"outer" convergence criteria: a norm on the scaledLa
residualmaxYiter=0
maximum number of "inner" Newton-Raphson iterations overX
andU
for every value ofA
. Experience so far is that these inner iterations do not increase performance, so the default is "no inner iterations".maxΔy=1e-5
"inner" convergence criteria: a norm on the scaledY=[XU]
incrementmaxLy=∞
"inner" convergence criteria: a norm on the scaledLy=[Lx,Lu]
residualsaveiter=false
set to true so that the outputstate
is a vector describing the states of the model at the last iteration (for debugging non-convergence)γ0=1.
an initial value of the barrier coefficient for the handling of contact using an interior point methodγfac1=0.5
at each iteration, the barrier parameter γ is multipliedγfac2=100.
by γfac1*exp(-min(αᵢ)/γfac2)^2), where αᵢ is computed by the i-th interior point savvy element as αᵢ=abs(λ-g)/γ
Output
A vector of length equal to that of initialstate
containing the state of the optimized model at each of these steps
Muscade.default
— Typedefault{:fieldname}(namedtuple,defval)
attempt to get a field fieldname
from a NamedTuple
. If namedtuple
does not have such a field - or is not a NamedTuple
, return defval
.
Muscade.ℕ
— Typeℕ (\bbN)
an alias for UInt64
. For use in dispatching. ℕ1
... ℕ4
are AbstractArrays
of dimensions 1 to 4.
Muscade.ℝ
— Typeℝ (\bbR)
an alias for abstract type Real
. For use in dispatching. ℝ1
... ℝ4
are AbstractArrays
of dimensions 1 to 4. ℝ11
is an AbstractVector
of AbstractVector
.
Muscade.ℤ
— Typeℤ (\bbℤ)
an alias for abstract type Integer
. For use in dispatching. ℤ1
... ℤ4
are AbstractArrays
of dimensions 1 to 4. ℤ11
is an AbstractVector
of AbstractVector
.
Muscade.𝔹
— Type𝔹 (\bbB)
an alias for Bool
. For use in dispatching. 𝔹1
... 𝔹4
are AbstractArrays
of dimensions 1 to 4.
Muscade.𝕓
— Type𝕓 (\bbb)
an alias for Bool
. For use in struct
definitions. 𝕓1
... 𝕓4
are Arrays
of dimensions 1 to 4.
Muscade.𝕟
— Type𝕟 (\bbn)
an alias for UInt64
. For use in struct
definitions. 𝕟1
... 𝕟4
are Arrays
of dimensions 1 to 4.
Muscade.𝕣
— Type𝕣 (\bbr)
an alias for Float64
. For use in struct
definitions. 𝕣1
... 𝕣4
are Arrays
of dimensions 1 to 4. 𝕣11
is a Vector
of Vector
.
Muscade.𝕫
— Type𝕫 (\bbz)
an alias for Int64
. For use in struct
definitions. 𝕫1
... 𝕫4
are Arrays
of dimensions 1 to 4. 𝕫11
is a Vector
of Vector
.
Functions
Muscade.addelement!
— Methodeleid = addelement!(model,ElType,nodid;kwargs...)
Add one or several elements to model
, connecting them to the nodes specified by nodid
.
If nodid
is an AbstractVector
: add a single element to the model. eleid
is then a single element identifier.
If nodid
is an AbstractMatrix
: add multiple elements to the model. Each column of nodid
identifies the node of a single element. eleid
is then a vector of element identifiers.
For each element, addelement!
will call eleobj = ElType(nodes;kwargs...)
where nodes
is a vector of nodes of the element.
Muscade.addnode!
— Methodnodid = addnode!(model,coord)
If coord
is an AbstractVector
of Real
: add a single node to the model. Muscade does not prescribe what coordinate system to use. Muscade will handle to each element the coord
of the nodes of the element, and the element constructor must be able to make sense of it. nodid
is a node identifier, that is used as input to addelement!
.
If coord
is an AbstractMatrix
, its rows are treated as vectors of coordinates. nodid
is then a vector of node identifiers.
See also: addelement!
, coord
, describe
Muscade.coord
— Methodc = coord(node)
Used by element constructors to obtain the coordinates of a vector of Nodes handed by Muscade to the constructor. c
is accessed as
c[inod][icoord]
where inod
is the element-node number and icoord
an index into a vector of coordinates.
See also: addnode!
, addelement!
, describe
, solve
Muscade.describe
— Methoddescribe(model,spec)
Print out information about model
. spec
can be an EleID
, a DofID
, a NodID
to describe an element, a dof or a node. spec
can be :dof
to obtain a list of dofs or :eletyp
for a list of element types.
See also: addelement!
, addnode!
Muscade.describe
— Methoddescribe(state;class=:all)
Provide a description of the dofs stored in state
. class
can be either :all
, :Λ
, :ΛX
, :X
, :U
or :A
See also: solve
Muscade.doflist
— MethodMuscade.doflist(::Type{E<:AbstractElement})
Elements must overload Muscade's doflist
function. The method must take the element type as only input, and return a NamedTuple
with fieldnames inod
,class
and field
. The tuple-fields are NTuple
s of the same length. For example
Muscade.doflist( ::Type{<:Turbine}) = (inod =(1 ,1 ,2 ,2 ),
class=(:X ,:X ,:A ,:A ),
field=(:tx1,:tx2,:Δseadrag,:Δskydrag))
In Λ
, X
, U
and A
handed by Muscade to residual
or lagrangian
, the dofs in the vectors will follow the order in the doflist. Element developers are free to number their dofs by node, by field, or in any other way.
See also: lagrangian
, residual
Muscade.equal
— Methodequal(t) → :equal
A function which for any value t
returns the symbol equal
. Usefull for specifying the keyword argument mode=equal
in adding an element of type `DofConstraint
to a Model
.
See also: DofConstraint
, off
, positive
Muscade.findlastassigned
— Methodilast = findlastassigned(state)
Find the index ilast
of the element before the first non assigment element in a vector state
.
In multistep analyses, solve
returns a vector state
of length equal to the number of steps requested by the user. If the analysis is aborted, solve
still returns any available results at the begining of state
, and the vector state[1:ilast]
is fully assigned.
See also: solve
Muscade.getdof
— Methoddofres = getdof(state;[class=:X],field=:somefield,nodID=[nodids...],[iders=0|1|2])
Obtain the value of dofs of the same class and field, at various nodes and for various states.
If state
is a vector, the output dofres
has size (ndof,nder+1,nstate)
. If state
is a scalar, the output dofres
has size (ndof,nder+1)
.
Muscade.getndof
— Methodgetndof(model)
getndof(model,class)
getndof(model,(class1,class2,[,...]))
where class
can be any of :X
, :U
, :A
: get the number of dofs in the specified classes (or in the whole model).
model
can be replaced with a concrete element type. The number of dofs is then per element.
See also: describe
Muscade.getresult
— Methodeleres = getresult(state,req,eleids)
Obtain an array of nested NamedTuples and NTuples of element results. req
is a request defined using @request
. state
a vector of State
s or a single State
. eleids
can be either
- a vector of
EleID
s (obtained fromaddelement!
) all corresponding to the same concrete element type - a concrete element type.
If state
is a vector, the output dofres
has size (nele,nstate)
. If state
is a scalar, the output dofres
has size (nele)
.
See also: getdof
, @request
, @espy
, addelement!
, solve
Muscade.initialize!
— Methodinitialstate = initialize!(model)
Finalize a model (invoquing addnode!
and addelement!
after initialize!
will result in an error) and return an initial State
(with all dofs set to zero, as starting point for an analysis.)
See also: addnode!
, addelement!
, solve
Muscade.lagrangian
— Method@espy function Muscade.lagrangian(eleobj::MyElement,Λ,X,U,A,t,χ,χcv,SP,dbg)
...
return L,χ,FB
end
Inputs
eleobj
an element objectΛ
aSVector{nXdof,R} where{R<:Real}
, Lagrange multipliers (akaδX
virtual displacements).X
aNTuple
ofSVector{nXdof,R} where{R<:Real}
, containing the Xdofs and, depending on the solver, their time derivatives. Usex=∂0(X)
,v=∂1(X)
anda=∂2(X)
to safely obtain vectors of zeros where the solver leaves time derivatives undefined.U
aNTuple
ofSVector{nUdof,R} where{R<:Real}
, containing the Udofs and, depending on the solver, their time derivatives. Useu=∂0(U)
,̇u=∂1(U)
and̈u=∂2(U)
to safely obtain vectors of zeros where the solver leaves time derivatives undefined.A
aSVector{nAdof,R} where{R<:Real}
.t
a `Real
containing the time.χ
the element memoryχcv
a function used to built the updated element memory.SP
solver parameters (for example: the barrier parameterγ
for interior point methods).dbg
aNamedTuple
to be used only for debugging purposes.
Outputs
L
the lagrangianχ
an updated element memory. Returnnoχ
if the element has no memory.FB
feedback from the element to the solver (for example: canγ
be reduced?). ReturnnoFB
of the element has no feedback to provide.
Muscade.muscadeerror
— Methodmuscadeerror([[dbg,]msg])
Throw a MuscadeException
, where
dbg
is aNamedTuple
that contains "location information"
(for example: solver, step, iteration, element, quadrature point) that will be displayed with the error message.
msg
is aString
describing the problem.
Muscade.off
— Methodoff(t) → :off
A function which for any value t
returns the symbol off
. Usefull for specifying the keyword argument mode=off
in adding an element of type `DofConstraint
to a Model
.
See also: [`DofConstraint`](@ref), [`equal`](@ref), [`positive`](@ref)
Muscade.positive
— Methodpositive(t) → :positive
A function which for any value t
returns the symbol positive
. Usefull for specifying the keyword argument mode=positive
in adding an element of type `DofConstraint
to a Model
.
See also: DofConstraint
, off
, equal
Muscade.residual
— Method@espy function Muscade.residual(eleobj::MyElement,X,U,A,t,χ,χcv,SP,dbg) ... return R,χ,FB end
The inputs and outputs to residual
are the same as for lagrangian
with two exceptions:
residual
does no have inputΛ
.- the first output argument of
residual
is not a LagrangianL
butR
,
a SVector{nXdof,R} where{R<:Real}
, containing the element's contribution to the residual of the equations to be solved.
See lagrangian
for the rest of the inputs and outputs.
Muscade.setscale!
— Methodsetscale!(model;scale=nothing,Λscale=nothing)
Provides an order of magnitude for each type of dof in the model. This is usued to improve the conditioning of the incremental problems and for convergence criteria. scale
is a NamedTuple
with fieldnames within X
, U
and A
. Each field is itself a NamedTuple
with fieldnames being dof fields, and value being the expected order of magnitude.
For example scale = (X=(tx=10,rx=1),A=(drag=3.))
should be read as: X-dofs of field :tx
are in tens of meters, :rx
are in radians, and A-dofs of field drag
are of the order of 3. All other degrees of freedom are expected to be roughly of the order of 1.
Λscale
is a scalar. The scale of a Λ-dof will be deemed to be the scale of the corresponding X-dof, times Λscale
.
Muscade.solve
— Methodsolve(Solver;dbg=(;),verbose=true,silenterror=false,kwargs...)
Execute an analysis using Solver
, and safeguard partial results in the case of error.
Named arguments
dbg=(;)
a named tuple to trace the call tree (for debugging)verbose=true
set to false to suppress printed output (for testing)silenterror=false
set to true to suppress print out of error (for testing)kwargs...
Further arguments passed on to the methodsolve
provided by the solver
This will call the method solve
provided by the solver with solve(Solver,pstate,verbose,(dbg...,solver=Symbol(Solver));kwargs...)
See also: StaticX
, StaticXUA
, initialize!
Muscade.toggle
— Methodtoggle(condition,a,b)
Typestable equivalent of condition ? a : b
. Returns a value converted to promote_type(typeof(a),typeof(b))
Muscade.∂0
— Methodposition = ∂0(X)
Used by elements' residual
or lagrangian
to extract the zero-th order time derivative from the variables X
and U
.
Muscade.∂1
— Methodvelocity = ∂1(X)
Used by elements' residual
or lagrangian
to extract the first order time derivative from the variables X
and U
. Where the solver does not provide this derivative (e.g. a static solver), the output is a vector of zeros.
Muscade.∂2
— Methodposition = ∂2(X)
Used by elements' residual
or lagrangian
to extract the zero-th order time derivative from the variables X
and U
. Where the solver does not provide this derivative (e.g. a static solver), the output is a vector of zeros.
Macros
Muscade.@espy
— Macro@espy function ... end
From an anotated function code, generate - "clean" code, in which the anotations have been deleted, and with the call syntax argout... = foo(argin...)
- "espying" code, with added input and ouput arguments argout...,res = foo(argin...,req)
where req
has been generated using @request
and res
is a nested structure of NamedTuple
s and NTuple
s containing the requested data.
The macro is not general: it is designed for residual
and lagrangian
, which for performance have to be programmed in "immutable" style: they must never mutate variables (this implies in particular, no adding into an array in a loop over Gauss points). So @espy only supports the specific programming constructs needed in this style.
The following is an example of anotated code:
@espy function residual(x::Vector{R},y) where{R<:Real}
ngp=2
accum = ntuple(ngp) do igp
☼z = x[igp]+y[igp]
☼s,☼t = ☼material(z)
♢square = s^2
@named(s)
end
r = sum(i->accum[i].s,ngp)
return r,nothing,nothing
end
- The keyword
function
is preceded by the macro-call@espy
. - The name of requestable variables of interest is preceded by
☼
(\sun
). Such anotation must always appear on the left of an assigment. - If the name of a variable is preceded by
♢
(\diamond
), then the variable is evaluated only if requested. Such a notation can only be used if there is only one variable left of the assignement. - The name of a function being called must be preceded by
☼
if the definition of the function is itself preceeded by the macro-call@espy
. for
-loops are not supported.do
-loops must be used: to be efficient,residual
andlagrangian
must not allocate and thus use immutables.
Muscade.@espydbg
— Macro@espydbg function ... end
Generate the same code as @espy
and print it (for debug purposes).
Muscade.@once
— Macro@once f(x)= x^2
do not parse the definition of function f
again if not modified. Using in a script, this prevents recompilations in Muscade
or applications based on it when they receive such functions as argument
Muscade.@request
— Macroreq = @request expr
Create a request of internal results wanted from a function. Considering the function presented as example for @espy
, examples of possible syntax include
req = @request gp(s,z,material(a,b))
req = @request gp(s)
req = @request gp(material(a))
The first expression can be read as follows: "In the function, there is a do
loop over variable igp
, and within this loop a call to a function material
. Results s
and z
are wanted from within the loop, and results a
and b
from within material
.
The corresponding datastructure containing the results for each element is a nesting of NTuples
and NamedTuples
, and can be accessed as out.gp[igp].material.a
and so forth.
Index
Muscade.noFB
Muscade.noχ
Muscade.ϵ
Muscade.∞
Muscade.AbstractElement
Muscade.DofConstraint
Muscade.DofCost
Muscade.DofLoad
Muscade.ElementCost
Muscade.Hold
Muscade.Model
Muscade.Node
Muscade.QuickFix
Muscade.SingleDofCost
Muscade.StaticX
Muscade.StaticXUA
Muscade.default
Muscade.ℕ
Muscade.ℝ
Muscade.ℤ
Muscade.𝔹
Muscade.𝕓
Muscade.𝕟
Muscade.𝕣
Muscade.𝕫
Muscade.addelement!
Muscade.addnode!
Muscade.coord
Muscade.describe
Muscade.describe
Muscade.doflist
Muscade.equal
Muscade.findlastassigned
Muscade.getdof
Muscade.getndof
Muscade.getresult
Muscade.initialize!
Muscade.lagrangian
Muscade.muscadeerror
Muscade.off
Muscade.positive
Muscade.residual
Muscade.setscale!
Muscade.solve
Muscade.toggle
Muscade.∂0
Muscade.∂1
Muscade.∂2
Muscade.@espy
Muscade.@espydbg
Muscade.@once
Muscade.@request