예제 #1
0
파일: bus.c 프로젝트: entriken/PFNET
REAL BUS_get_total_gen_Q(Bus* bus, int t) {
  Gen* gen;
  REAL Q = 0;
  if (!bus || t < 0 || t >= bus->num_periods)
    return 0;
  for (gen = bus->gen; gen != NULL; gen = GEN_get_next(gen))
    Q += GEN_get_Q(gen,t);
  return Q;
}
예제 #2
0
파일: constr_FIX.c 프로젝트: entriken/PFNET
void CONSTR_FIX_analyze_step(Constr* c, Branch* br, int t) {

  // Local variables
  Bus* buses[2];
  Bus* bus;
  Gen* gen;
  Vargen* vargen;
  Bat* bat;
  Load* load;
  Shunt* shunt;
  int* A_nnz;
  int* A_row;
  char* bus_counted;
  Vec* b;
  Mat* A;
  int i;
  REAL Pc;
  REAL Pd;
  int T;

  // Number of periods
  T = BRANCH_get_num_periods(br);

  // Cosntr data
  b = CONSTR_get_b(c);
  A = CONSTR_get_A(c);
  A_nnz = CONSTR_get_A_nnz_ptr(c);
  A_row = CONSTR_get_A_row_ptr(c);
  bus_counted = CONSTR_get_bus_counted(c);

  // Check pointers
  if (!A_nnz || !A_row || !bus_counted)
    return;

  // Check outage
  if (BRANCH_is_on_outage(br))
    return;

  // Bus data
  buses[0] = BRANCH_get_bus_k(br);
  buses[1] = BRANCH_get_bus_m(br);

  // Tap ratio
  if (BRANCH_has_flags(br,FLAG_FIXED,BRANCH_VAR_RATIO) &&
      BRANCH_has_flags(br,FLAG_VARS,BRANCH_VAR_RATIO)) {
    VEC_set(b,*A_row,BRANCH_get_ratio(br,t));
    MAT_set_i(A,*A_nnz,*A_row);
    MAT_set_j(A,*A_nnz,BRANCH_get_index_ratio(br,t));
    MAT_set_d(A,*A_nnz,1.);
    (*A_nnz)++;
    (*A_row)++;
  }

  // Phase shift
  if (BRANCH_has_flags(br,FLAG_FIXED,BRANCH_VAR_PHASE) &&
      BRANCH_has_flags(br,FLAG_VARS,BRANCH_VAR_PHASE)) {
    VEC_set(b,*A_row,BRANCH_get_phase(br,t));
    MAT_set_i(A,*A_nnz,*A_row);
    MAT_set_j(A,*A_nnz,BRANCH_get_index_phase(br,t));
    MAT_set_d(A,*A_nnz,1.);
    (*A_nnz)++;
    (*A_row)++;
  }

  // Buses
  for (i = 0; i < 2; i++) {

    bus = buses[i];

    if (!bus_counted[BUS_get_index(bus)*T+t]) {

      // Voltage magnitude (V_MAG)
      if (BUS_has_flags(bus,FLAG_FIXED,BUS_VAR_VMAG) &&
	  BUS_has_flags(bus,FLAG_VARS,BUS_VAR_VMAG)) {
	if (BUS_is_regulated_by_gen(bus))
	  VEC_set(b,*A_row,BUS_get_v_set(bus,t));
	else
	  VEC_set(b,*A_row,BUS_get_v_mag(bus,t));
	MAT_set_i(A,*A_nnz,*A_row);
	MAT_set_j(A,*A_nnz,BUS_get_index_v_mag(bus,t));
	MAT_set_d(A,*A_nnz,1.);
	(*A_nnz)++;

	// Extra nz for regulating generator (for PV-PQ switching?)
	if (BUS_is_regulated_by_gen(bus) &&
	    GEN_has_flags(BUS_get_reg_gen(bus),FLAG_VARS,GEN_VAR_Q)) {
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,GEN_get_index_Q(BUS_get_reg_gen(bus),t));
	  MAT_set_d(A,*A_nnz,0.); // placeholder
	  (*A_nnz)++;
	}

	(*A_row)++;
      }

      // Voltage angle (V_ANG)
      if (BUS_has_flags(bus,FLAG_FIXED,BUS_VAR_VANG) &&
	  BUS_has_flags(bus,FLAG_VARS,BUS_VAR_VANG)) {
	VEC_set(b,*A_row,BUS_get_v_ang(bus,t));
	MAT_set_i(A,*A_nnz,*A_row);
	MAT_set_j(A,*A_nnz,BUS_get_index_v_ang(bus,t));
	MAT_set_d(A,*A_nnz,1.);
	(*A_nnz)++;
	(*A_row)++;
      }

      // Generators
      for (gen = BUS_get_gen(bus); gen != NULL; gen = GEN_get_next(gen)) {

	// Active power (P)
	if (GEN_has_flags(gen,FLAG_FIXED,GEN_VAR_P) &&
	    GEN_has_flags(gen,FLAG_VARS,GEN_VAR_P)) {
	  VEC_set(b,*A_row,GEN_get_P(gen,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,GEN_get_index_P(gen,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}

	// Reactive power (Q)
	if (GEN_has_flags(gen,FLAG_FIXED,GEN_VAR_Q) &&
	    GEN_has_flags(gen,FLAG_VARS,GEN_VAR_Q)) {
	  VEC_set(b,*A_row,GEN_get_Q(gen,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,GEN_get_index_Q(gen,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}
      }

      // Variable generators
      for (vargen = BUS_get_vargen(bus); vargen != NULL; vargen = VARGEN_get_next(vargen)) {

	// Active power (P)
	if (VARGEN_has_flags(vargen,FLAG_FIXED,VARGEN_VAR_P) &&
	    VARGEN_has_flags(vargen,FLAG_VARS,VARGEN_VAR_P)) {
	  VEC_set(b,*A_row,VARGEN_get_P(vargen,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,VARGEN_get_index_P(vargen,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}

	// Reactive power (Q)
	if (VARGEN_has_flags(vargen,FLAG_FIXED,VARGEN_VAR_Q) &&
	    VARGEN_has_flags(vargen,FLAG_VARS,VARGEN_VAR_Q)) {
	  VEC_set(b,*A_row,VARGEN_get_Q(vargen,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,VARGEN_get_index_Q(vargen,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}
      }

      // Shunts
      for (shunt = BUS_get_shunt(bus); shunt != NULL; shunt = SHUNT_get_next(shunt)) {

	// Susceptance (b)
	if (SHUNT_has_flags(shunt,FLAG_FIXED,SHUNT_VAR_SUSC) &&
	    SHUNT_has_flags(shunt,FLAG_VARS,SHUNT_VAR_SUSC)) {
	  VEC_set(b,*A_row,SHUNT_get_b(shunt,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,SHUNT_get_index_b(shunt,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}
      }

      // Batteries
      for (bat = BUS_get_bat(bus); bat != NULL; bat = BAT_get_next(bat)) {

	// Charging/discharging power (P)
	if (BAT_has_flags(bat,FLAG_FIXED,BAT_VAR_P) &&
	    BAT_has_flags(bat,FLAG_VARS,BAT_VAR_P)) {

	  if (BAT_get_P(bat,t) >= 0) {
	    Pc = BAT_get_P(bat,t);
	    Pd = 0.;
	  }
	  else {
	    Pc = 0.;
	    Pd = -BAT_get_P(bat,t);
	  }

	  // Pc
	  VEC_set(b,*A_row,Pc);
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,BAT_get_index_Pc(bat,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;

	  // Pd
	  VEC_set(b,*A_row,Pd);
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,BAT_get_index_Pd(bat,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}

	// Energy level (E)
	if (BAT_has_flags(bat,FLAG_FIXED,BAT_VAR_E) &&
	    BAT_has_flags(bat,FLAG_VARS,BAT_VAR_E)) {
	  VEC_set(b,*A_row,BAT_get_E(bat,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,BAT_get_index_E(bat,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}
      }

      // Loads
      for (load = BUS_get_load(bus); load != NULL; load = LOAD_get_next(load)) {

	// Active power (P)
	if (LOAD_has_flags(load,FLAG_FIXED,LOAD_VAR_P) &&
	    LOAD_has_flags(load,FLAG_VARS,LOAD_VAR_P)) {
	  VEC_set(b,*A_row,LOAD_get_P(load,t));
	  MAT_set_i(A,*A_nnz,*A_row);
	  MAT_set_j(A,*A_nnz,LOAD_get_index_P(load,t));
	  MAT_set_d(A,*A_nnz,1.);
	  (*A_nnz)++;
	  (*A_row)++;
	}
      }
    }

    // Update counted flag
    bus_counted[BUS_get_index(bus)*T+t] = TRUE;
  }
}
예제 #3
0
파일: func_REG_PQ.c 프로젝트: ttinoco/PFNET
void FUNC_REG_PQ_eval_step(Func* f, Branch* br, int t, Vec* var_values) {

  // Local variables
  Bus* bus[2];
  Gen* gen;
  int bus_index_t[2];
  char* bus_counted;
  REAL* phi;
  REAL* gphi;
  REAL Qmid;
  REAL Pmid;
  REAL P;
  REAL Q;
  REAL dP;
  REAL dQ;
  int k;
  int T;
 
  // Num periods
  T = BRANCH_get_num_periods(br);

  // Constr data
  phi = FUNC_get_phi_ptr(f);
  gphi = VEC_get_data(FUNC_get_gphi(f));
  bus_counted = FUNC_get_bus_counted(f);

  // Check pointers
  if (!phi || !gphi || !bus_counted)
    return;

  // Check outage
  if (BRANCH_is_on_outage(br))
    return;

  // Bus data
  bus[0] = BRANCH_get_bus_from(br);
  bus[1] = BRANCH_get_bus_to(br);
  for (k = 0; k < 2; k++)
    bus_index_t[k] = BUS_get_index(bus[k])*T+t;

  // Buses
  for (k = 0; k < 2; k++) {

    if (!bus_counted[bus_index_t[k]]) {
      
      // Generators
      for (gen = BUS_get_gen(bus[k]); gen != NULL; gen = GEN_get_next(gen)) {

	// Mid value
	Qmid = (GEN_get_Q_max(gen)+GEN_get_Q_min(gen))/2.; // p.u.
	Pmid = (GEN_get_P_max(gen)+GEN_get_P_min(gen))/2.; // p.u.

	// Normalization factor
	dQ = GEN_get_Q_max(gen)-GEN_get_Q_min(gen); // p.u.
	if (dQ < FUNC_REG_PQ_PARAM)
	  dQ = FUNC_REG_PQ_PARAM;
	dP = GEN_get_P_max(gen)-GEN_get_P_min(gen); // p.u.
	if (dP < FUNC_REG_PQ_PARAM)
	  dP = FUNC_REG_PQ_PARAM;
	
	if (GEN_has_flags(gen,FLAG_VARS,GEN_VAR_Q)) { // Q var
	  
	  // Value
	  Q = VEC_get(var_values,GEN_get_index_Q(gen,t));

	  // phi
	  (*phi) += 0.5*pow((Q-Qmid)/dQ,2.);
	  
	  // gphi
	  gphi[GEN_get_index_Q(gen,t)] = (Q-Qmid)/(dQ*dQ);
	}
	else {
	  
	  // Value
	  Q = GEN_get_Q(gen,t);

	  // phi
	  (*phi) += 0.5*pow((Q-Qmid)/dQ,2.); 
	}

	if (GEN_has_flags(gen,FLAG_VARS,GEN_VAR_P)) { // P var
	  	
	  // Value
	  P = VEC_get(var_values,GEN_get_index_P(gen,t));

	  // phi
	  (*phi) += 0.5*pow((P-Pmid)/dP,2.);

	  // gphi
	  gphi[GEN_get_index_P(gen,t)] = (P-Pmid)/(dP*dP);
	}
	else {

	  // Value
	  P = GEN_get_P(gen,t);

	  // phi
	  (*phi) += 0.5*pow((P-Pmid)/dP,2.);
	}
      }
    }
    
    // Update counted flag
    bus_counted[bus_index_t[k]] = TRUE;
  }
}
예제 #4
0
void CONSTR_PAR_GEN_Q_analyze_branch(Constr* c, Branch* br) {
  
  // Local variables
  Bus* buses[2];
  Bus* bus;
  Gen* gen1;
  Gen* gen2;
  int* Acounter;
  int* Aconstr_index;
  char* bus_counted;
  Vec* b;
  Mat* A;
  int i;
  int j;
  REAL Qmin1;
  REAL Qmin2;
  REAL dQ1;
  REAL dQ2;
  
  // Cosntr data
  b = CONSTR_get_b(c);
  A = CONSTR_get_A(c);
  Acounter = CONSTR_get_Acounter_ptr(c);
  Aconstr_index = CONSTR_get_Aconstr_index_ptr(c);
  bus_counted = CONSTR_get_bus_counted(c);
  if (!Acounter || !Aconstr_index || !bus_counted)
    return;

  // Bus data
  buses[0] = BRANCH_get_bus_from(br);
  buses[1] = BRANCH_get_bus_to(br);

  // Buses
  for (i = 0; i < 2; i++) {
    
    bus = buses[i];
    
    if (!bus_counted[BUS_get_index(bus)]) {
      
      // Reactive power of regulating generators
      if (BUS_is_regulated_by_gen(bus)) {
	gen1 = BUS_get_reg_gen(bus);
	Qmin1 = GEN_get_Q_min(gen1);
	dQ1 = GEN_get_Q_max(gen1)-Qmin1;
	if (dQ1 < CONSTR_PAR_GEN_Q_PARAM)
	  dQ1 = CONSTR_PAR_GEN_Q_PARAM;
	for (gen2 = GEN_get_reg_next(gen1); gen2 != NULL; gen2 = GEN_get_reg_next(gen2)) {
	  Qmin2 = GEN_get_Q_min(gen2);
	  dQ2 = GEN_get_Q_max(gen2)-Qmin2;
	  if (dQ2 < CONSTR_PAR_GEN_Q_PARAM)
	    dQ2 = CONSTR_PAR_GEN_Q_PARAM;
	  VEC_set(b,*Aconstr_index,Qmin1/dQ1-Qmin2/dQ2);
	  if (GEN_has_flags(gen1,FLAG_VARS,GEN_VAR_Q)) {
	    MAT_set_i(A,*Acounter,*Aconstr_index);
	    MAT_set_j(A,*Acounter,GEN_get_index_Q(gen1));
	    MAT_set_d(A,*Acounter,1./dQ1);
	    (*Acounter)++;
	  }
	  else
	    VEC_add_to_entry(b,*Aconstr_index,-GEN_get_Q(gen1)/dQ1); 
	  if (GEN_has_flags(gen2,FLAG_VARS,GEN_VAR_Q)) {
	    MAT_set_i(A,*Acounter,*Aconstr_index);
	    MAT_set_j(A,*Acounter,GEN_get_index_Q(gen2));	      
	    MAT_set_d(A,*Acounter,-1./dQ2);
	    (*Acounter)++;
	  }
	  else
	    VEC_add_to_entry(b,*Aconstr_index,GEN_get_Q(gen2)/dQ2); 
	  (*Aconstr_index)++;
	}
      }
    }

    // Update counted flag
    bus_counted[BUS_get_index(bus)] = TRUE;    
  }  
}