xref: /petsc/src/snes/tutorials/network/power/PFReadData.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
1c4762a1bSJed Brown #include "petscmat.h"
2c4762a1bSJed Brown #include "power.h"
3c4762a1bSJed Brown #include <string.h>
4c4762a1bSJed Brown #include <ctype.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown PetscErrorCode PFReadMatPowerData(PFDATA *pf,char *filename)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   FILE           *fp;
9c4762a1bSJed Brown   VERTEX_Power   Bus;
10c4762a1bSJed Brown   LOAD           Load;
11c4762a1bSJed Brown   GEN            Gen;
12c4762a1bSJed Brown   EDGE_Power     Branch;
13c4762a1bSJed Brown   PetscInt       line_counter=0;
14c4762a1bSJed Brown   PetscInt       bus_start_line=-1,bus_end_line=-1; /* xx_end_line points to the next line after the record ends */
15c4762a1bSJed Brown   PetscInt       gen_start_line=-1,gen_end_line=-1;
16c4762a1bSJed Brown   PetscInt       br_start_line=-1,br_end_line=-1;
17c4762a1bSJed Brown   char           line[MAXLINE];
18c4762a1bSJed Brown   PetscInt       loadi=0,geni=0,bri=0,busi=0,i,j;
19c4762a1bSJed Brown   int            extbusnum,bustype_i;
20c4762a1bSJed Brown   double         Pd,Qd;
21c4762a1bSJed Brown   PetscInt       maxbusnum=-1,intbusnum,*busext2intmap,genj,loadj;
22c4762a1bSJed Brown   GEN            newgen;
23c4762a1bSJed Brown   LOAD           newload;
24c4762a1bSJed Brown 
25c4762a1bSJed Brown   PetscFunctionBegin;
26c4762a1bSJed Brown   fp = fopen(filename,"r");
27c4762a1bSJed Brown   /* Check for valid file */
28*28b400f6SJacob Faibussowitsch   PetscCheck(fp,PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Can't open Matpower data file %s",filename);
29c4762a1bSJed Brown   pf->nload=0;
30c4762a1bSJed Brown   while (fgets(line,MAXLINE,fp)) {
31c4762a1bSJed Brown     if (strstr(line,"mpc.bus = ["))    bus_start_line = line_counter+1; /* Bus data starts from next line */
32c4762a1bSJed Brown     if (strstr(line,"mpc.gen") && gen_start_line == -1)    gen_start_line = line_counter+1; /* Generator data starts from next line */
33c4762a1bSJed Brown     if (strstr(line,"mpc.branch")) br_start_line = line_counter+1; /* Branch data starts from next line */
34c4762a1bSJed Brown     if (strstr(line,"];")) {
35c4762a1bSJed Brown       if (bus_start_line != -1 && bus_end_line == -1) bus_end_line = line_counter;
36c4762a1bSJed Brown       if (gen_start_line != -1 && gen_end_line == -1) gen_end_line = line_counter;
37c4762a1bSJed Brown       if (br_start_line  != -1 && br_end_line == -1) br_end_line = line_counter;
38c4762a1bSJed Brown     }
39c4762a1bSJed Brown 
40c4762a1bSJed Brown     /* Count the number of pq loads */
41c4762a1bSJed Brown     if (bus_start_line != -1 && line_counter >= bus_start_line && bus_end_line == -1) {
42c4762a1bSJed Brown       sscanf(line,"%d %d %lf %lf",&extbusnum,&bustype_i,&Pd,&Qd);
43c4762a1bSJed Brown       if (!((Pd == 0.0) && (Qd == 0.0))) pf->nload++;
44c4762a1bSJed Brown       if (extbusnum > maxbusnum) maxbusnum = extbusnum;
45c4762a1bSJed Brown     }
46c4762a1bSJed Brown     line_counter++;
47c4762a1bSJed Brown   }
48c4762a1bSJed Brown   fclose(fp);
49c4762a1bSJed Brown 
50c4762a1bSJed Brown   pf->nbus    = bus_end_line - bus_start_line;
51c4762a1bSJed Brown   pf->ngen    = gen_end_line - gen_start_line;
52c4762a1bSJed Brown   pf->nbranch = br_end_line  - br_start_line;
53c4762a1bSJed Brown 
545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(pf->nbus,&pf->bus));
555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(pf->ngen,&pf->gen));
565f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(pf->nload,&pf->load));
575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCalloc1(pf->nbranch,&pf->branch));
58c4762a1bSJed Brown   Bus = pf->bus; Gen = pf->gen; Load = pf->load; Branch = pf->branch;
59c4762a1bSJed Brown 
60c4762a1bSJed Brown   /* Setting pf->sbase to 100 */
61c4762a1bSJed Brown   pf->sbase = 100.0;
62c4762a1bSJed Brown 
635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(maxbusnum+1,&busext2intmap));
64c4762a1bSJed Brown   for (i=0; i < maxbusnum+1; i++) busext2intmap[i] = -1;
65c4762a1bSJed Brown 
66c4762a1bSJed Brown   fp = fopen(filename,"r");
67c4762a1bSJed Brown   /* Reading data */
68c4762a1bSJed Brown   for (i=0;i<line_counter;i++) {
692c71b3e2SJacob Faibussowitsch     PetscCheckFalse(!fgets(line,MAXLINE,fp),PETSC_COMM_SELF,PETSC_ERR_SUP,"File is incorrectly formatted");
70c4762a1bSJed Brown 
71c4762a1bSJed Brown     if ((i >= bus_start_line) && (i < bus_end_line)) {
72c4762a1bSJed Brown       double gl,bl,vm,va,basekV;
73c4762a1bSJed Brown       int    bus_i,ide,area;
74c4762a1bSJed Brown       /* Bus data */
75c4762a1bSJed Brown       sscanf(line,"%d %d %lf %lf %lf %lf %d %lf %lf %lf",&bus_i,&ide,&Pd,&Qd,&gl,&bl,&area,&vm,&va,&basekV);
76c4762a1bSJed Brown       Bus[busi].bus_i = bus_i; Bus[busi].ide = ide; Bus[busi].area = area;
77c4762a1bSJed Brown       Bus[busi].gl = gl; Bus[busi].bl = bl;
78c4762a1bSJed Brown       Bus[busi].vm = vm; Bus[busi].va = va; Bus[busi].basekV = basekV;
79c4762a1bSJed Brown       Bus[busi].internal_i = busi;
80c4762a1bSJed Brown       busext2intmap[Bus[busi].bus_i] = busi;
81c4762a1bSJed Brown 
82c4762a1bSJed Brown       if (!((Pd == 0.0) && (Qd == 0.0))) {
83c4762a1bSJed Brown         Load[loadi].bus_i = Bus[busi].bus_i;
84c4762a1bSJed Brown         Load[loadi].status = 1;
85c4762a1bSJed Brown         Load[loadi].pl = Pd;
86c4762a1bSJed Brown         Load[loadi].ql = Qd;
87c4762a1bSJed Brown         Load[loadi].area = Bus[busi].area;
88c4762a1bSJed Brown         Load[loadi].internal_i = busi;
89c4762a1bSJed Brown         Bus[busi].lidx[Bus[busi].nload++] = loadi;
902c71b3e2SJacob Faibussowitsch         PetscCheckFalse(Bus[busi].nload > NLOAD_AT_BUS_MAX,PETSC_COMM_SELF,PETSC_ERR_SUP,"Exceeded maximum number of loads allowed at bus");
91c4762a1bSJed Brown         loadi++;
92c4762a1bSJed Brown       }
93c4762a1bSJed Brown       busi++;
94c4762a1bSJed Brown     }
95c4762a1bSJed Brown 
96c4762a1bSJed Brown     /* Read generator data */
97c4762a1bSJed Brown     if (i >= gen_start_line && i < gen_end_line) {
98c4762a1bSJed Brown       double pg,qg,qt,qb,vs,mbase,pt,pb;
99c4762a1bSJed Brown       int    bus_i,status;
100c4762a1bSJed Brown       sscanf(line,"%d %lf %lf %lf %lf %lf %lf %d %lf %lf",&bus_i,&pg,&qg,&qt,&qb,&vs,&mbase,&status,&pt,&pb);
101c4762a1bSJed Brown       Gen[geni].bus_i = bus_i; Gen[geni].status = status;
102c4762a1bSJed Brown       Gen[geni].pg = pg; Gen[geni].qg = qg; Gen[geni].qt = qt; Gen[geni].qb = qb;
103c4762a1bSJed Brown       Gen[geni].vs = vs; Gen[geni].mbase = mbase; Gen[geni].pt = pt; Gen[geni].pb = pb;
104c4762a1bSJed Brown 
105c4762a1bSJed Brown       intbusnum = busext2intmap[Gen[geni].bus_i];
106c4762a1bSJed Brown       Gen[geni].internal_i = intbusnum;
107c4762a1bSJed Brown       Bus[intbusnum].gidx[Bus[intbusnum].ngen++] = geni;
108c4762a1bSJed Brown 
109c4762a1bSJed Brown       Bus[intbusnum].vm = Gen[geni].vs;
110c4762a1bSJed Brown 
1112c71b3e2SJacob Faibussowitsch       PetscCheckFalse(Bus[intbusnum].ngen > NGEN_AT_BUS_MAX,PETSC_COMM_SELF,PETSC_ERR_SUP,"Exceeded maximum number of generators allowed at bus");
112c4762a1bSJed Brown       geni++;
113c4762a1bSJed Brown     }
114c4762a1bSJed Brown 
115c4762a1bSJed Brown     if (i >= br_start_line && i < br_end_line) {
116c4762a1bSJed Brown       PetscScalar R,X,Bc,B,G,Zm,tap,shift,tap2,tapr,tapi;
117c4762a1bSJed Brown       double      r,x,b,rateA,rateB,rateC,tapratio,phaseshift;
118c4762a1bSJed Brown       int         fbus,tbus,status;
119c4762a1bSJed Brown       sscanf(line,"%d %d %lf %lf %lf %lf %lf %lf %lf %lf %d",&fbus,&tbus,&r,&x,&b,&rateA,&rateB,&rateC,&tapratio,&phaseshift,&status);
120c4762a1bSJed Brown       Branch[bri].fbus = fbus; Branch[bri].tbus = tbus; Branch[bri].status = status;
121c4762a1bSJed Brown       Branch[bri].r = r; Branch[bri].x = x; Branch[bri].b = b;
122c4762a1bSJed Brown       Branch[bri].rateA = rateA; Branch[bri].rateB = rateB; Branch[bri].rateC = rateC;
123c4762a1bSJed Brown       Branch[bri].tapratio = tapratio; Branch[bri].phaseshift = phaseshift;
124c4762a1bSJed Brown 
125c4762a1bSJed Brown       if (Branch[bri].tapratio == 0.0) Branch[bri].tapratio = 1.0;
126c4762a1bSJed Brown       Branch[bri].phaseshift *= PETSC_PI/180.0;
127c4762a1bSJed Brown 
128c4762a1bSJed Brown       intbusnum = busext2intmap[Branch[bri].fbus];
129c4762a1bSJed Brown       Branch[bri].internal_i = intbusnum;
130c4762a1bSJed Brown 
131c4762a1bSJed Brown       intbusnum = busext2intmap[Branch[bri].tbus];
132c4762a1bSJed Brown       Branch[bri].internal_j = intbusnum;
133c4762a1bSJed Brown 
134c4762a1bSJed Brown       /* Compute self and transfer admittances */
135c4762a1bSJed Brown       R = Branch[bri].r;
136c4762a1bSJed Brown       X = Branch[bri].x;
137c4762a1bSJed Brown       Bc = Branch[bri].b;
138c4762a1bSJed Brown 
139c4762a1bSJed Brown       Zm = R*R + X*X;
140c4762a1bSJed Brown       G  = R/Zm;
141c4762a1bSJed Brown       B  = -X/Zm;
142c4762a1bSJed Brown 
143c4762a1bSJed Brown       tap = Branch[bri].tapratio;
144c4762a1bSJed Brown       shift = Branch[bri].phaseshift;
145c4762a1bSJed Brown       tap2 = tap*tap;
146c4762a1bSJed Brown       tapr = tap*PetscCosScalar(shift);
147c4762a1bSJed Brown       tapi = tap*PetscSinScalar(shift);
148c4762a1bSJed Brown 
149c4762a1bSJed Brown       Branch[bri].yff[0] = G/tap2;
150c4762a1bSJed Brown       Branch[bri].yff[1] = (B+Bc/2.0)/tap2;
151c4762a1bSJed Brown 
152c4762a1bSJed Brown       Branch[bri].yft[0] = -(G*tapr - B*tapi)/tap2;
153c4762a1bSJed Brown       Branch[bri].yft[1] = -(B*tapr + G*tapi)/tap2;
154c4762a1bSJed Brown 
155c4762a1bSJed Brown       Branch[bri].ytf[0] = -(G*tapr + B*tapi)/tap2;
156c4762a1bSJed Brown       Branch[bri].ytf[1] = -(B*tapr - G*tapi)/tap2;
157c4762a1bSJed Brown 
158c4762a1bSJed Brown       Branch[bri].ytt[0] = G;
159c4762a1bSJed Brown       Branch[bri].ytt[1] = B+Bc/2.0;
160c4762a1bSJed Brown 
161c4762a1bSJed Brown       bri++;
162c4762a1bSJed Brown     }
163c4762a1bSJed Brown   }
164c4762a1bSJed Brown   fclose(fp);
165c4762a1bSJed Brown 
166c4762a1bSJed Brown   /* Reorder the generator data structure according to bus numbers */
167c4762a1bSJed Brown   genj=0; loadj=0;
1685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(pf->ngen,&newgen));
1695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(pf->nload,&newload));
170c4762a1bSJed Brown   for (i = 0; i < pf->nbus; i++) {
171c4762a1bSJed Brown     for (j = 0; j < pf->bus[i].ngen; j++) {
1725f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMemcpy(&newgen[genj++],&pf->gen[pf->bus[i].gidx[j]],sizeof(struct _p_GEN)));
173c4762a1bSJed Brown     }
174c4762a1bSJed Brown     for (j = 0; j < pf->bus[i].nload; j++) {
1755f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMemcpy(&newload[loadj++],&pf->load[pf->bus[i].lidx[j]],sizeof(struct _p_LOAD)));
176c4762a1bSJed Brown     }
177c4762a1bSJed Brown   }
1785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(pf->gen));
1795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(pf->load));
180c4762a1bSJed Brown   pf->gen = newgen;
181c4762a1bSJed Brown   pf->load = newload;
182c4762a1bSJed Brown 
1835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(busext2intmap));
184c4762a1bSJed Brown   PetscFunctionReturn(0);
185c4762a1bSJed Brown }
186