Skip to content

Commit

Permalink
v0.17.0 (#42)
Browse files Browse the repository at this point in the history
* preparations for FMIExport

* fixes
  • Loading branch information
ThummeTo authored Apr 11, 2023
1 parent b618567 commit 74d1156
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 88 deletions.
5 changes: 4 additions & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
name = "FMICore"
uuid = "8af89139-c281-408e-bce2-3005eb87462f"
authors = ["TT <[email protected]>", "LM <[email protected]>", "JK <[email protected]>"]
version = "0.16.1"
version = "0.17.0"

[deps]
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"

[compat]
julia = "1.6"
2 changes: 1 addition & 1 deletion src/FMI2/cfunc.jl
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ The function controls debug logging that is output via the logger function callb
function fmi2SetDebugLogging(cfunc::Ptr{Nothing}, c::fmi2Component, logginOn::fmi2Boolean, nCategories::Csize_t, categories::Union{Ptr{fmi2String}, AbstractArray{fmi2String}})
status = ccall(cfunc,
fmi2Status,
(fmi2Component, fmi2Component, Csize_t, Ptr{fmi2String}),
(fmi2Component, fmi2Boolean, Csize_t, Ptr{fmi2String}),
c, logginOn, nCategories, categories)
@debug "fmi2SetDebugLogging(c: $(c), logginOn: $(loggingOn), nCategories: $(nCategories), categories: $(categories)) → $(status)"
return status
Expand Down
223 changes: 145 additions & 78 deletions src/FMI2/ctype.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
# Licensed under the MIT license. See LICENSE file in the project root for details.
#

import Dates: DateTime

"""
Source: FMISpec2.0.2[p.84]: 3.2.2 Evaluation of Model Equations
Expand Down Expand Up @@ -298,6 +300,32 @@ mutable struct fmi2EnumerationAttributesExt <: fmi2AttributesExt
end
end

"""
Custom helper, not part of the FMI-Spec.
Source: 2.2.3 Definition of Types (TypeDefinitions)
"""
mutable struct fmi2ModelDescriptionEnumerationItem

# mandatory
name::Union{String,Nothing}
value::Union{Integer,Nothing}

# optional
description::Union{String,Nothing}

# Constructor
function fmi2ModelDescriptionEnumerationItem()
inst = new()
inst.name = nothing
inst.value = nothing

inst.description = nothing

return inst
end
end

"""
ToDo.
Expand All @@ -307,8 +335,8 @@ mutable struct fmi2EnumerationAttributes <: fmi2Attributes
# optional
quantity::Union{String, Nothing}

# mandatory
items::Array # ToDo: Parse Items
# mandatory (invisible)
items::Array{fmi2ModelDescriptionEnumerationItem,1}

# constructor
function fmi2EnumerationAttributes()
Expand All @@ -319,6 +347,21 @@ mutable struct fmi2EnumerationAttributes <: fmi2Attributes
end
end

import Base.push!
function push!(attr::fmi2EnumerationAttributes, items...)
push!(attr.items, items...)
end

import Base.getindex
function getindex(attr::fmi2EnumerationAttributes, keys...)
getindex(attr.items, keys...)
end

import Base.length
function length(attr::fmi2EnumerationAttributes)
length(attr.items)
end

# mimic existence of properties of `fmi2RealAttributes` in `fmi2RealAttributesExt` (inheritance is not available in Julia, so it is simulated)
function Base.setproperty!(var::Union{fmi2RealAttributesExt, fmi2IntegerAttributesExt}, sym::Symbol, value)

Expand Down Expand Up @@ -497,67 +540,10 @@ mutable struct fmi2ScalarVariable
inst = new()
inst.name = name
inst.valueReference = valueReference
inst.description = nothing # ""
inst.description = nothing
inst.causality = causality
if inst.causality == nothing
inst.causality = fmi2CausalityLocal # this is the default according FMI-spec p. 48
end
inst.variability = variability
if inst.variability == nothing
inst.variability = fmi2VariabilityContinuous # this is the default according FMI-spec p. 49
end
inst.initial = initial
if inst.initial == nothing
# setting default value for initial according FMI-spec p. 51
if inst.causality != nothing && inst.variability != nothing
if inst.causality == fmi2CausalityParameter
if inst.variability == fmi2VariabilityFixed || inst.variability == fmi2VariabilityTunable
inst.initial = fmi2InitialExact
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) This combination is not allowed."
end
elseif inst.causality == fmi2CausalityCalculatedParameter
if inst.variability == fmi2VariabilityFixed || inst.variability == fmi2VariabilityTunable
inst.initial = fmi2InitialCalculated
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) This combination is not allowed."
end
elseif inst.causality == fmi2CausalityInput
if inst.variability == fmi2VariabilityDiscrete || inst.variability == fmi2VariabilityContinuous
# everything allright, it's not allowed to define `initial` in this case
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) This combination is not allowed."
end
elseif inst.causality == fmi2CausalityOutput
if inst.variability == fmi2VariabilityConstant
inst.initial = fmi2InitialExact
elseif inst.variability == fmi2VariabilityDiscrete || inst.variability == fmi2VariabilityContinuous
inst.initial = fmi2InitialCalculated
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) This combination is not allowed."
end
elseif inst.causality == fmi2CausalityLocal
if inst.variability == fmi2VariabilityConstant
inst.initial = fmi2InitialExact
elseif inst.variability == fmi2VariabilityFixed || inst.variability == fmi2VariabilityTunable
inst.initial = fmi2InitialCalculated
elseif inst.variability == fmi2VariabilityDiscrete || inst.variability == fmi2VariabilityContinuous
inst.initial = fmi2InitialCalculated
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) This combination is not allowed."
end
elseif inst.causality == fmi2CausalityIndependent
if inst.variability == fmi2VariabilityContinuous
# everything allright, it's not allowed to define `initial` in this case
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) This combination is not allowed."
end
end
else
@warn "Causality: $(fmi2CausalityToString(inst.causality)) Variability: $(fmi2VariabilityToString(inst.variability)) Cannot pick default value for `initial` if one of them is `nothing`."
end
end

