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: 1 addition & 1 deletion examples/PhasorDynamics/Tiny/TwoBus/Basic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ target_link_libraries(TwoBusBasic
GRIDKIT::solvers_dyn)
install(TARGETS TwoBusBasic RUNTIME DESTINATION bin)

add_test(NAME GenrouTest1 COMMAND $<TARGET_FILE:TwoBusBasic>)
add_test(NAME TwoBusBasicTest COMMAND $<TARGET_FILE:TwoBusBasic>)
1 change: 1 addition & 0 deletions examples/PhasorDynamics/Tiny/TwoBus/Tgov1/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
add_executable(TwoBusTgov1 TwoBusTgov1.cpp)
target_link_libraries(TwoBusTgov1
GRIDKIT::phasor_dynamics_components
GRIDKIT::phasor_dynamics_signal
GRIDKIT::solvers_dyn)
install(TARGETS TwoBusTgov1 RUNTIME DESTINATION bin)

Expand Down
83 changes: 55 additions & 28 deletions examples/PhasorDynamics/Tiny/TwoBus/Tgov1/TwoBusTgov1.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* @file TwoBusTgov1.cpp
* @file TwoBusTgov1Signal.cpp
* @author Adam Birchfield (abirchfield@tamu.edu)
* @author Slaven Peles (peless@ornl.gov)
* @brief Example running a 2-bus system
Expand Down Expand Up @@ -51,6 +51,15 @@ int main()
data.bus[1].Vr0 = 1.0;
data.bus[1].Vi0 = 0.0;

// Set signal nodes data
data.signal.resize(2);

data.signal[0].name = "omega";
data.signal[0].signal_id = 0;

data.signal[1].name = "Pm";
data.signal[1].signal_id = 1;

// Set branch data
data.branch.resize(1);

Expand All @@ -68,12 +77,6 @@ int main()
data.bus_fault[0].parameters[BusFaultParameters::X] = 1e-3;
data.bus_fault[0].parameters[BusFaultParameters::state0] = false;

//
// Instantiate system model
//

SystemModel<scalar_type, index_type> sys(data);

// Set generator data
data.genrou.resize(1);

Expand All @@ -96,9 +99,9 @@ int main()
data.genrou[0].parameters[GenrouParameters::S10] = 0.;
data.genrou[0].parameters[GenrouParameters::S12] = 0.;

// Set governor data (Default PW values)
data.gov.resize(1);

// Set Gov data (Default PW values)
data.gov[0].R = 0.05;
data.gov[0].Pvmin = 0;
data.gov[0].Pvmax = 1.0;
Expand All @@ -107,32 +110,50 @@ int main()
data.gov[0].T3 = 7.5;
data.gov[0].Dt = 0;

// Manual add gen & gov components
// This is a hack since SignalBus not implemented
// Manually add components
// This is a workaround since signal connections are not implemented in parser

// Create Pointers first
Genrou<scalar_type, index_type>* gen;
Governor::Tgov1<scalar_type, index_type>* gov;
// Create buses
auto* bus0 = BusFactory<scalar_type, index_type>::create(data.bus[0]);
auto* bus1 = BusFactory<scalar_type, index_type>::create(data.bus[1]);

// Instatiate Genrou & add to system model
gen = new Genrou<scalar_type, index_type>(
sys.getBus(0),
data.genrou[0]);
// Create signal nodes
auto* omega = new SignalNode<scalar_type, index_type>(data.signal[0]);
auto* pmech = new SignalNode<scalar_type, index_type>(data.signal[1]);

// Instatiate GovernorTgov1 & add to system model
gov = new Governor::Tgov1<scalar_type, index_type>(
gen,
data.gov[0]);
gen->setgovenor(gov);
// Create branch
Branch<scalar_type, index_type> branch(bus0, bus1, data.branch[0]);

// Add Generator and Governor to System
sys.addComponent(gen);
sys.addComponent(gov);
// Add bus fault to bus0
BusFault<scalar_type, index_type> fault(bus0, data.bus_fault[0]);

// Create generator
Genrou<scalar_type, index_type> gen(bus0,
omega,
pmech,
data.genrou[0]);

// Create governor
Governor::Tgov1<scalar_type, index_type> gov(pmech, omega);

//
// Instantiate system model and add components to it
//

