powerflow/undergroundline_test.h

00001 #ifndef _UNDERGROUNDLINE_TEST_H
00002 #define _UNDERGROUNDLINE_TEST_H
00003 
00004 #include "line.h"
00005 
00006 #ifndef _NO_CPPUNIT
00007 
00008 class undergroundline_tests : public test_helper
00009 {
00010 public:
00011     void setUp(){
00012     }
00013 
00014     void tearDown(){
00015         local_callbacks->remove_objects();
00016     }
00017 
00021     void test_underground_line_a_cn(){
00022         OBJECT *node1,*node2; // Node objects
00023         OBJECT *ohl1; // underground line object
00024         // Test values
00025         complex* node1_phA_I_test = new complex(204.5,-18.431);
00026         complex* node2_phA_V_test = new complex(2345.9,-230.99);
00027 
00028         CLASS *cl = get_class_by_name("node");
00029         node1 = gl_create_object(cl,sizeof(node));
00030         OBJECTDATA(node1,node)->create();
00031         cl = get_class_by_name("load");
00032         node2 = gl_create_object(cl,sizeof(load));
00033         OBJECTDATA(node2,load)->create();
00034         cl = get_class_by_name("underground_line");
00035         ohl1 = gl_create_object(cl,sizeof(underground_line));
00036         OBJECTDATA(ohl1,underground_line)->create();
00037 
00038         OBJECTDATA(ohl1,underground_line)->from = node1;
00039         OBJECTDATA(ohl1,underground_line)->to = node2;
00040         OBJECTDATA(ohl1,underground_line)->length = 500;
00041 
00042         // Next we set up the parameters needed for the test
00043         //OBJECTDATA(ohl1,underground_line)->phase = OBJECTDATA(node1,node)->phase = OBJECTDATA(node2,load)->phase = PHASEA;
00044         OBJECTDATA(ohl1,underground_line)->phases = PHASE_A;
00045         OBJECTDATA(node1,node)->phases = PHASE_A;
00046         OBJECTDATA(node2,load)->phases = PHASE_A;
00047         
00048         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2349.8;
00049         OBJECTDATA(node1,node)->phaseA_V.SetImag(-228.75);
00050         OBJECTDATA(node2,load)->phaseA_V.SetImag(-228.75);
00051         OBJECTDATA(node2,load)->phaseA_I.SetReal(204.5);
00052         OBJECTDATA(node2,load)->phaseA_I.SetImag(-18.431);
00053         
00054         // Phase A line conductor
00055         cl = get_class_by_name("underground_line_conductor");
00056         OBJECT *ulc_a = gl_create_object(cl,sizeof(underground_line_conductor));
00057         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_diameter = 0.567;
00058         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_gmr = 0.0171;
00059         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_resistance = 0.41;
00060         OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter = 1.29;
00061         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_gmr = 0.00208;
00062         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter = 0.0641;
00063         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_resistance = 14.8722;
00064         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_strands = 13;
00065 
00066 
00067         cl = get_class_by_name("line_spacing");
00068         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00069         OBJECTDATA(ls,line_spacing)->distance_AtoN = 0.0;//no extra neutral
00070             //(OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter - 
00071             //                                        OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter)/24.0;
00072         
00073         
00074 
00075         /*
00076         OBJECT *olc_n = gl_create_object(cl,sizeof(underground_line_conductor));
00077         OBJECTDATA(olc_n,underground_line_conductor)->geometric_mean_radius = .00446;
00078         OBJECTDATA(olc_n,underground_line_conductor)->resistance = 1.12;
00079         */
00080 
00081         // Do I need to set up the other conductors and set them to INF?
00082         cl = get_class_by_name("line_configuration");
00083         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00084         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00085         lc->line_spacing = ls;
00086         lc->phaseA_conductor = ulc_a;
00087         lc->phaseB_conductor = 0;
00088         lc->phaseC_conductor = 0;
00089         lc->phaseN_conductor = 0;
00090         
00091         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00092         
00093         // Now we call init on the objects
00094         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00095 
00096         // Rank?
00097         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00098 
00099         // Run the test
00100         local_callbacks->sync_all(PC_PRETOPDOWN);
00101         local_callbacks->sync_all(PC_BOTTOMUP);
00102 
00103         // Check the bottom-up pass values
00104         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00105         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00106 
00107         // Get the percentage of the difference between the calculated value and the test value
00108         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);
00109         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);
00110 
00111         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00112         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00113 
00114         
00115         OBJECTDATA(node1,node)->phaseA_V = 2367.6;
00116         OBJECTDATA(node1,node)->phaseA_V.SetImag(-220.05);
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     }
00129 
00130     void test_underground_line_b_cn(){
00131         OBJECT *node1,*node2; // Node objects
00132         OBJECT *ohl1; // underground line object
00133         // Test values
00134         complex* node1_phB_I_test = new complex(39.716,-57.144);
00135         complex* node2_phB_V_test = new complex(-1360.5,2140);
00136 
00137         CLASS *cl = get_class_by_name("node");
00138         node1 = gl_create_object(cl,sizeof(node));
00139         OBJECTDATA(node1,node)->create();
00140         cl = get_class_by_name("load");
00141         node2 = gl_create_object(cl,sizeof(load));
00142         OBJECTDATA(node2,load)->create();
00143         cl = get_class_by_name("underground_line");
00144         ohl1 = gl_create_object(cl,sizeof(underground_line));
00145         OBJECTDATA(ohl1,underground_line)->create();
00146 
00147         OBJECTDATA(ohl1,underground_line)->from = node1;
00148         OBJECTDATA(ohl1,underground_line)->to = node2;
00149         OBJECTDATA(ohl1,underground_line)->length = 500;
00150 
00151         // Next we set up the parameters needed for the test
00152         OBJECTDATA(ohl1,underground_line)->phases = PHASE_B;
00153         OBJECTDATA(node1,node)->phases = PHASE_B;
00154         OBJECTDATA(node2,load)->phases = PHASE_B;
00155         
00156         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -1362.2;
00157         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.6);
00158         OBJECTDATA(node2,load)->phaseB_V.SetImag(-2136.6);
00159         OBJECTDATA(node2,load)->phaseB_I.SetReal(39.716);
00160         OBJECTDATA(node2,load)->phaseB_I.SetImag(-57.144);
00161         
00162         // Phase A line conductor
00163         cl = get_class_by_name("underground_line_conductor");
00164         OBJECT *ulc_b = gl_create_object(cl,sizeof(underground_line_conductor));
00165         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_diameter = 0.567;
00166         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_gmr = 0.0171;
00167         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_resistance = 0.41;
00168         OBJECTDATA(ulc_b,underground_line_conductor)->outer_diameter = 1.29;
00169         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_gmr = 0.00208;
00170         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_diameter = 0.0641;
00171         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_resistance = 14.8722;
00172         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_strands = 13;
00173 
00174 
00175         cl = get_class_by_name("line_spacing");
00176         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00177         OBJECTDATA(ls,line_spacing)->distance_BtoN = 0.0;//no extra neutral
00178             //(OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter - 
00179             //                                        OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter)/24.0;
00180         
00181         
00182 
00183         /*
00184         OBJECT *olc_n = gl_create_object(cl,sizeof(underground_line_conductor));
00185         OBJECTDATA(olc_n,underground_line_conductor)->geometric_mean_radius = .00446;
00186         OBJECTDATA(olc_n,underground_line_conductor)->resistance = 1.12;
00187         */
00188 
00189         // Do I need to set up the other conductors and set them to INF?
00190         cl = get_class_by_name("line_configuration");
00191         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00192         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00193         lc->line_spacing = ls;
00194         lc->phaseA_conductor = 0;
00195         lc->phaseB_conductor = ulc_b;
00196         lc->phaseC_conductor = 0;
00197         lc->phaseN_conductor = 0;
00198         
00199         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00200         
00201         // Now we call init on the objects
00202         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00203 
00204         // Rank?
00205         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00206 
00207         // Run the test
00208         local_callbacks->sync_all(PC_PRETOPDOWN);
00209         local_callbacks->sync_all(PC_BOTTOMUP);
00210 
00211         // Check the bottom-up pass values
00212         double rI_1 = OBJECTDATA(node1,node)->get_phaseB_I_in().Re(); // Real part of the current at node 1
00213         double iI_1 = OBJECTDATA(node1,node)->get_phaseB_I_in().Im(); // Imaginary part of the current at node 1
00214 
00215         // Get the percentage of the difference between the calculated value and the test value
00216         double validate_re = 1 - (rI_1 <= node1_phB_I_test->Re() ? rI_1 / node1_phB_I_test->Re() : node1_phB_I_test->Re() /rI_1);
00217         double validate_im = 1 - (iI_1 <= node1_phB_I_test->Im() ? iI_1 / node1_phB_I_test->Im() : node1_phB_I_test->Im() /iI_1);
00218 
00219         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00220         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00221 
00222         
00223         OBJECTDATA(node1,node)->phaseB_V = -1352.9;
00224         OBJECTDATA(node1,node)->phaseB_V.SetImag(2136.8);
00225         local_callbacks->sync_all(PC_POSTTOPDOWN);
00226         // check the top down values
00227 
00228         double rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00229         double iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00230 
00231         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00232         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00233         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00234         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00235 
00236     }
00237 
00238     void test_underground_line_c_cn(){
00239         OBJECT *node1,*node2; // Node objects
00240         OBJECT *ohl1; // underground line object
00241         // Test values
00242         complex* node1_phC_I_test = new complex(-46.035,115.21);
00243         complex* node2_phC_V_test = new complex(-1018.6,2102.2);
00244 
00245         CLASS *cl = get_class_by_name("node");
00246         node1 = gl_create_object(cl,sizeof(node));
00247         OBJECTDATA(node1,node)->create();
00248         cl = get_class_by_name("load");
00249         node2 = gl_create_object(cl,sizeof(load));
00250         OBJECTDATA(node2,load)->create();
00251         cl = get_class_by_name("underground_line");
00252         ohl1 = gl_create_object(cl,sizeof(underground_line));
00253         OBJECTDATA(ohl1,underground_line)->create();
00254 
00255         OBJECTDATA(ohl1,underground_line)->from = node1;
00256         OBJECTDATA(ohl1,underground_line)->to = node2;
00257         OBJECTDATA(ohl1,underground_line)->length = 500;
00258 
00259         // Next we set up the parameters needed for the test
00260         OBJECTDATA(ohl1,underground_line)->phases = PHASE_C;
00261         OBJECTDATA(node1,node)->phases = PHASE_C;
00262         OBJECTDATA(node2,load)->phases = PHASE_C;
00263         
00264         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = -1028.7;
00265         OBJECTDATA(node1,node)->phaseC_V.SetImag(2106.4);
00266         OBJECTDATA(node2,load)->phaseC_V.SetImag(2106.4);
00267         OBJECTDATA(node2,load)->phaseC_I.SetReal(-46.035);
00268         OBJECTDATA(node2,load)->phaseC_I.SetImag(115.21);
00269         
00270         // Phase A line conductor
00271         cl = get_class_by_name("underground_line_conductor");
00272         OBJECT *ulc_c = gl_create_object(cl,sizeof(underground_line_conductor));
00273         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_diameter = 0.567;
00274         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_gmr = 0.0171;
00275         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_resistance = 0.41;
00276         OBJECTDATA(ulc_c,underground_line_conductor)->outer_diameter = 1.29;
00277         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_gmr = 0.00208;
00278         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_diameter = 0.0641;
00279         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_resistance = 14.8722;
00280         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_strands = 13;
00281 
00282 
00283         cl = get_class_by_name("line_spacing");
00284         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00285         OBJECTDATA(ls,line_spacing)->distance_CtoN = 0.0;//no extra neutral
00286             //(OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter - 
00287             //                                        OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter)/24.0;
00288         
00289         
00290 
00291         /*
00292         OBJECT *olc_n = gl_create_object(cl,sizeof(underground_line_conductor));
00293         OBJECTDATA(olc_n,underground_line_conductor)->geometric_mean_radius = .00446;
00294         OBJECTDATA(olc_n,underground_line_conductor)->resistance = 1.12;
00295         */
00296 
00297         // Do I need to set up the other conductors and set them to INF?
00298         cl = get_class_by_name("line_configuration");
00299         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00300         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00301         lc->line_spacing = ls;
00302         lc->phaseA_conductor = 0;
00303         lc->phaseB_conductor = 0;
00304         lc->phaseC_conductor = ulc_c;
00305         lc->phaseN_conductor = 0;
00306         
00307         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00308         
00309         // Now we call init on the objects
00310         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00311 
00312         // Rank?
00313         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00314 
00315         // Run the test
00316         local_callbacks->sync_all(PC_PRETOPDOWN);
00317         local_callbacks->sync_all(PC_BOTTOMUP);
00318 
00319         // Check the bottom-up pass values
00320         double rI_1 = OBJECTDATA(node1,node)->get_phaseC_I_in().Re(); // Real part of the current at node 1
00321         double iI_1 = OBJECTDATA(node1,node)->get_phaseC_I_in().Im(); // Imaginary part of the current at node 1
00322 
00323         // Get the percentage of the difference between the calculated value and the test value
00324         double validate_re = 1 - (rI_1 <= node1_phC_I_test->Re() ? rI_1 / node1_phC_I_test->Re() : node1_phC_I_test->Re() /rI_1);
00325         double validate_im = 1 - (iI_1 <= node1_phC_I_test->Im() ? iI_1 / node1_phC_I_test->Im() : node1_phC_I_test->Im() /iI_1);
00326 
00327         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00328         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00329 
00330         
00331         OBJECTDATA(node1,node)->phaseC_V = -1030.4;
00332         OBJECTDATA(node1,node)->phaseC_V.SetImag(2110.9);
00333         local_callbacks->sync_all(PC_POSTTOPDOWN);
00334         // check the top down values
00335 
00336         double rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00337         double iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00338 
00339         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00340         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00341         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00342         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00343 
00344     }
00345 
00346 
00347 
00348     void test_underground_line_ab_cn(){
00349         OBJECT *node1,*node2; // Node objects
00350         OBJECT *ohl1; // underground line object
00351         // Test values
00352         complex* node1_phA_I_test = new complex(204.5,-18.431);
00353         complex* node2_phA_V_test = new complex(2347.4,-225.7);
00354         complex* node1_phB_I_test = new complex(39.716,-57.144);
00355         complex* node2_phB_V_test = new complex(-1367.1,-2134.6);
00356 
00357         CLASS *cl = get_class_by_name("node");
00358         node1 = gl_create_object(cl,sizeof(node));
00359         OBJECTDATA(node1,node)->create();
00360         cl = get_class_by_name("load");
00361         node2 = gl_create_object(cl,sizeof(load));
00362         OBJECTDATA(node2,load)->create();
00363         cl = get_class_by_name("underground_line");
00364         ohl1 = gl_create_object(cl,sizeof(underground_line));
00365         OBJECTDATA(ohl1,underground_line)->create();
00366 
00367         OBJECTDATA(ohl1,underground_line)->from = node1;
00368         OBJECTDATA(ohl1,underground_line)->to = node2;
00369         OBJECTDATA(ohl1,underground_line)->length = 500;
00370 
00371         // Next we set up the parameters needed for the test
00372         OBJECTDATA(ohl1,underground_line)->phases = PHASE_A|PHASE_B;
00373         OBJECTDATA(node1,node)->phases = PHASE_A|PHASE_B;
00374         OBJECTDATA(node2,load)->phases = PHASE_A|PHASE_B;
00375         
00376         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2349.8;
00377         OBJECTDATA(node1,node)->phaseA_V.SetImag(-228.75);
00378         OBJECTDATA(node2,load)->phaseA_V.SetImag(-228.75);
00379         OBJECTDATA(node2,load)->phaseA_I.SetReal(204.5);
00380         OBJECTDATA(node2,load)->phaseA_I.SetImag(-18.431);
00381 
00382         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -1362.2;
00383         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.6);
00384         OBJECTDATA(node2,load)->phaseB_V.SetImag(-2136.6);
00385         OBJECTDATA(node2,load)->phaseB_I.SetReal(39.716);
00386         OBJECTDATA(node2,load)->phaseB_I.SetImag(-57.144);
00387         
00388         // Phase A line conductor
00389         cl = get_class_by_name("underground_line_conductor");
00390         OBJECT *ulc_a = gl_create_object(cl,sizeof(underground_line_conductor));
00391         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_diameter = 0.567;
00392         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_gmr = 0.0171;
00393         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_resistance = 0.41;
00394         OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter = 1.29;
00395         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_gmr = 0.00208;
00396         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter = 0.0641;
00397         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_resistance = 14.8722;
00398         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_strands = 13;
00399 
00400         cl = get_class_by_name("underground_line_conductor");
00401         OBJECT *ulc_b = gl_create_object(cl,sizeof(underground_line_conductor));
00402         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_diameter = 0.567;
00403         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_gmr = 0.0171;
00404         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_resistance = 0.41;
00405         OBJECTDATA(ulc_b,underground_line_conductor)->outer_diameter = 1.29;
00406         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_gmr = 0.00208;
00407         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_diameter = 0.0641;
00408         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_resistance = 14.8722;
00409         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_strands = 13;
00410 
00411 
00412         cl = get_class_by_name("line_spacing");
00413         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00414         OBJECTDATA(ls,line_spacing)->distance_AtoN = 0.0;//no extra neutral
00415         OBJECTDATA(ls,line_spacing)->distance_AtoB = 0.5;
00416             //(OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter - 
00417             //                                        OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter)/24.0;
00418         
00419         
00420 
00421         /*
00422         OBJECT *olc_n = gl_create_object(cl,sizeof(underground_line_conductor));
00423         OBJECTDATA(olc_n,underground_line_conductor)->geometric_mean_radius = .00446;
00424         OBJECTDATA(olc_n,underground_line_conductor)->resistance = 1.12;
00425         */
00426 
00427         // Do I need to set up the other conductors and set them to INF?
00428         cl = get_class_by_name("line_configuration");
00429         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00430         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00431         lc->line_spacing = ls;
00432         lc->phaseA_conductor = ulc_a;
00433         lc->phaseB_conductor = ulc_b;
00434         lc->phaseC_conductor = 0;
00435         lc->phaseN_conductor = 0;
00436         
00437         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00438         
00439         // Now we call init on the objects
00440         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00441 
00442         // Rank?
00443         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00444 
00445         // Run the test
00446         local_callbacks->sync_all(PC_PRETOPDOWN);
00447         local_callbacks->sync_all(PC_BOTTOMUP);
00448 
00449         // Check the bottom-up pass values
00450         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00451         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00452 
00453         // Get the percentage of the difference between the calculated value and the test value
00454         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);
00455         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);
00456 
00457         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00458         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00459 
00460         
00461         OBJECTDATA(node1,node)->phaseA_V = 2367.6;
00462         OBJECTDATA(node1,node)->phaseA_V.SetImag(-220.05);
00463         OBJECTDATA(node1,node)->phaseB_V = -1352.9;
00464         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.8);
00465         local_callbacks->sync_all(PC_POSTTOPDOWN);
00466         // check the top down values
00467 
00468         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00469         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00470 
00471         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00472         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00473         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00474         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00475 
00476         rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00477         iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00478         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00479         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00480         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00481         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00482 
00483     }
00484 
00485     void test_underground_line_bc_cn(){
00486         OBJECT *node1,*node2; // Node objects
00487         OBJECT *ohl1; // underground line object
00488         // Test values
00489         complex* node1_phB_I_test = new complex(39.716,-57.144);
00490         complex* node2_phB_V_test = new complex(-1356.1,-2138);
00491         complex* node1_phC_I_test = new complex(-46.035,115.21);
00492         complex* node2_phC_V_test = new complex(-1023.4,2105.1);
00493 
00494         CLASS *cl = get_class_by_name("node");
00495         node1 = gl_create_object(cl,sizeof(node));
00496         OBJECTDATA(node1,node)->create();
00497         cl = get_class_by_name("load");
00498         node2 = gl_create_object(cl,sizeof(load));
00499         OBJECTDATA(node2,load)->create();
00500         cl = get_class_by_name("underground_line");
00501         ohl1 = gl_create_object(cl,sizeof(underground_line));
00502         OBJECTDATA(ohl1,underground_line)->create();
00503 
00504         OBJECTDATA(ohl1,underground_line)->from = node1;
00505         OBJECTDATA(ohl1,underground_line)->to = node2;
00506         OBJECTDATA(ohl1,underground_line)->length = 500;
00507 
00508         // Next we set up the parameters needed for the test
00509         OBJECTDATA(ohl1,underground_line)->phases = PHASE_B|PHASE_C;
00510         OBJECTDATA(node1,node)->phases = PHASE_B|PHASE_C;
00511         OBJECTDATA(node2,load)->phases = PHASE_B|PHASE_C;
00512         
00513         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -1362.2;
00514         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.6);
00515         OBJECTDATA(node2,load)->phaseB_V.SetImag(-2136.6);
00516         OBJECTDATA(node2,load)->phaseB_I.SetReal(39.716);
00517         OBJECTDATA(node2,load)->phaseB_I.SetImag(-57.144);
00518         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = -1028.7;
00519         OBJECTDATA(node1,node)->phaseC_V.SetImag(2106.4);
00520         OBJECTDATA(node2,load)->phaseC_V.SetImag(2106.4);
00521         OBJECTDATA(node2,load)->phaseC_I.SetReal(-46.035);
00522         OBJECTDATA(node2,load)->phaseC_I.SetImag(115.21);
00523         
00524         // Phase A line conductor
00525         cl = get_class_by_name("underground_line_conductor");
00526         OBJECT *ulc_b = gl_create_object(cl,sizeof(underground_line_conductor));
00527         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_diameter = 0.567;
00528         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_gmr = 0.0171;
00529         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_resistance = 0.41;
00530         OBJECTDATA(ulc_b,underground_line_conductor)->outer_diameter = 1.29;
00531         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_gmr = 0.00208;
00532         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_diameter = 0.0641;
00533         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_resistance = 14.8722;
00534         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_strands = 13;
00535 
00536         OBJECT *ulc_c = gl_create_object(cl,sizeof(underground_line_conductor));
00537         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_diameter = 0.567;
00538         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_gmr = 0.0171;
00539         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_resistance = 0.41;
00540         OBJECTDATA(ulc_c,underground_line_conductor)->outer_diameter = 1.29;
00541         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_gmr = 0.00208;
00542         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_diameter = 0.0641;
00543         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_resistance = 14.8722;
00544         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_strands = 13;
00545 
00546 
00547         cl = get_class_by_name("line_spacing");
00548         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00549         OBJECTDATA(ls,line_spacing)->distance_BtoN = 0.0;//no extra neutral
00550         OBJECTDATA(ls,line_spacing)->distance_BtoC = 0.5;
00551             //(OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter - 
00552             //                                        OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter)/24.0;
00553         
00554         
00555 
00556         /*
00557         OBJECT *olc_n = gl_create_object(cl,sizeof(underground_line_conductor));
00558         OBJECTDATA(olc_n,underground_line_conductor)->geometric_mean_radius = .00446;
00559         OBJECTDATA(olc_n,underground_line_conductor)->resistance = 1.12;
00560         */
00561 
00562         // Do I need to set up the other conductors and set them to INF?
00563         cl = get_class_by_name("line_configuration");
00564         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00565         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00566         lc->line_spacing = ls;
00567         lc->phaseA_conductor = 0;
00568         lc->phaseB_conductor = ulc_b;
00569         lc->phaseC_conductor = ulc_c;
00570         lc->phaseN_conductor = 0;
00571         
00572         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00573         
00574         // Now we call init on the objects
00575         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00576 
00577         // Rank?
00578         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00579 
00580         // Run the test
00581         local_callbacks->sync_all(PC_PRETOPDOWN);
00582         local_callbacks->sync_all(PC_BOTTOMUP);
00583 
00584         // Check the bottom-up pass values
00585         double rI_1 = OBJECTDATA(node1,node)->get_phaseB_I_in().Re(); // Real part of the current at node 1
00586         double iI_1 = OBJECTDATA(node1,node)->get_phaseB_I_in().Im(); // Imaginary part of the current at node 1
00587 
00588         // Get the percentage of the difference between the calculated value and the test value
00589         double validate_re = 1 - (rI_1 <= node1_phB_I_test->Re() ? rI_1 / node1_phB_I_test->Re() : node1_phB_I_test->Re() /rI_1);
00590         double validate_im = 1 - (iI_1 <= node1_phB_I_test->Im() ? iI_1 / node1_phB_I_test->Im() : node1_phB_I_test->Im() /iI_1);
00591 
00592         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00593         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00594 
00595         
00596         OBJECTDATA(node1,node)->phaseB_V = -1352.88;
00597         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.8);
00598         OBJECTDATA(node1,node)->phaseC_V = -1030.46;
00599         OBJECTDATA(node1,node)->phaseC_V.SetImag(2110.809);
00600         local_callbacks->sync_all(PC_POSTTOPDOWN);
00601         // check the top down values
00602 
00603         double rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00604         double iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00605 
00606         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00607         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00608         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00609         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00610 
00611         rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00612         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00613 
00614         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00615         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00616         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00617         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00618 
00619     }
00620 
00621     void test_underground_line_ca_cn(){
00622         OBJECT *node1,*node2; // Node objects
00623         OBJECT *ohl1; // underground line object
00624         // Test values
00625         complex* node1_phA_I_test = new complex(204.5,-18.431);
00626         complex* node2_phA_V_test = new complex(2351.4,-232.45);
00627         complex* node1_phC_I_test = new complex(-46.035,115.21);
00628         complex* node2_phC_V_test = new complex(-1028.6,2102.9);
00629 
00630         CLASS *cl = get_class_by_name("node");
00631         node1 = gl_create_object(cl,sizeof(node));
00632         OBJECTDATA(node1,node)->create();
00633         cl = get_class_by_name("load");
00634         node2 = gl_create_object(cl,sizeof(load));
00635         OBJECTDATA(node2,load)->create();
00636         cl = get_class_by_name("underground_line");
00637         ohl1 = gl_create_object(cl,sizeof(underground_line));
00638         OBJECTDATA(ohl1,underground_line)->create();
00639 
00640         OBJECTDATA(ohl1,underground_line)->from = node1;
00641         OBJECTDATA(ohl1,underground_line)->to = node2;
00642         OBJECTDATA(ohl1,underground_line)->length = 500;
00643 
00644         // Next we set up the parameters needed for the test
00645         OBJECTDATA(ohl1,underground_line)->phases = PHASE_A|PHASE_C;
00646         OBJECTDATA(node1,node)->phases = PHASE_A|PHASE_C;
00647         OBJECTDATA(node2,load)->phases = PHASE_A|PHASE_C;
00648 
00649         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2349.8;
00650         OBJECTDATA(node1,node)->phaseA_V.SetImag(-228.75);
00651         OBJECTDATA(node2,load)->phaseA_V.SetImag(-228.75);
00652         OBJECTDATA(node2,load)->phaseA_I.SetReal(204.5);
00653         OBJECTDATA(node2,load)->phaseA_I.SetImag(-18.431);
00654 
00655         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = -1028.7;
00656         OBJECTDATA(node1,node)->phaseC_V.SetImag(2106.4);
00657         OBJECTDATA(node2,load)->phaseC_V.SetImag(2106.4);
00658         OBJECTDATA(node2,load)->phaseC_I.SetReal(-46.035);
00659         OBJECTDATA(node2,load)->phaseC_I.SetImag(115.21);
00660         
00661         // Phase A line conductor
00662         cl = get_class_by_name("underground_line_conductor");
00663         OBJECT *ulc_a = gl_create_object(cl,sizeof(underground_line_conductor));
00664         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_diameter = 0.567;
00665         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_gmr = 0.0171;
00666         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_resistance = 0.41;
00667         OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter = 1.29;
00668         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_gmr = 0.00208;
00669         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter = 0.0641;
00670         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_resistance = 14.8722;
00671         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_strands = 13;
00672 
00673         cl = get_class_by_name("underground_line_conductor");
00674         OBJECT *ulc_c = gl_create_object(cl,sizeof(underground_line_conductor));
00675         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_diameter = 0.567;
00676         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_gmr = 0.0171;
00677         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_resistance = 0.41;
00678         OBJECTDATA(ulc_c,underground_line_conductor)->outer_diameter = 1.29;
00679         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_gmr = 0.00208;
00680         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_diameter = 0.0641;
00681         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_resistance = 14.8722;
00682         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_strands = 13;
00683 
00684 
00685         cl = get_class_by_name("line_spacing");
00686         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00687         OBJECTDATA(ls,line_spacing)->distance_AtoN = 0.0;//no extra neutral
00688         OBJECTDATA(ls,line_spacing)->distance_AtoC = 1;
00689             //(OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter - 
00690             //                                        OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter)/24.0;
00691         
00692         
00693 
00694         /*
00695         OBJECT *olc_n = gl_create_object(cl,sizeof(underground_line_conductor));
00696         OBJECTDATA(olc_n,underground_line_conductor)->geometric_mean_radius = .00446;
00697         OBJECTDATA(olc_n,underground_line_conductor)->resistance = 1.12;
00698         */
00699 
00700         // Do I need to set up the other conductors and set them to INF?
00701         cl = get_class_by_name("line_configuration");
00702         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00703         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00704         lc->line_spacing = ls;
00705         lc->phaseA_conductor = ulc_a;
00706         lc->phaseB_conductor = 0;
00707         lc->phaseC_conductor = ulc_c;
00708         lc->phaseN_conductor = 0;
00709         
00710         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00711         
00712         // Now we call init on the objects
00713         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00714 
00715         // Rank?
00716         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00717 
00718         // Run the test
00719         local_callbacks->sync_all(PC_PRETOPDOWN);
00720         local_callbacks->sync_all(PC_BOTTOMUP);
00721 
00722         // Check the bottom-up pass values
00723         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00724         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00725 
00726         // Get the percentage of the difference between the calculated value and the test value
00727         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);
00728         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);
00729 
00730         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00731         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00732 
00733         
00734         OBJECTDATA(node1,node)->phaseA_V = 2367.6;
00735         OBJECTDATA(node1,node)->phaseA_V.SetImag(-220.05);
00736         OBJECTDATA(node1,node)->phaseC_V = -1030.4;
00737         OBJECTDATA(node1,node)->phaseC_V.SetImag(2110.9);
00738         local_callbacks->sync_all(PC_POSTTOPDOWN);
00739         // check the top down values
00740 
00741         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00742         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00743 
00744         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00745         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00746         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00747         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00748 
00749         rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00750         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00751 
00752         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00753         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00754         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00755         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00756     }
00757 
00758     void test_underground_line_abc_cn(){
00759         OBJECT *node1,*node2; // Node objects
00760         OBJECT *ohl1; // underground line object
00761         // Test values
00762         complex* node1_phA_I_test = new complex(204.5,-18.431);
00763         complex* node2_phA_V_test = new complex(2351,-220.05);
00764         complex* node1_phB_I_test = new complex(39.716,-57.144);
00765         complex* node2_phB_V_test = new complex(-1362.6,-2136.8);
00766         complex* node1_phC_I_test = new complex(-46.035,115.21);
00767         complex* node2_phC_V_test = new complex(-1029,2106.5);
00768 
00769         CLASS *cl = get_class_by_name("node");
00770         node1 = gl_create_object(cl,sizeof(node));
00771         OBJECTDATA(node1,node)->create();
00772         cl = get_class_by_name("load");
00773         node2 = gl_create_object(cl,sizeof(load));
00774         OBJECTDATA(node2,load)->create();
00775         cl = get_class_by_name("underground_line");
00776         ohl1 = gl_create_object(cl,sizeof(underground_line));
00777         OBJECTDATA(ohl1,underground_line)->create();
00778 
00779         OBJECTDATA(ohl1,underground_line)->from = node1;
00780         OBJECTDATA(ohl1,underground_line)->to = node2;
00781         OBJECTDATA(ohl1,underground_line)->length = 500;
00782 
00783         // Next we set up the parameters needed for the test
00784         OBJECTDATA(ohl1,underground_line)->phases = PHASE_A|PHASE_B|PHASE_C;
00785         OBJECTDATA(node1,node)->phases = PHASE_A|PHASE_B|PHASE_C;
00786         OBJECTDATA(node2,load)->phases = PHASE_A|PHASE_B|PHASE_C;
00787         
00788         OBJECTDATA(node1,node)->phaseA_V = OBJECTDATA(node2,load)->phaseA_V = 2349.8;
00789         OBJECTDATA(node1,node)->phaseA_V.SetImag(-228.75);
00790         OBJECTDATA(node2,load)->phaseA_V.SetImag(-228.75);
00791         OBJECTDATA(node2,load)->phaseA_I.SetReal(204.5);
00792         OBJECTDATA(node2,load)->phaseA_I.SetImag(-18.431);
00793 
00794         OBJECTDATA(node1,node)->phaseB_V = OBJECTDATA(node2,load)->phaseB_V = -1362.2;
00795         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.6);
00796         OBJECTDATA(node2,load)->phaseB_V.SetImag(-2136.6);
00797         OBJECTDATA(node2,load)->phaseB_I.SetReal(39.716);
00798         OBJECTDATA(node2,load)->phaseB_I.SetImag(-57.144);
00799 
00800         OBJECTDATA(node1,node)->phaseC_V = OBJECTDATA(node2,load)->phaseC_V = -1028.7;
00801         OBJECTDATA(node1,node)->phaseC_V.SetImag(2106.4);
00802         OBJECTDATA(node2,load)->phaseC_V.SetImag(2106.4);
00803         OBJECTDATA(node2,load)->phaseC_I.SetReal(-46.035);
00804         OBJECTDATA(node2,load)->phaseC_I.SetImag(115.21);
00805         
00806         // Phase A line conductor
00807         cl = get_class_by_name("underground_line_conductor");
00808         OBJECT *ulc_a = gl_create_object(cl,sizeof(underground_line_conductor));
00809         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_diameter = 0.567;
00810         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_gmr = 0.0171;
00811         OBJECTDATA(ulc_a,underground_line_conductor)->conductor_resistance = 0.41;
00812         OBJECTDATA(ulc_a,underground_line_conductor)->outer_diameter = 1.29;
00813         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_gmr = 0.00208;
00814         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_diameter = 0.0641;
00815         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_resistance = 14.8722;
00816         OBJECTDATA(ulc_a,underground_line_conductor)->neutral_strands = 13;
00817 
00818         cl = get_class_by_name("underground_line_conductor");
00819         OBJECT *ulc_b = gl_create_object(cl,sizeof(underground_line_conductor));
00820         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_diameter = 0.567;
00821         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_gmr = 0.0171;
00822         OBJECTDATA(ulc_b,underground_line_conductor)->conductor_resistance = 0.41;
00823         OBJECTDATA(ulc_b,underground_line_conductor)->outer_diameter = 1.29;
00824         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_gmr = 0.00208;
00825         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_diameter = 0.0641;
00826         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_resistance = 14.8722;
00827         OBJECTDATA(ulc_b,underground_line_conductor)->neutral_strands = 13;
00828 
00829         cl = get_class_by_name("underground_line_conductor");
00830         OBJECT *ulc_c = gl_create_object(cl,sizeof(underground_line_conductor));
00831         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_diameter = 0.567;
00832         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_gmr = 0.0171;
00833         OBJECTDATA(ulc_c,underground_line_conductor)->conductor_resistance = 0.41;
00834         OBJECTDATA(ulc_c,underground_line_conductor)->outer_diameter = 1.29;
00835         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_gmr = 0.00208;
00836         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_diameter = 0.0641;
00837         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_resistance = 14.8722;
00838         OBJECTDATA(ulc_c,underground_line_conductor)->neutral_strands = 13;
00839 
00840 
00841         cl = get_class_by_name("line_spacing");
00842         OBJECT *ls = gl_create_object(cl,sizeof(line_spacing));
00843         OBJECTDATA(ls,line_spacing)->distance_AtoN = 0.0;//no extra neutral
00844         OBJECTDATA(ls,line_spacing)->distance_AtoB = 0.5;
00845         OBJECTDATA(ls,line_spacing)->distance_AtoC = 1;
00846         OBJECTDATA(ls,line_spacing)->distance_BtoC = 0.5;
00847         
00848         cl = get_class_by_name("line_configuration");
00849         OBJECT *line_config = gl_create_object(cl,sizeof(line_configuration));
00850         line_configuration *lc = OBJECTDATA(line_config,line_configuration);
00851         lc->line_spacing = ls;
00852         lc->phaseA_conductor = ulc_a;
00853         lc->phaseB_conductor = ulc_b;
00854         lc->phaseC_conductor = ulc_c;
00855         lc->phaseN_conductor = 0;
00856         
00857         OBJECTDATA(ohl1,underground_line)->configuration = line_config;
00858         
00859         // Now we call init on the objects
00860         CPPUNIT_ASSERT(local_callbacks->init_objects() != FAILED);
00861 
00862         // Rank?
00863         CPPUNIT_ASSERT(local_callbacks->setup_test_ranks() != FAILED);
00864 
00865         // Run the test
00866         local_callbacks->sync_all(PC_PRETOPDOWN);
00867         local_callbacks->sync_all(PC_BOTTOMUP);
00868 
00869         // Check the bottom-up pass values
00870         double rI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Re(); // Real part of the current at node 1
00871         double iI_1 = OBJECTDATA(node1,node)->get_phaseA_I_in().Im(); // Imaginary part of the current at node 1
00872 
00873         // Get the percentage of the difference between the calculated value and the test value
00874         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);
00875         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);
00876 
00877         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00878         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00879 
00880         
00881         OBJECTDATA(node1,node)->phaseA_V = 2367.6;
00882         OBJECTDATA(node1,node)->phaseA_V.SetImag(-220.05);
00883         OBJECTDATA(node1,node)->phaseB_V = -1352.9;
00884         OBJECTDATA(node1,node)->phaseB_V.SetImag(-2136.8);
00885         OBJECTDATA(node1,node)->phaseC_V = -1030.4;
00886         OBJECTDATA(node1,node)->phaseC_V.SetImag(2110.9);
00887         local_callbacks->sync_all(PC_POSTTOPDOWN);
00888         // check the top down values
00889 
00890         double rV_2 = OBJECTDATA(node2,load)->phaseA_V.Re();
00891         double iV_2 = OBJECTDATA(node2,load)->phaseA_V.Im();
00892 
00893         validate_re = 1 - (rV_2 <= node2_phA_V_test->Re() ? rV_2 / node2_phA_V_test->Re() : node2_phA_V_test->Re() /rV_2);
00894         validate_im = 1 - (iV_2 <= node2_phA_V_test->Im() ? iV_2 / node2_phA_V_test->Im() : node2_phA_V_test->Im() /iV_2);
00895         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00896         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00897 
00898         rV_2 = OBJECTDATA(node2,load)->phaseB_V.Re();
00899         iV_2 = OBJECTDATA(node2,load)->phaseB_V.Im();
00900         validate_re = 1 - (rV_2 <= node2_phB_V_test->Re() ? rV_2 / node2_phB_V_test->Re() : node2_phB_V_test->Re() /rV_2);
00901         validate_im = 1 - (iV_2 <= node2_phB_V_test->Im() ? iV_2 / node2_phB_V_test->Im() : node2_phB_V_test->Im() /iV_2);
00902         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00903         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00904 
00905         rV_2 = OBJECTDATA(node2,load)->phaseC_V.Re();
00906         iV_2 = OBJECTDATA(node2,load)->phaseC_V.Im();
00907         validate_re = 1 - (rV_2 <= node2_phC_V_test->Re() ? rV_2 / node2_phC_V_test->Re() : node2_phC_V_test->Re() /rV_2);
00908         validate_im = 1 - (iV_2 <= node2_phC_V_test->Im() ? iV_2 / node2_phC_V_test->Im() : node2_phC_V_test->Im() /iV_2);
00909         CPPUNIT_ASSERT(validate_re < VALIDATE_THRESHOLD);
00910         CPPUNIT_ASSERT(validate_im < VALIDATE_THRESHOLD);
00911 
00912     }
00913 
00914     
00915 
00916     /*
00917      * This section creates the suite() method that will be used by the
00918      * CPPUnit testrunner to execute the tests that we have registered.
00919      * This section needs to be in the .h file
00920      */
00921     CPPUNIT_TEST_SUITE(undergroundline_tests);
00922     /*
00923      * For each test method defined above, we should have a separate
00924      * CPPUNIT_TEST() line.
00925      */
00926 
00927     
00928     CPPUNIT_TEST(test_underground_line_a_cn);
00929     CPPUNIT_TEST(test_underground_line_b_cn);
00930     CPPUNIT_TEST(test_underground_line_c_cn);
00931     CPPUNIT_TEST(test_underground_line_bc_cn);
00932     CPPUNIT_TEST(test_underground_line_ab_cn);
00933     CPPUNIT_TEST(test_underground_line_ca_cn);
00934     CPPUNIT_TEST(test_underground_line_abc_cn);
00935     
00936     CPPUNIT_TEST_SUITE_END();
00937 
00938 };
00939 
00940 
00941 #endif
00942 #endif

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