inst.canHandleMultipleSetPerTimeInstant = nothing
inst.annotations = nothing
inst.attribute = nothing
Expand All @@ -567,6 +553,74 @@ mutable struct fmi2ScalarVariable
end
export fmi2ScalarVariable

function getAttributes(sv::fmi2ScalarVariable)

causality = sv.causality
variability = sv.variability
initial = sv.initial

if causality == nothing
causality = fmi2CausalityLocal # this is the default according FMI-spec p. 48
end

if variability == nothing
variability = fmi2VariabilityContinuous # this is the default according FMI-spec p. 49
end

if initial == nothing
# setting default value for initial according FMI-spec p. 51
if causality != nothing && variability != nothing
if causality == fmi2CausalityParameter
if variability == fmi2VariabilityFixed || variability == fmi2VariabilityTunable
initial = fmi2InitialExact
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) This combination is not allowed."
end
elseif causality == fmi2CausalityCalculatedParameter
if variability == fmi2VariabilityFixed || variability == fmi2VariabilityTunable
initial = fmi2InitialCalculated
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) This combination is not allowed."
end
elseif causality == fmi2CausalityInput
if variability == fmi2VariabilityDiscrete || variability == fmi2VariabilityContinuous
# everything allright, it's not allowed to define `initial` in this case
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) This combination is not allowed."
end
elseif causality == fmi2CausalityOutput
if variability == fmi2VariabilityConstant
initial = fmi2InitialExact
elseif variability == fmi2VariabilityDiscrete || variability == fmi2VariabilityContinuous
initial = fmi2InitialCalculated
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) This combination is not allowed."
end
elseif causality == fmi2CausalityLocal
if variability == fmi2VariabilityConstant
initial = fmi2InitialExact
elseif variability == fmi2VariabilityFixed || variability == fmi2VariabilityTunable
initial = fmi2InitialCalculated
elseif variability == fmi2VariabilityDiscrete || variability == fmi2VariabilityContinuous
initial = fmi2InitialCalculated
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) This combination is not allowed."
end
elseif causality == fmi2CausalityIndependent
if variability == fmi2VariabilityContinuous
# everything allright, it's not allowed to define `initial` in this case
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) This combination is not allowed."
end
end
else
@warn "Causality: $(fmi2CausalityToString(causality)) Variability: $(fmi2VariabilityToString(variability)) Cannot pick default value for `initial` if one of them is `nothing`."
end
end

