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