DPsim
Loading...
Searching...
No Matches
CompositePowerComp.cpp
1// SPDX-License-Identifier: Apache-2.0
2
3#include <dpsim-models/CompositePowerComp.h>
4
5using namespace CPS;
6
7template <typename VarType>
9 Real frequency) {
10 this->createSubComponents();
11
13
14 for (auto subComp : this->mSubComponents) {
15 subComp->initialize(this->mFrequencies);
16 subComp->initializeFromNodesAndTerminals(frequency);
17 }
18}
19
20template <typename VarType>
22 typename SimPowerComp<VarType>::Ptr subc,
23 MNA_SUBCOMP_TASK_ORDER preStepOrder, MNA_SUBCOMP_TASK_ORDER postStepOrder,
24 Bool contributeToRightVector) {
25 this->mSubComponents.push_back(subc);
26 if (auto mnasubcomp =
27 std::dynamic_pointer_cast<MNASimPowerComp<VarType>>(subc)) {
28 this->mSubcomponentsMNA.push_back(mnasubcomp);
29
30 if (contributeToRightVector) {
31 this->mRightVectorStamps.push_back(mnasubcomp->mRightVector);
32 }
33
34 switch (preStepOrder) {
35 case MNA_SUBCOMP_TASK_ORDER::NO_TASK:
36 break;
37 case MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT: {
38 this->mSubcomponentsPreStepBeforeParent.push_back(mnasubcomp);
39 break;
40 }
41 case MNA_SUBCOMP_TASK_ORDER::TASK_AFTER_PARENT: {
42 this->mSubcomponentsPreStepAfterParent.push_back(mnasubcomp);
43 break;
44 }
45 }
46 switch (postStepOrder) {
47 case MNA_SUBCOMP_TASK_ORDER::NO_TASK:
48 break;
49 case MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT: {
50 this->mSubcomponentsPostStepBeforeParent.push_back(mnasubcomp);
51 break;
52 }
53 case MNA_SUBCOMP_TASK_ORDER::TASK_AFTER_PARENT: {
54 this->mSubcomponentsPostStepAfterParent.push_back(mnasubcomp);
55 break;
56 }
57 }
58 }
59}
60
61template <typename VarType>
63 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
65
66 for (auto subComp : mSubcomponentsMNA) {
67 subComp->mnaInitialize(omega, timeStep, leftVector);
68 }
70 **this->mRightVector = Matrix::Zero(leftVector->get().rows(), 1);
71
72 mnaParentInitialize(omega, timeStep, leftVector);
73}
74
75template <typename VarType>
77 SparseMatrixRow &systemMatrix) {
78 for (auto subComp : mSubcomponentsMNA) {
79 subComp->mnaApplySystemMatrixStamp(systemMatrix);
80 }
81 mnaParentApplySystemMatrixStamp(systemMatrix);
82}
84template <typename VarType>
86 Matrix &rightVector) {
87 rightVector.setZero();
88 for (auto stamp : mRightVectorStamps) {
89 if ((**stamp).size() != 0) {
90 rightVector += **stamp;
91 }
92 }
93 mnaParentApplyRightSideVectorStamp(rightVector);
95
96template <typename VarType>
97void CompositePowerComp<VarType>::mnaCompPreStep(Real time, Int timeStepCount) {
98 for (auto subComp : mSubcomponentsPreStepBeforeParent) {
99 subComp->mnaPreStep(time, timeStepCount);
100 }
101 mnaParentPreStep(time, timeStepCount);
102 for (auto subComp : mSubcomponentsPreStepAfterParent) {
103 subComp->mnaPreStep(time, timeStepCount);
104 }
105}
106
107template <typename VarType>
109 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
110 for (auto subComp : mSubcomponentsPostStepBeforeParent) {
111 subComp->mnaPostStep(time, timeStepCount, leftVector);
112 }
113 mnaParentPostStep(time, timeStepCount, leftVector);
114 for (auto subComp : mSubcomponentsPostStepAfterParent) {
115 subComp->mnaPostStep(time, timeStepCount, leftVector);
116 }
117}
118
119template <typename VarType>
121 AttributeBase::List &prevStepDependencies,
122 AttributeBase::List &attributeDependencies,
123 AttributeBase::List &modifiedAttributes) {
124 for (auto subComp : mSubcomponentsMNA) {
125 subComp->mnaAddPreStepDependencies(
126 prevStepDependencies, attributeDependencies, modifiedAttributes);
127 }
128 mnaParentAddPreStepDependencies(prevStepDependencies, attributeDependencies,
129 modifiedAttributes);
130}
131
132template <typename VarType>
134 AttributeBase::List &prevStepDependencies,
135 AttributeBase::List &attributeDependencies,
136 AttributeBase::List &modifiedAttributes,
137 Attribute<Matrix>::Ptr &leftVector) {
138 for (auto subComp : mSubcomponentsMNA) {
139 subComp->mnaAddPostStepDependencies(prevStepDependencies,
140 attributeDependencies,
141 modifiedAttributes, leftVector);
142 }
143 mnaParentAddPostStepDependencies(prevStepDependencies, attributeDependencies,
144 modifiedAttributes, leftVector);
145}
146
147// Declare specializations to move definitions to .cpp
148template class CPS::CompositePowerComp<Real>;
Base class for composite power components.
void mnaCompInitialize(Real omega, Real timeStep, Attribute< Matrix >::Ptr leftVector) override
Initializes variables of components.
void addMNASubComponent(typename SimPowerComp< VarType >::Ptr subc, MNA_SUBCOMP_TASK_ORDER preStepOrder, MNA_SUBCOMP_TASK_ORDER postStepOrder, Bool contributeToRightVector)
Add a new subcomponent implementing MNA methods.
void mnaCompAddPostStepDependencies(AttributeBase::List &prevStepDependencies, AttributeBase::List &attributeDependencies, AttributeBase::List &modifiedAttributes, Attribute< Matrix >::Ptr &leftVector) override
Add MNA post step dependencies.
virtual void initializeParentFromNodesAndTerminals(Real frequency)=0
void initializeFromNodesAndTerminals(Real frequency) override final
void mnaCompApplySystemMatrixStamp(SparseMatrixRow &systemMatrix) override
Stamps system matrix.
void mnaCompPreStep(Real time, Int timeStepCount) override
MNA pre step operations.
void mnaCompApplyRightSideVectorStamp(Matrix &rightVector) override
Stamps right side (source) vector.
void mnaCompAddPreStepDependencies(AttributeBase::List &prevStepDependencies, AttributeBase::List &attributeDependencies, AttributeBase::List &modifiedAttributes) override
Add MNA pre step dependencies.
void mnaCompPostStep(Real time, Int timeStepCount, Attribute< Matrix >::Ptr &leftVector) override
MNA post step operations.
virtual void createSubComponents()
Constructs and registers MNA subcomponents; called before collectVirtualNodes so virtual nodes exist ...
MNASimPowerComp(String uid, String name, Bool hasPreStep, Bool hasPostStep, Logger::Level logLevel)
Basic constructor that takes UID, name and log level.
Attribute< Matrix >::Ptr mRightVector
Matrix mFrequencies
List of considered network frequencies.
std::vector< std::shared_ptr< SimPowerComp< VarType > > > mSubComponents
void updateMatrixNodeIndices()
Update the "cached" mMatrixNodeIndices and mMatrixNodeIndexIsGround members.