92 if (mPhaseType == PhaseType::B)
93 return {mMatrixNodeIndex[1]};
94 else if (mPhaseType == PhaseType::C)
95 return {mMatrixNodeIndex[2]};
96 else if (mPhaseType == PhaseType::ABC)
97 return mMatrixNodeIndex;
99 return {mMatrixNodeIndex[0]};
102template <
typename VarType> MatrixVar<VarType> SimNode<VarType>::voltage() {
106template <
typename VarType>
107void SimNode<VarType>::setMatrixNodeIndex(UInt phase, UInt matrixNodeIndex) {
108 mMatrixNodeIndex[phase] = matrixNodeIndex;
115template <>
void SimNode<Complex>::setVoltage(Complex newVoltage) {
116 (**mVoltage)(0, 0) = newVoltage;
119template <>
void SimNode<Complex>::setPower(Complex newPower) {
120 (**mApparentPower)(0, 0) = newPower;
123template <>
void SimNode<Real>::mnaUpdateVoltage(
const Matrix &leftVector) {
124 if (mMatrixNodeIndex[0] >= 0)
126 Math::realFromVectorElement(leftVector, mMatrixNodeIndex[0]);
127 if (mPhaseType == PhaseType::ABC) {
128 if (mMatrixNodeIndex[1] >= 0)
130 Math::realFromVectorElement(leftVector, mMatrixNodeIndex[1]);
131 if (mMatrixNodeIndex[2] >= 0)
133 Math::realFromVectorElement(leftVector, mMatrixNodeIndex[2]);
137template <>
void SimNode<Complex>::mnaUpdateVoltage(
const Matrix &leftVector) {
138 for (UInt freq = 0; freq < mNumFreqs; freq++) {
139 if (mMatrixNodeIndex[0] >= 0)
140 (**mVoltage)(0, freq) = Math::complexFromVectorElement(
141 leftVector, mMatrixNodeIndex[0], mNumFreqs, freq);
142 if (mPhaseType == PhaseType::ABC) {
143 if (mMatrixNodeIndex[1] >= 0)
144 (**mVoltage)(1, freq) = Math::complexFromVectorElement(
145 leftVector, mMatrixNodeIndex[1], mNumFreqs, freq);
146 if (mMatrixNodeIndex[2] >= 0)
147 (**mVoltage)(2, freq) = Math::complexFromVectorElement(
148 leftVector, mMatrixNodeIndex[2], mNumFreqs, freq);
154void SimNode<Real>::mnaUpdateVoltageHarm(
const Matrix &leftVector,
158void SimNode<Complex>::mnaUpdateVoltageHarm(
const Matrix &leftVector,
160 if (mMatrixNodeIndex[0] >= 0)
161 (**mVoltage)(0, freqIdx) =
162 Math::complexFromVectorElement(leftVector, mMatrixNodeIndex[0]);
163 if (mPhaseType == PhaseType::ABC) {
164 if (mMatrixNodeIndex[1] >= 0)
165 (**mVoltage)(1, freqIdx) =
166 Math::complexFromVectorElement(leftVector, mMatrixNodeIndex[1]);
167 if (mMatrixNodeIndex[2] >= 0)
168 (**mVoltage)(2, freqIdx) =
169 Math::complexFromVectorElement(leftVector, mMatrixNodeIndex[2]);
174void SimNode<Real>::mnaInitializeHarm(
175 std::vector<Attribute<Matrix>::Ptr> leftVectors) {}
178void SimNode<Complex>::mnaInitializeHarm(
179 std::vector<Attribute<Matrix>::Ptr> leftVectors) {
180 mMnaTasks = {std::make_shared<MnaPostStepHarm>(*
this, leftVectors)};
184void SimNode<Complex>::MnaPostStepHarm::execute(Real time, Int timeStepCount) {
185 for (UInt freq = 0; freq < mNode.mNumFreqs; freq++)
186 mNode.mnaUpdateVoltageHarm(**mLeftVectors[freq], freq);
192template class CPS::SimNode<Real>;
193template class CPS::SimNode<Complex>;