SystemModel<scalar_type, index_type> sys;
sys.addBus(bus0);
sys.addBus(bus1);
sys.addSignal(omega);
sys.addSignal(pmech);
sys.addComponent(&branch);
sys.addComponent(&gen);
sys.addComponent(&gov);
sys.addFault(&fault);

sys.allocate();

// Get access to the fault
auto* fault = sys.getBusFault(0);
// auto* fault = sys.getBusFault(0);

// Set time step to 1/4 of a 60Hz cycle
real_type dt = 1.0 / 4.0 / 60.0;
Expand Down Expand Up @@ -185,13 +206,13 @@ int main()
ida.runSimulation(1.0, nout, output_cb);

// Introduce fault and run for the next 0.1s
fault->setStatus(true);
fault.setStatus(true);
ida.initializeSimulation(1.0, false);
nout = static_cast<int>(std::round((1.1 - 1.0) / dt));
ida.runSimulation(1.1, nout, output_cb);

// Clear the fault and run until t = 10s.
fault->setStatus(false);
fault.setStatus(false);
ida.initializeSimulation(1.1, false);
nout = static_cast<int>(std::round((10.0 - 1.1) / dt));
ida.runSimulation(10.0, nout, output_cb);
Expand Down Expand Up @@ -255,5 +276,11 @@ int main()

std::cout << "\n\nComplete in " << (stop - start) / CLOCKS_PER_SEC << " seconds\n";

// Delete connectors created on heap
delete bus0;
delete bus1;
delete omega;
delete pmech;

return status;
}
10 changes: 5 additions & 5 deletions src/Model/PhasorDynamics/BusBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ namespace GridKit
return J_;
}

virtual const IdxT busID() const
{
return bus_id_;
}

protected:
const IdxT bus_id_{static_cast<IdxT>(-1)};

Expand Down Expand Up @@ -302,11 +307,6 @@ namespace GridKit
throw "ERROR: Method not implemented!\n";
return gB_;
}

virtual const IdxT busID() const
{
return bus_id_;
}
};

} // namespace PhasorDynamics
Expand Down
2 changes: 2 additions & 0 deletions src/Model/PhasorDynamics/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ add_subdirectory(Governor)
add_subdirectory(Load)
add_subdirectory(SynchronousMachine)

add_subdirectory(SignalNode)

add_library(GRIDKIT::phasor_dynamics_components ALIAS gridkit_phasor_dynamics_components)
1 change: 1 addition & 0 deletions src/Model/PhasorDynamics/ComponentLibrary.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
#include <Model/PhasorDynamics/BusFault/BusFault.hpp>
#include <Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp>
#include <Model/PhasorDynamics/Load/Load.hpp>
#include <Model/PhasorDynamics/SignalNode/SignalNode.hpp>
#include <Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp>
#include <Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp>
1 change: 1 addition & 0 deletions src/Model/PhasorDynamics/Governor/Tgov1/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ gridkit_add_library(phasor_dynamics_governortgov1
Tgov1.cpp
LINK_LIBRARIES
GRIDKIT::phasor_dynamics_genrou
GRIDKIT::phasor_dynamics_signal
OUTPUT_NAME
gridkit_phasor_dynamics_governortgov1)

Expand Down
41 changes: 26 additions & 15 deletions src/Model/PhasorDynamics/Governor/Tgov1/Tgov1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <iostream>

#include <Model/PhasorDynamics/Governor/Tgov1/Tgov1Data.hpp>
#include <Model/PhasorDynamics/SignalNode/SignalNode.hpp>
#include <Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp>

