/* Set up compiler for maximum number of generators for future changes */

#define MAXGEN 10                       /* MAXIMUM NUMBER OF GENERATORS    */
#define MAXBUS 10                       /* MAXIMUM NUMBER OF BUSSES        */
#define MAXLINE 15                      /* MAXIMUM NUMBER OF LINES         */
#define CASES 1024                      /* MAXIMUM POSSIBLE GOOD CASES     */
#define OUTROW 2                        /* SCREEN OUTPUT ROW COORDINATE    */
#define OUTCOL 1                        /* SCREEN OUTPUT COLUMN COORDINATE */
#define INROW 25                        /* SCREEN INPUT ROW COORDINATE     */
#define INCOL 1                         /* SCREEN INPUT COLUMN COORDINATE  */
#define TOL .1                          /* CONVERGENCE TOLERANCE           */
#define MAXITERATIONS 20                /* MAXIMUM ALLOWED ITERATIONS      */

/* SET UP FUNCTIONS FOR I/O SUBROUTINES ---------------------------------- */
char check_gen_data(int unitno);        /* CHECKS FOR GOOD GENERATOR DATA  */
char get_gen_data(void);                /* GET GENERATOR DAT FROM A FILE   */
								/* T-rue F-alse                    */
char get_loss_data(void);               /* GET THE LOSS DATA FROM A FILE   */
char input_data(void);                  /* INPUT DATA & EDIT DATA ROUTINE  */
char save_data(void);                   /* SAVE DATA TO A FILE             */
void show_data(void);                   /* SHOWS GENERATOR DATA & FEASIBLE */

/* - SET UP FUNCTIONS FOR DISPATCH --------------------------------------  */
char solve_a_case(void);                /* SOLVE A CASE S-olved F-ailed    */
void calc_dfdp_constants (void);        /* CALCULATE FIRST DERIVATIVE F(P) */
char calc_output (void);                /* GIVEN LAMBDA, CALCULAT OUTPUT   */
void calc_energy_cost (void);           /* ENERGY COST                     */
void print_solution(void);              /* PRINT OUT SOLVED CASE           */
char binary_solution(void);             /* BINARY SOLUTION METHOD          */
char slope_solution(float acceleration); /* BASE GUESS ON PREVIOUS ERR */

/* -FUNCTIONS DEDICATED TO TEACHING -------------------------------------  */
char guess_a_lambda( void );            /* GUESS LAMBDA & DISPLAY OUTPUT   */
char teach_equal_lambda(void);          /* TEACH MINIMUM COST AT = LAMBDA  */
char input_gen_poly( int unitno);       /* GENERATOR INPUT DATA            */
char plot_gen_poly( float min_load,     /* PLOTS GENERATOR POLYNOMIAL      */
				float max_load,
				float *mw_out,
				float *mw_in,
				int numobs,         /* NUMBER OF HEAT RATE DATA POINTS */
				float *coef);       /* COEFFECIENTS OF POLYNOMIAL      */
	/* PLOT THE RESULTS OF AN ITERATIVE SOLUTION */
void plot_iterations( float *each_guess, int num_guess );

/* GRAPHS UNIT OUTPUT & LAMBDAS    */
char display_unit_incrementals( float disp_lambda, char show_steps);

/* UPDATE LOSS PEANALTY dPl/dPn    */
char update_loss_penalty(void);

/* SET UP COMPLEX VARIABLES  --------------------------------------------- */
struct complex cdiv(struct complex, struct complex); /* COMPLEX DIVIDE     */
struct complex far y[MAXBUS][MAXBUS];    /* Y MATRIX DEFINITION            */

/* DIMENSIONED ARRAY FOR GENERATOR DATA ---------------------------------- */

/* Input Data */

float      gen_name[MAXGEN];        /* NUMBER ASSIGNED TO GENERATOR         */
float      min_out[MAXGEN],         /* MINIMUM OUTPUT OF THIS GENERATOR     */
		 max_out[MAXGEN],         /* MAXIMUM OUTPUT OF THIS GENERATOR     */
		 fuel_cost[MAXGEN],       /* FUEL COST FOR THIS GENERATOR         */
		 h_0[MAXGEN],             /* NO LOAD CONSTANT OF ENERGY = f(Pi)   */
		 h_1[MAXGEN],             /* LINEAR PORTION OF ENERGY = f(Pi)     */
		 h_2[MAXGEN],             /* SQUARED PORTION OF ENERGY = f(Pi)    */
		 h_3[MAXGEN],             /* CUBED PORTION OF ENERGY = f(Pi)      */
		 loss_dpdl[MAXGEN],       /* CHANGE IN LOSSES PER GEN. OUTPUT     */
		 dfdp_0[MAXGEN],          /* CONSTANT PORTION OF LAMBDA           */
		 dfdp_1[MAXGEN],          /* PORTION OF LAMBDA PROPORTIONAL TO Pi */
		 dfdp_2[MAXGEN];          /* new constant to be determined        */

/* Calculated Data */

float far gen_min_lambda[MAXGEN],  /* MINIMUM LAMBDA FOR THIS UNIT         */
		gen_max_lambda[MAXGEN],  /* MAXIMUM LAMBDA FOR THIS UNIT         */
		gen_lambda[MAXGEN],      /* CALCULATED GENERATOR LAMBDA          */
		gen_load[MAXGEN],        /* CALCULATED GENERATOR LOAD            */
		gen_output_cost[MAXGEN], /* TOTAL OUTPUT COST AT A GIVEN LOAD    */
		gen_energy_cost[MAXGEN]; /* ENERGY COST / KWH AT A GIVEN LOAD    */
char      gen_status[MAXGEN];      /* STATUS      R-egulating              */
							/*             L-ow limit               */
							/*             H-igh limit              */
							/*             O-ff (not available)     */
							/*             F-ixed output            */
float lam_guess[MAXITERATIONS];    /* KEEPS TRACK OF LAMBDA ITERATIONS     */

/* DIMENSINED ARRAYS FOR LOSS CALCULATIONS FROM LOAD FLOW ---------------- */

float far dpl_dtheta[MAXBUS];      /* LOSS CHANGE / CHANGE IN THETA        */
float far a[MAXBUS][MAXGEN],       /* A(j,n) COEFFECIENTS                  */
		v[MAXBUS],               /* MAGNITUDE OF VOLTAGE AT BUS j        */
		theta[MAXBUS];           /* ANGLE OF VOLTAGE AT BUS j            */


/* - SET UP MISCELLANEOUS VARIABLES -------------------------------------- */

int   num_gen = 0;                 /* NUMBER OF GENERATORS                 */
int   num_line = 0;                /* NUMBER OF LINES                      */
int   num_bus = 0;                 /* NUMBER OF BUSSES                     */
int   num_guesses = 0;             /* NUMBER OF GUESSES FROM ITERATIONS    */
float lambda = 0;                  /* SYSTEM LAMBDA                        */
float max_lambda;                  /* MAXIMUM LAMBDA FROM GENERATORS       */
float min_lambda;                  /* MINIMUM LAMBDA FROM GENERATORS       */
float system_load = 0;             /* SYSTEM LOAD TO MEET                  */
float net_out = 0;                 /* OUTPUT TOTALIZER                */
float maximum_feasable = 0;        /* MAXIMUM FEASABLE GENERATION          */
float minimum_feasable = 0;        /* MINIMUM FEASABLE GENERATION          */

/* Status Flags */

char  mp[81];                      /* MESSAGE STRING POINTER               */
char  valid_data = 'F';            /* VALID DATA CHECK T-rue F-alse        */
char  up_to_date = 'F';            /* MARKER FOR CURRENT DATA ON FILE      */
char  file_open = 'F';             /* FILE OPEN TRACKING VARIABLE          */
char  useloss = 'Y';               /* USE LOSS SELECTOR   Y-es N-o         */
char  line_data = 'N';             /* HAVE WE LOADED LINE DATA  Y-es N-o   */
char  bus_data = 'N';              /* HAVE WE LOADED BUS  DATA  Y-es N-o   */
char  a_data = 'N';                /* HAVE WE LOADED A    DATA  Y-es N-o   */
char  print_all = 'N';             /* PRINT OUT INTERMEDIATE STEPS         */
char  teach_mode = 'T';            /* SHOW LEARN MESSAGES? T/F             */

/* File buffers */

static FILE *genfile;              /* GENERATOR FILE NAME POINTER          */
char  genfile_buff[128] = "NONE";  /* BUFFER FOR FILE NAME                 */

/* Miscellaneous graphics display variables                                */
char      buffer [81];             /* I/O BUFFER FOR _OUTTEXT              */
short     oldfgd;                  /* OLD FOREGROUND COLOR                 */
long      oldbgd;                  /* OLD BACKGROUND COLOR                 */
struct    rccoord oldpos;          /* FORMER CURSOR POSITION               */
int       line_color[10];          /* ARRAY CONTAINING LINE COLOR DATA     */
int       border_color;            /* COLOR NUMBER FOR GRAPH BORDERS       */
int       axis_color;              /* COLOR NUMBER FOR AXIS                */
int       lambda_color;            /* COLOR FOR LAMBDA ON GRAPHS           */
int       gen1_color;              /* COLOR FOR GENERATOR 1 ON EQUAL LAMBD */
int       gen2_color;              /* COLOR FOR GENERATOR 2 ON EQUAL LAMBD */
int       iter_color;              /* COLOR FOR ITERATION PLOT             */
int       prompt_color;            /* COLOR FOR PROMPT LINE                */
float     scatter_mark_size;       /* SCALE FACTOR FOR SCATTER MARKING     */
char      font_path[40];           /* FONT PATH SPECIFICATION              */