Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ modernize*,
-modernize-use-trailing-return-type,
-modernize-use-override,
-modernize-use-ranges,
-modernize-use-std-numbers,
-modernize-avoid-c-arrays,
-modernize-pass-by-value,
-modernize-use-equals-default,
Expand Down Expand Up @@ -55,6 +56,7 @@ modernize*,
-modernize-use-trailing-return-type,
-modernize-use-override,
-modernize-use-ranges,
-modernize-use-std-numbers,
-modernize-use-using,
-modernize-avoid-c-arrays,
-modernize-pass-by-value,
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,5 @@ fmus
/.pre-commit-cache-2/
.pre-commit-cache
.vs
.julia
output
97 changes: 97 additions & 0 deletions src/fileInput/gridDynReadDYR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,12 @@ namespace {
void loadESDC1A(CoreObject* parentObject, stringVec& tokens);
void loadESDC2A(CoreObject* parentObject, stringVec& tokens);
void loadIEEET1(CoreObject* parentObject, stringVec& tokens);
void loadIEEET3(CoreObject* parentObject, stringVec& tokens);
void loadIEEEX1(CoreObject* parentObject, stringVec& tokens);
void loadAC7B(CoreObject* parentObject, stringVec& tokens);
void loadAC8B(CoreObject* parentObject, stringVec& tokens);
void loadESST1A(CoreObject* parentObject, stringVec& tokens);
void loadESST2A(CoreObject* parentObject, stringVec& tokens);
void loadESST3A(CoreObject* parentObject, stringVec& tokens);
void loadESST4B(CoreObject* parentObject, stringVec& tokens);
void loadEXPIC1(CoreObject* parentObject, stringVec& tokens);
Expand Down Expand Up @@ -147,10 +151,18 @@ void loadDyr(CoreObject* parentObject,
loadESDC2A(parentObject, lineTokens);
} else if (type == "'IEEET1'") {
loadIEEET1(parentObject, lineTokens);
} else if (type == "'IEEET3'") {
loadIEEET3(parentObject, lineTokens);
} else if (type == "'IEEEX1'") {
loadIEEEX1(parentObject, lineTokens);
} else if (type == "'AC7B'") {
loadAC7B(parentObject, lineTokens);
} else if (type == "'AC8B'") {
loadAC8B(parentObject, lineTokens);
} else if (type == "'ESST1A'") {
loadESST1A(parentObject, lineTokens);
} else if (type == "'ESST2A'") {
loadESST2A(parentObject, lineTokens);
} else if (type == "'ESST3A'") {
loadESST3A(parentObject, lineTokens);
} else if (type == "'ESST4B'") {
Expand Down Expand Up @@ -466,6 +478,24 @@ namespace {
gen->add(exciterModel);
}

void loadIEEET3(CoreObject* parentObject, stringVec& tokens)
{
if (tokens.size() != 15U) {
throw InvalidParameterValue("IEEET3 DYR record must contain 15 fields");
}
auto* gen = requireDyrGenerator(parentObject, tokens, "IEEET3");
const auto params = gmlc::utilities::str2vector(tokens, kNullVal);
auto* model =
static_cast<Exciter*>(CoreObjectFactory::instance()->createObject("exciter", "ieeet3"));
// PSS/E order verified against the ANDES psse-dyr.yaml IEEET3 schema.
static constexpr std::array<std::string_view, 12> names{
"tr", "ka", "ta", "vrmax", "vrmin", "vbmax", "ke", "te", "kf", "tf", "kp", "ki"};
for (std::size_t index = 0; index < names.size(); ++index) {
model->set(names[index], params[index + 3]);
}
gen->add(model);
}

void loadIEEEX1(CoreObject* parentObject, stringVec& tokens)
{
if (tokens.size() != 19U) {
Expand Down Expand Up @@ -498,6 +528,54 @@ namespace {
gen->add(exciterModel);
}

void loadAC7B(CoreObject* parentObject, stringVec& tokens)
{
if (tokens.size() != 30U) {
throw InvalidParameterValue("AC7B DYR record must contain 30 fields");
}
auto* gen = requireDyrGenerator(parentObject, tokens, "AC7B");
const auto params = gmlc::utilities::str2vector(tokens, kNullVal);
auto* model =
static_cast<Exciter*>(CoreObjectFactory::instance()->createObject("exciter", "ac7b"));
// AC7B uses the 27-parameter order of the IEEE/OpenIPSL block:
// TR, KPR, KIR, KDR, TDR, VRMAX, VRMIN, KPA, KIA, VAMAX, VAMIN,
// KP, KL, TE, KC, KD, KE, KF1, KF2, KF3, TF3, VEMIN, VFEMAX,
// E1, SE1, E2, SE2.
static constexpr std::array<std::string_view, 27> names{"tr", "kpr", "kir", "kdr",
"tdr", "vrmax", "vrmin", "kpa",
"kia", "vamax", "vamin", "kp",
"kl", "te", "kc", "kd",
"ke", "kf1", "kf2", "kf3",
"tf3", "vemin", "vfemax", "e1",
"se1", "e2", "se2"};
for (std::size_t index = 0; index < names.size(); ++index) {
model->set(names[index], params[index + 3]);
}
gen->add(model);
}

void loadAC8B(CoreObject* parentObject, stringVec& tokens)
{
if (tokens.size() != 24U) {
throw InvalidParameterValue("AC8B DYR record must contain 24 fields");
}
auto* gen = requireDyrGenerator(parentObject, tokens, "AC8B");
const auto params = gmlc::utilities::str2vector(tokens, kNullVal);
auto* model =
static_cast<Exciter*>(CoreObjectFactory::instance()->createObject("exciter", "ac8b"));
// Exact ANDES psse-dyr.yaml order.
static constexpr std::array<std::string_view, 21> names{"tr", "kpr", "kir", "kdr",
"tdr", "vpmax", "vpmin", "vrmax",
"vrmin", "vfemax", "vemin", "ta",
"ka", "te", "kc", "kd",
"ke", "e1", "se1", "e2",
"se2"};
for (std::size_t index = 0; index < names.size(); ++index) {
model->set(names[index], params[index + 3]);
}
gen->add(model);
}

void loadESST1A(CoreObject* parentObject, stringVec& tokens)
{
if (tokens.size() != 23U) {
Expand Down Expand Up @@ -533,6 +611,25 @@ namespace {
gen->add(model);
}

void loadESST2A(CoreObject* parentObject, stringVec& tokens)
{
if (tokens.size() != 16U) {
throw InvalidParameterValue("ESST2A DYR record must contain 16 fields");
}
auto* gen = requireDyrGenerator(parentObject, tokens, "ESST2A");
const auto params = gmlc::utilities::str2vector(tokens, kNullVal);
auto* model =
static_cast<Exciter*>(CoreObjectFactory::instance()->createObject("exciter", "esst2a"));
// GridDyn's compact 13-parameter layout for the OpenIPSL ESST2A core.
// Separate VUEL/VOEL selector fields are intentionally not accepted.
static constexpr std::array<std::string_view, 13> names{
"tr", "ka", "ta", "vrmax", "vrmin", "kp", "ki", "kc", "kf", "tf", "ke", "te", "efdmax"};
for (std::size_t index = 0; index < names.size(); ++index) {
model->set(names[index], params[index + 3]);
}
gen->add(model);
}

void loadESST3A(CoreObject* parentObject, stringVec& tokens)
{
auto* gen = requireDyrGenerator(parentObject, tokens, "ESST3A");
Expand Down
9 changes: 9 additions & 0 deletions src/griddyn/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,14 @@ set(exciter_headers
stabilizers/StabilizerST2CUT.h
exciters/ExciterDC1A.h
exciters/ExciterDC2A.h
exciters/ExciterAC7B.h
exciters/ExciterAC8B.h
exciters/ExciterESST1A.h
exciters/ExciterESST2A.h
exciters/ExciterESST3A.h
exciters/ExciterESST4B.h
exciters/ExciterEXPIC1.h
exciters/ExciterSignalHelper.h
exciters/StaticExciterRectifier.h
exciters/ExciterEXAC1.h
exciters/ExciterESAC1A.h
Expand All @@ -104,6 +108,7 @@ set(exciter_headers
exciters/ExciterEXST1.h
exciters/ExciterIEEEtype1.h
exciters/ExciterIEEEtype2.h
exciters/ExciterIEEET3.h
exciters/ExciterIEEEX1.h
exciters/ExciterSEXS.h
exciters/ExciterSCRX.h
Expand All @@ -114,7 +119,10 @@ set(exciter_sources
exciters/Exciter.cpp
exciters/ExciterDC1A.cpp
exciters/ExciterDC2A.cpp
exciters/ExciterAC7B.cpp
exciters/ExciterAC8B.cpp
exciters/ExciterESST1A.cpp
exciters/ExciterESST2A.cpp
exciters/ExciterESST3A.cpp
exciters/ExciterESST4B.cpp
exciters/ExciterEXPIC1.cpp
Expand All @@ -127,6 +135,7 @@ set(exciter_sources
exciters/ExciterEXST1.cpp
exciters/ExciterIEEEtype1.cpp
exciters/ExciterIEEEtype2.cpp
exciters/ExciterIEEET3.cpp
exciters/ExciterIEEEX1.cpp
exciters/ExciterSEXS.cpp
exciters/ExciterSCRX.cpp
Expand Down
8 changes: 8 additions & 0 deletions src/griddyn/exciters/Exciter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,22 @@
#include "../GridComponentHelperClasses.h"
#include "../GridPrimary.h"
#include "../gridDynDefinitions.hpp"
#include "ExciterAC7B.h"
#include "ExciterAC8B.h"
#include "ExciterDC1A.h"
#include "ExciterDC2A.h"
#include "ExciterESAC1A.h"
#include "ExciterESAC6A.h"
#include "ExciterESST1A.h"
#include "ExciterESST2A.h"
#include "ExciterESST3A.h"
#include "ExciterESST4B.h"
#include "ExciterEXAC1.h"
#include "ExciterEXAC2.h"
#include "ExciterEXAC4.h"
#include "ExciterEXPIC1.h"
#include "ExciterEXST1.h"
#include "ExciterIEEET3.h"
#include "ExciterIEEEX1.h"
#include "ExciterIEEEtype1.h"
#include "ExciterIEEEtype2.h"
Expand Down Expand Up @@ -49,7 +53,10 @@ namespace exciters {
static ChildTypeFactory<ExciterDC1A, Exciter> gfeEsdc1a("exciter", "esdc1a"); // NOLINT
static ChildTypeFactory<ExciterDC2A, Exciter> gfeEsdc2a("exciter", "esdc2a"); // NOLINT
static ChildTypeFactory<ExciterDC2A, Exciter> gfeExdc2("exciter", "exdc2"); // NOLINT
static ChildTypeFactory<ExciterAC7B, Exciter> gfeAc7b("exciter", "ac7b"); // NOLINT
static ChildTypeFactory<ExciterAC8B, Exciter> gfeAc8b("exciter", "ac8b"); // NOLINT
static ChildTypeFactory<ExciterESST1A, Exciter> gfeEsst1a("exciter", "esst1a"); // NOLINT
static ChildTypeFactory<ExciterESST2A, Exciter> gfeEsst2a("exciter", "esst2a"); // NOLINT
static ChildTypeFactory<ExciterESST3A, Exciter> gfeEsst3a("exciter", "esst3a"); // NOLINT
static ChildTypeFactory<ExciterESST4B, Exciter> gfeEsst4b("exciter", "esst4b"); // NOLINT
static ChildTypeFactory<ExciterEXPIC1, Exciter> gfeExpic1("exciter", "expic1"); // NOLINT
Expand All @@ -61,6 +68,7 @@ namespace exciters {
static ChildTypeFactory<ExciterEXST1, Exciter> gfeExst1("exciter", "exst1"); // NOLINT
static ChildTypeFactory<ExciterIEEEtype1, Exciter> gfeType1("exciter", "type1"); // NOLINT
ChildTypeFactory<ExciterIEEEtype1, Exciter> gFeIeeet1("exciter", "ieeet1"); // NOLINT
ChildTypeFactory<ExciterIEEET3, Exciter> gFeIeeet3("exciter", "ieeet3"); // NOLINT
ChildTypeFactory<ExciterIEEEX1, Exciter> gFeIeeex1("exciter", "ieeex1"); // NOLINT
static TypeFactory<Exciter> gfeDefault( // NOLINT
"exciter",
Expand Down
Loading