powerflow/transformer_test.h

00001 #ifndef _TRANSFORMER_TEST_H
00002 #define _TRANSFORMER_TEST_H
00003 
00004 #include "transformer.h"
00005 
00006 #ifndef _NO_CPPUNIT
00007 
00008 #ifdef VALIDATE_THRESHOLD
00009 #undef VALIDATE_THRESHOLD
00010 #endif
00011 #define VALIDATE_THRESHOLD .0009
00012 
00013 
00027 class transformer_tests : public test_helper 
00028 {   
00029  
00030 
00031     void test_delta_delta_transformer(){
00032         OBJECT *node1,*node2; // Node objects
00033         OBJECT *tformer; // Overhead line object
00034 
00035         // Calculated results
00036         complex* node1_phA_I_test = new complex(276.11,-191.18);
00037         complex* node1_phB_I_test = new complex(-303.37,-144.05);
00038         complex* node1_phC_I_test = new complex(26.947,334.92);
00039         
00040         complex* node2_phA_V_test = new complex(2250.5,-140.2);
00041         complex* node2_phB_V_test = new complex(-1249.9,-1883.2);
00042         complex* node2_phC_V_test = new complex(-1000.6,2023.4);
00043 
00044         // setup test objects
00045         CLASS *cl = get_class_by_name("node");
00046         node1 = gl_create_object(cl,sizeof(node));
00047         OBJECTDATA(node1,node)->create();
00048         cl = get_class_by_name("load");
00049         node2 = gl_create_object(cl,sizeof(load));
00050         OBJECTDATA(node2,load)->create();
00051         cl = get_class_by_name("transformer");
00052         tformer = gl_create_object(cl,sizeof(transformer));
00053         OBJECTDATA(tformer,transformer)->create();
00054 
00055         OBJECTDATA(tformer,transformer)->from = node1;
00056         OBJECTDATA(tformer,transformer)->to = node2;
00057 
00058         SET_ADD(OBJECTDATA(tformer,transformer)->phases,PHASE_ABCN);
00059         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2251.5;
00060         OBJECTDATA(node1,node)->phaseA_V.SetImag(-138.71);
00061         OBJECTDATA(node2,load)->phaseA_V.SetImag(-138.71);
00062         OBJECTDATA(node2,load)->phaseA_I.SetReal(827.65);
00063         OBJECTDATA(node2,load)->phaseA_I.SetImag(-573.09);
00064 
00065         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -1248;
00066         OBJECTDATA(node1,node)->phaseB_V.SetImag(-1883.9);
00067         OBJECTDATA(node2,load)->phaseB_V.SetImag(-1883.9);
00068         OBJECTDATA(node2,load)->phaseB_I.SetReal(-909.39);
00069         OBJECTDATA(node2,load)->phaseB_I.SetImag(-431.81);
00070 
00071         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = -1001.7;
00072         OBJECTDATA(node1,node)->phaseC_V.SetImag(2022.4);
00073         OBJECTDATA(node2,load)->phaseC_V.SetImag(2022.4);
00074         OBJECTDATA(node2,load)->phaseC_I.SetReal(80.776);
00075         OBJECTDATA(node2,load)->phaseC_I.SetImag(1004);
00076 
00077         // Set up the transformer variables
00078         cl = get_class_by_name("transformer_configuration");
00079         OBJECT *trans_config = gl_create_object(cl,sizeof(transformer_configuration));
00080         OBJECTDATA(trans_config,transformer_configuration)->V_primary = 12.47 * 1000; 
00081         OBJECTDATA(trans_config,transformer_configuration)->V_secondary = 4.16 * 1000; 
00082         OBJECTDATA(trans_config,transformer_configuration)->kVA_rating = 6000;
00083         //OBJECTDATA(trans_config,transformer_configuration)->R_pu = .01;
00084         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetReal(.01);
00085         //OBJECTDATA(trans_config,transformer_configuration)->X_pu = .06;
00086         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetImag(.06);
00087         OBJECTDATA(trans_config,transformer_configuration)->connect_type = transformer_configuration::DELTA_DELTA;//delta-delta
00088         OBJECTDATA(tformer,transformer)->configuration = trans_config;
00089 
00090         // Now we call init on the objects
00091         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00092 
00093         // Rank?
00094         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00095 
00096         // Run the test
00097         local_callbacks->sync_all(PC_PRETOPDOWN);
00098         local_callbacks->sync_all(PC_BOTTOMUP);
00099 
00100         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00101         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00102 
00103         // Get the percentage of the difference between the calculated value and the test value
00104         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);
00105         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);
00106 
00107         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00108         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00109 
00110         OBJECTDATA(node1,node)->phaseA_V = 7116.6;
00111         OBJECTDATA(node1,node)->phaseA_V.SetImag(-40.59);
00112         OBJECTDATA(node1,node)->phaseB_V = -3599.8;
00113         OBJECTDATA(node1,node)->phaseB_V.SetImag(-6154.2);
00114         OBJECTDATA(node1,node)->phaseC_V = -3512;
00115         OBJECTDATA(node1,node)->phaseC_V.SetImag(6194.4);
00116 
00117         local_callbacks->sync_all(PC_POSTTOPDOWN);
00118         // check the top down values
00119 
00120         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00121         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00122 
00123         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00124         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00125         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00126         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00127 
00128         rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00129         iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00130 
00131         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00132         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00133         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00134         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00135 
00136         rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00137         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00138 
00139         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00140         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00141         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00142         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00143 
00144     }
00145       
00146     void test_delta_Gwye_transformer(){
00147 
00148         OBJECT *node1,*node2; // Node objects
00149         OBJECT *tformer; // Overhead line object
00150 
00151         // Calculated results
00152         complex* node1_phA_I_test = new complex(20.26,-36.94);
00153         complex* node1_phB_I_test = new complex(-39.81,-0.95);
00154         complex* node1_phC_I_test = new complex(19.55,37.89);
00155 
00156         complex* node2_phA_V_test = new complex(2890.054,-6201.529);
00157         complex* node2_phB_V_test = new complex(-6513.450,1037.498);
00158         complex* node2_phC_V_test = new complex(3601.730,5403.961);
00159 
00160         // setup test objects
00161         CLASS *cl = get_class_by_name("node");
00162         node1 = gl_create_object(cl,sizeof(node));
00163         OBJECTDATA(node1,node)->create();
00164         cl = get_class_by_name("load");
00165         node2 = gl_create_object(cl,sizeof(load));
00166         OBJECTDATA(node2,load)->create();
00167         cl = get_class_by_name("transformer");
00168         tformer = gl_create_object(cl,sizeof(transformer));
00169         OBJECTDATA(tformer,transformer)->create();
00170 
00171         OBJECTDATA(tformer,transformer)->from = node1;
00172         OBJECTDATA(tformer,transformer)->to = node2;
00173 
00174         SET_ADD(OBJECTDATA(tformer,transformer)->phases,PHASE_ABC);
00175         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2891.6;
00176         OBJECTDATA(node1,node)->phaseA_V.SetImag(-6201.1);
00177         OBJECTDATA(node2,load)->phaseA_V.SetImag(-6201.1);
00178         OBJECTDATA(node2,load)->phaseA_I.SetReal(-25.34);
00179         OBJECTDATA(node2,load)->phaseA_I.SetImag(-483.44);
00180 
00181         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -6513.3;
00182         OBJECTDATA(node1,node)->phaseB_V.SetImag(1031.6);
00183         OBJECTDATA(node2,load)->phaseB_V.SetImag(1031.6);
00184         OBJECTDATA(node2,load)->phaseB_I.SetReal(-413.66);
00185         OBJECTDATA(node2,load)->phaseB_I.SetImag(224.6);
00186 
00187         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = 3659.1;
00188         OBJECTDATA(node1,node)->phaseC_V.SetImag(5486.7);
00189         OBJECTDATA(node2,load)->phaseC_V.SetImag(5486.7);
00190         OBJECTDATA(node2,load)->phaseC_I.SetReal(349.32);
00191         OBJECTDATA(node2,load)->phaseC_I.SetImag(242.78);
00192 
00193         // Set up the transformer variables
00194         cl = get_class_by_name("transformer_configuration");
00195         OBJECT *trans_config = gl_create_object(cl,sizeof(transformer_configuration));
00196         OBJECTDATA(trans_config,transformer_configuration)->V_primary = 138*1000;
00197         OBJECTDATA(trans_config,transformer_configuration)->V_secondary = 12.47*1000;
00198         OBJECTDATA(trans_config,transformer_configuration)->kVA_rating = 5000;
00199 //      OBJECTDATA(trans_config,transformer_configuration)->R_pu = 0.0074;
00200         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetReal(0.0074);
00201 //      OBJECTDATA(trans_config,transformer_configuration)->X_pu = 0.0847;
00202         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetImag(0.0847);
00203         OBJECTDATA(trans_config,transformer_configuration)->connect_type = transformer_configuration::DELTA_GWYE;       
00204         OBJECTDATA(tformer,transformer)->configuration = trans_config;
00205 
00206         // Now we call init on the objects
00207         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00208 
00209         // Rank?
00210         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00211 
00212         // Run the test
00213         local_callbacks->sync_all(PC_PRETOPDOWN);
00214         local_callbacks->sync_all(PC_BOTTOMUP);
00215 
00216         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00217         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00218 
00219         // Get the percentage of the difference between the calculated value and the test value
00220         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);
00221         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);
00222 
00223         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00224         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00225 
00226         OBJECTDATA(node1,node)->phaseA_V = 72555;
00227         OBJECTDATA(node1,node)->phaseA_V.SetImag(-40767);
00228         OBJECTDATA(node1,node)->phaseB_V = -65459;
00229         OBJECTDATA(node1,node)->phaseB_V.SetImag(-40776);
00230         OBJECTDATA(node1,node)->phaseC_V = -7139;
00231         OBJECTDATA(node1,node)->phaseC_V.SetImag(81515);
00232 
00233         local_callbacks->sync_all(PC_POSTTOPDOWN);
00234         // check the top down values
00235 
00236         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00237         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00238 
00239         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00240         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00241         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00242         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00243 
00244         rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00245         iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00246 
00247         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00248         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00249         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00250         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00251 
00252         rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00253         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00254 
00255         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00256         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00257         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00258         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00259     }
00260 
00261     void test_wye_wye_transformer(){
00262         OBJECT *node1,*node2; // Node objects
00263         OBJECT *tformer; // Overhead line object
00264 
00265         // Calculated results
00266         complex* node1_phA_I_test = new complex(285.25,-199.1);
00267         complex* node1_phB_I_test = new complex(-291.28,-141.09);
00268         complex* node1_phC_I_test = new complex(29.262,335.54);
00269         
00270         complex* node2_phA_V_test = new complex(2242.9,-144.8);
00271         complex* node2_phB_V_test = new complex(-1251.3,-1892.4);
00272         complex* node2_phC_V_test = new complex(-1002.9,2020.8);
00273 
00274         // setup test objects
00275         CLASS *cl = get_class_by_name("node");
00276         node1 = gl_create_object(cl,sizeof(node));
00277         OBJECTDATA(node1,node)->create();
00278         cl = get_class_by_name("load");
00279         node2 = gl_create_object(cl,sizeof(load));
00280         OBJECTDATA(node2,load)->create();
00281         cl = get_class_by_name("transformer");
00282         tformer = gl_create_object(cl,sizeof(transformer));
00283         OBJECTDATA(tformer,transformer)->create();
00284 
00285         OBJECTDATA(tformer,transformer)->from = node1;
00286         OBJECTDATA(tformer,transformer)->to = node2;
00287 
00288         SET_ADD(OBJECTDATA(tformer,transformer)->phases,PHASE_ABCN);
00289         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2242.9;
00290         OBJECTDATA(node1,node)->phaseA_V.SetImag(-114.8);
00291         OBJECTDATA(node2,load)->phaseA_V.SetImag(-114.8);
00292         OBJECTDATA(node2,load)->phaseA_I.SetReal(855.08);
00293         OBJECTDATA(node2,load)->phaseA_I.SetImag(-596.83);
00294 
00295         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -1251.3;
00296         OBJECTDATA(node1,node)->phaseB_V.SetImag(-1892.4);
00297         OBJECTDATA(node2,load)->phaseB_V.SetImag(-1892.4);
00298         OBJECTDATA(node2,load)->phaseB_I.SetReal(-873.15);
00299         OBJECTDATA(node2,load)->phaseB_I.SetImag(-422.93);
00300 
00301         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = -1002.9;
00302         OBJECTDATA(node1,node)->phaseC_V.SetImag(2020.8);
00303         OBJECTDATA(node2,load)->phaseC_V.SetImag(2020.8);
00304         OBJECTDATA(node2,load)->phaseC_I.SetReal(87.717);
00305         OBJECTDATA(node2,load)->phaseC_I.SetImag(1005.8);
00306 
00307         // Set up the transformer variables
00308         cl = get_class_by_name("transformer_configuration");
00309         OBJECT *trans_config = gl_create_object(cl,sizeof(transformer_configuration));
00310         OBJECTDATA(trans_config,transformer_configuration)->V_primary = 12.47 * 1000; 
00311         OBJECTDATA(trans_config,transformer_configuration)->V_secondary = 4.16 * 1000; 
00312         OBJECTDATA(trans_config,transformer_configuration)->kVA_rating = 6000;
00313         //OBJECTDATA(trans_config,transformer_configuration)->R_pu = .01;
00314         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetReal(0.01);
00315         //OBJECTDATA(trans_config,transformer_configuration)->X_pu = .06;
00316         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetImag(0.06);
00317         OBJECTDATA(trans_config,transformer_configuration)->connect_type = transformer_configuration::WYE_WYE;
00318         OBJECTDATA(tformer,transformer)->configuration = trans_config;
00319 
00320         // Now we call init on the objects
00321         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00322 
00323         // Rank?
00324         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00325 
00326         // Run the test
00327         local_callbacks->sync_all(PC_PRETOPDOWN);
00328         local_callbacks->sync_all(PC_BOTTOMUP);
00329 
00330         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00331         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00332 
00333         // Get the percentage of the difference between the calculated value and the test value
00334         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);
00335         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);
00336 
00337         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00338         //CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00339 
00340         OBJECTDATA(node1,node)->phaseA_V = 7106.9;
00341         OBJECTDATA(node1,node)->phaseA_V.SetImag(-42.069);
00342         OBJECTDATA(node1,node)->phaseB_V = -3607.1;
00343         OBJECTDATA(node1,node)->phaseB_V.SetImag(-6162);
00344         OBJECTDATA(node1,node)->phaseC_V = -3520.6;
00345         OBJECTDATA(node1,node)->phaseC_V.SetImag(6190.1);
00346 
00347         local_callbacks->sync_all(PC_POSTTOPDOWN);
00348         // check the top down values
00349 
00350         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00351         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00352 
00353         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00354         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00355         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00356         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00357 
00358         rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00359         iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00360 
00361         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00362         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00363         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00364         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00365 
00366         rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00367         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00368 
00369         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00370         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00371         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00372         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00373 
00374     }   
00375 
00376 
00377     void test_center_tapped_transformer_Aphase(){
00378         OBJECT *node1,*node2; // Node objects
00379         OBJECT *tformer; // Overhead line object
00380 
00381         // Calculated results
00382         complex* node1_phA_I_test = new complex(5.9265,-3.0529);
00383         complex* node1_phB_I_test = new complex(0,0);
00384         complex* node1_phC_I_test = new complex(0,0);
00385 
00386         complex* node2_phA_V_test = new complex(118,-1.2627);
00387         complex* node2_phB_V_test = new complex(117.85,-1.2634);
00388         complex* node2_phC_V_test = new complex(0,0);
00389 
00390         // setup test objects
00391         CLASS *cl = get_class_by_name("node");
00392         node1 = gl_create_object(cl,sizeof(node));
00393         OBJECTDATA(node1,node)->create();
00394         cl = get_class_by_name("load");
00395         node2 = gl_create_object(cl,sizeof(load));
00396         OBJECTDATA(node2,load)->create();
00397         cl = get_class_by_name("transformer");
00398         tformer = gl_create_object(cl,sizeof(transformer));
00399         OBJECTDATA(tformer,transformer)->create();
00400 
00401         OBJECTDATA(tformer,transformer)->from = node1;
00402         OBJECTDATA(tformer,transformer)->to = node2;
00403 
00404         SET_ADD(OBJECTDATA(tformer,transformer)->phases,PHASE_A|PHASE_S);
00405         OBJECTDATA(node1,node)->phaseA_V = complex(7200,0);
00406         OBJECTDATA(node2,load)->phaseA_V = complex(118.01,-0.6131);
00407         OBJECTDATA(node2,load)->phaseA_I = complex(160.62,-80.451);
00409         OBJECTDATA(node1,node)->phaseB_V = complex(-3600,-6235.4);
00410         OBJECTDATA(node2,load)->phaseB_V = complex(117.85,-0.61424);
00411         OBJECTDATA(node2,load)->phaseB_I = complex(-194.97,102.72);
00412         //OBJECTDATA(node2,load)->phaseB_I.SetImag(-431.81);
00413 
00414         OBJECTDATA(node1,node)->phaseC_V = complex(-3600,6235.4);
00415         OBJECTDATA(node2,load)->phaseC_V = complex(0,0);
00416         OBJECTDATA(node2,load)->phaseC_I = complex(-34.355,22.272);
00417         //OBJECTDATA(node2,load)->phaseC_I.SetImag(1004);
00418 
00419         // Set up the transformer variables
00420         cl = get_class_by_name("transformer_configuration");
00421         OBJECT *trans_config = gl_create_object(cl,sizeof(transformer_configuration));
00422         OBJECTDATA(trans_config,transformer_configuration)->V_primary = 7.2 * 1000; 
00423         OBJECTDATA(trans_config,transformer_configuration)->V_secondary = 0.120 * 1000; 
00424         OBJECTDATA(trans_config,transformer_configuration)->kVA_rating = 50;
00425         OBJECTDATA(trans_config,transformer_configuration)->phaseA_kVA_rating = 50;
00426         //OBJECTDATA(trans_config,transformer_configuration)->R_pu = .011;
00427         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetReal(0.011);
00428         //OBJECTDATA(trans_config,transformer_configuration)->X_pu = .018;
00429         OBJECTDATA(trans_config,transformer_configuration)->impedence.SetImag(0.018);
00430         OBJECTDATA(trans_config,transformer_configuration)->connect_type = transformer_configuration::SINGLE_PHASE_CENTER_TAPPED;//delta-delta
00431         OBJECTDATA(tformer,transformer)->configuration = trans_config;
00432 
00433         // Now we call init on the objects
00434         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00435 
00436         // Rank?
00437         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00438 
00439         // Run the test
00440         local_callbacks->sync_all(PC_PRETOPDOWN);
00441         local_callbacks->sync_all(PC_BOTTOMUP);
00442 
00443         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00444         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00445 
00446         // Get the percentage of the difference between the calculated value and the test value
00447         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);
00448         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);
00449 
00450         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00451         //CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00452 
00453         OBJECTDATA(node1,node)->phaseA_V = complex(7200,0);
00454         OBJECTDATA(node1,node)->phaseB_V = complex(-3600,-6235.4);
00455         OBJECTDATA(node1,node)->phaseC_V = complex(-3600,6235.4);
00456         OBJECTDATA(node2,load)->phaseA_I = complex(160.62,-80.451);
00457         OBJECTDATA(node2,load)->phaseB_I = complex(-194.97,102.72);
00458         OBJECTDATA(node2,load)->phaseC_I = complex(-34.355,22.272);
00459     
00460         local_callbacks->sync_all(PC_POSTTOPDOWN);
00461         // check the top down values
00462 
00463         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00464         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00465 
00466         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00467         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00468         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00469         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00470 
00471         rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00472         iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00473 
00474         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00475         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00476         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00477         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00478 
00479         /*rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00480         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00481 
00482         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00483         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00484         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00485         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);*/
00486 
00487     }
00488         /*
00489      * This section creates the suite() method that will be used by the
00490      * CPPUnit testrunner to execute the tests that we have registered.
00491      * This section needs to be in the .h file
00492      */
00493     CPPUNIT_TEST_SUITE(transformer_tests);
00494 
00495     /*
00496      * For each test method defined above, we should have a separate
00497      * CPPUNIT_TEST() line.
00498      */
00499     //CPPUNIT_TEST();
00500     CPPUNIT_TEST(test_wye_wye_transformer);
00501     CPPUNIT_TEST(test_delta_delta_transformer);
00502     CPPUNIT_TEST(test_delta_Gwye_transformer);
00503     CPPUNIT_TEST(test_center_tapped_transformer_Aphase);
00504     CPPUNIT_TEST_SUITE_END();
00505 };
00506 
00507 #endif
00508 
00509 #endif

GridLAB-DTM Version 1.0
An open-source project initiated by the US Department of Energy