Advertisement
Guest User

MTKCompat

a guest
Feb 26th, 2024
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 3.29 KB | None | 0 0
  1. module MTKCompat
  2.     using ..Variables: z
  3.     using ModelingToolkit
  4.     using ModelingToolkitStandardLibrary
  5.     using ModelingToolkit: @component
  6.     using ModelingToolkitStandardLibrary.Blocks: get_sampled_data, SampledDataType, Parameter, RealOutput
  7.  
  8.     """
  9.    SampledDataZ(; name, buffer, sample_time, circular_buffer=true)
  10.  
  11.    data input component.
  12.  
  13.    # Parameters:
  14.    - `buffer::Vector{Real}`:  holds the data sampled at `sample_time`
  15.    - `sample_time::Real`
  16.    - `circular_buffer::Bool = true`: how to handle `t > length(buffer)*sample_time`.  If true data is considered circular, otherwise last data point is held.
  17.  
  18.    # Connectors:
  19.    - `output`
  20.    """
  21.     @component function SampledDataZ(::Val{SampledDataType.vector_based};
  22.             name,
  23.             buffer,
  24.             sample_time,
  25.             circular_buffer = true)
  26.         T = eltype(buffer)
  27.         pars = @parameters begin
  28.             buffer::Vector{T} = buffer #::Vector{Real}
  29.             sample_time::T = sample_time #::Real
  30.             circular_buffer::Bool = circular_buffer #::Bool
  31.         end
  32.         @parameters p::Parameter{T} = Parameter(buffer, sample_time, circular_buffer)
  33.         vars = []
  34.         systems = @named begin
  35.             output = RealOutput()
  36.         end
  37.         eqs = [
  38.             output.u ~ get_sampled_data(z, p)
  39.         ]
  40.         return ODESystem(eqs, z, vars, [pars; p]; name, systems,
  41.             defaults = [
  42.                 output.u => get_sampled_data(0.0, p)
  43.             ])
  44.     end
  45.  
  46.     """
  47.        SampledDataZ(; name, buffer)
  48.  
  49.    data input component.
  50.  
  51.    # Parameters:
  52.    - `buffer`: a `Parameter` type which holds the data and sample time
  53.  
  54.    # Connectors:
  55.    - `output`
  56.    """
  57.     @component function SampledDataZ(
  58.             ::Val{SampledDataType.struct_based}; name, buffer::Parameter)
  59.         pars = @parameters begin
  60.             buffer::typeof(buffer) = buffer #::Parameter
  61.         end
  62.         @show pars
  63.         vars = []
  64.         systems = @named begin
  65.             output = RealOutput()
  66.         end
  67.         eqs = [
  68.             output.u ~ get_sampled_data(z, buffer)
  69.         ]
  70.         return ODESystem(eqs, z, vars, pars; name, systems,
  71.             defaults = [output.u => get_sampled_data(0.0, buffer)])
  72.     end
  73.  
  74.     SampledDataZ(x::SampledDataType.Option; kwargs...) = SampledDataZ(Val(x); kwargs...)
  75.  
  76.     # struct_based
  77.     function SampledDataZ(T::Type, circular_buffer = true; name)
  78.         SampledDataZ(SampledDataType.struct_based;
  79.             name,
  80.             buffer = Parameter(T[], zero(T), circular_buffer))
  81.     end
  82.  
  83.     # vector_based
  84.     function SampledDataZ(sample_time::T, circular_buffer = true; name) where {T <: Real}
  85.         SampledDataZ(SampledDataType.vector_based;
  86.             name,
  87.             buffer = T[],
  88.             sample_time,
  89.             circular_buffer)
  90.     end
  91.     function SampledDataZ(buffer::Vector{<:Real},
  92.             sample_time::Real,
  93.             circular_buffer = true;
  94.             name)
  95.         SampledDataZ(SampledDataType.vector_based; name, buffer, sample_time, circular_buffer)
  96.     end
  97.     function SampledDataZ(; name, buffer, sample_time, circular_buffer)
  98.         SampledDataZ(SampledDataType.vector_based; name, buffer, sample_time, circular_buffer)
  99.     end
  100.  
  101.     export SampledDataZ
  102. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement