/// <summary> /// Initializes a new instance of the <see cref="FrequencyBehavior"/> class. /// </summary> /// <param name="context">The context.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="context"/> is <c>null</c>.</exception> public FrequencyBehavior(BehavioralBindingContext context) : base(context) { var bp = context.GetParameterSet<Parameters>(); var state = context.GetState<IComplexSimulationState>(); _variables = new OnePort<Complex>( state.GetSharedVariable(context.Nodes[0]), state.GetSharedVariable(context.Nodes[1])); // Build the functions var derivatives = new List<Func<Complex>>(Derivatives.Count); var builder = new ComplexFunctionBuilder(); builder.VariableFound += (sender, args) => { if (args.Variable == null && DerivativeVariables.TryGetValue(args.Node, out var variable)) args.Variable = new FuncVariable<Complex>(variable.Name, () => variable.Value, variable.Unit); }; bp.RegisterBuilder(context, builder); var rhsLocs = _variables.GetRhsIndices(state.Map); var matLocs = new List<MatrixLocation>(Derivatives.Count * 2); foreach (var pair in Derivatives) { var variable = context.MapNode(state, pair.Key); if (state.Map.Contains(variable)) { derivatives.Add(builder.Build(pair.Value)); matLocs.Add(new MatrixLocation(rhsLocs[0], state.Map[variable])); matLocs.Add(new MatrixLocation(rhsLocs[1], state.Map[variable])); } } // Get the matrix elements _derivatives = derivatives.ToArray(); _elements = new ElementSet<Complex>(state.Solver, matLocs.ToArray()); }
/// <summary> /// Initializes a new instance of the <see cref="Frequency"/> class. /// </summary> /// <param name="context">The binding context.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="context"/> is <c>null</c>.</exception> public Frequency(IComponentBindingContext context) : base(context) { _complex = context.GetState <IComplexSimulationState>(); _variables = new OnePort <Complex>(_complex, context); _elements = new ElementSet <Complex>(_complex.Solver, null, _variables.GetRhsIndices(_complex.Map)); }
/// <summary> /// Initializes a new instance of the <see cref="Time"/> class. /// </summary> /// <param name="context">The context.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="context"/> is <c>null</c>.</exception> public Time(IComponentBindingContext context) : base(context) { context.Nodes.CheckNodes(2); _biasing = context.GetState <IBiasingSimulationState>(); _time = context.GetState <ITimeSimulationState>(); _variables = new OnePort <double>(_biasing, context); _elements = new ElementSet <double>(_biasing.Solver, _variables.GetMatrixLocations(_biasing.Map), _variables.GetRhsIndices(_biasing.Map)); var method = context.GetState <IIntegrationMethod>(); _qcap = method.CreateDerivative(); }
/// <summary> /// Initializes a new instance of the <see cref="Biasing"/> class. /// </summary> /// <param name="context">The context.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="context"/> is <c>null</c>.</exception> public Biasing(BehavioralBindingContext context) : base(context) { var bp = context.GetParameterSet <Parameters>(); var state = context.GetState <IBiasingSimulationState>(); _variables = new OnePort <double>( state.GetSharedVariable(context.Nodes[0]), state.GetSharedVariable(context.Nodes[1])); // Let's build the derivative functions and get their matrix locations/rhs locations Function = bp.Function; Derivatives = context.CreateDerivatives(Function); DerivativeVariables = Derivatives.Keys.ToDictionary(d => d, d => context.MapNode(state, d), Derivatives.Comparer); var derivatives = new List <Func <double> >(Derivatives.Count); var derivativeVariables = new List <IVariable <double> >(Derivatives.Count); var builder = new RealFunctionBuilder(); builder.VariableFound += (sender, args) => { if (args.Variable == null && DerivativeVariables.TryGetValue(args.Node, out var variable)) { args.Variable = variable; } }; bp.RegisterBuilder(context, builder); var matLocs = new List <MatrixLocation>(Derivatives.Count * 2); var rhsLocs = _variables.GetRhsIndices(state.Map); foreach (var pair in Derivatives) { var variable = DerivativeVariables[pair.Key]; if (state.Map.Contains(variable)) { derivatives.Add(builder.Build(pair.Value)); derivativeVariables.Add(variable); matLocs.Add(new MatrixLocation(rhsLocs[0], state.Map[variable])); matLocs.Add(new MatrixLocation(rhsLocs[1], state.Map[variable])); } } _value = builder.Build(Function); _derivatives = derivatives.ToArray(); _derivativeVariables = derivativeVariables.ToArray(); _values = new double[_derivatives.Length * 2 + 2]; // Get the matrix elements _elements = new ElementSet <double>(state.Solver, matLocs.ToArray(), rhsLocs); }
/// <summary> /// Initializes a new instance of the <see cref="Biasing"/> class. /// </summary> /// <param name="context">The context.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="context"/> is <c>null</c>.</exception> public Biasing(IComponentBindingContext context) : base(context) { context.ThrowIfNull(nameof(context)); Parameters = context.GetParameterSet <Parameters>(); _biasing = context.GetState <IBiasingSimulationState>(); _iteration = context.GetState <IIterationSimulationState>(); _variables = new OnePort <double>(_biasing, context); context.TryGetState <IIntegrationMethod>(out _method); Waveform = Parameters.Waveform?.Create(context); // Give some warnings if no value is given if (!Parameters.DcValue.Given) { // no DC value - either have a transient value or none SpiceSharpWarning.Warning(this, Waveform != null ? Properties.Resources.IndependentSources_NoDcUseWaveform.FormatString(Name) : Properties.Resources.IndependentSources_NoDc.FormatString(Name)); } _elements = new ElementSet <double>(_biasing.Solver, null, _variables.GetRhsIndices(_biasing.Map)); }