/// <summary> /// Initializes a new instance of the <see cref="Frequency"/> class. /// </summary> /// <param name="context">The 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>(); CollectorPrime = _complex.GetSharedVariable(context.Nodes[0]); BasePrime = _complex.GetSharedVariable(context.Nodes[1]); EmitterPrime = _complex.GetSharedVariable(context.Nodes[2]); _collectorNode = _complex.Map[CollectorPrime]; _baseNode = _complex.Map[BasePrime]; _emitterNode = _complex.Map[EmitterPrime]; _substrateNode = _complex.Map[_complex.GetSharedVariable(context.Nodes[3])]; // Add a series collector node if necessary if (ModelParameters.CollectorResistance > 0) { CollectorPrime = _complex.CreatePrivateVariable(Name.Combine("col"), Units.Volt); } _collectorPrimeNode = _complex.Map[CollectorPrime]; // Add a series base node if necessary if (ModelParameters.BaseResist > 0) { BasePrime = _complex.CreatePrivateVariable(Name.Combine("base"), Units.Volt); } _basePrimeNode = _complex.Map[BasePrime]; // Add a series emitter node if necessary if (ModelParameters.EmitterResistance > 0) { EmitterPrime = _complex.CreatePrivateVariable(Name.Combine("emit"), Units.Volt); } _emitterPrimeNode = _complex.Map[EmitterPrime]; _elements = new ElementSet <Complex>(_complex.Solver, new MatrixLocation(_collectorNode, _collectorNode), new MatrixLocation(_baseNode, _baseNode), new MatrixLocation(_emitterNode, _emitterNode), new MatrixLocation(_collectorPrimeNode, _collectorPrimeNode), new MatrixLocation(_basePrimeNode, _basePrimeNode), new MatrixLocation(_emitterPrimeNode, _emitterPrimeNode), new MatrixLocation(_collectorNode, _collectorPrimeNode), new MatrixLocation(_baseNode, _basePrimeNode), new MatrixLocation(_emitterNode, _emitterPrimeNode), new MatrixLocation(_collectorPrimeNode, _collectorNode), new MatrixLocation(_collectorPrimeNode, _basePrimeNode), new MatrixLocation(_collectorPrimeNode, _emitterPrimeNode), new MatrixLocation(_basePrimeNode, _baseNode), new MatrixLocation(_basePrimeNode, _collectorPrimeNode), new MatrixLocation(_basePrimeNode, _emitterPrimeNode), new MatrixLocation(_emitterPrimeNode, _emitterNode), new MatrixLocation(_emitterPrimeNode, _collectorPrimeNode), new MatrixLocation(_emitterPrimeNode, _basePrimeNode), new MatrixLocation(_substrateNode, _substrateNode), new MatrixLocation(_collectorPrimeNode, _substrateNode), new MatrixLocation(_substrateNode, _collectorPrimeNode), new MatrixLocation(_baseNode, _collectorPrimeNode), new MatrixLocation(_collectorPrimeNode, _baseNode)); }
/// <summary> /// Initializes a new instance of the <see cref="Frequency" /> class. /// </summary> /// <param name="context">The 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>(); _pos1 = _complex.Map[_complex.GetSharedVariable(context.Nodes[0])]; _neg1 = _complex.Map[_complex.GetSharedVariable(context.Nodes[1])]; _pos2 = _complex.Map[_complex.GetSharedVariable(context.Nodes[2])]; _neg2 = _complex.Map[_complex.GetSharedVariable(context.Nodes[3])]; Internal1 = _complex.CreatePrivateVariable(Name.Combine("int1"), Units.Volt); _int1 = _complex.Map[Internal1]; Internal2 = _complex.CreatePrivateVariable(Name.Combine("int2"), Units.Volt); _int2 = _complex.Map[Internal2]; Branch1 = _complex.CreatePrivateVariable(Name.Combine("branch1"), Units.Ampere); _br1 = _complex.Map[Branch1]; Branch2 = _complex.CreatePrivateVariable(Name.Combine("branch2"), Units.Ampere); _br2 = _complex.Map[Branch2]; _elements = new ElementSet <Complex>(_complex.Solver, new MatrixLocation(_pos1, _pos1), new MatrixLocation(_pos1, _int1), new MatrixLocation(_neg1, _br1), new MatrixLocation(_pos2, _pos2), new MatrixLocation(_neg2, _br2), new MatrixLocation(_int1, _pos1), new MatrixLocation(_int1, _int1), new MatrixLocation(_int1, _br1), new MatrixLocation(_int2, _int2), new MatrixLocation(_int2, _br2), new MatrixLocation(_br1, _neg1), new MatrixLocation(_br1, _pos2), new MatrixLocation(_br1, _neg2), new MatrixLocation(_br1, _int1), new MatrixLocation(_br1, _br2), new MatrixLocation(_br2, _pos1), new MatrixLocation(_br2, _neg1), new MatrixLocation(_br2, _neg2), new MatrixLocation(_br2, _int2), new MatrixLocation(_br2, _br1), new MatrixLocation(_pos2, _int2), new MatrixLocation(_int2, _pos2)); }
/// <summary> /// Initializes a new instance of the <see cref="Frequency"/> class. /// </summary> /// <param name="context">The context.</param> public Frequency(BehavioralBindingContext context) : base(context) { var bp = context.GetParameterSet <Parameters>(); _state = context.GetState <IComplexSimulationState>(); _variables = new OnePort <Complex>( _state.GetSharedVariable(context.Nodes[0]), _state.GetSharedVariable(context.Nodes[1])); var derivatives = new List <Func <Complex> >(Derivatives.Count); var derivativeVariables = new List <IVariable <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 matLocs = new List <MatrixLocation>(Derivatives.Count * 2); var rhsLocs = _variables.GetRhsIndices(_state.Map); foreach (var pair in Derivatives) { var variable = context.MapNode(_state, 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])); } } _derivatives = derivatives.ToArray(); _values = new Complex[_derivatives.Length * 2]; _derivativeVariables = derivativeVariables.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 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>(); _posNode = _complex.Map[_complex.GetSharedVariable(context.Nodes[0])]; _negNode = _complex.Map[_complex.GetSharedVariable(context.Nodes[1])]; _contPosNode = _complex.Map[_complex.GetSharedVariable(context.Nodes[2])]; _contNegNode = _complex.Map[_complex.GetSharedVariable(context.Nodes[3])]; Branch = _complex.CreatePrivateVariable(Name.Combine("branch"), Units.Ampere); _branchEq = _complex.Map[Branch]; _elements = new ElementSet <Complex>(_complex.Solver, new[] { new MatrixLocation(_posNode, _branchEq), new MatrixLocation(_negNode, _branchEq), new MatrixLocation(_branchEq, _posNode), new MatrixLocation(_branchEq, _negNode), new MatrixLocation(_branchEq, _contPosNode), new MatrixLocation(_branchEq, _contNegNode) }); }