return causality, variability, initial
end

"""
Overload the Base.show() function for custom printing of the fmi2ScalarVariable.
"""
Expand Down Expand Up @@ -780,63 +834,76 @@ mutable struct fmi2ModelDescription
copyright::Union{String, Nothing}
license::Union{String, Nothing}
generationTool::Union{String, Nothing}
generationDateAndTime # DateTime
generationDateAndTime::Union{DateTime, String, Nothing}
variableNamingConvention::Union{fmi2VariableNamingConvention, Nothing}
numberOfEventIndicators::Union{UInt, Nothing}

unitDefinitions::Array{fmi2Unit, 1}
typeDefinitions::Array{fmi2SimpleType, 1}
logCategories::Array # ToDo: Array type
unitDefinitions::Union{Array{fmi2Unit, 1}, Nothing}
typeDefinitions::Union{Array{fmi2SimpleType, 1}, Nothing}
logCategories::Union{Array, Nothing} # ToDo: Array type

defaultExperiment::Union{fmi2ModelDescriptionDefaultExperiment, Nothing}
modelExchange::Union{fmi2ModelDescriptionModelExchange, Nothing}
coSimulation::Union{fmi2ModelDescriptionCoSimulation, Nothing}

vendorAnnotations::Array # ToDo: Array type
vendorAnnotations::Union{Array, Nothing} # ToDo: Array type
modelVariables::Array{fmi2ScalarVariable, 1}
modelStructure::fmi2ModelDescriptionModelStructure

modelExchange::Union{fmi2ModelDescriptionModelExchange, Nothing}
coSimulation::Union{fmi2ModelDescriptionCoSimulation, Nothing}

# additionals
valueReferences::Array{fmi2ValueReference}
inputValueReferences::Array{fmi2ValueReference}
outputValueReferences::Array{fmi2ValueReference}
stateValueReferences::Array{fmi2ValueReference}
discreteStateValueReferences::Union{Array{fmi2ValueReference}}
derivativeValueReferences::Array{fmi2ValueReference}
parameterValueReferences::Array{fmi2ValueReference}

stringValueReferences::Dict{String, fmi2ValueReference} # String-ValueReference pairs of MD

# ToDo: from here on refactoring is needed

enumerations::fmi2Enum

# additional fields (non-FMI-specific)
stringValueReferences::Dict{String, fmi2ValueReference} # String-ValueReference pairs of MD
valueReferenceIndicies::Dict{UInt, UInt}

# Constructor for uninitialized struct
function fmi2ModelDescription()
inst = new()

inst.fmiVersion = ""
inst.modelName = ""
inst.guid = ""

inst.description = nothing
inst.author = nothing
inst.version = nothing
inst.copyright = nothing
inst.license = nothing
inst.generationTool = nothing
inst.generationDateAndTime = nothing
inst.variableNamingConvention = nothing
inst.numberOfEventIndicators = nothing

inst.unitDefinitions = nothing
inst.typeDefinitions = nothing
inst.logCategories = nothing

inst.defaultExperiment = nothing
inst.modelExchange = nothing
inst.coSimulation = nothing
inst.defaultExperiment = nothing


inst.vendorAnnotations = nothing
inst.modelVariables = Array{fmi2ScalarVariable, 1}()
inst.modelStructure = fmi2ModelDescriptionModelStructure()
inst.numberOfEventIndicators = nothing
inst.enumerations = []

inst.valueReferences = []
inst.inputValueReferences = []
inst.outputValueReferences = []
inst.stateValueReferences = []
inst.discreteStateValueReferences = []
inst.derivativeValueReferences = []
inst.parameterValueReferences = []

inst.stringValueReferences = Dict{String, fmi2ValueReference}()
inst.valueReferenceIndicies = Dict{UInt, UInt}()

return inst
end
end
Expand Down
Loading

2 comments on commit 74d1156

@ThummeTo
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: JuliaRegistries/General/81421

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.17.0 -m "<description of version>" 74d115697b042dd99bbdc19866663f0b93d8c17e
git push origin v0.17.0

Please sign in to comment.