#define _USE_MATH_DEFINES
Expand All @@ -22,16 +23,13 @@ namespace GridKit
{
namespace Governor
{

/*!
* @brief Constructor for Governor
/**
*
* @param machine Generator Object
* @param data TGOV1 Data Object
*/
template <class ScalarT, typename IdxT>
Tgov1<ScalarT, IdxT>::Tgov1(machine_type* machine, const model_data_type& data)
: machine_(machine),
Tgov1<ScalarT, IdxT>::Tgov1(signal_type* pmech, signal_type* omega, const model_data_type& data)
: pmech_(pmech),
omega_(omega),
R_(data.R),
Pvmin_(data.Pvmin),
Pvmax_(data.Pvmax),
Expand All @@ -40,14 +38,14 @@ namespace GridKit
T3_(data.T3),
Dt_(data.Dt)
{

// 3 Internal Variables
size_ = 3;
}

template <class ScalarT, typename IdxT>
Tgov1<ScalarT, IdxT>::Tgov1(machine_type* machine)
: machine_(machine),
Tgov1<ScalarT, IdxT>::Tgov1(signal_type* pmech, signal_type* omega)
: pmech_(pmech),
omega_(omega),
R_(0.05),
Pvmin_(0),
Pvmax_(1),
Expand All @@ -56,7 +54,6 @@ namespace GridKit
T3_(7.5),
Dt_(0)
{

// 3 Internal Variables
size_ = 3;
}
Expand All @@ -68,11 +65,19 @@ namespace GridKit
template <class ScalarT, typename IdxT>
int Tgov1<ScalarT, IdxT>::allocate()
{
// Allocate local component data
auto size = static_cast<size_t>(size_); // avoid compiler warnings
f_.resize(size);
y_.resize(size);
yp_.resize(size);
tag_.resize(size);

// Set output signal after allocation
// The signal is accessible to the generator
if (pmech_)
{
pmech_->set(&y_[2]);
}
return 0;
}

Expand All @@ -83,9 +88,13 @@ namespace GridKit
template <class ScalarT, typename IdxT>
int Tgov1<ScalarT, IdxT>::initialize()
{
ScalarT p0{0};

// Initial mechanical = initial electric torque
ScalarT p0 = machine_->getTorque();
if (pmech_)
{
p0 = y_[2]; //<- generator needs to be initialized first
}

// Input Variables (Parameter for now)
pref_ = R_ * p0;
Expand Down Expand Up @@ -166,10 +175,12 @@ namespace GridKit
template <class ScalarT, typename IdxT>
int Tgov1<ScalarT, IdxT>::evaluateResidual()
{

// Input Variables
ScalarT omega = machine_->getSpeed();

ScalarT omega{0};
if (omega_)
{
omega = omega_->read();
}
// Read Internal Variables
ScalarT ptx = y_[0]; // y0 - Ptx
ScalarT pv = y_[1]; // y1 - Pv
Expand Down
13 changes: 8 additions & 5 deletions src/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ namespace GridKit
template <class ScalarT, typename IdxT>
class Genrou;

template <class ScalarT, typename IdxT>
class SignalNode;

} // namespace PhasorDynamics
} // namespace GridKit

Expand All @@ -47,13 +50,13 @@ namespace GridKit
using Component<ScalarT, IdxT>::y_;
using Component<ScalarT, IdxT>::yp_;

using machine_type = Genrou<ScalarT, IdxT>;
using real_type = typename Component<ScalarT, IdxT>::real_type;
using model_data_type = Tgov1Data<real_type, IdxT>;
using signal_type = SignalNode<ScalarT, IdxT>;

public:
Tgov1(machine_type* machine, const model_data_type& data);
Tgov1(machine_type* machine);
Tgov1(signal_type* pmech, signal_type* omega, const model_data_type& data);
Tgov1(signal_type* pmech, signal_type* omega);
~Tgov1() = default;

int allocate() override;
Expand All @@ -72,8 +75,8 @@ namespace GridKit
ScalarT& Pmech() override;

private:
// Associated Machine Model
machine_type* machine_;
signal_type* pmech_{nullptr};
signal_type* omega_{nullptr};

// Input parameters
real_type R_;
Expand Down
21 changes: 21 additions & 0 deletions src/Model/PhasorDynamics/SignalNode/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

# [[
# Author(s):
# - Cameron Rutherford <cameron.rutherford@pnnl.gov>
# - Slaven Peles <peless@ornl.gov>
# ]]

gridkit_add_library(phasor_dynamics_signal
SOURCES
SignalNode.cpp
OUTPUT_NAME
gridkit_phasor_dynamics_signal)

# Link to interface target for all components
target_link_libraries(gridkit_phasor_dynamics_components INTERFACE GRIDKIT::phasor_dynamics_signal)

gridkit_add_library(phasor_dynamics_signal_dependency_tracking
SOURCES
SignalNodeDependencyTracking.cpp
OUTPUT_NAME
gridkit_phasor_dynamics_signal_dependency_tracking)
14 changes: 14 additions & 0 deletions src/Model/PhasorDynamics/SignalNode/SignalNode.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* @file SignalNode model implementation.
*/
#include "SignalNodeImpl.hpp"

namespace GridKit
{
namespace PhasorDynamics
{
template class SignalNode<double, size_t>;
template class SignalNode<double, long>;

} // namespace PhasorDynamics
} // namespace GridKit
Loading
Loading