00001
00002
00003
00004 #ifndef _RESTORATION_H
00005 #define _RESTORATION_H
00006
00007 #include "powerflow.h"
00008 #include "powerflow_library.h"
00009
00010 typedef struct s_ChainNode {
00011 int data;
00012 struct s_ChainNode *link;
00013 } CHAINNODE;
00014
00015 typedef struct s_intVect {
00016 int *data;
00017 int currSize;
00018 int maxSize;
00019 } INTVECT;
00020
00021 typedef struct s_ChordSet {
00022 int *data_1;
00023 int *data_2;
00024 int currSize;
00025 int maxSize;
00026 } CHORDSET;
00027
00028 typedef struct s_LocSet {
00029 int *data_1;
00030 int *data_2;
00031 int *data_3;
00032 int *data_4;
00033 int currSize;
00034 int maxSize;
00035 } LOCSET;
00036
00037 typedef struct s_CandSwOpe {
00038 int *data_1;
00039 int *data_2;
00040 int *data_3;
00041 int *data_4;
00042 int *data_5;
00043 double *data_6;
00044 int *data_7;
00045 int currSize;
00046 int maxSize;
00047 } CANDSWOP;
00048
00049 typedef struct s_BranchVertices {
00050 int from_vert;
00051 int to_vert;
00052 } BRANCHVERTICES;
00053
00054
00055 class Chain
00056 {
00057 public:
00058 CHAINNODE *first;
00059 CHAINNODE *last;
00060 public:
00061 inline Chain()
00062 {
00063 first = NULL;
00064 last = NULL;
00065 }
00066 public:
00067 void delAllNodes(void);
00068 bool isempty(void);
00069 int getLength(void);
00070 int search(int sData);
00071 bool modify(int oldData, int newData);
00072 void addNode(int kIndex, int newData);
00073 void deleteNode(int dData);
00074 void copy(Chain *ilist);
00075 void append(int newData);
00076 };
00077
00078
00079 class LinkedQueue : public Chain
00080 {
00081 public:
00082 inline LinkedQueue():Chain(){};
00083 void enQueue(int newData);
00084 int deQueue(void);
00085 };
00086
00087
00088 class ChainIterator
00089 {
00090 public:
00091 CHAINNODE *location;
00092 public:
00093 inline ChainIterator()
00094 {
00095 location = NULL;
00096 }
00097 public:
00098 int initialize(Chain *lList);
00099 int next(void);
00100 };
00101
00102
00103 class LinkedBase
00104 {
00105 public:
00106 int numVertices;
00107 int numEdges;
00108 Chain **adjList;
00109 ChainIterator **iterPos;
00110 int source;
00111 int *status_value;
00112 int *parent_value;
00113 double *dist;
00114 TIMESTAMP dfs_time;
00115 TIMESTAMP *dTime;
00116 TIMESTAMP *fTime;
00117 public:
00118 LinkedBase(int nVer);
00119 void delAllVer(void);
00120 int getVerNum(void);
00121 int getEdgNum(void);
00122 int getOutDeg(int index);
00123 void initializePos(void);
00124 void deactivatePos(void);
00125 int beginVertex(int index);
00126 int nextVertex(int index);
00127 void BFS(int s);
00128 void DFS1(void);
00129 void DFS2(int s);
00130 void DFSVisit(int u);
00131 void copy(LinkedBase *graph1);
00132 void addAIsoVer(int n);
00133 };
00134
00135
00136 class LinkedDigraph : public LinkedBase
00137 {
00138 public:
00139 inline LinkedDigraph(int nVer):LinkedBase(nVer){};
00140 bool isEdgeExisting(int iIndex, int jIndex);
00141 void addEdge(int iIndex, int jIndex);
00142 void deleteEdge(int iIndex, int jIndex);
00143 int getInDeg(int index);
00144 int getOutDeg(int index);
00145 };
00146
00147
00148 class LinkedUndigraph : public LinkedDigraph
00149 {
00150 public:
00151 inline LinkedUndigraph(int nVer):LinkedDigraph(nVer){};
00152
00153 void addEdge(int iIndex, int jIndex);
00154 void deleteEdge(int iIndex, int jIndex);
00155 int getInDeg(int index);
00156 int getOutDeg(int index);
00157 int getDeg(int index);
00158
00160 void findFunCutSet(CHORDSET *chordSet, BRANCHVERTICES *tBranch, CHORDSET *cutSet);
00161 void simplify(CHORDSET *chordset, BRANCHVERTICES *fBranch, int source, INTVECT *fVer, INTVECT *vMap);
00162
00163 void find_int(INTVECT *inputvect, INTVECT *foundvect, int findval, int numfind);
00164
00165 int isolateDeg12Ver(INTVECT *iVer);
00166 void deleteIsoVer(INTVECT *vMap);
00167 void mergeVer_2(INTVECT *vMap);
00168
00169 };
00170
00171 class restoration : public powerflow_library
00172 {
00173 public:
00174 static CLASS *oclass;
00175 static CLASS *pclass;
00176 public:
00177 int reconfig_attempts;
00178 int reconfig_iter_limit;
00179
00180 OBJECT *sourceVerObj;
00181 OBJECT *faultSecObj;
00182
00183 char1024 fVerPub;
00184 char1024 feeder_power_limit_Pub;
00185 char1024 feeder_power_link_Pub;
00186
00187 char1024 mVerPub;
00188 char1024 microgrid_limit_Pub;
00189 char1024 microgrid_power_link_Pub;
00190
00191 char1024 logfile_name;
00192
00193 double voltage_limit[2];
00194
00195 bool stop_and_generate;
00196
00197
00198
00199 int PerformRestoration(int faulting_link);
00200
00201 restoration(MODULE *mod);
00202 inline restoration(CLASS *cl=oclass):powerflow_library(cl){};
00203 int create(void);
00204 int init(OBJECT *parent=NULL);
00205 int isa(char *classname);
00206
00207 private:
00208 int s_ver;
00209 int s_ver_1;
00210 int s_ver_2;
00211
00212 int numfVer;
00213 INTVECT feederVertices;
00214 INTVECT feederVertices_1;
00215 INTVECT feederVertices_2;
00216 OBJECT **fVerObjList;
00217 OBJECT **fLinkObjList;
00218 FUNCTIONADDR *fLinkPowerFunc;
00219 double *feeder_power_limit;
00220 complex **feeder_power_link_value;
00221
00222 int numMG;
00223 INTVECT MGIdx;
00224 INTVECT MGIdx_1;
00225 INTVECT MGIdx_2;
00226 OBJECT **mVerObjList;
00227 OBJECT **mLinkObjList;
00228 FUNCTIONADDR *mLinkPowerFunc;
00229 complex *microgrid_limit;
00230 complex **microgrid_power_link_value;
00231
00232 FUNCTIONADDR fault_check_fxn;
00233
00234 bool file_output_desired;
00235
00236 LinkedUndigraph *top_ori;
00237 LinkedUndigraph *top_sim_1;
00238 LinkedUndigraph *top_sim_2;
00239 LinkedUndigraph *top_res;
00240 LinkedUndigraph *top_tmp;
00241
00242 CHORDSET tie_swi;
00243 CHORDSET tie_swi_1;
00244 CHORDSET tie_swi_2;
00245 CHORDSET sec_swi;
00246 CHORDSET sec_swi_1;
00247 CHORDSET sec_swi_2;
00248 CHORDSET sec_list;
00249
00250 CHORDSET sec_swi_map;
00251 CHORDSET sec_swi_map_1;
00252
00253 LOCSET tie_swi_loc;
00254 LOCSET sec_swi_loc;
00255
00256 BRANCHVERTICES f_sec;
00257 BRANCHVERTICES f_sec_1;
00258 BRANCHVERTICES f_sec_2;
00259
00260 INTVECT ver_map_1;
00261 INTVECT ver_map_2;
00262
00263 CANDSWOP candidateSwOpe;
00264 CANDSWOP candidateSwOpe_1;
00265 CANDSWOP candidateSwOpe_2;
00266
00267 complex **voltage_storage;
00268
00269
00270 void PowerflowSave(void);
00271 void PowerflowRestore(void);
00272
00273
00274 double *ParseDoubleString(char *input_string,int *num_items_found);
00275 complex *ParseComplexString(char *input_string,int *num_items_found);
00276 OBJECT **ParseObjectString(char *input_string,int *num_items_found);
00277 bool isSwitch(int iIndex, int jIndex);
00278 bool isSwiInFeeder(BRANCHVERTICES *swi_2, int feederID_overload);
00279
00280
00281 void printResult(int IdxSW);
00282 void printSOs(FILE *FPHandle, int IdxSW);
00283 void printCIO(FILE *FPHandle, int IdxSW);
00284
00285
00286 void INTVECTalloc(INTVECT *inititem, int allocsizeval);
00287 void CHORDSETalloc(CHORDSET *inititem, int allocsizeval);
00288 void LOCSETalloc(LOCSET *inititem, int allocsizeval);
00289 void CANDSWOPalloc(CANDSWOP *inititem, int allocsizeval);
00290
00291
00292 void INTVECTfree(INTVECT *inititem);
00293 void CHORDSETfree(CHORDSET *inititem);
00294 void LOCSETfree(LOCSET *inititem);
00295 void CANDSWOPfree(CANDSWOP *inititem);
00296
00297
00298 void simplifyTop_1(void);
00299
00300 void simplifyTop_2(void);
00301 void setFeederVertices_2(void);
00302 void setMicrogridVertices(void);
00303 void modifySecSwiList(void);
00304 void formSecSwiMap(void);
00305 void mapSecSwi(BRANCHVERTICES *sSW_2, BRANCHVERTICES *sSW, BRANCHVERTICES *sSW_1);
00306 void mapTieSwi(BRANCHVERTICES *tSW_2, BRANCHVERTICES *tSW, BRANCHVERTICES *tSW_1);
00307 void renewFaultLocation(BRANCHVERTICES *faultsection);
00308 int spanningTreeSearch(void);
00309 void CHORDSETintersect(CHORDSET *set_1, CHORDSET *set_2, CHORDSET *intersect);
00310 void modifyModel(int counter);
00311 int runPowerFlow(void);
00312 void checkPF2(bool *flag, double *overLoad, int *feederID);
00313 bool checkVoltage(void);
00314 void checkFeederPower(bool *fFlag, double *overLoad, int *feederID);
00315 void checkMG(bool *mFlag, double *overLoad, int *microgridID);
00316 void checkLinePower(bool *lFlag, double *overLoad, int *lineID);
00317 };
00318
00319 EXPORT int perform_restoration(OBJECT *thisobj,int faulting_link);
00320
00321 void unique_int(INTVECT *inputvect, INTVECT *outputvect);
00322 void merge_sort_int(int *Input_Array, unsigned int Alen, int *Work_Array);
00323
00324 #endif // _RESTORATION_H