00001
00002
00003
00004
00005 #include "solver_nr.h"
00006
00007 #define MT // this enables multithreaded SuperLU
00008
00009 #ifdef MT
00010 #include <pdsp_defs.h>
00011 #else
00012 #include <slu_ddefs.h>
00013 #endif
00014
00015
00016 #include "powerflow.h"
00017
00018 double *deltaI_NR;
00019 double *deltaV_NR;
00020 unsigned int size_offdiag_PQ;
00021 unsigned int size_diag_fixed;
00022 unsigned int total_variables;
00023 unsigned int max_size_offdiag_PQ, max_size_diag_fixed, max_total_variables, max_size_diag_update;
00024 bool NR_realloc_needed;
00025 bool newiter;
00026 Bus_admit *BA_diag;
00027 Y_NR *Y_offdiag_PQ;
00028 Y_NR *Y_diag_fixed;
00029 Y_NR *Y_diag_update;
00030 Y_NR *Y_Amatrix;
00031 Y_NR *Y_Work_Amatrix;
00032
00033
00034 double *a_LU,*rhs_LU;
00035 int *perm_c, *perm_r, *cols_LU, *rows_LU;
00036 SuperMatrix A_LU,B_LU;
00037
00038 void merge_sort(Y_NR *Input_Array, unsigned int Alen, Y_NR *Work_Array){
00039 unsigned int split_point;
00040 unsigned int right_length;
00041 Y_NR *leftside, *rightside;
00042 Y_NR *Final_P;
00043
00044 if (Alen>0)
00045 {
00046 split_point = Alen/2;
00047 right_length = Alen - split_point;
00048
00049
00050 leftside = Input_Array;
00051 rightside = Input_Array+split_point;
00052
00053
00054 if (split_point>1)
00055 merge_sort(leftside,split_point,Work_Array);
00056
00057 if (right_length>1)
00058 merge_sort(rightside,right_length,Work_Array);
00059
00060
00061 Final_P = Work_Array;
00062
00063
00064 do {
00065 if (leftside->col_ind < rightside->col_ind)
00066 *Final_P++ = *leftside++;
00067 else if (leftside->col_ind == rightside->col_ind)
00068 {
00069 if (leftside->row_ind < rightside->row_ind)
00070 *Final_P++ = *leftside++;
00071 else
00072 *Final_P++ = *rightside++;
00073 }
00074 else
00075 *Final_P++ = *rightside++;
00076 } while ((leftside<(Input_Array+split_point)) && (rightside<(Input_Array+Alen)));
00077
00078 while (leftside<(Input_Array+split_point))
00079 *Final_P++ = *leftside++;
00080
00081 while (rightside<(Input_Array+Alen))
00082 *Final_P++ = *rightside++;
00083
00084 memcpy(Input_Array,Work_Array,sizeof(Y_NR)*Alen);
00085 }
00086 }
00087
00095 int64 solver_nr(unsigned int bus_count, BUSDATA *bus, unsigned int branch_count, BRANCHDATA *branch, bool *bad_computations)
00096 {
00097
00098 int64 Iteration;
00099
00100
00101 unsigned int size_Amatrix;
00102
00103
00104 double Maxmismatch;
00105
00106
00107 unsigned char phase_worka, phase_workb, phase_workc;
00108
00109
00110 double tempIcalcReal, tempIcalcImag;
00111 double tempPbus;
00112 double tempQbus;
00113
00114
00115 unsigned int indexer, tempa, tempb, jindexer, kindexer;
00116 char jindex, kindex;
00117 char temp_index, temp_index_b;
00118 unsigned int temp_index_c;
00119
00120
00121 complex tempY[3][3];
00122
00123
00124 bool Full_Mat_A, Full_Mat_B, proceed_flag;
00125
00126
00127 char temp_size, temp_size_b, temp_size_c;
00128
00129
00130 complex Temp_Ad_A[3][3];
00131 complex Temp_Ad_B[3][3];
00132
00133
00134 complex undeltacurr[3], undeltaimped[3], undeltapower[3];
00135 complex delta_current[3], voltageDel[3];
00136 complex temp_current[3], temp_power[3], temp_store[3];
00137
00138
00139 complex DVConvCheck[3];
00140 double CurrConvVal;
00141
00142
00143 unsigned int index_count = 0;
00144
00145
00146 double work_vals_double_0, work_vals_double_1,work_vals_double_2,work_vals_double_3;
00147 char work_vals_char_0;
00148
00149
00150 SuperMatrix L_LU,U_LU;
00151 NCformat *Astore;
00152 DNformat *Bstore;
00153 int nnz, info;
00154 unsigned int m,n;
00155 double *sol_LU;
00156
00157 #ifndef MT
00158 superlu_options_t options;
00159 SuperLUStat_t stat;
00160 #endif
00161
00162
00163 *bad_computations = false;
00164
00165 if (NR_admit_change)
00166 {
00167
00168 if (BA_diag == NULL)
00169 {
00170 BA_diag = (Bus_admit *)gl_malloc(bus_count *sizeof(Bus_admit));
00171
00172
00173 if (BA_diag == NULL)
00174 {
00175 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
00176
00177
00178
00179
00180
00181 }
00182 }
00183
00184 for (indexer=0; indexer<bus_count; indexer++)
00185 {
00186
00187 if ((bus[indexer].phases & 0x80) == 0x80)
00188 BA_diag[indexer].size = 2;
00189 else if ((bus[indexer].phases & 0x08) == 0x08)
00190 BA_diag[indexer].size = 3;
00191 else
00192 {
00193 phase_worka = 0;
00194 for (jindex=0; jindex<3; jindex++)
00195 {
00196 phase_worka += ((bus[indexer].phases & (0x01 << jindex)) >> jindex);
00197 }
00198 BA_diag[indexer].size = phase_worka;
00199 }
00200
00201
00202 for (jindex=0; jindex<3; jindex++)
00203 {
00204 for (kindex=0; kindex<3; kindex++)
00205 {
00206 BA_diag[indexer].Y[jindex][kindex] = 0;
00207 tempY[jindex][kindex] = 0;
00208 }
00209 }
00210
00211
00212 for (kindexer=0; kindexer<(bus[indexer].Link_Table_Size);kindexer++)
00213 {
00214
00215
00216 jindexer = bus[indexer].Link_Table[kindexer];
00217
00218 if ((branch[jindexer].from == indexer) || (branch[jindexer].to == indexer))
00219 {
00220 if (BA_diag[indexer].size == 3)
00221 {
00222 for (jindex=0; jindex<3; jindex++)
00223 {
00224 for (kindex=0; kindex<3; kindex++)
00225 {
00226 if (branch[jindexer].from == indexer)
00227 {
00228 tempY[jindex][kindex] += branch[jindexer].YSfrom[jindex*3+kindex];
00229 }
00230 else
00231 {
00232 tempY[jindex][kindex] += branch[jindexer].YSto[jindex*3+kindex];
00233 }
00234 }
00235 }
00236 }
00237 else if ((bus[indexer].phases & 0x80) == 0x80)
00238 {
00239 if (branch[jindexer].from == indexer)
00240 {
00241
00242 if ((bus[indexer].phases & 0x20) == 0x20)
00243 {
00244
00245 tempY[0][0] -= branch[jindexer].YSfrom[0];
00246 tempY[0][1] -= branch[jindexer].YSfrom[1];
00247 tempY[1][0] -= branch[jindexer].YSfrom[3];
00248 tempY[1][1] -= branch[jindexer].YSfrom[4];
00249 }
00250 else
00251 {
00252 tempY[0][0] += branch[jindexer].YSfrom[0];
00253 tempY[0][1] += branch[jindexer].YSfrom[1];
00254 tempY[1][0] += branch[jindexer].YSfrom[3];
00255 tempY[1][1] += branch[jindexer].YSfrom[4];
00256 }
00257 }
00258 else
00259 {
00260 tempY[0][0] += branch[jindexer].YSto[0];
00261 tempY[0][1] += branch[jindexer].YSto[1];
00262 tempY[1][0] += branch[jindexer].YSto[3];
00263 tempY[1][1] += branch[jindexer].YSto[4];
00264 }
00265
00266 }
00267 else
00268 {
00269 switch(bus[indexer].phases & 0x07) {
00270 case 0x01:
00271 {
00272 if (branch[jindexer].from == indexer)
00273 {
00274 tempY[0][0] += branch[jindexer].YSfrom[8];
00275 }
00276 else
00277 {
00278 tempY[0][0] += branch[jindexer].YSto[8];
00279 }
00280 break;
00281 }
00282 case 0x02:
00283 {
00284 if (branch[jindexer].from == indexer)
00285 {
00286 tempY[0][0] += branch[jindexer].YSfrom[4];
00287 }
00288 else
00289 {
00290 tempY[0][0] += branch[jindexer].YSto[4];
00291 }
00292 break;
00293 }
00294 case 0x03:
00295 {
00296 if (branch[jindexer].from == indexer)
00297 {
00298 tempY[0][0] += branch[jindexer].YSfrom[4];
00299 tempY[0][1] += branch[jindexer].YSfrom[5];
00300 tempY[1][0] += branch[jindexer].YSfrom[7];
00301 tempY[1][1] += branch[jindexer].YSfrom[8];
00302 }
00303 else
00304 {
00305 tempY[0][0] += branch[jindexer].YSto[4];
00306 tempY[0][1] += branch[jindexer].YSto[5];
00307 tempY[1][0] += branch[jindexer].YSto[7];
00308 tempY[1][1] += branch[jindexer].YSto[8];
00309 }
00310 break;
00311 }
00312 case 0x04:
00313 {
00314 if (branch[jindexer].from == indexer)
00315 {
00316 tempY[0][0] += branch[jindexer].YSfrom[0];
00317 }
00318 else
00319 {
00320 tempY[0][0] += branch[jindexer].YSto[0];
00321 }
00322 break;
00323 }
00324 case 0x05:
00325 {
00326 if (branch[jindexer].from == indexer)
00327 {
00328 tempY[0][0] += branch[jindexer].YSfrom[0];
00329 tempY[0][1] += branch[jindexer].YSfrom[2];
00330 tempY[1][0] += branch[jindexer].YSfrom[6];
00331 tempY[1][1] += branch[jindexer].YSfrom[8];
00332 }
00333 else
00334 {
00335 tempY[0][0] += branch[jindexer].YSto[0];
00336 tempY[0][1] += branch[jindexer].YSto[2];
00337 tempY[1][0] += branch[jindexer].YSto[6];
00338 tempY[1][1] += branch[jindexer].YSto[8];
00339 }
00340 break;
00341 }
00342 case 0x06:
00343 {
00344 if (branch[jindexer].from == indexer)
00345 {
00346 tempY[0][0] += branch[jindexer].YSfrom[0];
00347 tempY[0][1] += branch[jindexer].YSfrom[1];
00348 tempY[1][0] += branch[jindexer].YSfrom[3];
00349 tempY[1][1] += branch[jindexer].YSfrom[4];
00350 }
00351 else
00352 {
00353 tempY[0][0] += branch[jindexer].YSto[0];
00354 tempY[0][1] += branch[jindexer].YSto[1];
00355 tempY[1][0] += branch[jindexer].YSto[3];
00356 tempY[1][1] += branch[jindexer].YSto[4];
00357
00358 }
00359 break;
00360 }
00361 default:
00362 {
00363 GL_THROW("Unknown phase connection in NR self admittance diagonal");
00364
00365
00366
00367
00368
00369 break;
00370 }
00371 }
00372 }
00373 }
00374 else
00375 ;
00376 }
00377
00378
00379 BA_diag[indexer].col_ind = BA_diag[indexer].row_ind = index_count;
00380 bus[indexer].Matrix_Loc = index_count;
00381 index_count += BA_diag[indexer].size;
00382
00383
00384
00385 for (jindex=0; jindex<BA_diag[indexer].size; jindex++)
00386 {
00387 for (kindex=0; kindex<BA_diag[indexer].size; kindex++)
00388 {
00389 BA_diag[indexer].Y[jindex][kindex] = tempY[jindex][kindex];
00390 }
00391 }
00392 }
00393
00394
00395 total_variables=index_count;
00396
00397
00398 if (total_variables > max_total_variables)
00399 NR_realloc_needed = true;
00400
00402
00403
00404 size_offdiag_PQ = 0;
00405 for (jindexer=0; jindexer<branch_count;jindexer++)
00406 {
00407 tempa = branch[jindexer].from;
00408 tempb = branch[jindexer].to;
00409
00410
00411 if ((bus[tempa].Matrix_Loc == -1) || (bus[tempb].Matrix_Loc == -1))
00412 {
00413 GL_THROW("An element in NR line:%d was not properly localized");
00414
00415
00416
00417
00418
00419 }
00420
00421 if (((branch[jindexer].phases & 0x80) == 0x80) && (branch[jindexer].v_ratio==1.0))
00422 {
00423 for (jindex=0; jindex<2; jindex++)
00424 {
00425 for (kindex=0; kindex<2; kindex++)
00426 {
00427 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00428 size_offdiag_PQ += 1;
00429
00430 if (((branch[jindexer].Yto[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00431 size_offdiag_PQ += 1;
00432
00433 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00434 size_offdiag_PQ += 1;
00435
00436 if (((branch[jindexer].Yto[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00437 size_offdiag_PQ += 1;
00438 }
00439 }
00440 }
00441 else
00442 {
00443 for (jindex=0; jindex<3; jindex++)
00444 {
00445 for (kindex=0; kindex<3; kindex++)
00446 {
00447 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00448 size_offdiag_PQ += 1;
00449
00450 if (((branch[jindexer].Yto[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00451 size_offdiag_PQ += 1;
00452
00453 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00454 size_offdiag_PQ += 1;
00455
00456 if (((branch[jindexer].Yto[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00457 size_offdiag_PQ += 1;
00458 }
00459 }
00460 }
00461 }
00462
00463
00464 if (Y_offdiag_PQ == NULL)
00465 {
00466 Y_offdiag_PQ = (Y_NR *)gl_malloc((size_offdiag_PQ*2) *sizeof(Y_NR));
00467
00468
00469 if (Y_offdiag_PQ == NULL)
00470 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
00471
00472
00473 max_size_offdiag_PQ = size_offdiag_PQ;
00474 }
00475 else if (size_offdiag_PQ > max_size_offdiag_PQ)
00476 {
00477
00478 gl_free(Y_offdiag_PQ);
00479
00480
00481 Y_offdiag_PQ = (Y_NR *)gl_malloc((size_offdiag_PQ*2) *sizeof(Y_NR));
00482
00483
00484 if (Y_offdiag_PQ == NULL)
00485 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
00486
00487
00488 max_size_offdiag_PQ = size_offdiag_PQ;
00489
00490
00491 NR_realloc_needed = true;
00492 }
00493
00494 indexer = 0;
00495 for (jindexer=0; jindexer<branch_count;jindexer++)
00496 {
00497
00498 tempa = branch[jindexer].from;
00499 tempb = branch[jindexer].to;
00500
00501 phase_worka = 0;
00502 phase_workb = 0;
00503 for (jindex=0; jindex<3; jindex++)
00504 {
00505 phase_worka += ((bus[tempa].phases & (0x01 << jindex)) >> jindex);
00506 phase_workb += ((bus[tempb].phases & (0x01 << jindex)) >> jindex);
00507 }
00508
00509 if ((phase_worka==3) && (phase_workb==3))
00510 {
00511 for (jindex=0; jindex<3; jindex++)
00512 {
00513 for (kindex=0; kindex<3; kindex++)
00514 {
00515
00516
00517 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00518 {
00519 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00520 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00521 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Im());
00522 indexer += 1;
00523 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 3;
00524 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 3;
00525 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yfrom[jindex*3+kindex]).Im();
00526 indexer += 1;
00527 }
00528
00529 if (((branch[jindexer].Yto[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00530 {
00531 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00532 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00533 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Im());
00534 indexer += 1;
00535 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 3;
00536 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 3;
00537 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yto[jindex*3+kindex]).Im();
00538 indexer += 1;
00539 }
00540
00541 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00542 {
00543 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 3;
00544 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00545 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00546 indexer += 1;
00547 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00548 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 3;
00549 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00550 indexer += 1;
00551 }
00552
00553 if (((branch[jindexer].Yto[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00554 {
00555 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 3;
00556 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00557 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Re());
00558 indexer += 1;
00559 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00560 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 3;
00561 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Re());
00562 indexer += 1;
00563 }
00564 }
00565 }
00566 }
00567 else if (((bus[tempa].phases & 0x80) == 0x80) || ((bus[tempb].phases & 0x80) == 0x80))
00568 {
00569 if (((bus[tempa].phases & 0x80) == 0x80) && ((bus[tempb].phases & 0x80) == 0x80))
00570 {
00571 for (jindex=0; jindex<2; jindex++)
00572 {
00573 for (kindex=0; kindex<2; kindex++)
00574 {
00575
00576 if (((bus[tempa].phases & 0x20) & (bus[tempb].phases & 0x20)) == 0x20)
00577 {
00578 GL_THROW("NR: SPCT to SPCT via triplex connections are unsupported at this time.");
00579
00580
00581
00582
00583
00584 }
00585 else if ((bus[tempa].phases & 0x20) == 0x20)
00586 {
00587
00588
00589 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00590 {
00591 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00592 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00593 Y_offdiag_PQ[indexer].Y_value = ((branch[jindexer].Yfrom[jindex*3+kindex]).Im());
00594 indexer += 1;
00595
00596 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 2;
00597 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00598 Y_offdiag_PQ[indexer].Y_value = -(branch[jindexer].Yfrom[jindex*3+kindex]).Im();
00599 indexer += 1;
00600 }
00601
00602 if (((branch[jindexer].Yto[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00603 {
00604 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00605 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00606 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Im());
00607 indexer += 1;
00608
00609 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 2;
00610 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 2;
00611 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yto[jindex*3+kindex]).Im();
00612 indexer += 1;
00613 }
00614
00615 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00616 {
00617 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 2;
00618 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00619 Y_offdiag_PQ[indexer].Y_value = ((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00620 indexer += 1;
00621
00622 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00623 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00624 Y_offdiag_PQ[indexer].Y_value = ((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00625 indexer += 1;
00626 }
00627
00628 if (((branch[jindexer].Yto[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1 && bus[tempb].type != 1))
00629 {
00630 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 2;
00631 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00632 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Re());
00633 indexer += 1;
00634
00635 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00636 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 2;
00637 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Re());
00638 indexer += 1;
00639 }
00640 }
00641 else if ((bus[tempb].phases & 0x20) == 0x20)
00642 {
00643
00644
00645 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00646 {
00647 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00648 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00649 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Im());
00650 indexer += 1;
00651
00652 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 2;
00653 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00654 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yfrom[jindex*3+kindex]).Im();
00655 indexer += 1;
00656 }
00657
00658 if (((branch[jindexer].Yto[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00659 {
00660 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00661 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00662 Y_offdiag_PQ[indexer].Y_value = ((branch[jindexer].Yto[jindex*3+kindex]).Im());
00663 indexer += 1;
00664
00665 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 2;
00666 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 2;
00667 Y_offdiag_PQ[indexer].Y_value = -(branch[jindexer].Yto[jindex*3+kindex]).Im();
00668 indexer += 1;
00669 }
00670
00671 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00672 {
00673 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 2;
00674 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00675 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00676 indexer += 1;
00677
00678 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00679 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00680 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00681 indexer += 1;
00682 }
00683
00684 if (((branch[jindexer].Yto[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1 && bus[tempb].type != 1))
00685 {
00686 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 2;
00687 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00688 Y_offdiag_PQ[indexer].Y_value = ((branch[jindexer].Yto[jindex*3+kindex]).Re());
00689 indexer += 1;
00690
00691 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00692 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 2;
00693 Y_offdiag_PQ[indexer].Y_value = ((branch[jindexer].Yto[jindex*3+kindex]).Re());
00694 indexer += 1;
00695 }
00696 }
00697 else
00698 {
00699
00700
00701 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00702 {
00703 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00704 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00705 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Im());
00706 indexer += 1;
00707
00708 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 2;
00709 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00710 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yfrom[jindex*3+kindex]).Im();
00711 indexer += 1;
00712 }
00713
00714 if (((branch[jindexer].Yto[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00715 {
00716 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00717 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00718 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Im());
00719 indexer += 1;
00720
00721 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 2;
00722 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 2;
00723 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yto[jindex*3+kindex]).Im();
00724 indexer += 1;
00725 }
00726
00727 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00728 {
00729 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex + 2;
00730 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00731 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00732 indexer += 1;
00733
00734 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + jindex;
00735 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00736 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00737 indexer += 1;
00738 }
00739
00740 if (((branch[jindexer].Yto[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1 && bus[tempb].type != 1))
00741 {
00742 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex + 2;
00743 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex;
00744 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Re());
00745 indexer += 1;
00746
00747 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + jindex;
00748 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + kindex + 2;
00749 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[jindex*3+kindex]).Re());
00750 indexer += 1;
00751 }
00752 }
00753 }
00754 }
00755 }
00756 else if ((bus[tempa].phases & 0x80) == 0x80)
00757 {
00758 GL_THROW("NR does not support triplex to 3-phase connections.");
00759
00760
00761
00762
00763
00764
00765 }
00766 else
00767 {
00768
00769 phase_workc = (branch[jindexer].phases & 0x07);
00770
00771
00772 temp_index = -1;
00773 temp_size = -1;
00774
00775
00776 switch(bus[tempa].phases & 0x07)
00777 {
00778 case 0x01:
00779 {
00780 temp_size = 1;
00781
00782 if (phase_workc==0x01)
00783 {
00784
00785 temp_index = 0;
00786 }
00787 else if (phase_workc==0x02)
00788 {
00789 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00790
00791
00792
00793
00794
00795 }
00796 else
00797 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00798
00799 break;
00800 }
00801 case 0x02:
00802 {
00803 temp_size = 1;
00804
00805 if (phase_workc==0x01)
00806 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00807 else if (phase_workc==0x02)
00808 {
00809
00810 temp_index = 0;
00811 }
00812 else
00813 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00814
00815 break;
00816 }
00817 case 0x03:
00818 {
00819 temp_size = 2;
00820
00821 if (phase_workc==0x01)
00822 {
00823
00824 temp_index = 1;
00825 }
00826 else if (phase_workc==0x02)
00827 {
00828
00829 temp_index = 0;
00830 }
00831 else
00832 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00833
00834 break;
00835 }
00836 case 0x04:
00837 {
00838 temp_size = 1;
00839
00840 if (phase_workc==0x01)
00841 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00842 else if (phase_workc==0x02)
00843 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00844 else
00845 {
00846
00847 temp_index = 0;
00848 }
00849
00850 break;
00851 }
00852 case 0x05:
00853 {
00854 temp_size = 2;
00855
00856 if (phase_workc==0x01)
00857 {
00858
00859 temp_index = 1;
00860 }
00861 else if (phase_workc==0x02)
00862 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00863 else
00864 {
00865
00866 temp_index = 0;
00867 }
00868
00869 break;
00870 }
00871 case 0x06:
00872 {
00873 temp_size = 2;
00874
00875 if (phase_workc==0x01)
00876 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00877 else if (phase_workc==0x02)
00878 {
00879
00880 temp_index = 1;
00881 }
00882 else
00883 {
00884
00885 temp_index = 0;
00886 }
00887
00888 break;
00889 }
00890 case 0x07:
00891 {
00892 temp_size = 3;
00893
00894 if (phase_workc==0x01)
00895 {
00896
00897 temp_index = 2;
00898 }
00899 else if (phase_workc==0x02)
00900 {
00901
00902 temp_index = 1;
00903 }
00904 else
00905 {
00906
00907 temp_index = 0;
00908 }
00909
00910 break;
00911 }
00912 default:
00913 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00914 break;
00915 }
00916 if ((temp_index==-1) || (temp_size==-1))
00917 GL_THROW("NR: A center-tapped transformer has an invalid phase matching");
00918
00919
00920 if (phase_workc==0x01)
00921 {
00922 jindex=2;
00923 }
00924 else if (phase_workc==0x02)
00925 {
00926 jindex=1;
00927 }
00928 else
00929 {
00930 jindex=0;
00931 }
00932
00933
00934
00935 for (kindex=0; kindex<2; kindex++)
00936 {
00937
00938 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00939 {
00940 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index;
00941 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00942 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Im());
00943 indexer += 1;
00944
00945 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + temp_size;
00946 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00947 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yfrom[jindex*3+kindex]).Im();
00948 indexer += 1;
00949 }
00950
00951 if (((branch[jindexer].Yto[kindex*3+jindex]).Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00952 {
00953 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + kindex;
00954 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index;
00955 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[kindex*3+jindex]).Im());
00956 indexer += 1;
00957
00958 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00959 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + temp_size;
00960 Y_offdiag_PQ[indexer].Y_value = (branch[jindexer].Yto[kindex*3+jindex]).Im();
00961 indexer += 1;
00962 }
00963
00964 if (((branch[jindexer].Yfrom[jindex*3+kindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00965 {
00966 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + temp_size;
00967 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex;
00968 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00969 indexer += 1;
00970
00971 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index;
00972 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00973 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yfrom[jindex*3+kindex]).Re());
00974 indexer += 1;
00975 }
00976
00977 if (((branch[jindexer].Yto[kindex*3+jindex]).Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
00978 {
00979 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + kindex + 2;
00980 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index;
00981 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[kindex*3+jindex]).Re());
00982 indexer += 1;
00983
00984 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + kindex;
00985 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + temp_size;
00986 Y_offdiag_PQ[indexer].Y_value = -((branch[jindexer].Yto[kindex*3+jindex]).Re());
00987 indexer += 1;
00988 }
00989 }
00990
00991 }
00992 }
00993 else
00994 {
00995
00996 temp_index = temp_index_b = -1;
00997 temp_size = temp_size_b = temp_size_c = -1;
00998 Full_Mat_A = Full_Mat_B = false;
00999
01000
01001 switch(branch[jindexer].phases & 0x07) {
01002 case 0x01:
01003 {
01004 Temp_Ad_A[0][0] = branch[jindexer].Yfrom[8];
01005 Temp_Ad_B[0][0] = branch[jindexer].Yto[8];
01006 temp_size_c = 1;
01007 break;
01008 }
01009 case 0x02:
01010 {
01011 Temp_Ad_A[0][0] = branch[jindexer].Yfrom[4];
01012 Temp_Ad_B[0][0] = branch[jindexer].Yto[4];
01013 temp_size_c = 1;
01014 break;
01015 }
01016 case 0x03:
01017 {
01018 Temp_Ad_A[0][0] = branch[jindexer].Yfrom[4];
01019 Temp_Ad_A[0][1] = branch[jindexer].Yfrom[5];
01020 Temp_Ad_A[1][0] = branch[jindexer].Yfrom[7];
01021 Temp_Ad_A[1][1] = branch[jindexer].Yfrom[8];
01022
01023 Temp_Ad_B[0][0] = branch[jindexer].Yto[4];
01024 Temp_Ad_B[0][1] = branch[jindexer].Yto[5];
01025 Temp_Ad_B[1][0] = branch[jindexer].Yto[7];
01026 Temp_Ad_B[1][1] = branch[jindexer].Yto[8];
01027
01028 temp_size_c = 2;
01029 break;
01030 }
01031 case 0x04:
01032 {
01033 Temp_Ad_A[0][0] = branch[jindexer].Yfrom[0];
01034 Temp_Ad_B[0][0] = branch[jindexer].Yto[0];
01035 temp_size_c = 1;
01036 break;
01037 }
01038 case 0x05:
01039 {
01040 Temp_Ad_A[0][0] = branch[jindexer].Yfrom[0];
01041 Temp_Ad_A[0][1] = branch[jindexer].Yfrom[2];
01042 Temp_Ad_A[1][0] = branch[jindexer].Yfrom[6];
01043 Temp_Ad_A[1][1] = branch[jindexer].Yfrom[8];
01044
01045 Temp_Ad_B[0][0] = branch[jindexer].Yto[0];
01046 Temp_Ad_B[0][1] = branch[jindexer].Yto[2];
01047 Temp_Ad_B[1][0] = branch[jindexer].Yto[6];
01048 Temp_Ad_B[1][1] = branch[jindexer].Yto[8];
01049
01050 temp_size_c = 2;
01051 break;
01052 }
01053 case 0x06:
01054 {
01055 Temp_Ad_A[0][0] = branch[jindexer].Yfrom[0];
01056 Temp_Ad_A[0][1] = branch[jindexer].Yfrom[1];
01057 Temp_Ad_A[1][0] = branch[jindexer].Yfrom[3];
01058 Temp_Ad_A[1][1] = branch[jindexer].Yfrom[4];
01059
01060 Temp_Ad_B[0][0] = branch[jindexer].Yto[0];
01061 Temp_Ad_B[0][1] = branch[jindexer].Yto[1];
01062 Temp_Ad_B[1][0] = branch[jindexer].Yto[3];
01063 Temp_Ad_B[1][1] = branch[jindexer].Yto[4];
01064
01065 temp_size_c = 2;
01066 break;
01067 }
01068 default:
01069 {
01070 break;
01071 }
01072 }
01073
01074 if (temp_size_c==-1)
01075 {
01076 GL_THROW("NR: A line's phase was flagged as not full three-phase, but wasn't");
01077
01078
01079
01080
01081
01082 }
01083
01084
01085 switch(bus[tempa].phases & 0x07) {
01086 case 0x01:
01087 {
01088 if ((branch[jindexer].phases & 0x07) == 0x01)
01089 {
01090 temp_size = 1;
01091 temp_index = 0;
01092 }
01093 else
01094 {
01095 GL_THROW("NR: One of the lines has invalid phase parameters");
01096
01097
01098
01099
01100
01101 }
01102 break;
01103 }
01104 case 0x02:
01105 {
01106 if ((branch[jindexer].phases & 0x07) == 0x02)
01107 {
01108 temp_size = 1;
01109 temp_index = 0;
01110 }
01111 else
01112 {
01113 GL_THROW("NR: One of the lines has invalid phase parameters");
01114 }
01115 break;
01116 }
01117 case 0x03:
01118 {
01119 temp_size = 2;
01120 if ((branch[jindexer].phases & 0x07) == 0x01)
01121 {
01122 temp_index = 1;
01123 }
01124 else if ((branch[jindexer].phases & 0x07) == 0x02)
01125 {
01126 temp_index = 0;
01127 }
01128 else if ((branch[jindexer].phases & 0x07) == 0x03)
01129 {
01130 temp_index = 0;
01131 }
01132 else
01133 {
01134 GL_THROW("NR: One of the lines has invalid phase parameters");
01135 }
01136 break;
01137 }
01138 case 0x04:
01139 {
01140 if ((branch[jindexer].phases & 0x07) == 0x04)
01141 {
01142 temp_size = 1;
01143 temp_index = 0;
01144 }
01145 else
01146 {
01147 GL_THROW("NR: One of the lines has invalid phase parameters");
01148 }
01149 break;
01150 }
01151 case 0x05:
01152 {
01153 temp_size = 2;
01154 if ((branch[jindexer].phases & 0x07) == 0x01)
01155 {
01156 temp_index = 1;
01157 }
01158 else if ((branch[jindexer].phases & 0x07) == 0x04)
01159 {
01160 temp_index = 0;
01161 }
01162 else if ((branch[jindexer].phases & 0x07) == 0x05)
01163 {
01164 temp_index = 0;
01165 }
01166 else
01167 {
01168 GL_THROW("NR: One of the lines has invalid phase parameters");
01169 }
01170 break;
01171 }
01172 case 0x06:
01173 {
01174 temp_size = 2;
01175 if ((branch[jindexer].phases & 0x07) == 0x02)
01176 {
01177 temp_index = 1;
01178 }
01179 else if ((branch[jindexer].phases & 0x07) == 0x04)
01180 {
01181 temp_index = 0;
01182 }
01183 else if ((branch[jindexer].phases & 0x07) == 0x06)
01184 {
01185 temp_index = 0;
01186 }
01187 else
01188 {
01189 GL_THROW("NR: One of the lines has invalid phase parameters");
01190 }
01191 break;
01192 }
01193 case 0x07:
01194 {
01195 temp_size = 3;
01196 if ((branch[jindexer].phases & 0x07) == 0x01)
01197 {
01198 temp_index = 2;
01199 }
01200 else if ((branch[jindexer].phases & 0x07) == 0x02)
01201 {
01202 temp_index = 1;
01203 }
01204 else if ((branch[jindexer].phases & 0x07) == 0x03)
01205 {
01206 temp_index = 1;
01207 }
01208 else if ((branch[jindexer].phases & 0x07) == 0x04)
01209 {
01210 temp_index = 0;
01211 }
01212 else if ((branch[jindexer].phases & 0x07) == 0x05)
01213 {
01214 temp_index = 0;
01215 Full_Mat_A = true;
01216 }
01217 else if ((branch[jindexer].phases & 0x07) == 0x06)
01218 {
01219 temp_index = 0;
01220 }
01221 else
01222 {
01223 GL_THROW("NR: One of the lines has invalid phase parameters");
01224 }
01225 break;
01226 }
01227 default:
01228 {
01229 break;
01230 }
01231 }
01232
01233
01234 switch(bus[tempb].phases & 0x07) {
01235 case 0x01:
01236 {
01237 if ((branch[jindexer].phases & 0x07) == 0x01)
01238 {
01239 temp_size_b = 1;
01240 temp_index_b = 0;
01241 }
01242 else
01243 {
01244 GL_THROW("NR: One of the lines has invalid phase parameters");
01245
01246
01247
01248
01249
01250 }
01251 break;
01252 }
01253 case 0x02:
01254 {
01255 if ((branch[jindexer].phases & 0x07) == 0x02)
01256 {
01257 temp_size_b = 1;
01258 temp_index_b = 0;
01259 }
01260 else
01261 {
01262 GL_THROW("NR: One of the lines has invalid phase parameters");
01263 }
01264 break;
01265 }
01266 case 0x03:
01267 {
01268 temp_size_b = 2;
01269 if ((branch[jindexer].phases & 0x07) == 0x01)
01270 {
01271 temp_index_b = 1;
01272 }
01273 else if ((branch[jindexer].phases & 0x07) == 0x02)
01274 {
01275 temp_index_b = 0;
01276 }
01277 else if ((branch[jindexer].phases & 0x07) == 0x03)
01278 {
01279 temp_index_b = 0;
01280 }
01281 else
01282 {
01283 GL_THROW("NR: One of the lines has invalid phase parameters");
01284 }
01285 break;
01286 }
01287 case 0x04:
01288 {
01289 if ((branch[jindexer].phases & 0x07) == 0x04)
01290 {
01291 temp_size_b = 1;
01292 temp_index_b = 0;
01293 }
01294 else
01295 {
01296 GL_THROW("NR: One of the lines has invalid phase parameters");
01297 }
01298 break;
01299 }
01300 case 0x05:
01301 {
01302 temp_size_b = 2;
01303 if ((branch[jindexer].phases & 0x07) == 0x01)
01304 {
01305 temp_index_b = 1;
01306 }
01307 else if ((branch[jindexer].phases & 0x07) == 0x04)
01308 {
01309 temp_index_b = 0;
01310 }
01311 else if ((branch[jindexer].phases & 0x07) == 0x05)
01312 {
01313 temp_index_b = 0;
01314 }
01315 else
01316 {
01317 GL_THROW("NR: One of the lines has invalid phase parameters");
01318 }
01319 break;
01320 }
01321 case 0x06:
01322 {
01323 temp_size_b = 2;
01324 if ((branch[jindexer].phases & 0x07) == 0x02)
01325 {
01326 temp_index_b = 1;
01327 }
01328 else if ((branch[jindexer].phases & 0x07) == 0x04)
01329 {
01330 temp_index_b = 0;
01331 }
01332 else if ((branch[jindexer].phases & 0x07) == 0x06)
01333 {
01334 temp_index_b = 0;
01335 }
01336 else
01337 {
01338 GL_THROW("NR: One of the lines has invalid phase parameters");
01339 }
01340 break;
01341 }
01342 case 0x07:
01343 {
01344 temp_size_b = 3;
01345 if ((branch[jindexer].phases & 0x07) == 0x01)
01346 {
01347 temp_index_b = 2;
01348 }
01349 else if ((branch[jindexer].phases & 0x07) == 0x02)
01350 {
01351 temp_index_b = 1;
01352 }
01353 else if ((branch[jindexer].phases & 0x07) == 0x03)
01354 {
01355 temp_index_b = 1;
01356 }
01357 else if ((branch[jindexer].phases & 0x07) == 0x04)
01358 {
01359 temp_index_b = 0;
01360 }
01361 else if ((branch[jindexer].phases & 0x07) == 0x05)
01362 {
01363 temp_index_b = 0;
01364 Full_Mat_B = true;
01365 }
01366 else if ((branch[jindexer].phases & 0x07) == 0x06)
01367 {
01368 temp_index_b = 0;
01369 }
01370 else
01371 {
01372 GL_THROW("NR: One of the lines has invalid phase parameters");
01373 }
01374 break;
01375 }
01376 default:
01377 {
01378 break;
01379 }
01380 }
01381
01382
01383 if ((temp_index==-1) || (temp_index_b==-1) || (temp_size==-1) || (temp_size_b==-1) || (temp_size_c==-1))
01384 GL_THROW("NR: Failure to construct single/double phase line indices");
01385
01386
01387
01388
01389
01390 if (Full_Mat_A)
01391 {
01392 for (jindex=0; jindex<temp_size_c; jindex++)
01393 {
01394 for (kindex=0; kindex<temp_size_c; kindex++)
01395 {
01396
01397 if ((Temp_Ad_A[jindex][kindex].Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01398 {
01399 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex*2;
01400 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex;
01401 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Im());
01402 indexer += 1;
01403
01404 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex*2 + temp_size;
01405 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex + temp_size_b;
01406 Y_offdiag_PQ[indexer].Y_value = (Temp_Ad_A[jindex][kindex].Im());
01407 indexer += 1;
01408 }
01409
01410 if ((Temp_Ad_B[jindex][kindex].Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01411 {
01412 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex;
01413 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex*2;
01414 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Im());
01415 indexer += 1;
01416
01417 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex + temp_size_b;
01418 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex*2 + temp_size;
01419 Y_offdiag_PQ[indexer].Y_value = Temp_Ad_B[jindex][kindex].Im();
01420 indexer += 1;
01421 }
01422
01423 if ((Temp_Ad_A[jindex][kindex].Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01424 {
01425 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex*2 + temp_size;
01426 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex;
01427 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Re());
01428 indexer += 1;
01429
01430 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex*2;
01431 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex + temp_size_b;
01432 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Re());
01433 indexer += 1;
01434 }
01435
01436 if ((Temp_Ad_B[jindex][kindex].Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01437 {
01438 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex + temp_size_b;
01439 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex*2;
01440 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Re());
01441 indexer += 1;
01442
01443 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex;
01444 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex*2 + temp_size;
01445 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Re());
01446 indexer += 1;
01447 }
01448 }
01449 }
01450 }
01451
01452 if (Full_Mat_B)
01453 {
01454 for (jindex=0; jindex<temp_size_c; jindex++)
01455 {
01456 for (kindex=0; kindex<temp_size_c; kindex++)
01457 {
01458
01459 if ((Temp_Ad_A[jindex][kindex].Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01460 {
01461 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex;
01462 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex*2;
01463 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Im());
01464 indexer += 1;
01465
01466 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex + temp_size;
01467 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex*2 + temp_size_b;
01468 Y_offdiag_PQ[indexer].Y_value = (Temp_Ad_A[jindex][kindex].Im());
01469 indexer += 1;
01470 }
01471
01472 if ((Temp_Ad_B[jindex][kindex].Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01473 {
01474 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex*2;
01475 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex;
01476 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Im());
01477 indexer += 1;
01478
01479 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex*2 + temp_size_b;
01480 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex + temp_size;
01481 Y_offdiag_PQ[indexer].Y_value = Temp_Ad_B[jindex][kindex].Im();
01482 indexer += 1;
01483 }
01484
01485 if ((Temp_Ad_A[jindex][kindex].Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01486 {
01487 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex + temp_size;
01488 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex*2;
01489 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Re());
01490 indexer += 1;
01491
01492 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex;
01493 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex*2 + temp_size_b;
01494 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Re());
01495 indexer += 1;
01496 }
01497
01498 if ((Temp_Ad_B[jindex][kindex].Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01499 {
01500 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex*2 + temp_size_b;
01501 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex;
01502 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Re());
01503 indexer += 1;
01504
01505 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex*2;
01506 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex + temp_size;
01507 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Re());
01508 indexer += 1;
01509 }
01510 }
01511 }
01512 }
01513
01514 if ((!Full_Mat_A) && (!Full_Mat_B))
01515 {
01516 for (jindex=0; jindex<temp_size_c; jindex++)
01517 {
01518 for (kindex=0; kindex<temp_size_c; kindex++)
01519 {
01520
01521
01522 if ((Temp_Ad_A[jindex][kindex].Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01523 {
01524 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex;
01525 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex;
01526 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Im());
01527 indexer += 1;
01528
01529 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex + temp_size;
01530 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex + temp_size_b;
01531 Y_offdiag_PQ[indexer].Y_value = (Temp_Ad_A[jindex][kindex].Im());
01532 indexer += 1;
01533 }
01534
01535 if ((Temp_Ad_B[jindex][kindex].Im() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01536 {
01537 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex;
01538 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex;
01539 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Im());
01540 indexer += 1;
01541
01542 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex + temp_size_b;
01543 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex + temp_size;
01544 Y_offdiag_PQ[indexer].Y_value = Temp_Ad_B[jindex][kindex].Im();
01545 indexer += 1;
01546 }
01547
01548 if ((Temp_Ad_A[jindex][kindex].Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01549 {
01550 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex + temp_size;
01551 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex;
01552 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Re());
01553 indexer += 1;
01554
01555 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempa].Matrix_Loc + temp_index + jindex;
01556 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + kindex + temp_size_b;
01557 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_A[jindex][kindex].Re());
01558 indexer += 1;
01559 }
01560
01561 if ((Temp_Ad_B[jindex][kindex].Re() != 0) && (bus[tempa].type != 1) && (bus[tempb].type != 1))
01562 {
01563 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex + temp_size_b;
01564 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex;
01565 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Re());
01566 indexer += 1;
01567
01568 Y_offdiag_PQ[indexer].row_ind = 2*bus[tempb].Matrix_Loc + temp_index_b + jindex;
01569 Y_offdiag_PQ[indexer].col_ind = 2*bus[tempa].Matrix_Loc + temp_index + kindex + temp_size;
01570 Y_offdiag_PQ[indexer].Y_value = -(Temp_Ad_B[jindex][kindex].Re());
01571 indexer += 1;
01572 }
01573 }
01574 }
01575 }
01576 }
01577 }
01578
01579
01580 size_diag_fixed = 0;
01581 for (jindexer=0; jindexer<bus_count;jindexer++)
01582 {
01583 for (jindex=0; jindex<3; jindex++)
01584 {
01585 for (kindex=0; kindex<3; kindex++)
01586 {
01587 if ((BA_diag[jindexer].Y[jindex][kindex]).Re() != 0 && bus[jindexer].type != 1 && jindex!=kindex)
01588 size_diag_fixed += 1;
01589 if ((BA_diag[jindexer].Y[jindex][kindex]).Im() != 0 && bus[jindexer].type != 1 && jindex!=kindex)
01590 size_diag_fixed += 1;
01591 else {}
01592 }
01593 }
01594 }
01595 if (Y_diag_fixed == NULL)
01596 {
01597 Y_diag_fixed = (Y_NR *)gl_malloc((size_diag_fixed*2) *sizeof(Y_NR));
01598
01599
01600 if (Y_diag_fixed == NULL)
01601 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
01602
01603
01604 max_size_diag_fixed = size_diag_fixed;
01605 }
01606 else if (size_diag_fixed > max_size_diag_fixed)
01607 {
01608
01609 gl_free(Y_diag_fixed);
01610
01611
01612 Y_diag_fixed = (Y_NR *)gl_malloc((size_diag_fixed*2) *sizeof(Y_NR));
01613
01614
01615 if (Y_diag_fixed == NULL)
01616 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
01617
01618
01619 max_size_diag_fixed = size_diag_fixed;
01620
01621
01622 NR_realloc_needed = true;
01623 }
01624
01625 indexer = 0;
01626 for (jindexer=0; jindexer<bus_count;jindexer++)
01627 {
01628 for (jindex=0; jindex<BA_diag[jindexer].size; jindex++)
01629 {
01630 for (kindex=0; kindex<BA_diag[jindexer].size; kindex++)
01631 {
01632 if ((BA_diag[jindexer].Y[jindex][kindex]).Im() != 0 && bus[jindexer].type != 1 && jindex!=kindex)
01633 {
01634 Y_diag_fixed[indexer].row_ind = 2*BA_diag[jindexer].row_ind + jindex;
01635 Y_diag_fixed[indexer].col_ind = 2*BA_diag[jindexer].col_ind + kindex;
01636 Y_diag_fixed[indexer].Y_value = (BA_diag[jindexer].Y[jindex][kindex]).Im();
01637 indexer += 1;
01638
01639 Y_diag_fixed[indexer].row_ind = 2*BA_diag[jindexer].row_ind + jindex +BA_diag[jindexer].size;
01640 Y_diag_fixed[indexer].col_ind = 2*BA_diag[jindexer].col_ind + kindex +BA_diag[jindexer].size;
01641 Y_diag_fixed[indexer].Y_value = -(BA_diag[jindexer].Y[jindex][kindex]).Im();
01642 indexer += 1;
01643 }
01644
01645 if ((BA_diag[jindexer].Y[jindex][kindex]).Re() != 0 && bus[jindexer].type != 1 && jindex!=kindex)
01646 {
01647 Y_diag_fixed[indexer].row_ind = 2*BA_diag[jindexer].row_ind + jindex;
01648 Y_diag_fixed[indexer].col_ind = 2*BA_diag[jindexer].col_ind + kindex +BA_diag[jindexer].size;
01649 Y_diag_fixed[indexer].Y_value = (BA_diag[jindexer].Y[jindex][kindex]).Re();
01650 indexer += 1;
01651
01652 Y_diag_fixed[indexer].row_ind = 2*BA_diag[jindexer].row_ind + jindex +BA_diag[jindexer].size;
01653 Y_diag_fixed[indexer].col_ind = 2*BA_diag[jindexer].col_ind + kindex;
01654 Y_diag_fixed[indexer].Y_value = (BA_diag[jindexer].Y[jindex][kindex]).Re();
01655 indexer += 1;
01656 }
01657 }
01658 }
01659 }
01660 }
01661
01662
01663 for (Iteration=0; Iteration<NR_iteration_limit; Iteration++)
01664 {
01665
01666 for (indexer=0; indexer<bus_count; indexer++)
01667 {
01668 if ((bus[indexer].phases & 0x08) == 0x08)
01669 {
01670
01671 voltageDel[0] = bus[indexer].V[0] - bus[indexer].V[1];
01672 voltageDel[1] = bus[indexer].V[1] - bus[indexer].V[2];
01673 voltageDel[2] = bus[indexer].V[2] - bus[indexer].V[0];
01674
01675
01676 delta_current[0] = (voltageDel[0] == 0) ? 0 : ~(bus[indexer].S[0]/voltageDel[0]);
01677 delta_current[1] = (voltageDel[1] == 0) ? 0 : ~(bus[indexer].S[1]/voltageDel[1]);
01678 delta_current[2] = (voltageDel[2] == 0) ? 0 : ~(bus[indexer].S[2]/voltageDel[2]);
01679
01680
01681 delta_current[0] += voltageDel[0] * (bus[indexer].Y[0]);
01682 delta_current[1] += voltageDel[1] * (bus[indexer].Y[1]);
01683 delta_current[2] += voltageDel[2] * (bus[indexer].Y[2]);
01684
01685
01686 undeltacurr[0]=(bus[indexer].I[0]+delta_current[0])-(bus[indexer].I[2]+delta_current[2]);
01687 undeltacurr[1]=(bus[indexer].I[1]+delta_current[1])-(bus[indexer].I[0]+delta_current[0]);
01688 undeltacurr[2]=(bus[indexer].I[2]+delta_current[2])-(bus[indexer].I[1]+delta_current[1]);
01689
01690
01691 if ((bus[indexer].phases & 0x10) == 0x10)
01692 {
01693
01694 undeltacurr[0] += (bus[indexer].V[0] == 0) ? 0 : ~(bus[indexer].extra_var[0]/bus[indexer].V[0]);
01695 undeltacurr[1] += (bus[indexer].V[1] == 0) ? 0 : ~(bus[indexer].extra_var[1]/bus[indexer].V[1]);
01696 undeltacurr[2] += (bus[indexer].V[2] == 0) ? 0 : ~(bus[indexer].extra_var[2]/bus[indexer].V[2]);
01697
01698
01699 undeltacurr[0] += bus[indexer].extra_var[3]*bus[indexer].V[0];
01700 undeltacurr[1] += bus[indexer].extra_var[4]*bus[indexer].V[1];
01701 undeltacurr[2] += bus[indexer].extra_var[5]*bus[indexer].V[2];
01702
01703
01704 undeltacurr[0] += bus[indexer].extra_var[6];
01705 undeltacurr[1] += bus[indexer].extra_var[7];
01706 undeltacurr[2] += bus[indexer].extra_var[8];
01707 }
01708
01709
01710 for (jindex=0; jindex<3; jindex++)
01711 {
01712
01713 tempPbus = (undeltacurr[jindex]).Re() * (bus[indexer].V[jindex]).Re() + (undeltacurr[jindex]).Im() * (bus[indexer].V[jindex]).Im();
01714 bus[indexer].PL[jindex] = tempPbus;
01715
01716
01717 tempQbus = (undeltacurr[jindex]).Re() * (bus[indexer].V[jindex]).Im() - (undeltacurr[jindex]).Im() * (bus[indexer].V[jindex]).Re();
01718 bus[indexer].QL[jindex] = tempQbus;
01719 }
01720 }
01721 else if ((bus[indexer].phases & 0x80) == 0x80)
01722 {
01723
01724
01725 voltageDel[0] = bus[indexer].V[0] + bus[indexer].V[1];
01726
01727
01728 temp_current[0] = bus[indexer].I[0];
01729 temp_current[1] = bus[indexer].I[1];
01730 temp_current[2] = *bus[indexer].extra_var;
01731
01732
01733 temp_current[0] += bus[indexer].V[0] == 0.0 ? 0.0 : ~(bus[indexer].S[0]/bus[indexer].V[0]);
01734 temp_current[1] += bus[indexer].V[1] == 0.0 ? 0.0 : ~(bus[indexer].S[1]/bus[indexer].V[1]);
01735 temp_current[2] += voltageDel[0] == 0.0 ? 0.0 : ~(bus[indexer].S[2]/voltageDel[0]);
01736
01737
01738 temp_current[0] += bus[indexer].Y[0]*bus[indexer].V[0];
01739 temp_current[1] += bus[indexer].Y[1]*bus[indexer].V[1];
01740 temp_current[2] += bus[indexer].Y[2]*voltageDel[0];
01741
01742
01743 if ((bus[indexer].phases & 0x40) == 0x40)
01744 {
01745
01746 temp_store[0].SetPolar(1.0,bus[indexer].V[0].Arg());
01747 temp_store[1].SetPolar(1.0,bus[indexer].V[1].Arg());
01748 temp_store[2].SetPolar(1.0,voltageDel[0].Arg());
01749
01750
01751 delta_current[0] = bus[indexer].house_var[0]/(~temp_store[0]);
01752 delta_current[1] = bus[indexer].house_var[1]/(~temp_store[1]);
01753 delta_current[2] = bus[indexer].house_var[2]/(~temp_store[2]);
01754
01755
01756 temp_current[0] += delta_current[0];
01757 temp_current[1] += delta_current[1];
01758 temp_current[2] += delta_current[2];
01759 }
01760
01761
01762 temp_store[0] = temp_current[0] + temp_current[2];
01763 temp_store[1] = -temp_current[1] - temp_current[2];
01764
01765
01766 bus[indexer].PL[0] = temp_store[0].Re();
01767 bus[indexer].QL[0] = temp_store[0].Im();
01768
01769 bus[indexer].PL[1] = temp_store[1].Re();
01770 bus[indexer].QL[1] = temp_store[1].Im();
01771 }
01772 else
01773 {
01774
01775 temp_index = -1;
01776 temp_index_b = -1;
01777
01778 if ((bus[indexer].phases & 0x10) == 0x10)
01779 {
01780
01781 voltageDel[0] = bus[indexer].V[0] - bus[indexer].V[1];
01782 voltageDel[1] = bus[indexer].V[1] - bus[indexer].V[2];
01783 voltageDel[2] = bus[indexer].V[2] - bus[indexer].V[0];
01784
01785
01786 delta_current[0] = (voltageDel[0] == 0) ? 0 : ~(bus[indexer].extra_var[0]/voltageDel[0]);
01787 delta_current[1] = (voltageDel[1] == 0) ? 0 : ~(bus[indexer].extra_var[1]/voltageDel[1]);
01788 delta_current[2] = (voltageDel[2] == 0) ? 0 : ~(bus[indexer].extra_var[2]/voltageDel[2]);
01789
01790
01791 delta_current[0] += voltageDel[0] * (bus[indexer].extra_var[3]);
01792 delta_current[1] += voltageDel[1] * (bus[indexer].extra_var[4]);
01793 delta_current[2] += voltageDel[2] * (bus[indexer].extra_var[5]);
01794
01795
01796 undeltacurr[0]=(bus[indexer].extra_var[6]+delta_current[0])-(bus[indexer].extra_var[8]+delta_current[2]);
01797 undeltacurr[1]=(bus[indexer].extra_var[7]+delta_current[1])-(bus[indexer].extra_var[6]+delta_current[0]);
01798 undeltacurr[2]=(bus[indexer].extra_var[8]+delta_current[2])-(bus[indexer].extra_var[7]+delta_current[1]);
01799 }
01800 else
01801 {
01802 undeltacurr[0] = undeltacurr[1] = undeltacurr[2] = 0.0;
01803 }
01804
01805 for (jindex=0; jindex<BA_diag[indexer].size; jindex++)
01806 {
01807 switch(bus[indexer].phases & 0x07) {
01808 case 0x01:
01809 {
01810 temp_index=0;
01811 temp_index_b=2;
01812 break;
01813 }
01814 case 0x02:
01815 {
01816 temp_index=0;
01817 temp_index_b=1;
01818 break;
01819 }
01820 case 0x03:
01821 {
01822 if (jindex==0)
01823 {
01824 temp_index=0;
01825 temp_index_b=1;
01826 }
01827 else
01828 {
01829 temp_index=1;
01830 temp_index_b=2;
01831 }
01832 break;
01833 }
01834 case 0x04:
01835 {
01836 temp_index=0;
01837 temp_index_b=0;
01838 break;
01839 }
01840 case 0x05:
01841 {
01842 if (jindex==0)
01843 {
01844 temp_index=0;
01845 temp_index_b=0;
01846 }
01847 else
01848 {
01849 temp_index=1;
01850 temp_index_b=2;
01851 }
01852 break;
01853 }
01854 case 0x06:
01855 case 0x07:
01856 {
01857 temp_index=jindex;
01858 temp_index_b=jindex;
01859 break;
01860 }
01861 default:
01862 break;
01863 }
01864
01865 if ((temp_index==-1) || (temp_index_b==-1))
01866 {
01867 GL_THROW("NR: A scheduled power update element failed.");
01868
01869
01870
01871
01872
01873 }
01874
01875
01876 tempPbus = (bus[indexer].S[temp_index_b]).Re();
01877 tempPbus += (bus[indexer].I[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Re() + (bus[indexer].I[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Im();
01878 tempPbus += (undeltacurr[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Re() + (undeltacurr[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Im();
01879 tempPbus += (bus[indexer].Y[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Re() + (bus[indexer].Y[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Im();
01880 bus[indexer].PL[temp_index] = tempPbus;
01881
01882
01883 tempQbus = (bus[indexer].S[temp_index_b]).Im();
01884 tempQbus += (bus[indexer].I[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Im() - (bus[indexer].I[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Re();
01885 tempQbus += (undeltacurr[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Im() - (undeltacurr[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Re();
01886 tempQbus += -(bus[indexer].Y[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Im() - (bus[indexer].Y[temp_index_b]).Im() * (bus[indexer].V[temp_index_b]).Re() * (bus[indexer].V[temp_index_b]).Re();
01887 bus[indexer].QL[temp_index] = tempQbus;
01888
01889 }
01890 }
01891 }
01892
01893
01894
01895 if (deltaI_NR==NULL)
01896 {
01897 deltaI_NR = (double *)gl_malloc((2*total_variables) *sizeof(double));
01898
01899
01900 if (deltaI_NR == NULL)
01901 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
01902
01903
01904 max_total_variables = total_variables;
01905 }
01906 else if (NR_realloc_needed)
01907 {
01908
01909 gl_free(deltaI_NR);
01910
01911
01912 deltaI_NR = (double *)gl_malloc((2*total_variables) *sizeof(double));
01913
01914
01915 if (deltaI_NR == NULL)
01916 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
01917
01918
01919 max_total_variables = total_variables;
01920 }
01921
01922
01923 for (indexer=0; indexer<bus_count; indexer++)
01924 {
01925 for (jindex=0; jindex<BA_diag[indexer].size; jindex++)
01926 {
01927 tempIcalcReal = tempIcalcImag = 0;
01928
01929 if ((bus[indexer].phases & 0x80) == 0x80)
01930 {
01931
01932
01933 if ((bus[indexer].phases & 0x20) == 0x20)
01934 {
01935
01936 tempPbus = bus[indexer].PL[jindex];
01937 tempQbus = bus[indexer].QL[jindex];
01938 }
01939 else
01940 {
01941
01942 tempPbus = -bus[indexer].PL[jindex];
01943 tempQbus = -bus[indexer].QL[jindex];
01944 }
01945
01946
01947
01948 tempIcalcReal += (BA_diag[indexer].Y[jindex][0]).Re() * (bus[indexer].V[0]).Re() - (BA_diag[indexer].Y[jindex][0]).Im() * (bus[indexer].V[0]).Im();
01949 tempIcalcImag += (BA_diag[indexer].Y[jindex][0]).Re() * (bus[indexer].V[0]).Im() + (BA_diag[indexer].Y[jindex][0]).Im() * (bus[indexer].V[0]).Re();
01950
01951
01952 tempIcalcReal += (BA_diag[indexer].Y[jindex][1]).Re() * (bus[indexer].V[1]).Re() - (BA_diag[indexer].Y[jindex][1]).Im() * (bus[indexer].V[1]).Im();
01953 tempIcalcImag += (BA_diag[indexer].Y[jindex][1]).Re() * (bus[indexer].V[1]).Im() + (BA_diag[indexer].Y[jindex][1]).Im() * (bus[indexer].V[1]).Re();
01954
01955
01956 for (kindexer=0; kindexer<(bus[indexer].Link_Table_Size); kindexer++)
01957 {
01958
01959 jindexer=bus[indexer].Link_Table[kindexer];
01960
01961 if (branch[jindexer].from == indexer)
01962 {
01963 if ((bus[indexer].phases & 0x20) == 0x20)
01964 {
01965 work_vals_char_0 = jindex*3;
01966
01967
01968
01969
01970 tempIcalcReal += ((branch[jindexer].Yfrom[work_vals_char_0])).Re() * (bus[branch[jindexer].to].V[0]).Re() - ((branch[jindexer].Yfrom[work_vals_char_0])).Im() * (bus[branch[jindexer].to].V[0]).Im();
01971 tempIcalcImag += ((branch[jindexer].Yfrom[work_vals_char_0])).Re() * (bus[branch[jindexer].to].V[0]).Im() + ((branch[jindexer].Yfrom[work_vals_char_0])).Im() * (bus[branch[jindexer].to].V[0]).Re();
01972
01973
01974 tempIcalcReal += ((branch[jindexer].Yfrom[jindex*3+1])).Re() * (bus[branch[jindexer].to].V[1]).Re() - ((branch[jindexer].Yfrom[jindex*3+1])).Im() * (bus[branch[jindexer].to].V[1]).Im();
01975 tempIcalcImag += ((branch[jindexer].Yfrom[jindex*3+1])).Re() * (bus[branch[jindexer].to].V[1]).Im() + ((branch[jindexer].Yfrom[jindex*3+1])).Im() * (bus[branch[jindexer].to].V[1]).Re();
01976
01977 }
01978 else
01979 {
01980 work_vals_char_0 = jindex*3;
01981
01982
01983
01984 tempIcalcReal += (-(branch[jindexer].Yfrom[work_vals_char_0])).Re() * (bus[branch[jindexer].to].V[0]).Re() - (-(branch[jindexer].Yfrom[work_vals_char_0])).Im() * (bus[branch[jindexer].to].V[0]).Im();
01985 tempIcalcImag += (-(branch[jindexer].Yfrom[work_vals_char_0])).Re() * (bus[branch[jindexer].to].V[0]).Im() + (-(branch[jindexer].Yfrom[work_vals_char_0])).Im() * (bus[branch[jindexer].to].V[0]).Re();
01986
01987
01988 tempIcalcReal += (-(branch[jindexer].Yfrom[jindex*3+1])).Re() * (bus[branch[jindexer].to].V[1]).Re() - (-(branch[jindexer].Yfrom[jindex*3+1])).Im() * (bus[branch[jindexer].to].V[1]).Im();
01989 tempIcalcImag += (-(branch[jindexer].Yfrom[jindex*3+1])).Re() * (bus[branch[jindexer].to].V[1]).Im() + (-(branch[jindexer].Yfrom[jindex*3+1])).Im() * (bus[branch[jindexer].to].V[1]).Re();
01990
01991 }
01992 }
01993 else if (branch[jindexer].to == indexer)
01994 {
01995 if (branch[jindexer].v_ratio != 1.0)
01996 {
01997
01998 if ((branch[jindexer].phases & 0x01) == 0x01)
01999 {
02000 temp_index=2;
02001 }
02002 else if ((branch[jindexer].phases & 0x02) == 0x02)
02003 {
02004 temp_index=1;
02005 }
02006 else if ((branch[jindexer].phases & 0x04) == 0x04)
02007 {
02008 temp_index=0;
02009 }
02010 else
02011 {
02012 GL_THROW("NR: A split-phase transformer appears to have an invalid phase");
02013 }
02014
02015 work_vals_char_0 = jindex*3+temp_index;
02016
02017
02018 tempIcalcReal += (-(branch[jindexer].Yto[work_vals_char_0])).Re() * (bus[branch[jindexer].from].V[temp_index]).Re() - (-(branch[jindexer].Yto[work_vals_char_0])).Im() * (bus[branch[jindexer].from].V[temp_index]).Im();
02019 tempIcalcImag += (-(branch[jindexer].Yto[work_vals_char_0])).Re() * (bus[branch[jindexer].from].V[temp_index]).Im() + (-(branch[jindexer].Yto[work_vals_char_0])).Im() * (bus[branch[jindexer].from].V[temp_index]).Re();
02020
02021 }
02022 else
02023 {
02024 if ((bus[indexer].phases & 0x20) == 0x20)
02025 {
02026 work_vals_char_0 = jindex*3;
02027
02028
02029
02030 tempIcalcReal += ((branch[jindexer].Yto[work_vals_char_0])).Re() * (bus[branch[jindexer].from].V[0]).Re() - ((branch[jindexer].Yto[work_vals_char_0])).Im() * (bus[branch[jindexer].from].V[0]).Im();
02031 tempIcalcImag += ((branch[jindexer].Yto[work_vals_char_0])).Re() * (bus[branch[jindexer].from].V[0]).Im() + ((branch[jindexer].Yto[work_vals_char_0])).Im() * (bus[branch[jindexer].from].V[0]).Re();
02032
02033
02034 tempIcalcReal += ((branch[jindexer].Yto[work_vals_char_0+1])).Re() * (bus[branch[jindexer].from].V[1]).Re() - ((branch[jindexer].Yto[work_vals_char_0+1])).Im() * (bus[branch[jindexer].from].V[1]).Im();
02035 tempIcalcImag += ((branch[jindexer].Yto[work_vals_char_0+1])).Re() * (bus[branch[jindexer].from].V[1]).Im() + ((branch[jindexer].Yto[work_vals_char_0+1])).Im() * (bus[branch[jindexer].from].V[1]).Re();
02036 }
02037 else
02038 {
02039 work_vals_char_0 = jindex*3;
02040
02041
02042 tempIcalcReal += (-(branch[jindexer].Yto[work_vals_char_0])).Re() * (bus[branch[jindexer].from].V[0]).Re() - (-(branch[jindexer].Yto[work_vals_char_0])).Im() * (bus[branch[jindexer].from].V[0]).Im();
02043 tempIcalcImag += (-(branch[jindexer].Yto[work_vals_char_0])).Re() * (bus[branch[jindexer].from].V[0]).Im() + (-(branch[jindexer].Yto[work_vals_char_0])).Im() * (bus[branch[jindexer].from].V[0]).Re();
02044
02045
02046 tempIcalcReal += (-(branch[jindexer].Yto[work_vals_char_0+1])).Re() * (bus[branch[jindexer].from].V[1]).Re() - (-(branch[jindexer].Yto[work_vals_char_0+1])).Im() * (bus[branch[jindexer].from].V[1]).Im();
02047 tempIcalcImag += (-(branch[jindexer].Yto[work_vals_char_0+1])).Re() * (bus[branch[jindexer].from].V[1]).Im() + (-(branch[jindexer].Yto[work_vals_char_0+1])).Im() * (bus[branch[jindexer].from].V[1]).Re();
02048 }
02049 }
02050 }
02051 else
02052 ;
02053
02054 }
02055
02056
02057 deltaI_NR[2*bus[indexer].Matrix_Loc+ BA_diag[indexer].size + jindex] = tempPbus - tempIcalcReal;
02058 deltaI_NR[2*bus[indexer].Matrix_Loc + jindex] = tempQbus - tempIcalcImag;
02059 }
02060 else
02061 {
02062 tempPbus = - bus[indexer].PL[jindex];
02063 tempQbus = - bus[indexer].QL[jindex];
02064
02065 for (kindex=0; kindex<BA_diag[indexer].size; kindex++)
02066 {
02067
02068 temp_index = -1;
02069 switch(bus[indexer].phases & 0x07) {
02070 case 0x01:
02071 {
02072 temp_index=2;
02073 break;
02074 }
02075 case 0x02:
02076 {
02077 temp_index=1;
02078 break;
02079 }
02080 case 0x03:
02081 {
02082 if (kindex==0)
02083 temp_index=1;
02084 else
02085 temp_index=2;
02086 break;
02087 }
02088 case 0x04:
02089 {
02090 temp_index=0;
02091 break;
02092 }
02093 case 0x05:
02094 {
02095 if (kindex==0)
02096 temp_index=0;
02097 else
02098 temp_index=2;
02099 break;
02100 }
02101 case 0x06:
02102 {
02103 if (kindex==0)
02104 temp_index=0;
02105 else
02106 temp_index=1;
02107 break;
02108 }
02109 case 0x07:
02110 {
02111 temp_index = kindex;
02112 break;
02113 }
02114 }
02115
02116 if (temp_index==-1)
02117 {
02118 GL_THROW("NR: A voltage index failed to be found.");
02119
02120
02121
02122
02123 }
02124
02125
02126 tempIcalcReal += (BA_diag[indexer].Y[jindex][kindex]).Re() * (bus[indexer].V[temp_index]).Re() - (BA_diag[indexer].Y[jindex][kindex]).Im() * (bus[indexer].V[temp_index]).Im();
02127 tempIcalcImag += (BA_diag[indexer].Y[jindex][kindex]).Re() * (bus[indexer].V[temp_index]).Im() + (BA_diag[indexer].Y[jindex][kindex]).Im() * (bus[indexer].V[temp_index]).Re();
02128
02129
02130
02131
02132 temp_index_b = -1;
02133 switch(bus[indexer].phases & 0x07) {
02134 case 0x01:
02135 {
02136 temp_index_b=2;
02137 break;
02138 }
02139 case 0x02:
02140 {
02141 temp_index_b=1;
02142 break;
02143 }
02144 case 0x03:
02145 {
02146 if (jindex==0)
02147 temp_index_b=1;
02148 else
02149 temp_index_b=2;
02150 break;
02151 }
02152 case 0x04:
02153 {
02154 temp_index_b=0;
02155 break;
02156 }
02157 case 0x05:
02158 {
02159 if (jindex==0)
02160 temp_index_b=0;
02161 else
02162 temp_index_b=2;
02163 break;
02164 }
02165 case 0x06:
02166 {
02167 if (jindex==0)
02168 temp_index_b=0;
02169 else
02170 temp_index_b=1;
02171 break;
02172 }
02173 case 0x07:
02174 {
02175 temp_index_b = jindex;
02176 break;
02177 }
02178 }
02179
02180 if (temp_index_b==-1)
02181 {
02182 GL_THROW("NR: A voltage index failed to be found.");
02183 }
02184
02185 for (kindexer=0; kindexer<(bus[indexer].Link_Table_Size); kindexer++)
02186 {
02187
02188 jindexer=bus[indexer].Link_Table[kindexer];
02189
02190 if (branch[jindexer].from == indexer)
02191 {
02192
02193 if ((branch[jindexer].phases & 0x80) == 0x80)
02194 {
02195 proceed_flag = false;
02196 phase_worka = branch[jindexer].phases & 0x07;
02197
02198 if (kindex==0)
02199 {
02200 switch (bus[indexer].phases & 0x07) {
02201 case 0x01:
02202 {
02203 if (phase_worka==0x01)
02204 proceed_flag=true;
02205 break;
02206 }
02207 case 0x02:
02208 {
02209 if (phase_worka==0x02)
02210 proceed_flag=true;
02211 break;
02212 }
02213 case 0x03:
02214 {
02215 if ((jindex==0) && (phase_worka==0x02))
02216 proceed_flag=true;
02217 else if ((jindex==1) && (phase_worka==0x01))
02218 proceed_flag=true;
02219 else
02220 ;
02221 break;
02222 }
02223 case 0x04:
02224 {
02225 if (phase_worka==0x04)
02226 proceed_flag=true;
02227 break;
02228 }
02229 case 0x05:
02230 {
02231 if ((jindex==0) && (phase_worka==0x04))
02232 proceed_flag=true;
02233 else if ((jindex==1) && (phase_worka==0x01))
02234 proceed_flag=true;
02235 else
02236 ;
02237 break;
02238 }
02239 case 0x06:
02240 case 0x07:
02241 {
02242 if ((jindex==0) && (phase_worka==0x04))
02243 proceed_flag=true;
02244 else if ((jindex==1) && (phase_worka==0x02))
02245 proceed_flag=true;
02246 else if ((jindex==2) && (phase_worka==0x01))
02247 proceed_flag=true;
02248 else;
02249 break;
02250 }
02251 }
02252 }
02253
02254 if (proceed_flag)
02255 {
02256 work_vals_char_0 = temp_index_b*3;
02257
02258
02259 tempIcalcReal += (-(branch[jindexer].Yfrom[work_vals_char_0])).Re() * (bus[branch[jindexer].to].V[0]).Re() - (-(branch[jindexer].Yfrom[work_vals_char_0])).Im() * (bus[branch[jindexer].to].V[0]).Im();
02260 tempIcalcImag += (-(branch[jindexer].Yfrom[work_vals_char_0])).Re() * (bus[branch[jindexer].to].V[0]).Im() + (-(branch[jindexer].Yfrom[work_vals_char_0])).Im() * (bus[branch[jindexer].to].V[0]).Re();
02261
02262
02263 tempIcalcReal += (-(branch[jindexer].Yfrom[work_vals_char_0+1])).Re() * (bus[branch[jindexer].to].V[1]).Re() - (-(branch[jindexer].Yfrom[work_vals_char_0+1])).Im() * (bus[branch[jindexer].to].V[1]).Im();
02264 tempIcalcImag += (-(branch[jindexer].Yfrom[work_vals_char_0+1])).Re() * (bus[branch[jindexer].to].V[1]).Im() + (-(branch[jindexer].Yfrom[work_vals_char_0+1])).Im() * (bus[branch[jindexer].to].V[1]).Re();
02265
02266 }
02267 }
02268 else
02269 {
02270 work_vals_char_0 = temp_index_b*3+temp_index;
02271 work_vals_double_0 = (-branch[jindexer].Yfrom[work_vals_char_0]).Re();
02272 work_vals_double_1 = (-branch[jindexer].Yfrom[work_vals_char_0]).Im();
02273 work_vals_double_2 = (bus[branch[jindexer].to].V[temp_index]).Re();
02274 work_vals_double_3 = (bus[branch[jindexer].to].V[temp_index]).Im();
02275
02276 tempIcalcReal += work_vals_double_0 * work_vals_double_2 - work_vals_double_1 * work_vals_double_3;
02277 tempIcalcImag += work_vals_double_0 * work_vals_double_3 + work_vals_double_1 * work_vals_double_2;
02278
02279 }
02280
02281 }
02282 if (branch[jindexer].to == indexer)
02283 {
02284 work_vals_char_0 = temp_index_b*3+temp_index;
02285 work_vals_double_0 = (-branch[jindexer].Yto[work_vals_char_0]).Re();
02286 work_vals_double_1 = (-branch[jindexer].Yto[work_vals_char_0]).Im();
02287 work_vals_double_2 = (bus[branch[jindexer].from].V[temp_index]).Re();
02288 work_vals_double_3 = (bus[branch[jindexer].from].V[temp_index]).Im();
02289
02290 tempIcalcReal += work_vals_double_0 * work_vals_double_2 - work_vals_double_1 * work_vals_double_3;
02291 tempIcalcImag += work_vals_double_0 * work_vals_double_3 + work_vals_double_1 * work_vals_double_2;
02292
02293 }
02294 else;
02295
02296 }
02297 }
02298 work_vals_double_0 = (bus[indexer].V[temp_index_b]).Mag()*(bus[indexer].V[temp_index_b]).Mag();
02299
02300 if (work_vals_double_0!=0)
02301 {
02302 work_vals_double_1 = (bus[indexer].V[temp_index_b]).Re();
02303 work_vals_double_2 = (bus[indexer].V[temp_index_b]).Im();
02304 deltaI_NR[2*bus[indexer].Matrix_Loc+ BA_diag[indexer].size + jindex] = (tempPbus * work_vals_double_1 + tempQbus * work_vals_double_2)/ (work_vals_double_0) - tempIcalcReal ;
02305 deltaI_NR[2*bus[indexer].Matrix_Loc + jindex] = (tempPbus * work_vals_double_2 - tempQbus * work_vals_double_1)/ (work_vals_double_0) - tempIcalcImag;
02306 }
02307 else
02308 {
02309 deltaI_NR[2*bus[indexer].Matrix_Loc+BA_diag[indexer].size + jindex] = 0.0;
02310 deltaI_NR[2*bus[indexer].Matrix_Loc + jindex] = 0.0;
02311 }
02312 }
02313 }
02314 }
02315
02316
02317 for (indexer=0; indexer<bus_count; indexer++)
02318 {
02319 if ((bus[indexer].phases & 0x08) == 0x08)
02320 {
02321
02322 voltageDel[0] = bus[indexer].V[0] - bus[indexer].V[1];
02323 voltageDel[1] = bus[indexer].V[1] - bus[indexer].V[2];
02324 voltageDel[2] = bus[indexer].V[2] - bus[indexer].V[0];
02325
02326
02327 delta_current[0] = (voltageDel[0] == 0) ? 0 : ~(bus[indexer].S[0]/voltageDel[0]);
02328 delta_current[1] = (voltageDel[1] == 0) ? 0 : ~(bus[indexer].S[1]/voltageDel[1]);
02329 delta_current[2] = (voltageDel[2] == 0) ? 0 : ~(bus[indexer].S[2]/voltageDel[2]);
02330
02331
02332 undeltapower[0] = undeltapower[1] = undeltapower[2] = 0.0;
02333
02334
02335 delta_current[0] += voltageDel[0] * (bus[indexer].Y[0]);
02336 delta_current[1] += voltageDel[1] * (bus[indexer].Y[1]);
02337 delta_current[2] += voltageDel[2] * (bus[indexer].Y[2]);
02338
02339
02340 undeltacurr[0]=(bus[indexer].I[0]+delta_current[0])-(bus[indexer].I[2]+delta_current[2]);
02341 undeltacurr[1]=(bus[indexer].I[1]+delta_current[1])-(bus[indexer].I[0]+delta_current[0]);
02342 undeltacurr[2]=(bus[indexer].I[2]+delta_current[2])-(bus[indexer].I[1]+delta_current[1]);
02343
02344
02345 if ((bus[indexer].phases & 0x10) == 0x10)
02346 {
02347
02348 undeltacurr[0] += (bus[indexer].V[0] == 0) ? 0 : ~(bus[indexer].extra_var[0]/bus[indexer].V[0]);
02349 undeltacurr[1] += (bus[indexer].V[1] == 0) ? 0 : ~(bus[indexer].extra_var[1]/bus[indexer].V[1]);
02350 undeltacurr[2] += (bus[indexer].V[2] == 0) ? 0 : ~(bus[indexer].extra_var[2]/bus[indexer].V[2]);
02351
02352
02353 undeltacurr[0] += bus[indexer].extra_var[3]*bus[indexer].V[0];
02354 undeltacurr[1] += bus[indexer].extra_var[4]*bus[indexer].V[1];
02355 undeltacurr[2] += bus[indexer].extra_var[5]*bus[indexer].V[2];
02356
02357
02358 undeltacurr[0] += bus[indexer].extra_var[6];
02359 undeltacurr[1] += bus[indexer].extra_var[7];
02360 undeltacurr[2] += bus[indexer].extra_var[8];
02361 }
02362
02363 for (jindex=0; jindex<3; jindex++)
02364 {
02365 if ((bus[indexer].V[jindex]).Mag()!=0)
02366 {
02367 bus[indexer].Jacob_A[jindex] = ((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(undeltacurr[jindex]).Re() + (undeltacurr[jindex]).Im() *pow((bus[indexer].V[jindex]).Im(),2))/pow((bus[indexer].V[jindex]).Mag(),3) + (undeltaimped[jindex]).Im();
02368 bus[indexer].Jacob_B[jindex] = -((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(undeltacurr[jindex]).Im() + (undeltacurr[jindex]).Re() *pow((bus[indexer].V[jindex]).Re(),2))/pow((bus[indexer].V[jindex]).Mag(),3) - (undeltaimped[jindex]).Re();
02369 bus[indexer].Jacob_C[jindex] =((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(undeltacurr[jindex]).Im() - (undeltacurr[jindex]).Re() *pow((bus[indexer].V[jindex]).Im(),2))/pow((bus[indexer].V[jindex]).Mag(),3) - (undeltaimped[jindex]).Re();
02370 bus[indexer].Jacob_D[jindex] = ((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(undeltacurr[jindex]).Re() - (undeltacurr[jindex]).Im() *pow((bus[indexer].V[jindex]).Re(),2))/pow((bus[indexer].V[jindex]).Mag(),3) - (undeltaimped[jindex]).Im();
02371 }
02372 else
02373 {
02374 bus[indexer].Jacob_A[jindex] = (undeltaimped[jindex]).Im() - 1e-4;
02375 bus[indexer].Jacob_B[jindex] = -(undeltaimped[jindex]).Re() - 1e-4;
02376 bus[indexer].Jacob_C[jindex] = -(undeltaimped[jindex]).Re() - 1e-4;
02377 bus[indexer].Jacob_D[jindex] = -(undeltaimped[jindex]).Im() - 1e-4;
02378 }
02379 }
02380 }
02381 else if ((bus[indexer].phases & 0x80) == 0x80)
02382 {
02383
02384
02385 voltageDel[0] = bus[indexer].V[0] + bus[indexer].V[1];
02386
02387
02388 temp_current[0] = bus[indexer].I[0];
02389 temp_current[1] = bus[indexer].I[1];
02390 temp_current[2] = *bus[indexer].extra_var;
02391
02392
02393 temp_current[0] += bus[indexer].V[0] == 0.0 ? 0.0 : ~(bus[indexer].S[0]/bus[indexer].V[0]);
02394 temp_current[1] += bus[indexer].V[1] == 0.0 ? 0.0 : ~(bus[indexer].S[1]/bus[indexer].V[1]);
02395 temp_current[2] += voltageDel[0] == 0.0 ? 0.0 : ~(bus[indexer].S[2]/voltageDel[0]);
02396
02397
02398 temp_current[0] += bus[indexer].Y[0]*bus[indexer].V[0];
02399 temp_current[1] += bus[indexer].Y[1]*bus[indexer].V[1];
02400 temp_current[2] += bus[indexer].Y[2]*voltageDel[0];
02401
02402
02403 if ((bus[indexer].phases & 0x40) == 0x40)
02404 {
02405
02406 temp_store[0].SetPolar(1.0,bus[indexer].V[0].Arg());
02407 temp_store[1].SetPolar(1.0,bus[indexer].V[1].Arg());
02408 temp_store[2].SetPolar(1.0,voltageDel[0].Arg());
02409
02410
02411 delta_current[0] = bus[indexer].house_var[0]/(~temp_store[0]);
02412 delta_current[1] = bus[indexer].house_var[1]/(~temp_store[1]);
02413 delta_current[2] = bus[indexer].house_var[2]/(~temp_store[2]);
02414
02415
02416 temp_current[0] += delta_current[0];
02417 temp_current[1] += delta_current[1];
02418 temp_current[2] += delta_current[2];
02419 }
02420
02421
02422 temp_store[0] = -(temp_current[0] + temp_current[2]);
02423 temp_store[1] = -(-temp_current[1] - temp_current[2]);
02424
02425 for (jindex=0; jindex<2; jindex++)
02426 {
02427 if ((bus[indexer].V[jindex]).Mag()!=0)
02428 {
02429 bus[indexer].Jacob_A[jindex] = ((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(temp_store[jindex]).Re() + (temp_store[jindex]).Im() *pow((bus[indexer].V[jindex]).Im(),2))/pow((bus[indexer].V[jindex]).Mag(),3);
02430 bus[indexer].Jacob_B[jindex] = -((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(temp_store[jindex]).Im() + (temp_store[jindex]).Re() *pow((bus[indexer].V[jindex]).Re(),2))/pow((bus[indexer].V[jindex]).Mag(),3);
02431 bus[indexer].Jacob_C[jindex] =((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(temp_store[jindex]).Im() - (temp_store[jindex]).Re() *pow((bus[indexer].V[jindex]).Im(),2))/pow((bus[indexer].V[jindex]).Mag(),3);
02432 bus[indexer].Jacob_D[jindex] = ((bus[indexer].V[jindex]).Re()*(bus[indexer].V[jindex]).Im()*(temp_store[jindex]).Re() - (temp_store[jindex]).Im() *pow((bus[indexer].V[jindex]).Re(),2))/pow((bus[indexer].V[jindex]).Mag(),3);
02433 }
02434 else
02435 {
02436 bus[indexer].Jacob_A[jindex]= -1e-4;
02437 bus[indexer].Jacob_B[jindex]= -1e-4;
02438 bus[indexer].Jacob_C[jindex]= -1e-4;
02439 bus[indexer].Jacob_D[jindex]= -1e-4;
02440 }
02441 }
02442
02443
02444 bus[indexer].Jacob_A[2] = 0.0;
02445 bus[indexer].Jacob_B[2] = 0.0;
02446 bus[indexer].Jacob_C[2] = 0.0;
02447 bus[indexer].Jacob_D[2] = 0.0;
02448
02449 }
02450 else
02451 {
02452
02453 temp_index = -1;
02454 temp_index_b = -1;
02455
02456 if ((bus[indexer].phases & 0x10) == 0x10)
02457 {
02458
02459 voltageDel[0] = bus[indexer].V[0] - bus[indexer].V[1];
02460 voltageDel[1] = bus[indexer].V[1] - bus[indexer].V[2];
02461 voltageDel[2] = bus[indexer].V[2] - bus[indexer].V[0];
02462
02463
02464 delta_current[0] = (voltageDel[0] == 0) ? 0 : ~(bus[indexer].extra_var[0]/voltageDel[0]);
02465 delta_current[1] = (voltageDel[1] == 0) ? 0 : ~(bus[indexer].extra_var[1]/voltageDel[1]);
02466 delta_current[2] = (voltageDel[2] == 0) ? 0 : ~(bus[indexer].extra_var[2]/voltageDel[2]);
02467
02468
02469 delta_current[0] += voltageDel[0] * (bus[indexer].extra_var[3]);
02470 delta_current[1] += voltageDel[1] * (bus[indexer].extra_var[4]);
02471 delta_current[2] += voltageDel[2] * (bus[indexer].extra_var[5]);
02472
02473
02474 undeltacurr[0]=(bus[indexer].extra_var[6]+delta_current[0])-(bus[indexer].extra_var[8]+delta_current[2]);
02475 undeltacurr[1]=(bus[indexer].extra_var[7]+delta_current[1])-(bus[indexer].extra_var[6]+delta_current[0]);
02476 undeltacurr[2]=(bus[indexer].extra_var[8]+delta_current[2])-(bus[indexer].extra_var[7]+delta_current[1]);
02477 }
02478 else
02479 {
02480 undeltacurr[0] = undeltacurr[1] = undeltacurr[2] = 0.0;
02481 }
02482
02483 for (jindex=0; jindex<BA_diag[indexer].size; jindex++)
02484 {
02485 switch(bus[indexer].phases & 0x07) {
02486 case 0x01:
02487 {
02488 temp_index=0;
02489 temp_index_b=2;
02490 break;
02491 }
02492 case 0x02:
02493 {
02494 temp_index=0;
02495 temp_index_b=1;
02496 break;
02497 }
02498 case 0x03:
02499 {
02500 if (jindex==0)
02501 {
02502 temp_index=0;
02503 temp_index_b=1;
02504 }
02505 else
02506 {
02507 temp_index=1;
02508 temp_index_b=2;
02509 }
02510 break;
02511 }
02512 case 0x04:
02513 {
02514 temp_index=0;
02515 temp_index_b=0;
02516 break;
02517 }
02518 case 0x05:
02519 {
02520 if (jindex==0)
02521 {
02522 temp_index=0;
02523 temp_index_b=0;
02524 }
02525 else
02526 {
02527 temp_index=1;
02528 temp_index_b=2;
02529 }
02530 break;
02531 }
02532 case 0x06:
02533 case 0x07:
02534 {
02535 temp_index=jindex;
02536 temp_index_b=jindex;
02537 break;
02538 }
02539 default:
02540 break;
02541 }
02542
02543 if ((temp_index==-1) || (temp_index_b==-1))
02544 {
02545 GL_THROW("NR: A Jacobian update element failed.");
02546
02547
02548
02549
02550
02551 }
02552
02553 if ((bus[indexer].V[temp_index_b]).Mag()!=0)
02554 {
02555 bus[indexer].Jacob_A[temp_index] = ((bus[indexer].S[temp_index_b]).Im() * (pow((bus[indexer].V[temp_index_b]).Re(),2) - pow((bus[indexer].V[temp_index_b]).Im(),2)) - 2*(bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].S[temp_index_b]).Re())/pow((bus[indexer].V[temp_index_b]).Mag(),4);
02556 bus[indexer].Jacob_A[temp_index] += ((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].I[temp_index_b]).Re() + (bus[indexer].I[temp_index_b]).Im() *pow((bus[indexer].V[temp_index_b]).Im(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3) + (bus[indexer].Y[temp_index_b]).Im();
02557 bus[indexer].Jacob_A[temp_index] += ((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(undeltacurr[temp_index_b]).Re() + (undeltacurr[temp_index_b]).Im() *pow((bus[indexer].V[temp_index_b]).Im(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3);
02558
02559 bus[indexer].Jacob_B[temp_index] = ((bus[indexer].S[temp_index_b]).Re() * (pow((bus[indexer].V[temp_index_b]).Re(),2) - pow((bus[indexer].V[temp_index_b]).Im(),2)) + 2*(bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].S[temp_index_b]).Im())/pow((bus[indexer].V[temp_index_b]).Mag(),4);
02560 bus[indexer].Jacob_B[temp_index] += -((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].I[temp_index_b]).Im() + (bus[indexer].I[temp_index_b]).Re() *pow((bus[indexer].V[temp_index_b]).Re(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3) - (bus[indexer].Y[temp_index_b]).Re();
02561 bus[indexer].Jacob_B[temp_index] += -((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(undeltacurr[temp_index_b]).Im() + (undeltacurr[temp_index_b]).Re() *pow((bus[indexer].V[temp_index_b]).Re(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3);
02562
02563 bus[indexer].Jacob_C[temp_index] = ((bus[indexer].S[temp_index_b]).Re() * (pow((bus[indexer].V[temp_index_b]).Im(),2) - pow((bus[indexer].V[temp_index_b]).Re(),2)) - 2*(bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].S[temp_index_b]).Im())/pow((bus[indexer].V[temp_index_b]).Mag(),4);
02564 bus[indexer].Jacob_C[temp_index] +=((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].I[temp_index_b]).Im() - (bus[indexer].I[temp_index_b]).Re() *pow((bus[indexer].V[temp_index_b]).Im(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3) - (bus[indexer].Y[temp_index_b]).Re();
02565 bus[indexer].Jacob_C[temp_index] +=((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(undeltacurr[temp_index_b]).Im() - (undeltacurr[temp_index_b]).Re() *pow((bus[indexer].V[temp_index_b]).Im(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3);
02566
02567 bus[indexer].Jacob_D[temp_index] = ((bus[indexer].S[temp_index_b]).Im() * (pow((bus[indexer].V[temp_index_b]).Re(),2) - pow((bus[indexer].V[temp_index_b]).Im(),2)) - 2*(bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].S[temp_index_b]).Re())/pow((bus[indexer].V[temp_index_b]).Mag(),4);
02568 bus[indexer].Jacob_D[temp_index] += ((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(bus[indexer].I[temp_index_b]).Re() - (bus[indexer].I[temp_index_b]).Im() *pow((bus[indexer].V[temp_index_b]).Re(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3) - (bus[indexer].Y[temp_index_b]).Im();
02569 bus[indexer].Jacob_D[temp_index] += ((bus[indexer].V[temp_index_b]).Re()*(bus[indexer].V[temp_index_b]).Im()*(undeltacurr[temp_index_b]).Re() - (undeltacurr[temp_index_b]).Im() *pow((bus[indexer].V[temp_index_b]).Re(),2))/pow((bus[indexer].V[temp_index_b]).Mag(),3);
02570
02571 }
02572 else
02573 {
02574 bus[indexer].Jacob_A[temp_index]= (bus[indexer].Y[temp_index_b]).Im() - 1e-4;
02575 bus[indexer].Jacob_B[temp_index]= -(bus[indexer].Y[temp_index_b]).Re() - 1e-4;
02576 bus[indexer].Jacob_C[temp_index]= -(bus[indexer].Y[temp_index_b]).Re() - 1e-4;
02577 bus[indexer].Jacob_D[temp_index]= -(bus[indexer].Y[temp_index_b]).Im() - 1e-4;
02578 }
02579 }
02580 }
02581 }
02582
02583
02584 unsigned int size_diag_update = 0;
02585 for (jindexer=0; jindexer<bus_count;jindexer++)
02586 {
02587 if (bus[jindexer].type != 1)
02588 size_diag_update += BA_diag[jindexer].size;
02589 else {}
02590 }
02591
02592 if (Y_diag_update == NULL)
02593 {
02594 Y_diag_update = (Y_NR *)gl_malloc((4*size_diag_update) *sizeof(Y_NR));
02595
02596
02597 if (Y_diag_update == NULL)
02598 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
02599
02600
02601 max_size_diag_update = size_diag_update;
02602 }
02603 else if (size_diag_update > max_size_diag_update)
02604 {
02605
02606 gl_free(Y_diag_update);
02607
02608
02609 Y_diag_update = (Y_NR *)gl_malloc((4*size_diag_update) *sizeof(Y_NR));
02610
02611
02612 if (Y_diag_update == NULL)
02613 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
02614
02615
02616 max_size_diag_update = size_diag_update;
02617
02618
02619 NR_realloc_needed = true;
02620 }
02621
02622 indexer = 0;
02623
02624 for (jindexer=0; jindexer<bus_count; jindexer++)
02625 {
02626 if (bus[jindexer].type == 2)
02627 {
02628 for (jindex=0; jindex<BA_diag[jindexer].size; jindex++)
02629 {
02630 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex;
02631 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind;
02632 Y_diag_update[indexer].Y_value = 1e10;
02633 indexer += 1;
02634
02635 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex;
02636 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind + BA_diag[jindexer].size;
02637 Y_diag_update[indexer].Y_value = 1e10;
02638 indexer += 1;
02639
02640 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex + BA_diag[jindexer].size;
02641 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind - BA_diag[jindexer].size;
02642 Y_diag_update[indexer].Y_value = 1e10;
02643 indexer += 1;
02644
02645 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex + BA_diag[jindexer].size;
02646 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind;
02647 Y_diag_update[indexer].Y_value = -1e10;
02648 indexer += 1;
02649 }
02650 }
02651
02652 if (bus[jindexer].type != 1 && bus[jindexer].type != 2)
02653 {
02654 for (jindex=0; jindex<BA_diag[jindexer].size; jindex++)
02655 {
02656 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex;
02657 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind;
02658 Y_diag_update[indexer].Y_value = (BA_diag[jindexer].Y[jindex][jindex]).Im() + bus[jindexer].Jacob_A[jindex];
02659 indexer += 1;
02660
02661 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex;
02662 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind + BA_diag[jindexer].size;
02663 Y_diag_update[indexer].Y_value = (BA_diag[jindexer].Y[jindex][jindex]).Re() + bus[jindexer].Jacob_B[jindex];
02664 indexer += 1;
02665
02666 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex + BA_diag[jindexer].size;
02667 Y_diag_update[indexer].col_ind = 2*bus[jindexer].Matrix_Loc + jindex;
02668 Y_diag_update[indexer].Y_value = (BA_diag[jindexer].Y[jindex][jindex]).Re() + bus[jindexer].Jacob_C[jindex];
02669 indexer += 1;
02670
02671 Y_diag_update[indexer].row_ind = 2*bus[jindexer].Matrix_Loc + jindex + BA_diag[jindexer].size;
02672 Y_diag_update[indexer].col_ind = Y_diag_update[indexer].row_ind;
02673 Y_diag_update[indexer].Y_value = -(BA_diag[jindexer].Y[jindex][jindex]).Im() + bus[jindexer].Jacob_D[jindex];
02674 indexer += 1;
02675 }
02676 }
02677 }
02678
02679
02680 size_Amatrix = size_offdiag_PQ*2 + size_diag_fixed*2 + 4*size_diag_update;
02681 if (Y_Amatrix == NULL)
02682 {
02683 Y_Amatrix = (Y_NR *)gl_malloc((size_Amatrix) *sizeof(Y_NR));
02684
02685
02686 if (Y_Amatrix == NULL)
02687 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
02688 }
02689 else if (NR_realloc_needed)
02690 {
02691
02692 gl_free(Y_Amatrix);
02693
02694
02695 Y_Amatrix = (Y_NR *)gl_malloc((size_Amatrix) *sizeof(Y_NR));
02696
02697
02698 if (Y_Amatrix == NULL)
02699 GL_THROW("NR: Failed to allocate memory for one of the necessary matrices");
02700 }
02701
02702
02703 for (indexer=0; indexer<size_offdiag_PQ*2; indexer++)
02704 {
02705 Y_Amatrix[indexer].row_ind = Y_offdiag_PQ[indexer].row_ind;
02706 Y_Amatrix[indexer].col_ind = Y_offdiag_PQ[indexer].col_ind;
02707 Y_Amatrix[indexer].Y_value = Y_offdiag_PQ[indexer].Y_value;
02708 }
02709
02710
02711 for (indexer=size_offdiag_PQ*2; indexer< (size_offdiag_PQ*2 + size_diag_fixed*2); indexer++)
02712 {
02713 Y_Amatrix[indexer].row_ind = Y_diag_fixed[indexer - size_offdiag_PQ*2 ].row_ind;
02714 Y_Amatrix[indexer].col_ind = Y_diag_fixed[indexer - size_offdiag_PQ*2 ].col_ind;
02715 Y_Amatrix[indexer].Y_value = Y_diag_fixed[indexer - size_offdiag_PQ*2 ].Y_value;
02716 }
02717
02718
02719 for (indexer=size_offdiag_PQ*2 + size_diag_fixed*2; indexer< size_Amatrix; indexer++)
02720 {
02721 Y_Amatrix[indexer].row_ind = Y_diag_update[indexer - size_offdiag_PQ*2 - size_diag_fixed*2].row_ind;
02722 Y_Amatrix[indexer].col_ind = Y_diag_update[indexer - size_offdiag_PQ*2 - size_diag_fixed*2].col_ind;
02723 Y_Amatrix[indexer].Y_value = Y_diag_update[indexer - size_offdiag_PQ*2 - size_diag_fixed*2].Y_value;
02724 }
02725
02726
02727
02728 if (Y_Work_Amatrix == NULL)
02729 {
02730 Y_Work_Amatrix = (Y_NR *)gl_malloc(size_Amatrix*sizeof(Y_NR));
02731 if (Y_Work_Amatrix==NULL)
02732 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02733 }
02734 else if (NR_realloc_needed)
02735 {
02736
02737 gl_free(Y_Work_Amatrix);
02738
02739
02740 Y_Work_Amatrix = (Y_NR *)gl_malloc(size_Amatrix*sizeof(Y_NR));
02741 if (Y_Work_Amatrix==NULL)
02742 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02743 }
02744
02745 merge_sort(Y_Amatrix, size_Amatrix, Y_Work_Amatrix);
02746
02748 m = 2*total_variables; n = 2*total_variables; nnz = size_Amatrix;
02749
02750 if (a_LU == NULL)
02751 {
02752
02753 a_LU = (double *) gl_malloc(nnz *sizeof(double));
02754 if (a_LU==NULL)
02755 {
02756 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02757
02758
02759
02760
02761
02762 }
02763
02764 rows_LU = (int *) gl_malloc(nnz *sizeof(int));
02765 if (rows_LU == NULL)
02766 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02767
02768 cols_LU = (int *) gl_malloc((n+1) *sizeof(int));
02769 if (cols_LU == NULL)
02770 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02771
02772
02773 rhs_LU = (double *) gl_malloc(m *sizeof(double));
02774 if (rhs_LU == NULL)
02775 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02776
02778 perm_r = (int *) gl_malloc(m *sizeof(int));
02779 if (perm_r == NULL)
02780 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02781
02782 perm_c = (int *) gl_malloc(n *sizeof(int));
02783 if (perm_c == NULL)
02784 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02785
02786
02787 A_LU.Store = (void *)gl_malloc(sizeof(NCformat));
02788 if (A_LU.Store == NULL)
02789 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02790
02791 B_LU.Store = (void *)gl_malloc(sizeof(DNformat));
02792 if (B_LU.Store == NULL)
02793 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02794
02795
02796 A_LU.Stype = SLU_NC;
02797 A_LU.Dtype = SLU_D;
02798 A_LU.Mtype = SLU_GE;
02799 A_LU.nrow = n;
02800 A_LU.ncol = m;
02801
02802
02803 B_LU.Stype = SLU_DN;
02804 B_LU.Dtype = SLU_D;
02805 B_LU.Mtype = SLU_GE;
02806 B_LU.nrow = m;
02807 B_LU.ncol = 1;
02808 }
02809 else if (NR_realloc_needed)
02810 {
02811
02812 gl_free(a_LU);
02813 gl_free(rows_LU);
02814 gl_free(cols_LU);
02815 gl_free(rhs_LU);
02816 gl_free(perm_r);
02817 gl_free(perm_c);
02818
02819
02820 a_LU = (double *) gl_malloc(nnz *sizeof(double));
02821 if (a_LU==NULL)
02822 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02823
02824 rows_LU = (int *) gl_malloc(nnz *sizeof(int));
02825 if (rows_LU == NULL)
02826 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02827
02828 cols_LU = (int *) gl_malloc((n+1) *sizeof(int));
02829 if (cols_LU == NULL)
02830 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02831
02832
02833 rhs_LU = (double *) gl_malloc(m *sizeof(double));
02834 if (rhs_LU == NULL)
02835 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02836
02838 perm_r = (int *) gl_malloc(m *sizeof(int));
02839 if (perm_r == NULL)
02840 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02841
02842 perm_c = (int *) gl_malloc(n *sizeof(int));
02843 if (perm_c == NULL)
02844 GL_THROW("NR: One of the SuperLU solver matrices failed to allocate");
02845
02846
02847 A_LU.Stype = SLU_NC;
02848 A_LU.Dtype = SLU_D;
02849 A_LU.Mtype = SLU_GE;
02850 A_LU.nrow = n;
02851 A_LU.ncol = m;
02852
02853
02854 B_LU.Stype = SLU_DN;
02855 B_LU.Dtype = SLU_D;
02856 B_LU.Mtype = SLU_GE;
02857 B_LU.nrow = m;
02858 B_LU.ncol = 1;
02859 }
02860
02861 #ifndef MT
02862
02863 set_default_options ( &options );
02864 #endif
02865
02866 for (indexer=0; indexer<size_Amatrix; indexer++)
02867 {
02868 rows_LU[indexer] = Y_Amatrix[indexer].row_ind ;
02869 a_LU[indexer] = Y_Amatrix[indexer].Y_value;
02870 }
02871 cols_LU[0] = 0;
02872 indexer = 0;
02873 temp_index_c = 0;
02874 for ( jindexer = 0; jindexer< (size_Amatrix-1); jindexer++)
02875 {
02876 indexer += 1;
02877 tempa = Y_Amatrix[jindexer].col_ind;
02878 tempb = Y_Amatrix[jindexer+1].col_ind;
02879 if (tempb > tempa)
02880 {
02881 temp_index_c += 1;
02882 cols_LU[temp_index_c] = indexer;
02883 }
02884 }
02885 cols_LU[n] = nnz ;
02886
02887 for (temp_index_c=0;temp_index_c<m;temp_index_c++)
02888 {
02889 rhs_LU[temp_index_c] = deltaI_NR[temp_index_c];
02890 }
02891
02893
02894 Astore = (NCformat*)A_LU.Store;
02895 Astore->nnz = nnz;
02896 Astore->nzval = a_LU;
02897 Astore->rowind = rows_LU;
02898 Astore->colptr = cols_LU;
02899
02900
02901
02902 Bstore = (DNformat*)B_LU.Store;
02903 Bstore->lda = m;
02904 Bstore->nzval = rhs_LU;
02905
02906 #ifdef MT
02907
02908
02909
02910 get_perm_c(1, &A_LU, perm_c);
02911
02912
02913 pdgssv(NR_superLU_procs, &A_LU, perm_c, perm_r, &L_LU, &U_LU, &B_LU, &info);
02914 #else
02915
02916
02917 StatInit ( &stat );
02918
02919
02920 dgssv(&options, &A_LU, perm_c, perm_r, &L_LU, &U_LU, &B_LU, &stat, &info);
02921 #endif
02922
02923 sol_LU = (double*) ((DNformat*) B_LU.Store)->nzval;
02924
02925
02926 Maxmismatch = 0;
02927
02928 temp_index = -1;
02929 temp_index_b = -1;
02930 newiter = false;
02931
02932 for (indexer=0; indexer<bus_count; indexer++)
02933 {
02934
02935 if (bus[indexer].type != 2)
02936 {
02937
02938 if ((bus[indexer].phases & 0x80) == 0x80)
02939 {
02940
02941 DVConvCheck[0]=complex(sol_LU[2*bus[indexer].Matrix_Loc],sol_LU[(2*bus[indexer].Matrix_Loc+2)]);
02942 DVConvCheck[1]=complex(sol_LU[(2*bus[indexer].Matrix_Loc+1)],sol_LU[(2*bus[indexer].Matrix_Loc+3)]);
02943 bus[indexer].V[0] += DVConvCheck[0];
02944 bus[indexer].V[1] += DVConvCheck[1];
02945
02946
02947 CurrConvVal=DVConvCheck[0].Mag();
02948 if (CurrConvVal > Maxmismatch)
02949 Maxmismatch=CurrConvVal;
02950
02951 if (CurrConvVal > bus[indexer].max_volt_error)
02952 newiter=true;
02953
02954 CurrConvVal=DVConvCheck[1].Mag();
02955 if (CurrConvVal > Maxmismatch)
02956 Maxmismatch=CurrConvVal;
02957
02958 if (CurrConvVal > bus[indexer].max_volt_error)
02959 newiter=true;
02960 }
02961 else
02962 {
02963 for (jindex=0; jindex<BA_diag[indexer].size; jindex++)
02964 {
02965 switch(bus[indexer].phases & 0x07) {
02966 case 0x01:
02967 {
02968 temp_index=0;
02969 temp_index_b=2;
02970 break;
02971 }
02972 case 0x02:
02973 {
02974 temp_index=0;
02975 temp_index_b=1;
02976 break;
02977 }
02978 case 0x03:
02979 {
02980 if (jindex==0)
02981 {
02982 temp_index=0;
02983 temp_index_b=1;
02984 }
02985 else
02986 {
02987 temp_index=1;
02988 temp_index_b=2;
02989 }
02990
02991 break;
02992 }
02993 case 0x04:
02994 {
02995 temp_index=0;
02996 temp_index_b=0;
02997 break;
02998 }
02999 case 0x05:
03000 {
03001 if (jindex==0)
03002 {
03003 temp_index=0;
03004 temp_index_b=0;
03005 }
03006 else
03007 {
03008 temp_index=1;
03009 temp_index_b=2;
03010 }
03011 break;
03012 }
03013 case 0x06:
03014 case 0x07:
03015 {
03016 temp_index = jindex;
03017 temp_index_b = jindex;
03018 break;
03019 }
03020 }
03021
03022 if ((temp_index==-1) || (temp_index_b==-1))
03023 {
03024 GL_THROW("NR: An error occurred indexing voltage updates");
03025
03026
03027
03028
03029
03030 }
03031
03032 DVConvCheck[jindex]=complex(sol_LU[(2*bus[indexer].Matrix_Loc+temp_index)],sol_LU[(2*bus[indexer].Matrix_Loc+BA_diag[indexer].size+temp_index)]);
03033 bus[indexer].V[temp_index_b] += DVConvCheck[jindex];
03034
03035
03036 CurrConvVal=DVConvCheck[jindex].Mag();
03037 if (CurrConvVal > bus[indexer].max_volt_error)
03038 newiter=true;
03039
03040 if (CurrConvVal > Maxmismatch)
03041 Maxmismatch = CurrConvVal;
03042
03043 }
03044 }
03045 }
03046 else
03047 {
03048 temp_index +=2*BA_diag[indexer].size;
03049 }
03050 }
03051
03052
03053 NR_realloc_needed = false;
03054
03055
03056 #ifdef MT
03057
03058 Destroy_SuperNode_SCP(&L_LU);
03059 Destroy_CompCol_NCP(&U_LU);
03060 #else
03061
03062 Destroy_SuperNode_Matrix( &L_LU );
03063 Destroy_CompCol_Matrix( &U_LU );
03064 StatFree ( &stat );
03065 #endif
03066
03067
03068 if (( newiter == false ) || (info!=0))
03069 {
03070 if (newiter == false)
03071 {
03072 gl_verbose("Power flow calculation converges at Iteration %d \n",Iteration+1);
03073 }
03074 break;
03075 }
03076 }
03077
03078
03079 if ((Iteration==NR_iteration_limit) && (newiter==true))
03080 {
03081 gl_verbose("Max solver mismatch of failed solution %f\n",Maxmismatch);
03082 return -Iteration;
03083 }
03084 else if (info!=0)
03085 {
03086 *bad_computations = true;
03087 return 0;
03088 }
03089 else
03090 return Iteration;
03091 }
03092
03093
03094
03095