3#include <dpsim-models/CompositePowerComp.h>
7template <
typename VarType>
16 subComp->initializeFromNodesAndTerminals(frequency);
20template <
typename VarType>
22 typename SimPowerComp<VarType>::Ptr subc,
23 MNA_SUBCOMP_TASK_ORDER preStepOrder, MNA_SUBCOMP_TASK_ORDER postStepOrder,
24 Bool contributeToRightVector) {
28 this->mSubcomponentsMNA.push_back(mnasubcomp);
30 if (contributeToRightVector) {
31 this->mRightVectorStamps.push_back(mnasubcomp->mRightVector);
34 switch (preStepOrder) {
35 case MNA_SUBCOMP_TASK_ORDER::NO_TASK:
37 case MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT: {
38 this->mSubcomponentsPreStepBeforeParent.push_back(mnasubcomp);
41 case MNA_SUBCOMP_TASK_ORDER::TASK_AFTER_PARENT: {
42 this->mSubcomponentsPreStepAfterParent.push_back(mnasubcomp);
46 switch (postStepOrder) {
47 case MNA_SUBCOMP_TASK_ORDER::NO_TASK:
49 case MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT: {
50 this->mSubcomponentsPostStepBeforeParent.push_back(mnasubcomp);
53 case MNA_SUBCOMP_TASK_ORDER::TASK_AFTER_PARENT: {
54 this->mSubcomponentsPostStepAfterParent.push_back(mnasubcomp);
61template <
typename VarType>
63 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
66 for (
auto subComp : mSubcomponentsMNA) {
67 subComp->mnaInitialize(omega, timeStep, leftVector);
70 **this->
mRightVector = Matrix::Zero(leftVector->get().rows(), 1);
72 mnaParentInitialize(omega, timeStep, leftVector);
75template <
typename VarType>
77 SparseMatrixRow &systemMatrix) {
78 for (
auto subComp : mSubcomponentsMNA) {
79 subComp->mnaApplySystemMatrixStamp(systemMatrix);
81 mnaParentApplySystemMatrixStamp(systemMatrix);
84template <
typename VarType>
86 Matrix &rightVector) {
87 rightVector.setZero();
88 for (
auto stamp : mRightVectorStamps) {
89 if ((**stamp).size() != 0) {
90 rightVector += **stamp;
93 mnaParentApplyRightSideVectorStamp(rightVector);
96template <
typename VarType>
98 for (
auto subComp : mSubcomponentsPreStepBeforeParent) {
99 subComp->mnaPreStep(time, timeStepCount);
101 mnaParentPreStep(time, timeStepCount);
102 for (
auto subComp : mSubcomponentsPreStepAfterParent) {
103 subComp->mnaPreStep(time, timeStepCount);
107template <
typename VarType>
109 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
110 for (
auto subComp : mSubcomponentsPostStepBeforeParent) {
111 subComp->mnaPostStep(time, timeStepCount, leftVector);
113 mnaParentPostStep(time, timeStepCount, leftVector);
114 for (
auto subComp : mSubcomponentsPostStepAfterParent) {
115 subComp->mnaPostStep(time, timeStepCount, leftVector);
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);
128 mnaParentAddPreStepDependencies(prevStepDependencies, attributeDependencies,
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);
143 mnaParentAddPostStepDependencies(prevStepDependencies, attributeDependencies,
144 modifiedAttributes, leftVector);
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.