00001
00002
00003 #ifndef _REGULATOR_TEST_H
00004 #define _REGULATOR_TEST_H
00005
00006 #include <stdlib.h>
00007 #include "node.h"
00008 #include "regulator.h"
00009
00010 #ifndef _NO_CPPUNIT
00011
00012 #ifdef VALIDATE_THRESHOLD
00013 #undef VALIDATE_THRESHOLD
00014 #endif
00015 #define VALIDATE_THRESHOLD .0004
00016
00017
00031 class regulator_tests : public test_helper
00032 {
00033
00034 void test_three_single_phase_wye_regulator() {
00035
00036 CLASS *cl = get_class_by_name("node");
00037 OBJECT *obj = gl_create_object(cl);
00038 node *src_node = OBJECTDATA(obj,node);
00039 src_node->create();
00040
00041 cl = get_class_by_name("load");
00042 obj = gl_create_object(cl);
00043 node *load_node = OBJECTDATA(obj,load);
00044 load_node->create();
00045
00046 cl = get_class_by_name("regulator");
00047 obj = gl_create_object(cl);
00048 regulator *reg = OBJECTDATA(obj,regulator);
00049 reg->create();
00050
00051 cl = get_class_by_name("regulator_configuration");
00052 obj = gl_create_object(cl);
00053 regulator_configuration *reg_config = OBJECTDATA(obj,regulator_configuration);
00054 reg_config->create();
00055
00056
00057 complex node1_phA_I_test(242.49, -88.26);
00058 complex node1_phB_I_test(-214.54, -156.86);
00059 complex node1_phC_I_test(21.47, 307.05);
00060
00061 complex node2_phA_V_test(7384.6, 0.0);
00062 complex node2_phB_V_test(-3716.1, -6436.5);
00063 complex node2_phC_V_test(-3814.6, 6607.0);
00064
00065
00066 src_node->phases = PHASE_ABCN;
00067 src_node->voltageA = complex(7200.0, 0.0);
00068 src_node->voltageB = complex(-3600.0, -6235.4);
00069 src_node->voltageC = complex(-3600.0, 6235.4);
00070
00071 load_node->phases = PHASE_ABCN;
00072 load_node->voltageA = complex(7384.6, 0.0);
00073 load_node->voltageB = complex(-3716.1, -6436.6);
00074 load_node->voltageC = complex(-3789.0, 6562.7);
00075 load_node->currentA = complex(236.43, -86.05);
00076 load_node->currentB = complex(-233.99, -151.95);
00077 load_node->currentC = complex(21.47, 307.05);
00078
00079 reg_config->connect_type = regulator_configuration::WYE_WYE;
00080 reg_config->band_center = 120.0;
00081 reg_config->band_width = 2.0;
00082 reg_config->time_delay = 30.0;
00083 reg_config->raise_taps = 16;
00084 reg_config->lower_taps = 16;
00085 reg_config->CT_ratio = 600;
00086 reg_config->PT_ratio = 60;
00087 reg_config->ldc_R_V[0] = 6.0;
00088 reg_config->ldc_R_V[1] = 6.0;
00089 reg_config->ldc_R_V[2] = 6.0;
00090 reg_config->ldc_X_V[0] = 12.0;
00091 reg_config->ldc_X_V[1] = 12.0;
00092 reg_config->ldc_X_V[2] = 12.0;
00093 reg_config->CT_phase = PHASE_ABC;
00094 reg_config->PT_phase = PHASE_ABC;
00095 reg_config->regulation = 0.10;
00096 reg_config->tap_pos[0] = 4;
00097 reg_config->tap_pos[1] = 5;
00098 reg_config->tap_pos[2] = 9;
00099
00100 reg->phases = PHASE_ABCN;
00101 reg->configuration = OBJECTHDR(reg_config);
00102 reg->from = OBJECTHDR(src_node);
00103 reg->to = OBJECTHDR(load_node);
00104
00105
00106 CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00107
00108
00109 CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00110
00111
00112 local_callbacks->sync_all(PC_PRETOPDOWN);
00113 local_callbacks->sync_all(PC_BOTTOMUP);
00114
00115 double rI_1 = src_node->currentA.Re();
00116 double iI_1 = src_node->currentA.Im();
00117
00118
00119 double validate_re = 1 - (rI_1 <= node1_phA_I_test.Re() ? rI_1 / node1_phA_I_test.Re() : node1_phA_I_test.Re() /rI_1);
00120 double validate_im = 1 - (iI_1 <= node1_phA_I_test.Im() ? iI_1 / node1_phA_I_test.Im() : node1_phA_I_test.Im() /iI_1);
00121
00122 CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00123 CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00124
00125 src_node->voltageA = complex(7200.0, 0.0);
00126 src_node->voltageB = complex(-3600.0, -6235.4);
00127 src_node->voltageC = complex(-3600.0, 6235.4);
00128
00129 local_callbacks->sync_all(PC_POSTTOPDOWN);
00130
00131
00132 double rV_2 = load_node->voltageA.Re();
00133 double iV_2 = load_node->voltageA.Im();
00134
00135 validate_re = 1 - (rV_2 <= node2_phA_V_test.Re() ? (node2_phA_V_test.Re() != 0 ? rV_2 / node2_phA_V_test.Re():rV_2) : (rV_2 != 0 ? node2_phA_V_test.Re() /rV_2 : node2_phA_V_test.Re()));
00136 validate_im = 1 - (iV_2 <= node2_phA_V_test.Im() ? (node2_phA_V_test.Im() != 0 ? iV_2 / node2_phA_V_test.Im():iV_2) : (iV_2 != 0 ? node2_phA_V_test.Im() /iV_2 : node2_phA_V_test.Im()));
00137 CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00138
00139
00140 rV_2 = load_node->voltageB.Re();
00141 iV_2 = load_node->voltageB.Im();
00142
00143 validate_re = 1 - (rV_2 <= node2_phB_V_test.Re() ? rV_2 / node2_phB_V_test.Re() : node2_phB_V_test.Re() /rV_2);
00144 validate_im = 1 - (iV_2 <= node2_phB_V_test.Im() ? iV_2 / node2_phB_V_test.Im() : node2_phB_V_test.Im() /iV_2);
00145 CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00146 CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00147
00148 rV_2 = load_node->voltageC.Re();
00149 iV_2 = load_node->voltageC.Im();
00150
00151 validate_re = 1 - (rV_2 <= node2_phC_V_test.Re() ? rV_2 / node2_phC_V_test.Re() : node2_phC_V_test.Re() /rV_2);
00152 validate_im = 1 - (iV_2 <= node2_phC_V_test.Im() ? iV_2 / node2_phC_V_test.Im() : node2_phC_V_test.Im() /iV_2);
00153 CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00154 CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00155 }
00156
00157 void test_two_single_phase_open_delta_ABBC_regulator() {
00158 OBJECT *src_obj, *load_obj;
00159 OBJECT *reg_obj, *config_obj;
00160 node *src_node;
00161 load *load_node;
00162 regulator *reg;
00163 regulator_configuration *reg_config;
00164
00165
00166 complex node1_phA_I_test(163.32, -261.37);
00167 complex node1_phB_I_test(-263.44, -18.249);
00168 complex node1_phC_I_test(100.12, 279.62);
00169
00170 complex node2_phA_V_test(6505.6, -3692.1);
00171 complex node2_phB_V_test(-6450.2, -3692.1);
00172 complex node2_phC_V_test(-55.367, 7384.2);
00173
00174
00175 CLASS *_class = get_class_by_name("node");
00176 src_obj = gl_create_object(_class);
00177 src_node = OBJECTDATA(src_obj, node);
00178 src_node->create();
00179
00180 src_node->phases = PHASE_ABC;
00181 src_node->voltageA = complex(6505.6, -3692.1);
00182 src_node->voltageB = complex(-6450.2, -3692.1);
00183 src_node->voltageC = complex(-55.367, 7384.2);
00184
00185 _class = get_class_by_name("load");
00186 load_obj = gl_create_object(_class);
00187 load_node = OBJECTDATA(load_obj, load);
00188 load_node->create();
00189
00190 load_node->phases = PHASE_ABC;
00191 load_node->voltageA = complex(6505.6, -3692.1);
00192 load_node->voltageB = complex(-6450.2, -3692.1);
00193 load_node->voltageC = complex(-55.367, 7384.2);
00194 load_node->currentA = complex(157.17, -251.53);
00195 load_node->currentB = complex(-254.81, -21.059);
00196 load_node->currentC = complex(97.614, 272.63);
00197
00198 _class = get_class_by_name("regulator_configuration");
00199 config_obj = gl_create_object(_class);
00200 reg_config = OBJECTDATA(config_obj, regulator_configuration);
00201 reg_config->create();
00202
00203 reg_config->connect_type = regulator_configuration::OPEN_DELTA_ABBC;
00204 reg_config->band_center = 120.0;
00205 reg_config->band_width = 2.0;
00206 reg_config->time_delay = 30.0;
00207 reg_config->raise_taps = 16;
00208 reg_config->lower_taps = 16;
00209 reg_config->CT_ratio = 500;
00210 reg_config->PT_ratio = (int)103.92;
00211 reg_config->ldc_R_V[0] = 0.8;
00212 reg_config->ldc_R_V[1] = 0.8;
00213 reg_config->ldc_R_V[2] = 0.8;
00214 reg_config->ldc_X_V[0] = 9.9;
00215 reg_config->ldc_X_V[1] = 9.9;
00216 reg_config->ldc_X_V[2] = 9.9;
00217 reg_config->CT_phase = PHASE_ABC;
00218 reg_config->PT_phase = PHASE_ABC;
00219 reg_config->regulation = 0.10;
00220 reg_config->tap_pos[0] = 6;
00221 reg_config->tap_pos[1] = 4;
00222 reg_config->tap_pos[2] = 0;
00223
00224 _class = get_class_by_name("regulator");
00225 reg_obj = gl_create_object(_class);
00226 reg = OBJECTDATA(reg_obj, regulator);
00227 reg->create();
00228
00229 reg->phases = PHASE_ABC;
00230 reg->configuration = config_obj;
00231 reg->from = src_obj;
00232 reg->to = load_obj;
00233
00234
00235 CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00236
00237
00238 CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00239
00240
00241 local_callbacks->sync_all(PC_PRETOPDOWN);
00242 local_callbacks->sync_all(PC_BOTTOMUP);
00243
00244 double rI_1 = src_node->currentA.Re();
00245 double iI_1 = src_node->currentA.Im();
00246
00247
00248 double validate_re = 1 - (rI_1 <= node1_phA_I_test.Re() ? rI_1 / node1_phA_I_test.Re() : node1_phA_I_test.Re() /rI_1);
00249 double validate_im = 1 - (iI_1 <= node1_phA_I_test.Im() ? iI_1 / node1_phA_I_test.Im() : node1_phA_I_test.Im() /iI_1);
00250
00251 CPPUNIT_ASSERT(fabs(validate_re) < VALIDATE_THRESHOLD);
00252 CPPUNIT_ASSERT(fabs(validate_im) < VALIDATE_THRESHOLD);
00253
00254 src_node->voltageA = complex(6235, -3599.8);
00255 src_node->voltageB = complex(-6235, -3599.8);
00256 src_node->voltageC = complex(0, 7199.6);
00257
00258 local_callbacks->sync_all(PC_POSTTOPDOWN);
00259
00260
00261 double rV_2 = load_node->voltageA.Re();
00262 double iV_2 = load_node->voltageA.Im();
00263
00264 validate_re = 1 - (rV_2 <= node2_phA_V_test.Re() ? (node2_phA_V_test.Re() != 0 ? rV_2 / node2_phA_V_test.Re():rV_2) : (rV_2 != 0 ? node2_phA_V_test.Re() /rV_2 : node2_phA_V_test.Re()));
00265 validate_im = 1 - (iV_2 <= node2_phA_V_test.Im() ? (node2_phA_V_test.Im() != 0 ? iV_2 / node2_phA_V_test.Im():iV_2) : (iV_2 != 0 ? node2_phA_V_test.Im() /iV_2 : node2_phA_V_test.Im()));
00266 CPPUNIT_ASSERT(fabs(validate_re) < VALIDATE_THRESHOLD);
00267
00268
00269 rV_2 = load_node->voltageB.Re();
00270 iV_2 = load_node->voltageB.Im();
00271
00272 validate_re = 1 - (rV_2 <= node2_phB_V_test.Re() ? rV_2 / node2_phB_V_test.Re() : node2_phB_V_test.Re() /rV_2);
00273 validate_im = 1 - (iV_2 <= node2_phB_V_test.Im() ? iV_2 / node2_phB_V_test.Im() : node2_phB_V_test.Im() /iV_2);
00274 CPPUNIT_ASSERT(fabs(validate_re) < VALIDATE_THRESHOLD);
00275 CPPUNIT_ASSERT(fabs(validate_im) < VALIDATE_THRESHOLD);
00276
00277 rV_2 = load_node->voltageC.Re();
00278 iV_2 = load_node->voltageC.Im();
00279
00280 validate_re = 1 - (rV_2 <= node2_phC_V_test.Re() ? rV_2 / node2_phC_V_test.Re() : node2_phC_V_test.Re() /rV_2);
00281 validate_im = 1 - (iV_2 <= node2_phC_V_test.Im() ? iV_2 / node2_phC_V_test.Im() : node2_phC_V_test.Im() /iV_2);
00282 CPPUNIT_ASSERT(fabs(validate_re) < VALIDATE_THRESHOLD);
00283 CPPUNIT_ASSERT(fabs(validate_im) < VALIDATE_THRESHOLD);
00284 }
00285
00286 void test_two_single_phase_open_delta_ABAC_regulator() {
00287
00288 }
00289
00290 void test_two_single_phase_open_delta_ACBC_regulator() {
00291
00292 }
00293
00294
00295
00296
00297
00298
00299 CPPUNIT_TEST_SUITE(regulator_tests);
00300
00301
00302
00303
00304
00305
00306 CPPUNIT_TEST(test_three_single_phase_wye_regulator);
00307 CPPUNIT_TEST(test_two_single_phase_open_delta_ABBC_regulator);
00308 CPPUNIT_TEST_SUITE_END();
00309 };
00310
00311 #endif
00312 #endif
00313