1*a4963045SJacob Faibussowitsch #pragma once 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscsnes.h> 4c4762a1bSJed Brown #include <petscdmnetwork.h> 5c4762a1bSJed Brown 6c4762a1bSJed Brown #define MAXLINE 1000 7c4762a1bSJed Brown #define REF_BUS 3 8c4762a1bSJed Brown #define PV_BUS 2 9c4762a1bSJed Brown #define PQ_BUS 1 10c4762a1bSJed Brown #define ISOLATED_BUS 4 11c4762a1bSJed Brown #define NGEN_AT_BUS_MAX 15 12c4762a1bSJed Brown #define NLOAD_AT_BUS_MAX 1 13c4762a1bSJed Brown 14c4762a1bSJed Brown struct _p_UserCtx_Power { 15c4762a1bSJed Brown PetscScalar Sbase; 16c4762a1bSJed Brown PetscBool jac_error; /* introduce error in the jacobian */ 17c4762a1bSJed Brown PetscInt compkey_branch; 18c4762a1bSJed Brown PetscInt compkey_bus; 19c4762a1bSJed Brown PetscInt compkey_gen; 20c4762a1bSJed Brown PetscInt compkey_load; 21b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 22c4762a1bSJed Brown 23c4762a1bSJed Brown typedef struct _p_UserCtx_Power UserCtx_Power; 24c4762a1bSJed Brown 25c4762a1bSJed Brown /* 2. Bus data */ 26c4762a1bSJed Brown /* 11 columns */ 27c4762a1bSJed Brown struct _p_VERTEX_Power { 28c4762a1bSJed Brown PetscInt bus_i; /* Integer bus number .. used by some formats like Matpower */ 29c4762a1bSJed Brown char i[20]; /* Bus Number */ 30c4762a1bSJed Brown char name[20]; /* Bus Name */ 31c4762a1bSJed Brown PetscScalar basekV; /* Bus Base kV */ 32c4762a1bSJed Brown PetscInt ide; /* Bus type code */ 33c4762a1bSJed Brown PetscScalar gl; /* Active component of shunt admittance to ground */ 34c4762a1bSJed Brown PetscScalar bl; /* Reactive component of shunt admittance to ground */ 35c4762a1bSJed Brown PetscInt area; /* Area number */ 36c4762a1bSJed Brown PetscInt zone; /* Zone number */ 37c4762a1bSJed Brown PetscScalar vm; /* Bus voltage magnitude; in pu */ 38c4762a1bSJed Brown PetscScalar va; /* Bus voltage phase angle */ 39c4762a1bSJed Brown PetscInt owner; /* Owner number */ 40c4762a1bSJed Brown PetscInt internal_i; /* Internal Bus Number */ 41c4762a1bSJed Brown PetscInt ngen; /* Number of generators incident at this bus */ 42c4762a1bSJed Brown PetscInt gidx[NGEN_AT_BUS_MAX]; /* list of inndices for accessing the generator data in GEN structure */ 43c4762a1bSJed Brown PetscInt nload; 44c4762a1bSJed Brown PetscInt lidx[NLOAD_AT_BUS_MAX]; 45b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 46c4762a1bSJed Brown 47c4762a1bSJed Brown typedef struct _p_VERTEX_Power *VERTEX_Power; 48c4762a1bSJed Brown 49c4762a1bSJed Brown /* 3. Load data */ 50c4762a1bSJed Brown /* 12 columns */ 51c4762a1bSJed Brown struct _p_LOAD { 52c4762a1bSJed Brown PetscInt bus_i; /* Bus number */ 53c4762a1bSJed Brown char i[20]; /* Bus Number or extended bus name*/ 54c4762a1bSJed Brown char id[20]; /* Load identifier, in case of multiple loads. 1 by default */ 55c4762a1bSJed Brown PetscInt status; /* Load status */ 56c4762a1bSJed Brown PetscInt area; /* Area to which load is assigned */ 57c4762a1bSJed Brown PetscInt zone; /* Zone to which load is assigned */ 58c4762a1bSJed Brown PetscScalar pl; /* Active power component of constant MVA load */ 59c4762a1bSJed Brown PetscScalar ql; /* Reactive power component of constant MVA load */ 60c4762a1bSJed Brown PetscScalar ip; /* Active power component of constant current load: MW pu V */ 61c4762a1bSJed Brown PetscScalar iq; /* Reactive power component of constant current load: Mvar pu V */ 62c4762a1bSJed Brown PetscScalar yp; /* Active power component of constant admittance load: MW pu V */ 63c4762a1bSJed Brown PetscScalar yq; /* Reactive power component of constant admittance load: Mvar pu V */ 64c4762a1bSJed Brown PetscScalar scale_load; 65c4762a1bSJed Brown PetscInt owner; /* Owner number */ 66c4762a1bSJed Brown PetscInt internal_i; /* Internal Bus Number */ 67b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 68c4762a1bSJed Brown 69c4762a1bSJed Brown typedef struct _p_LOAD *LOAD; 70c4762a1bSJed Brown 71c4762a1bSJed Brown /* 4. Generator data */ 72c4762a1bSJed Brown /* 20+ columns */ 73c4762a1bSJed Brown /******* 20, USING ONLY 1 OWNER's WORTH OF DATA. COME BACK TO THIS LATER, if necessary ******/ 74c4762a1bSJed Brown struct _p_GEN { 75c4762a1bSJed Brown PetscInt bus_i; 76c4762a1bSJed Brown char i[20]; /* Bus Number or extended bus name*/ 77c4762a1bSJed Brown char id[20]; /* Generator identifier, in case of multiple generators at same bus. 1 by default */ 78c4762a1bSJed Brown PetscScalar pg; /* Generator active power output */ 79c4762a1bSJed Brown PetscScalar qg; /* Generator reactive power output */ 80c4762a1bSJed Brown PetscScalar qt; /* Maximum reactive power output: Mvar */ 81c4762a1bSJed Brown PetscScalar qb; /* Minimum reactive power output: Mvar */ 82c4762a1bSJed Brown PetscScalar vs; /* Regulated voltage setpoint: pu */ 83c4762a1bSJed Brown PetscInt ireg; /* Remote bus number/identifier */ 84c4762a1bSJed Brown PetscScalar mbase; /* MVA base of the machine */ 85c4762a1bSJed Brown PetscScalar zr; /* Complex machine impedance ZSOURCE in pu on mbase */ 86c4762a1bSJed Brown PetscScalar zx; /* ----------------------"------------------------- */ 87c4762a1bSJed Brown PetscScalar rt; /* Step-up transformer impedance XTRAN in pu on mbase */ 88c4762a1bSJed Brown PetscScalar xt; /* -----------------------"-------------------------- */ 89c4762a1bSJed Brown PetscScalar gtap; /* Step-up transformer turns ratio */ 90c4762a1bSJed Brown PetscInt status; /* Machine status */ 91c4762a1bSJed Brown PetscScalar rmpct; /* Mvar % required to hold voltage at remote bus */ 92c4762a1bSJed Brown PetscScalar pt; /* Gen max active power output: MW */ 93c4762a1bSJed Brown PetscScalar pb; /* Gen min active power output: MW */ 94c4762a1bSJed Brown PetscInt o1; /* Owner number */ 95c4762a1bSJed Brown PetscScalar f1; /* Fraction of ownership */ 96c4762a1bSJed Brown PetscScalar scale_gen; 97c4762a1bSJed Brown PetscInt internal_i; /* Internal Bus Number */ 98b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 99c4762a1bSJed Brown 100c4762a1bSJed Brown typedef struct _p_GEN *GEN; 101c4762a1bSJed Brown 102c4762a1bSJed Brown /* 17+ columns */ 103c4762a1bSJed Brown struct _p_EDGE_Power { 104c4762a1bSJed Brown PetscInt fbus; 105c4762a1bSJed Brown PetscInt tbus; 106c4762a1bSJed Brown char i[20]; /* Bus Number or extended bus name*/ 107c4762a1bSJed Brown char j[20]; /* Bus Number or extended bus name*/ 108c4762a1bSJed Brown char ckt[20]; /* Circuit identifier. 1 by default */ 109c4762a1bSJed Brown PetscScalar r; /* Branch resistance: pu */ 110c4762a1bSJed Brown PetscScalar x; /* Branch reactance: pu */ 111c4762a1bSJed Brown PetscScalar b; /* Branch charging susceptance: pu */ 112c4762a1bSJed Brown PetscScalar rateA; /* rate A in MVA */ 113c4762a1bSJed Brown PetscScalar rateB; /* rate B in MVA */ 114c4762a1bSJed Brown PetscScalar rateC; /* rate C in MVA */ 115c4762a1bSJed Brown PetscScalar tapratio; 116c4762a1bSJed Brown PetscScalar phaseshift; 117c4762a1bSJed Brown PetscScalar gi; /* Complex admittance at 'i' end: pu */ 118c4762a1bSJed Brown PetscScalar bi; /* Complex admittance at 'i' end: pu */ 119c4762a1bSJed Brown PetscScalar gj; /* Complex admittance at 'j' end: pu */ 120c4762a1bSJed Brown PetscScalar bj; /* Complex admittance at 'j' end: pu */ 121c4762a1bSJed Brown PetscInt status; /* Service status */ 122c4762a1bSJed Brown PetscScalar length; /* Line length */ 123c4762a1bSJed Brown PetscInt o1; /* Owner number */ 124c4762a1bSJed Brown PetscScalar f1; /* Fraction of ownership */ 125c4762a1bSJed Brown PetscScalar yff[2], yft[2], ytf[2], ytt[2]; /* [G,B] */ 126c4762a1bSJed Brown PetscInt internal_i; /* Internal From Bus Number */ 127c4762a1bSJed Brown PetscInt internal_j; /* Internal To Bus Number */ 128b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 129c4762a1bSJed Brown 130c4762a1bSJed Brown typedef struct _p_EDGE_Power *EDGE_Power; 131c4762a1bSJed Brown 132c4762a1bSJed Brown /* PTI format data structure */ 133c4762a1bSJed Brown typedef struct { 134c4762a1bSJed Brown PetscScalar sbase; /* System base MVA */ 135c4762a1bSJed Brown PetscInt nbus, ngen, nbranch, nload; /* # of buses,gens,branches, and loads (includes elements which are 136c4762a1bSJed Brown out of service */ 137c4762a1bSJed Brown VERTEX_Power bus; 138c4762a1bSJed Brown LOAD load; 139c4762a1bSJed Brown GEN gen; 140c4762a1bSJed Brown EDGE_Power branch; 141b8582c7cSSatish Balay } PFDATA PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 142c4762a1bSJed Brown 143c4762a1bSJed Brown extern PetscErrorCode PFReadMatPowerData(PFDATA *, char *); 144c4762a1bSJed Brown extern PetscErrorCode GetListofEdges_Power(PFDATA *, PetscInt *); 145c4762a1bSJed Brown extern PetscErrorCode FormJacobian_Power(SNES, Vec, Mat, Mat, void *); 146c4762a1bSJed Brown extern PetscErrorCode FormJacobian_Power_private(DM, Vec, Mat, PetscInt, PetscInt, const PetscInt *, const PetscInt *, void *); 147c4762a1bSJed Brown extern PetscErrorCode FormFunction_Power(DM, Vec, Vec, PetscInt, PetscInt, const PetscInt *, const PetscInt *, void *); 148c4762a1bSJed Brown extern PetscErrorCode SetInitialGuess_Power(DM, Vec, PetscInt, PetscInt, const PetscInt *, const PetscInt *, void *); 149