76 return (**mVoltage)(2, 0);
78 return (**mVoltage)(0, 0);
81template <
typename VarType>
83 if ((phaseType == PhaseType::A || phaseType == PhaseType::Single) &&
84 (mPhaseType == PhaseType::Single || mPhaseType == PhaseType::A ||
85 mPhaseType == PhaseType::ABC))
86 return mMatrixNodeIndex[0];
87 else if (phaseType == PhaseType::B &&
88 (mPhaseType == PhaseType::B || mPhaseType == PhaseType::ABC))
89 return mMatrixNodeIndex[1];
90 else if (phaseType == PhaseType::C &&
91 (mPhaseType == PhaseType::C || mPhaseType == PhaseType::ABC))
92 return mMatrixNodeIndex[2];
97template <
typename VarType>
99 if (mPhaseType == PhaseType::B)
100 return {mMatrixNodeIndex[1]};
101 else if (mPhaseType == PhaseType::C)
102 return {mMatrixNodeIndex[2]};
103 else if (mPhaseType == PhaseType::ABC)
104 return mMatrixNodeIndex;
106 return {mMatrixNodeIndex[0]};
109template <
typename VarType> MatrixVar<VarType> SimNode<VarType>::voltage() {
113template <
typename VarType>
114void SimNode<VarType>::setMatrixNodeIndex(UInt phase, UInt matrixNodeIndex) {
115 mMatrixNodeIndex[phase] = matrixNodeIndex;
122template <>
void SimNode<Complex>::setVoltage(Complex newVoltage) {
123 (**mVoltage)(0, 0) = newVoltage;
126template <>
void SimNode<Complex>::setPower(Complex newPower) {
127 (**mApparentPower)(0, 0) = newPower;
130template <>
void SimNode<Real>::mnaUpdateVoltage(
const Matrix &leftVector) {
131 if (mMatrixNodeIndex[0] >= 0)
133 Math::realFromVectorElement(leftVector, mMatrixNodeIndex[0]);
134 if (mPhaseType == PhaseType::ABC) {
135 if (mMatrixNodeIndex[1] >= 0)
137 Math::realFromVectorElement(leftVector, mMatrixNodeIndex[1]);
138 if (mMatrixNodeIndex[2] >= 0)
140 Math::realFromVectorElement(leftVector, mMatrixNodeIndex[2]);
144template <>
void SimNode<Complex>::mnaUpdateVoltage(
const Matrix &leftVector) {
145 for (UInt freq = 0; freq < mNumFreqs; freq++) {
146 if (mMatrixNodeIndex[0] >= 0)
147 (**mVoltage)(0, freq) = Math::complexFromVectorElement(
148 leftVector, mMatrixNodeIndex[0], mNumFreqs, freq);
149 if (mPhaseType == PhaseType::ABC) {
150 if (mMatrixNodeIndex[1] >= 0)
151 (**mVoltage)(1, freq) = Math::complexFromVectorElement(
152 leftVector, mMatrixNodeIndex[1], mNumFreqs, freq);
153 if (mMatrixNodeIndex[2] >= 0)
154 (**mVoltage)(2, freq) = Math::complexFromVectorElement(
155 leftVector, mMatrixNodeIndex[2], mNumFreqs, freq);
161void SimNode<Real>::mnaUpdateVoltageHarm(
const Matrix &leftVector,
165void SimNode<Complex>::mnaUpdateVoltageHarm(
const Matrix &leftVector,
167 if (mMatrixNodeIndex[0] >= 0)
168 (**mVoltage)(0, freqIdx) =
169 Math::complexFromVectorElement(leftVector, mMatrixNodeIndex[0]);
170 if (mPhaseType == PhaseType::ABC) {
171 if (mMatrixNodeIndex[1] >= 0)
172 (**mVoltage)(1, freqIdx) =
173 Math::complexFromVectorElement(leftVector, mMatrixNodeIndex[1]);
174 if (mMatrixNodeIndex[2] >= 0)
175 (**mVoltage)(2, freqIdx) =
176 Math::complexFromVectorElement(leftVector, mMatrixNodeIndex[2]);
181void SimNode<Real>::mnaInitializeHarm(
182 std::vector<Attribute<Matrix>::Ptr> leftVectors) {}
185void SimNode<Complex>::mnaInitializeHarm(
186 std::vector<Attribute<Matrix>::Ptr> leftVectors) {
187 mMnaTasks = {std::make_shared<MnaPostStepHarm>(*
this, leftVectors)};
191void SimNode<Complex>::MnaPostStepHarm::execute(Real time, Int timeStepCount) {
192 for (UInt freq = 0; freq < mNode.mNumFreqs; freq++)
193 mNode.mnaUpdateVoltageHarm(**mLeftVectors[freq], freq);
199template class CPS::SimNode<Real>;
200template class CPS::SimNode<Complex>;