int transmissioncom::init(OBJECT *parent) { OBJECT *hdr = OBJECTHDR(this); // input validation checks // * parent is a controller if(0 == parent){ gl_error("init(): no parent object"); return 0; } if(!gl_object_isa(parent, "substation", "powerflow") && !gl_object_isa(parent, "meter", "powerflow")){ gl_error("init(): parent is not a powerflow:substation or a powerflow:meter."); return 0; } //TODO: datafromgld=gl_get_property..... datafromgld = get_complex(parent, power_property); datatogld = get_complex(parent, voltage_property); if(gl_object_isa(parent, "substation", "powerflow")){ powerdiff = get_double(parent,"power_convergence_value"); } else { default_powerdiff = 1; //default is 1 VA powerdiff = &default_powerdiff; } myinterface=Integrator::getCommInterface(hdr->name); printf("MY INTEFRACE is mull %d\n",myinterface==NULL); }
void mexFunction ( int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin [ ] ) { if (nargout > 1 || nargin < 2 || nargin > 4) { mexErrMsgTxt ("Usage: C = cs_add(A,B,alpha,beta)") ; } if (mxIsComplex (pargin [0]) || mxIsComplex (pargin [1]) || (nargin > 2 && mxIsComplex (pargin [2])) || (nargin > 3 && mxIsComplex (pargin [3]))) { #ifndef NCOMPLEX cs_complex_t alpha, beta ; cs_cl Amatrix, Bmatrix, *A, *B, *C, *D ; A = cs_cl_mex_get_sparse (&Amatrix, 0, pargin [0]) ; /* get A */ B = cs_cl_mex_get_sparse (&Bmatrix, 0, pargin [1]) ; /* get B */ alpha = (nargin < 3) ? 1 : get_complex (pargin [2]) ; /* get alpha */ beta = (nargin < 4) ? 1 : get_complex (pargin [3]) ; /* get beta */ C = cs_cl_add (A,B,alpha,beta) ; /* C = alpha*A + beta *B */ cs_cl_dropzeros (C) ; /* drop zeros */ D = cs_cl_transpose (C, 1) ; /* sort result via double transpose */ cs_cl_spfree (C) ; C = cs_cl_transpose (D, 1) ; cs_cl_spfree (D) ; pargout [0] = cs_cl_mex_put_sparse (&C) ; /* return C */ #else mexErrMsgTxt ("complex matrices not supported") ; #endif } else { double alpha, beta ; cs_dl Amatrix, Bmatrix, *A, *B, *C, *D ; A = cs_dl_mex_get_sparse (&Amatrix, 0, 1, pargin [0]) ; /* get A */ B = cs_dl_mex_get_sparse (&Bmatrix, 0, 1, pargin [1]) ; /* get B */ alpha = (nargin < 3) ? 1 : mxGetScalar (pargin [2]) ; /* get alpha */ beta = (nargin < 4) ? 1 : mxGetScalar (pargin [3]) ; /* get beta */ C = cs_dl_add (A,B,alpha,beta) ; /* C = alpha*A + beta *B */ cs_dl_dropzeros (C) ; /* drop zeros */ D = cs_dl_transpose (C, 1) ; /* sort result via double transpose */ cs_dl_spfree (C) ; C = cs_dl_transpose (D, 1) ; cs_dl_spfree (D) ; pargout [0] = cs_dl_mex_put_sparse (&C) ; /* return C */ } }
void MainWindow::mouse_released_slot(int xt, int yt, int xb, int yb) { Complex tmp1 = get_complex(xt, yt), tmp2 = get_complex(xb, yb); upper_left_corner = tmp1; lower_right_corner = tmp2; upper_left_corner_x_edit->setText(QString("%1").arg(upper_left_corner.x)); upper_left_corner_y_edit->setText(QString("%1").arg(upper_left_corner.y)); lower_right_corner_x_edit->setText(QString("%1").arg(lower_right_corner.x)); lower_right_corner_y_edit->setText(QString("%1").arg(lower_right_corner.y)); emit paint_button->clicked(); }
void MainWindow::paint_slot() { c = Complex(c_re_edit->text().toDouble(), c_im_edit->text().toDouble()); infinity = infinity_edit->text().toDouble(); iterations = iterations_edit->text().toInt(); red_factor = red_factor_edit->text().toDouble(); green_factor = green_factor_edit->text().toDouble(); blue_factor = blue_factor_edit->text().toDouble(); uchar* bit = image->bits(); for ( int i = 0; i < image_height; ++i ) { for ( int j = 0; j < image_width; ++j ) { Complex z0 = get_complex(j, i); int iter = when_goes_to_infinity(z0); double sum = (blue_factor + green_factor + red_factor) / 3; // iter = (iterations - iter); /* * normal * *bit = std::min(255, (int)(255 * blue_factor / sum * iter * iter / iterations)); ++bit; //blue *bit = std::min(255, (int)(255 * green_factor / sum * iter * iter / iterations)); ++bit; //green *bit = std::min(255, (int)(255 * red_factor / sum * iter * iter / iterations)); ++bit; //red */ /* * modular * *bit = (int)(255 * blue_factor * iter * iter / iterations / sum); ++bit; //blue *bit = (int)(255 * green_factor * iter * iter / iterations / sum); ++bit; //green *bit = (int)(255 * red_factor * iter * iter / iterations / sum); ++bit; //red */ *bit = 255; ++bit; //alpha } } fractal->setPixmap(QPixmap::fromImage(*image)); }
/* Object initialization is called once after all object have been created */ int microturbine::init(OBJECT *parent) { //generator_mode_choice = CONSTANT_PQ; gen_status_v = ONLINE; Rinternal = 0.05; Rload = 1; V_Max = complex(10000); I_Max = complex(1000); frequency = 0; Max_Frequency = 2000; Min_Frequency = 0; Fuel_Used = 0; Heat_Out = 0; KV = 1; //voltage constant Power_Angle = 1; Max_P = 100;//< maximum real power capacity in kW Min_P = 0;//< minimus real power capacity in kW Max_Q = 100;//< maximum reactive power capacity in kVar Min_Q = 0;//< minimus reactive power capacity in kVar Rated_kVA = 150; //< nominal capacity in kVA //double Rated_kV; //< nominal line-line voltage in kV efficiency = 0; pf_Out = 1; gl_verbose("microturbine init: finished initializing variables"); struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V_A, "phaseA_V_In"}, {&pCircuit_V_B, "phaseB_V_In"}, {&pCircuit_V_C, "phaseC_V_In"}, {&pLine_I_A, "phaseA_I_In"}, {&pLine_I_B, "phaseB_I_In"}, {&pLine_I_C, "phaseC_I_In"}, /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) }; static complex default_line_voltage[1], default_line_current[1]; int i; // find parent meter, if not defined, use a default meter (using static variable 'default_meter') if (parent!=NULL && strcmp(parent->oclass->name,"meter")==0) { for (i=0; i<sizeof(map)/sizeof(map[0]); i++) *(map[i].var) = get_complex(parent,map[i].varname); gl_verbose("microturbine init: mapped METER objects to internal variables"); } else if (parent!=NULL && strcmp(parent->oclass->name,"rectifier")==0){ gl_verbose("microturbine init: parent WAS found, is an rectifier!"); // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) for (i=0; i<sizeof(map)/sizeof(map[0]); i++){ *(map[i].var) = get_complex(parent,map[i].varname); } gl_verbose("microturbine init: mapped RECTIFIER objects to internal variables"); } else{ // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) gl_verbose("microturbine init: mapped meter objects to internal variables"); OBJECT *obj = OBJECTHDR(this); gl_verbose("microturbine init: no parent meter defined, parent is not a meter"); gl_warning("microturbine:%d %s", obj->id, parent==NULL?"has no parent meter defined":"parent is not a meter"); // attach meter variables to each circuit in the default_meter *(map[0].var) = &default_line_voltage[0]; *(map[1].var) = &default_line_current[0]; // provide initial values for voltages default_line_voltage[0] = complex(V_Max.Re()/sqrt(3.0),0); default_line_current[0] = complex(I_Max.Re()); //default_line123_voltage[1] = complex(V_Max/sqrt(3.0)*cos(2*PI/3),V_Max/sqrt(3.0)*sin(2*PI/3)); //default_line123_voltage[2] = complex(V_Max/sqrt(3.0)*cos(-2*PI/3),V_Max/sqrt(3.0)*sin(-2*PI/3)); } gl_verbose("microturbine init: finished connecting with meter"); /* TODO: set the context-dependent initial value of properties */ //double ZB, SB, EB; //complex tst; if (gen_mode_v==UNKNOWN) { OBJECT *obj = OBJECTHDR(this); throw("Generator control mode is not specified"); } if (gen_status_v==0) { //OBJECT *obj = OBJECTHDR(this); throw("Generator is out of service!"); }else { return 1; } return 1; /* return 1 on success, 0 on failure */ }
/* Object initialization is called once after all object have been created */ int inverter::init(OBJECT *parent) { OBJECT *obj = OBJECTHDR(this); // construct circuit variable map to meter static complex default_line123_voltage[3], default_line1_current[3]; int i; // find parent meter or triplex_meter, if not defined, use default voltages, and if // the parent is not a meter throw an exception if (parent!=NULL && gl_object_isa(parent,"meter")) { // attach meter variables to each circuit parent_string = "meter"; struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "voltage_A"}, // assumes 2 and 3 follow immediately in memory {&pLine_I, "current_A"}, // assumes 2 and 3(N) follow immediately in memory }; /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) NR_mode = get_bool(parent,"NR_mode"); for (i=0; i<sizeof(map)/sizeof(map[0]); i++) *(map[i].var) = get_complex(parent,map[i].varname); node *par = OBJECTDATA(parent, node); number_of_phases_out = 0; if (par->has_phase(PHASE_A)) number_of_phases_out += 1; if (par->has_phase(PHASE_B)) number_of_phases_out += 1; if (par->has_phase(PHASE_C)) number_of_phases_out += 1; } else if (parent!=NULL && gl_object_isa(parent,"triplex_meter")) { parent_string = "triplex_meter"; number_of_phases_out = 4; //Indicates it is a triplex node and should be handled differently struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "voltage_12"}, // assumes 1N and 2N follow immediately in memory {&pLine_I, "current_1"}, // assumes 2 and 3(N) follow immediately in memory {&pLine12, "current_12"}, // maps current load 1-2 onto triplex load /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) }; NR_mode = get_bool(parent,"NR_mode"); // attach meter variables to each circuit for (i=0; i<sizeof(map)/sizeof(map[0]); i++) { if ((*(map[i].var) = get_complex(parent,map[i].varname))==NULL) { GL_THROW("%s (%s:%d) does not implement triplex_meter variable %s for %s (house:%d)", /* TROUBLESHOOT The Inverter requires that the triplex_meter contains certain published properties in order to properly connect the inverter to the triplex-meter. If the triplex_meter does not contain those properties, GridLAB-D may suffer fatal pointer errors. If you encounter this error, please report it to the developers, along with the version of GridLAB-D that raised this error. */ parent->name?parent->name:"unnamed object", parent->oclass->name, parent->id, map[i].varname, obj->name?obj->name:"unnamed", obj->id); } } } else if ((parent != NULL && strcmp(parent->oclass->name,"meter") != 0)||(parent != NULL && strcmp(parent->oclass->name,"triplex_meter") != 0)) { throw("Inverter must have a meter or triplex meter as it's parent"); /* TROUBLESHOOT Check the parent object of the inverter. The inverter is only able to be childed via a meter or triplex meter when connecting into powerflow systems. You can also choose to have no parent, in which case the inverter will be a stand-alone application using default voltage values for solving purposes. */ } else { parent_string = "none"; number_of_phases_out = 3; struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "voltage_A"}, // assumes 2 and 3 follow immediately in memory {&pLine_I, "current_A"}, // assumes 2 and 3(N) follow immediately in memory }; gl_warning("Inverter:%d has no parent meter object defined; using static voltages", obj->id); NR_mode = false; // attach meter variables to each circuit in the default_meter *(map[0].var) = &default_line123_voltage[0]; *(map[1].var) = &default_line1_current[0]; // provide initial values for voltages default_line123_voltage[0] = complex(Rated_kV*1000/sqrt(3.0),0); default_line123_voltage[1] = complex(Rated_kV*1000/sqrt(3.0)*cos(2*PI/3),Rated_kV*1000/sqrt(3.0)*sin(2*PI/3)); default_line123_voltage[2] = complex(Rated_kV*1000/sqrt(3.0)*cos(-2*PI/3),Rated_kV*1000/sqrt(3.0)*sin(-2*PI/3)); } if (gen_mode_v == UNKNOWN) { gl_warning("Inverter control mode is not specified! Using default: SUPPLY_DRIVEN"); gen_mode_v = SUPPLY_DRIVEN; } if (gen_status_v == UNKNOWN) { gl_warning("Inverter status is unknown! Using default: ONLINE"); gen_status_v = ONLINE; } if (inverter_type_v == UNKNOWN) { gl_warning("Inverter type is unknown! Using default: PWM"); inverter_type_v = PWM; } //need to check for parameters SWITCH_TYPE, FILTER_TYPE, FILTER_IMPLEMENTATION, GENERATOR_MODE /* if (Rated_kW!=0.0) SB = Rated_kW/sqrt(1-Rated_pf*Rated_pf); if (Rated_kVA!=0.0) SB = Rated_kVA/3; if (Rated_kV!=0.0) EB = Rated_kV/sqrt(3.0); if (SB!=0.0) ZB = EB*EB/SB; else throw("Generator power capacity not specified!"); double Real_Rinternal = Rinternal * ZB; double Real_Rload = Rload * ZB; double Real_Rtotal = Rtotal * ZB; double Real_Rphase = Rphase * ZB; double Real_Rground = Rground * ZB; double Real_Rground_storage = Rground_storage * ZB; double[3] Real_Rfilter = Rfilter * ZB; double Real_Cinternal = Cinternal * ZB; double Real_Cground = Cground * ZB; double Real_Ctotal = Ctotal * ZB; double[3] Real_Cfilter = Cfilter * ZB; double Real_Linternal = Linternal * ZB; double Real_Lground = Lground * ZB; double Real_Ltotal = Ltotal * ZB; double[3] Real_Lfilter = Lfilter * ZB; tst = complex(Real_Rground,Real_Lground); AMx[0][0] = complex(Real_Rinternal,Real_Linternal) + tst; AMx[1][1] = complex(Real_Rinternal,Real_Linternal) + tst; AMx[2][2] = complex(Real_Rinternal,Real_Linternal) + tst; // AMx[0][0] = AMx[1][1] = AMx[2][2] = complex(Real_Rs+Real_Rg,Real_Xs+Real_Xg); AMx[0][1] = AMx[0][2] = AMx[1][0] = AMx[1][2] = AMx[2][0] = AMx[2][1] = tst; */ //all other variables set in input file through public parameters switch(inverter_type_v) { case TWO_PULSE: efficiency = 0.8; break; case SIX_PULSE: efficiency = 0.8; break; case TWELVE_PULSE: efficiency = 0.8; break; case PWM: efficiency = 0.9; break; default: efficiency = 0.8; break; } internal_switch_resistance(switch_type_choice); filter_circuit_impact(filter_type_v, filter_imp_v); return 1; }
/* Object initialization is called once after all object have been created */ int micro_service::init(OBJECT *parent) { price = pmy_microturbine->microturbine_init(); struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V_A, "phaseA_V_In"}, {&pCircuit_V_B, "phaseB_V_In"}, {&pCircuit_V_C, "phaseC_V_In"}, {&pLine_I_A, "phaseA_I_In"}, {&pLine_I_B, "phaseB_I_In"}, {&pLine_I_C, "phaseC_I_In"}, /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) }; static complex default_line_voltage[1], default_line_current[1]; int i; // find parent meter, if not defined, use a default meter (using static variable 'default_meter') if (parent!=NULL && strcmp(parent->oclass->name,"meter")==0) { for (i=0; i<sizeof(map)/sizeof(map[0]); i++) *(map[i].var) = get_complex(parent,map[i].varname); gl_verbose("micro_service init: mapped METER objects to internal variables"); } else if (parent!=NULL && strcmp(parent->oclass->name,"rectifier")==0){ gl_verbose("micro_service init: parent WAS found, is an rectifier!"); // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) for (i=0; i<sizeof(map)/sizeof(map[0]); i++){ *(map[i].var) = get_complex(parent,map[i].varname); } gl_verbose("micro_service init: mapped RECTIFIER objects to internal variables"); } else{ // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) gl_verbose("micro_service init: mapped meter objects to internal variables"); OBJECT *obj = OBJECTHDR(this); gl_verbose("micro_service init: no parent meter defined, parent is not a meter"); gl_warning("micro_service:%d %s", obj->id, parent==NULL?"has no parent meter defined":"parent is not a meter"); // attach meter variables to each circuit in the default_meter *(map[0].var) = &default_line_voltage[0]; *(map[1].var) = &default_line_current[0]; // provide initial values for voltages default_line_voltage[0] = complex(V_Max.Re()/sqrt(3.0),0); default_line_current[0] = complex(I_Max.Re()); //default_line123_voltage[1] = complex(V_Max/sqrt(3.0)*cos(2*PI/3),V_Max/sqrt(3.0)*sin(2*PI/3)); //default_line123_voltage[2] = complex(V_Max/sqrt(3.0)*cos(-2*PI/3),V_Max/sqrt(3.0)*sin(-2*PI/3)); } gl_verbose("micro_service init: finished connecting with meter"); /* TODO: set the context-dependent initial value of properties */ //double ZB, SB, EB; //complex tst; if (gen_mode_v==UNKNOWN) { OBJECT *obj = OBJECTHDR(this); throw("Generator control mode is not specified"); } if (gen_status_v==0) { //OBJECT *obj = OBJECTHDR(this); throw("Generator is out of service!"); }else { return 1; } return 1; /* return 1 on success, 0 on failure */ }
int house::init(OBJECT *parent) { OBJECT *hdr = OBJECTHDR(this); hdr->flags |= OF_SKIPSAFE; // construct circuit variable map to meter struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "voltage_12"}, // assumes 1N and 2N follow immediately in memory {&pLine_I, "current_1"}, // assumes 2 and 3(N) follow immediately in memory {&pLine12, "current_12"}, // maps current load 1-2 onto triplex load /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) }; extern complex default_line_voltage[3], default_line_current[3]; static complex default_line_current_12; int i; // find parent meter, if not defined, use a default meter (using static variable 'default_meter') OBJECT *obj = OBJECTHDR(this); if (parent!=NULL && gl_object_isa(parent,"triplex_meter")) { // attach meter variables to each circuit for (i=0; i<sizeof(map)/sizeof(map[0]); i++) { if ((*(map[i].var) = get_complex(parent,map[i].varname))==NULL) GL_THROW("%s (%s:%d) does not implement triplex_meter variable %s for %s (house:%d)", /* TROUBLESHOOT The House requires that the triplex_meter contains certain published properties in order to properly connect the house circuit panel to the meter. If the triplex_meter does not contain those properties, GridLAB-D may suffer fatal pointer errors. If you encounter this error, please report it to the developers, along with the version of GridLAB-D that raised this error. */ parent->name?parent->name:"unnamed object", parent->oclass->name, parent->id, map[i].varname, obj->name?obj->name:"unnamed", obj->id); } } else { gl_error("house:%d %s; using static voltages", obj->id, parent==NULL?"has no parent triplex_meter defined":"parent is not a triplex_meter"); /* TROUBLESHOOT The House model relies on a triplex_meter as a parent to calculate voltages based on events within the powerflow module. Create a triplex_meter object and set it as the parent of the house object. */ // attach meter variables to each circuit in the default_meter *(map[0].var) = &default_line_voltage[0]; *(map[1].var) = &default_line_current[0]; *(map[2].var) = &default_line_current_12; } // Set defaults for published variables nor provided by model definition while (floor_area <= 500) floor_area = gl_random_normal(RNGSTATE,2500,300); // house size (sf) by 100 ft incs; if (ceiling_height <= ROUNDOFF) ceiling_height = 8.0; if (envelope_UA <= ROUNDOFF) envelope_UA = gl_random_uniform(RNGSTATE,0.15,0.2)*floor_area; // UA of house envelope [BTU/h.F] if (aspect_ratio <= ROUNDOFF) aspect_ratio = 1.0; if (gross_wall_area <= ROUNDOFF) gross_wall_area = 4.0 * 2.0 * (aspect_ratio + 1.0) * ceiling_height * sqrt(floor_area/aspect_ratio); if (airchange_per_hour <= ROUNDOFF) airchange_per_hour = gl_random_uniform(RNGSTATE,4,6); // air changes per hour [cf/h] if (thermostat_deadband <= ROUNDOFF) thermostat_deadband = 2; // thermostat hysteresis [F] if (heating_setpoint <= ROUNDOFF) heating_setpoint = gl_random_uniform(RNGSTATE,68,72); // heating setpoint [F] if (cooling_setpoint <= ROUNDOFF) cooling_setpoint = gl_random_uniform(RNGSTATE,76,80); // cooling setpoint [F] if (window_wall_ratio <= ROUNDOFF) window_wall_ratio = 0.15; // assuming 15% window wall ratio if (glazing_shgc <= ROUNDOFF) glazing_shgc = 0.65; // assuming generic double glazing if (design_cooling_capacity <= ROUNDOFF) design_cooling_capacity = gl_random_uniform(RNGSTATE,18,24); // Btuh/sf if (design_heating_capacity <= ROUNDOFF) design_heating_capacity = gl_random_uniform(RNGSTATE,18,24); // Btuh/sf // initalize/set hvac model parameters if (COP_coeff <= ROUNDOFF) COP_coeff = gl_random_uniform(RNGSTATE,0.9,1.1); // coefficient of cops [scalar] if (Tair <= ROUNDOFF) Tair = gl_random_uniform(RNGSTATE,heating_setpoint+thermostat_deadband, cooling_setpoint-thermostat_deadband); // air temperature [F] if (over_sizing_factor <= ROUNDOFF) over_sizing_factor = gl_random_uniform(RNGSTATE,0.98,1.3); heat_cool_mode = house::OFF; // heating/cooling mode {HEAT, COOL, OFF} if (house_content_heat_transfer_coeff <= ROUNDOFF) house_content_heat_transfer_coeff = gl_random_uniform(RNGSTATE,0.5,1.0)*floor_area; // heat transfer coefficient of house contents [BTU/hr.F] //house properties for HVAC volume = 8*floor_area; // volume of air [cf] air_mass = air_density*volume; // mass of air [lb] air_thermal_mass = air_heat_capacity*air_mass; // thermal mass of air [BTU/F] Tmaterials = Tair; // material temperture [F] hvac_rated_power = 24*floor_area*over_sizing_factor; // rated heating/cooling output [BTU/h] if (set_Eigen_values() == FALSE) return 0; if (hdr->latitude < 24 || hdr->latitude > 48) { /* bind latitudes to [24N, 48N] */ hdr->latitude = hdr->latitude<24 ? 24 : 48; gl_error("Latitude beyond the currently supported range 24 - 48 N, Simulations will continue assuming latitude %.0fN",hdr->latitude); /* TROUBLESHOOT GridLAB-D currently only supports latitudes within a temperate band in the northern hemisphere for the building models. Latitudes outside 24N to 48N may not correctly calculate solar input. */ } // attach the house HVAC to the panel //attach(&load, 50, TRUE); hvac_circuit = attach_enduse_house_a(hdr, &load, 50, TRUE); return 1; }
/* Object initialization is called once after all object have been created */ int dc_dc_converter::init(OBJECT *parent) { //initialize variables that are used internally //set_terminal_voltage = 240; //V //max_current_step_size = 100; //A Rated_kW = 1000; //< nominal power in kW Max_P = 1000;//< maximum real power capacity in kW Min_P = 0;//< minimum real power capacity in kW //Max_Q = 1000;//< maximum reactive power capacity in kVar //Min_Q = 1000;//< minimum reactive power capacity in kVar Rated_kVA = 2500; //< nominal capacity in kVA Rated_kV = 100; //< nominal line-line voltage in kV Rinternal = 0.035; Rload = 1; Rtotal = 0.05; //Rphase = 0.03; Rground = 0.03; Rground_storage = 0.05; Cinternal = 0; Cground = 0; Ctotal = 0; Linternal = 0; Lground = 0; Ltotal = 0; filter_120HZ = false; filter_180HZ = false; filter_240HZ = false; pf_in = 0; pf_out = 0; number_of_phases_in = 0; number_of_phases_out = 0; phaseAIn = false; phaseBIn = false; phaseCIn = false; phaseAOut = false; phaseBOut = false; phaseCOut = false; switch_type_choice = IDEAL_SWITCH; //generator_mode_choice = CONSTANT_PQ; gen_status_v = ONLINE; filter_type_v = BAND_PASS; filter_imp_v = IDEAL_FILTER; dc_dc_converter_type_v = BUCK_BOOST; power_in = DC; power_out = DC; P_Out = 500; // P_Out and Q_Out are set by the user as set values to output in CONSTANT_PQ mode Q_Out = 0; margin = 50; V_Set = 480; I_out_prev = 0; I_step_max = 50; internal_losses = 0; C_Storage_In = 0; C_Storage_Out = 0; losses = 0; efficiency = 0; //duty_ratio = 0; service_ratio = 2; //if greater than 1, output voltage > input voltage //if less than 1, output voltage < input voltage. //input_frequency = 2000; //frequency_losses = 0; /* TODO: set the context-dependent initial value of properties */ gl_verbose("dc_dc_converter init: initialized the variables"); struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "V_In"}, {&pLine_I, "I_In"}, }; static complex default_line_voltage[1], default_line_current[1]; int i; // find parent meter, if not defined, use a default meter (using static variable 'default_meter') if (parent!=NULL && strcmp(parent->oclass->name,"meter")==0) { parent_string = "meter"; for (i=0; i<sizeof(map)/sizeof(map[0]); i++) *(map[i].var) = get_complex(parent,map[i].varname); gl_verbose("dc_dc_converter init: mapped METER objects to internal variables"); } else if (parent!=NULL && ((strcmp(parent->oclass->name,"inverter")==0))){ gl_verbose("dc_dc_converter init: parent WAS found, is an inverter!"); parent_string = "inverter"; // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) for (i=0; i<sizeof(map)/sizeof(map[0]); i++){ *(map[i].var) = get_complex(parent,map[i].varname); } gl_verbose("dc_dc_converter init: mapped INVERTER objects to local variables"); } else if (parent!=NULL && strcmp(parent->oclass->name,"battery")==0){ gl_verbose("dc_dc_converter init: parent WAS found, is an battery!"); parent_string = "dc_dc_converter"; // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) for (i=0; i<sizeof(map)/sizeof(map[0]); i++){ *(map[i].var) = get_complex(parent,map[i].varname); } gl_verbose("dc_dc_converter init: mapped BATTERY objects to internal variables"); } else{ // construct circuit variable map to meter /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) gl_verbose("dc_dc_converter init: mapped meter objects to internal variables"); OBJECT *obj = OBJECTHDR(this); gl_verbose("dc_dc_converter init: no parent meter defined, parent is not a meter"); gl_warning("dc_dc_converter:%d %s", obj->id, parent==NULL?"has no parent meter defined":"parent is not a meter"); // attach meter variables to each circuit in the default_meter *(map[0].var) = &default_line_voltage[0]; *(map[1].var) = &default_line_current[0]; // provide initial values for voltages default_line_voltage[0] = complex(0,0); default_line_current[0] = complex(0,0); //default_line123_voltage[1] = complex(V_Max/sqrt(3.0)*cos(2*PI/3),V_Max/sqrt(3.0)*sin(2*PI/3)); //default_line123_voltage[2] = complex(V_Max/sqrt(3.0)*cos(-2*PI/3),V_Max/sqrt(3.0)*sin(-2*PI/3)); } gl_verbose("dc_dc_converter init: finished connecting with meter"); if (gen_mode_v==UNKNOWN) { OBJECT *obj = OBJECTHDR(this); throw("Generator control mode is not specified"); } if (gen_status_v== dc_dc_converter::OFFLINE) { //OBJECT *obj = OBJECTHDR(this); throw("Generator is out of service!"); }else { //initialize variables that are used internally //need to check for parameters SWITCH_TYPE, FILTER_TYPE, FILTER_IMPLEMENTATION, GENERATOR_MODE /* if (Rated_kW!=0.0) SB = Rated_kW/sqrt(1-Rated_pf*Rated_pf); if (Rated_kVA!=0.0) SB = Rated_kVA/3; if (Rated_kV!=0.0) EB = Rated_kV/sqrt(3.0); if (SB!=0.0) ZB = EB*EB/SB; else throw("Generator power capacity not specified!"); double Real_Rinternal = Rinternal * ZB; double Real_Rload = Rload * ZB; double Real_Rtotal = Rtotal * ZB; double Real_Rphase = Rphase * ZB; double Real_Rground = Rground * ZB; double Real_Rground_storage = Rground_storage * ZB; double[3] Real_Rfilter = Rfilter * ZB; double Real_Cinternal = Cinternal * ZB; double Real_Cground = Cground * ZB; double Real_Ctotal = Ctotal * ZB; double[3] Real_Cfilter = Cfilter * ZB; double Real_Linternal = Linternal * ZB; double Real_Lground = Lground * ZB; double Real_Ltotal = Ltotal * ZB; double[3] Real_Lfilter = Lfilter * ZB; tst = complex(Real_Rground,Real_Lground); AMx[0][0] = complex(Real_Rinternal,Real_Linternal) + tst; AMx[1][1] = complex(Real_Rinternal,Real_Linternal) + tst; AMx[2][2] = complex(Real_Rinternal,Real_Linternal) + tst; // AMx[0][0] = AMx[1][1] = AMx[2][2] = complex(Real_Rs+Real_Rg,Real_Xs+Real_Xg); AMx[0][1] = AMx[0][2] = AMx[1][0] = AMx[1][2] = AMx[2][0] = AMx[2][1] = tst; */ //all other variables set in input file through public parameters switch(dc_dc_converter_type_v){ case BUCK: efficiency = 0.9; break; case BOOST: efficiency = 0.9; break; case BUCK_BOOST: efficiency = 0.8; break; default: efficiency = 0.8; break; } internal_switch_resistance(switch_type_choice); filter_circuit_impact(filter_type_v, filter_imp_v); } return 1; }
int windturb_dg::init(OBJECT *parent) { OBJECT *obj = OBJECTHDR(this); double ZB, SB, EB; complex tst, tst2, tst3, tst4; switch (Turbine_Model) { case GENERIC_IND_LARGE: case GENERIC_SYNCH_LARGE: //Creates generic 1.5 MW wind turbine. blade_diam = 82.5; turbine_height = 90; q = 3; //number of gearbox stages Rated_VA = 1635000; Max_P = 1500000; Max_Q = 650000; Rated_V = 600; pf = 0.95; CP_Data = GENERAL_LARGE; cut_in_ws = 4; //lowest wind speed cut_out_ws = 25; //highest wind speed Cp_max = 0.302; //rotor specifications for power curve ws_maxcp = 7; Cp_rated = Cp_max-.05; ws_rated = 12.5; if (Turbine_Model == GENERIC_IND_LARGE) { Gen_type = INDUCTION; Rst = 0.12; Xst = 0.17; Rr = 0.12; Xr = 0.15; Rc = 999999; Xm = 9.0; } else if (Turbine_Model == GENERIC_SYNCH_LARGE) { Gen_type = SYNCHRONOUS; Rs = 0.05; Xs = 0.200; Rg = 0.000; Xg = 0.000; } break; case GENERIC_IND_MID: case GENERIC_SYNCH_MID: //Creates generic 100kW wind turbine, northwind 100 blade_diam = 23.2; //in m turbine_height = 30; //in m q = 0; //number of gearbox stages, no gear box Rated_VA = 156604; Max_P = 150000; Max_Q = 45000; Rated_V = 480; pf = 0.9; ///lag and lead of 0.9 CP_Data = GENERAL_MID; cut_in_ws = 3.5; //lowest wind speed in m/s cut_out_ws = 25; //highest wind speed in m/s Cp_max = 0.302; //rotor specifications for power curve ws_maxcp = 7; Cp_rated = Cp_max-.05; ws_rated = 14.5; // in m/s if (Turbine_Model == GENERIC_IND_MID) { // need to check the machine parameters Gen_type = INDUCTION; Rst = 0.12; Xst = 0.17; Rr = 0.12; Xr = 0.15; Rc = 999999; Xm = 9.0; } else if (Turbine_Model == GENERIC_SYNCH_MID) { Gen_type = SYNCHRONOUS; Rs = 0.05; Xs = 0.200; Rg = 0.000; Xg = 0.000; } break; case GENERIC_IND_SMALL: case GENERIC_SYNCH_SMALL: //Creates generic 5 kW wind turbine, Fortis Montana 5 kW wind turbine blade_diam = 5; // in m turbine_height = 16; //in m q = 0; //number of gearbox stages, no gear box Rated_VA = 6315; // calculate from P & Q Max_P = 5800; Max_Q = 2500; Rated_V = 600; pf = 0.95; CP_Data = GENERAL_SMALL; cut_in_ws = 2.5; //lowest wind speed cut_out_ws = 25; //highest wind speed Cp_max = 0.302; //rotor specifications for power curve ws_maxcp = 7; // | Cp_rated = Cp_max-.05; // | ws_rated = 17; // | if (Turbine_Model == GENERIC_IND_SMALL) { Gen_type = INDUCTION; Rst = 0.12; Xst = 0.17; Rr = 0.12; Xr = 0.15; Rc = 999999; Xm = 9.0; } else if (Turbine_Model == GENERIC_SYNCH_SMALL) { Gen_type = SYNCHRONOUS; Rs = 0.05; Xs = 0.200; Rg = 0.000; Xg = 0.000; } break; case VESTAS_V82: //Include manufacturer's data - cases can be added to call other wind turbines turbine_height = 78; blade_diam = 82; Rated_VA = 1808000; Rated_V = 600; Max_P = 1650000; Max_Q = 740000; pf = 0.91; //Can range between 0.65-1.00 depending on controllers and Pout. CP_Data = MANUF_TABLE; cut_in_ws = 3.5; cut_out_ws = 20; q = 2; Gen_type = SYNCHRONOUS; //V82 actually uses a DFIG, but will use synch representation for now Rs = 0.025; //Estimated values for synch representation. Xs = 0.200; Rg = 0.000; Xg = 0.000; break; case GE_25MW: turbine_height = 100; blade_diam = 100; Rated_VA = 2727000; Rated_V = 690; Max_P = 2500000; Max_Q = 1090000; pf = 0.95; //ranges between -0.9 -> 0.9; q = 3; CP_Data = GENERAL_LARGE; cut_in_ws = 3.5; cut_out_ws = 25; Cp_max = 0.28; Cp_rated = 0.275; ws_maxcp = 8.2; ws_rated = 12.5; Gen_type = SYNCHRONOUS; Rs = 0.035; Xs = 0.200; Rg = 0.000; Xg = 0.000; break; case BERGEY_10kW: turbine_height = 24; blade_diam = 7; Rated_VA = 10000; Rated_V = 360; Max_P = 15000; Max_Q = 4000; pf = 0.95; //ranges between -0.9 -> 0.9; q = 0; CP_Data = GENERAL_SMALL; cut_in_ws = 2; cut_out_ws = 20; Cp_max = 0.28; Cp_rated = 0.275; ws_maxcp = 8.2; ws_rated = 12.5; Gen_type = SYNCHRONOUS; Rs = 0.05; Xs = 0.200; Rg = 0.000; Xg = 0.000; break; case USER_DEFINED: CP_Data = USER_SPECIFY; Gen_type = USER_TYPE; Rs = 0.2; Xs = 0.2; Rg = 0.1; Xg = 0; if (turbine_height <=0) GL_THROW ("turbine height cannot have a negative or zero value."); /* TROUBLESHOOT Turbine height must be specified as a value greater than or equal to zero. */ if (blade_diam <=0) GL_THROW ("blade diameter cannot have a negative or zero value."); /* TROUBLESHOOT Blade diameter must be specified as a value greater than or equal to zero. */ if (cut_in_ws <=0) GL_THROW ("cut in wind speed cannot have a negative or zero value."); /* TROUBLESHOOT Cut in wind speed must be specified as a value greater than or equal to zero. */ if (cut_out_ws <=0) GL_THROW ("cut out wind speed cannot have a negative or zero value."); /* TROUBLESHOOT Cut out wind speed must be specified as a value greater than or equal to zero. */ if (ws_rated <=0) GL_THROW ("rated wind speed cannot have a negative or zero value."); /* TROUBLESHOOT Rated wind speed must be specified as a value greater than or equal to zero. */ if (ws_maxcp <=0) GL_THROW ("max cp cannot have a negative or zero value."); /* TROUBLESHOOT Maximum coefficient of performance must be specified as a value greater than or equal to zero. */ break; default: GL_THROW("Unknown turbine model was specified"); /* TROUBLESHOOT An unknown wind turbine model was selected. Please select a Turbine_Model from the available list. */ } // construct circuit variable map to meter -- copied from 'House' module struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "voltage_A"}, // assumes 2 and 3 follow immediately in memory {&pLine_I, "current_A"}, // assumes 2 and 3(N) follow immediately in memory /// @todo use triplex property mapping instead of assuming memory order for meter variables (residential, low priority) (ticket #139) }; static complex default_line123_voltage[3], default_line1_current[3]; int i; //Map phases set *phaseInfo; PROPERTY *tempProp; tempProp = gl_get_property(parent,"phases"); if ((tempProp==NULL || tempProp->ptype!=PT_set)) { GL_THROW("Unable to map phases property - ensure the parent is a powerflow:meter"); /* TROUBLESHOOT While attempting to map the phases property from the parent object, an error was encountered. Please check and make sure your parent object is a meter inside the powerflow module and try again. If the error persists, please submit your code and a bug report via the Trac website. */ } else phaseInfo = (set*)GETADDR(parent,tempProp); int temp_phases=0; // Currently only supports 3-phase connection, so check number of phases of parent if ((*phaseInfo & PHASE_A) == PHASE_A) temp_phases += 1; if ((*phaseInfo & PHASE_B) == PHASE_B) temp_phases += 1; if ((*phaseInfo & PHASE_C) == PHASE_C) temp_phases += 1; if (temp_phases < 3) GL_THROW("The wind turbine model currently only supports a 3-phase connection, please check meter connection"); /* TROUBLESHOOT Currently the wind turbine model only supports 3-phase connnections. Please attach to 3-phase meter. */ // find parent meter, if not defined, use a default meter (using static variable 'default_meter') if (parent!=NULL) { if((parent->flags & OF_INIT) != OF_INIT){ char objname[256]; gl_verbose("windturb_dg::init(): deferring initialization on %s", gl_name(parent, objname, 255)); return 2; // defer } if (gl_object_isa(parent,"meter","powerflow")) //Attach to meter { /* NR_mode = get_bool(parent,"NR_mode"); //Check NR_mode, just to be consistent if (NR_mode == NULL) { GL_THROW("Wind turbine failed to map NR_mode property"); */ /* TROUBLESHOOT While attempting to map up the NR_mode property, an error was encountered. Please try again. If the error persists, please submit your code and a bug report via the trac website. */ /* } */ //Map the voltages double *parNominalVoltage; tempProp = gl_get_property(parent,"nominal_voltage"); if ((tempProp==NULL || tempProp->ptype!=PT_double)) { GL_THROW("Unable to map nominal_voltage property - ensure the parent is a powerflow:meter"); /* TROUBLESHOOT While attempting to map the nominal_voltage property from the parent object, an error was encountered. Please check and make sure your parent object is a meter inside the powerflow module and try again. If the error persists, please submit your code and a bug report via the Trac website. */ } else parNominalVoltage = (double*)GETADDR(parent,tempProp); // check nominal voltage against rated voltage if ( fabs(1 - (*parNominalVoltage * sqrt(3.0) / Rated_V) ) > 0.1 ) gl_warning("windturb_dg (id:%d, name:%s): Rated generator voltage (LL: %.1f) and nominal voltage (LL: %.1f) of meter parent are different by greater than 10 percent. Odd behavior may occur.",obj->id,obj->name,Rated_V,*parNominalVoltage * sqrt(3.0)); /* TROUBLESHOOT Currently, the model allows you to attach the turbine to a voltage that is quite different than the rated terminal voltage of the generator. However, this may cause odd behavior, as the solved powerflow voltage is used to calculate the generator induced voltages and conversion from mechanical power. It is recommended that the nominal voltages of the parent meter be within ~10% of the rated voltage. */ // attach meter variables to each circuit for (i=0; i<sizeof(map)/sizeof(map[0]); i++) { *(map[i].var) = get_complex(parent,map[i].varname); if (*(map[i].var) == NULL) { GL_THROW("Unable to map variable %s",map[i].varname); /* TROUBLESHOOT The variable name was not found when mapping it */ } } } else if (gl_object_isa(parent,"triplex_meter","powerflow")) { GL_THROW("The wind turbine model does currently support direct connection to single phase or triplex meters. Connect through a rectifier-inverter combination."); /* TROUBLESHOOT This model does not currently support connection to a triplex system. Please connect to a 3-phase meter. */ //Map voltage pCircuit_V = get_complex(parent,"voltage_1"); //Make sure it worked if (pCircuit_V == NULL) GL_THROW("Unable to map triplex_meter voltage"); //Map current pLine_I = get_complex(parent,"current_1"); //Make sure it worked if (pLine_I == NULL) GL_THROW("Unable to map triplex_meter current"); //NR_mode = get_bool(parent,"NR_mode"); } else if (gl_object_isa(parent,"rectifier","generators")) { //Map the voltages double *parNominalVoltage; tempProp = gl_get_property(parent,"V_Rated"); if ((tempProp==NULL || tempProp->ptype!=PT_double)) { GL_THROW("Unable to map V_Rated property - ensure the parent is a powerflow:meter"); /* TROUBLESHOOT While attempting to map the nominal_voltage property from the parent object, an error was encountered. Please check and make sure your parent object is a meter inside the powerflow module and try again. If the error persists, please submit your code and a bug report via the Trac website. */ } else parNominalVoltage = (double*)GETADDR(parent,tempProp); // check nominal voltage against rated voltage if ( fabs(1 - (*parNominalVoltage / Rated_V) ) > 0.1 ) gl_warning("windturb_dg (id:%d, name:%s): Rated generator voltage (LL: %.1f) and nominal voltage (LL: %.1f) of meter parent are different by greater than 10 percent. Odd behavior may occur.",obj->id,obj->name,Rated_V,*parNominalVoltage * sqrt(3.0)); /* TROUBLESHOOT Currently, the model allows you to attach the turbine to a voltage that is quite different than the rated terminal voltage of the generator. However, this may cause odd behavior, as the solved powerflow voltage is used to calculate the generator induced voltages and conversion from mechanical power. It is recommended that the nominal voltages of the parent meter be within ~10% of the rated voltage. */ // attach meter variables to each circuit for (i=0; i<sizeof(map)/sizeof(map[0]); i++) { if ((*(map[i].var) = get_complex(parent,map[i].varname))==NULL) { GL_THROW("%s (%s:%d) does not implement rectifier variable %s for %s (windturb_dg:%d)", /* TROUBLESHOOT The rectifier requires that the inverter contains certain published properties in order to properly connect. If you encounter this error, please report it to the developers, along with the version of GridLAB-D that raised this error. */ parent->name?parent->name:"unnamed object", parent->oclass->name, parent->id, map[i].varname, obj->name?obj->name:"unnamed", obj->id); } } } else { GL_THROW("windturb_dg (id:%d): Invalid parent object",obj->id); /* TROUBLESHOOT The wind turbine object must be attached a 3-phase meter object. Please check parent of object. */ } } else { gl_warning("windturb_dg:%d %s", obj->id, parent==NULL?"has no parent meter defined":"parent is not a meter"); // attach meter variables to each circuit in the default_meter *(map[0].var) = &default_line123_voltage[0]; *(map[1].var) = &default_line1_current[0]; // provide initial values for voltages default_line123_voltage[0] = complex(Rated_V/sqrt(3.0),0); default_line123_voltage[1] = complex(Rated_V/sqrt(3.0)*cos(2*PI/3),Rated_V/sqrt(3.0)*sin(2*PI/3)); default_line123_voltage[2] = complex(Rated_V/sqrt(3.0)*cos(-2*PI/3),Rated_V/sqrt(3.0)*sin(-2*PI/3)); NR_mode = &default_NR_mode; } if (Gen_status==OFFLINE) { gl_warning("init_windturb_dg (id:%d,name:%s): Generator is out of service!", obj->id,obj->name); } if (Gen_type == SYNCHRONOUS || Gen_type == INDUCTION) { if (Gen_mode == CONSTANTE) { gl_warning("init_windturb_dg (id:%d,name:%s): Synchronous and induction generators in constant voltage mode has not been fully tested and my not work properly.", obj->id,obj->name); } } if (Rated_VA!=0.0) SB = Rated_VA/3; if (Rated_V!=0.0) EB = Rated_V/sqrt(3.0); if (SB!=0.0) ZB = EB*EB/SB; else GL_THROW("Generator power capacity not specified!"); /* TROUBLESHOOT Rated_VA of generator must be specified so that per unit values can be calculated */ if (Gen_type == INDUCTION) { complex Zrotor(Rr,Xr); complex Zmag = complex(Rc*Xm*Xm/(Rc*Rc + Xm*Xm),Rc*Rc*Xm/(Rc*Rc + Xm*Xm)); complex Zstator(Rst,Xst); //Induction machine two-port matrix. IndTPMat[0][0] = (Zmag + Zstator)/Zmag; IndTPMat[0][1] = Zrotor + Zstator + Zrotor*Zstator/Zmag; IndTPMat[1][0] = complex(1,0) / Zmag; IndTPMat[1][1] = (Zmag + Zrotor) / Zmag; } else if (Gen_type == SYNCHRONOUS) { double Real_Rs = Rs * ZB; double Real_Xs = Xs * ZB; double Real_Rg = Rg * ZB; double Real_Xg = Xg * ZB; tst = complex(Real_Rg,Real_Xg); tst2 = complex(Real_Rs,Real_Xs); AMx[0][0] = tst2 + tst; //Impedance matrix AMx[1][1] = tst2 + tst; AMx[2][2] = tst2 + tst; AMx[0][1] = AMx[0][2] = AMx[1][0] = AMx[1][2] = AMx[2][0] = AMx[2][1] = tst; tst3 = (complex(1,0) + complex(2,0)*tst/tst2)/(tst2 + complex(3,0)*tst); tst4 = (-tst/tst2)/(tst2 + tst); invAMx[0][0] = tst3; //Admittance matrix (inverse of Impedance matrix) invAMx[1][1] = tst3; invAMx[2][2] = tst3; invAMx[0][1] = AMx[0][2] = AMx[1][0] = AMx[1][2] = AMx[2][0] = AMx[2][1] = tst4; } else GL_THROW("Unknown generator type specified"); /* TROUBLESHOOT Shouldn't have been able to specify an unknown generator type. Please report this error to GridLAB-D support. */ init_climate(); return 1; }
/* Object initialization is called once after all object have been created */ int rectifier::init(OBJECT *parent) { OBJECT *obj = OBJECTHDR(this); //initialize variables that are used internally //set_terminal_voltage = 240; //V //max_current_step_size = 100; //A Rated_kW = 1000; //< nominal power in kW Max_P = 1000;//< maximum real power capacity in kW Min_P = 0;//< minimum real power capacity in kW //Max_Q = 1000;//< maximum reactive power capacity in kVar //Min_Q = 1000;//< minimum reactive power capacity in kVar Rated_kVA = 1500; //< nominal capacity in kVA Rated_kV = 10; //< nominal line-line voltage in kV Rinternal = 0.035; Rload = 1; Rtotal = 0.05; //XphaseA = complex(1 * 1,0); //XphaseB = complex(1 * -0.5, 1 * 0.866); //XphaseC = complex(1 * -0.5, 1 * -0.866); XphaseA = complex(5 * 1,0); XphaseB = complex(5 * 1,0); XphaseC = complex(5 * 1,0); Rground = 0.03; Rground_storage = 0.05; Vdc = 480; Cinternal = 0; Cground = 0; Ctotal = 0; Linternal = 0; Lground = 0; Ltotal = 0; filter_120HZ = false; filter_180HZ = false; filter_240HZ = false; pf_in = 1; pf_out = 0; number_of_phases_in = 3; number_of_phases_out = 0; phaseAIn = true; phaseBIn = true; phaseCIn = true; phaseAOut = false; phaseBOut = false; phaseCOut = false; V_In_Set_A = complex(360,0); V_In_Set_B = complex(-180, 311.769); V_In_Set_C = complex(-180,-311.769); switch_type_choice = IDEAL_SWITCH; //generator_mode_choice = CONSTANT_PQ; gen_status_v = ONLINE; filter_type_v = BAND_PASS; filter_imp_v = IDEAL_FILTER; rectifier_type_v = SIX_PULSE; power_in = AC; power_out = DC; P_Out = 500; // P_Out and Q_Out are set by the user as set values to output in CONSTANT_PQ mode Q_Out = 0; margin = 50; V_Rated = 360; I_out_prev = 0; I_step_max = 100; internal_losses = 0; C_Storage_Out = 0; efficiency = 0; losses = 0; on_ratio = 0; input_frequency = 2000; frequency_losses = 0; gl_verbose("rectifier init: initialized the variables"); int i; if (parent!=NULL && gl_object_isa(parent,"meter")) { // TO DO: Figure out how to connect a DC device to meter. } if (parent!=NULL && gl_object_isa(parent,"inverter")) { parent_string = "inverter"; struct { complex **var; char *varname; } map[] = { // local object name, meter object name {&pCircuit_V, "Vdc"}, {&pLine_I, "I_In"} }; // attach meter variables to each circuit for (i=0; i<sizeof(map)/sizeof(map[0]); i++) { if ((*(map[i].var) = get_complex(parent,map[i].varname))==NULL) { GL_THROW("%s (%s:%d) does not implement triplex_meter variable %s for %s (inverter:%d)", /* TROUBLESHOOT The rectifier requires that the inverter contains certain published properties in order to properly connect. If you encounter this error, please report it to the developers, along with the version of GridLAB-D that raised this error. */ parent->name?parent->name:"unnamed object", parent->oclass->name, parent->id, map[i].varname, obj->name?obj->name:"unnamed", obj->id); } } } if (parent_string == NULL){ GL_THROW("Rectifier's parent is not an inverter. The rectifier object's parent must be an inverter."); } /* TODO: set the context-dependent initial value of properties */ if (gen_mode_v==UNKNOWN) { GL_THROW("Generator control mode is not specified."); } else if(gen_mode_v == CONSTANT_V) { GL_THROW("Generator mode CONSTANT_V is not implemented yet."); } else if(gen_mode_v == CONSTANT_PQ) { GL_THROW("Generator mode CONSTANT_PQ is not implemented yet."); } else if(gen_mode_v == CONSTANT_PF) { GL_THROW("Generator mode CONSTANT_PF is not implemented yet."); } //need to check for parameters SWITCH_TYPE, FILTER_TYPE, FILTER_IMPLEMENTATION, GENERATOR_MODE /* if (Rated_kW!=0.0) SB = Rated_kW/sqrt(1-Rated_pf*Rated_pf); if (Rated_kVA!=0.0) SB = Rated_kVA/3; if (Rated_kV!=0.0) EB = Rated_kV/sqrt(3.0); if (SB!=0.0) ZB = EB*EB/SB; else throw("Generator power capacity not specified!"); double Real_Rinternal = Rinternal * ZB; double Real_Rload = Rload * ZB; double Real_Rtotal = Rtotal * ZB; double Real_Xphase = Xphase * ZB; double Real_Rground = Rground * ZB; double Real_Rground_storage = Rground_storage * ZB; double[3] Real_Rfilter = Rfilter * ZB; double Real_Cinternal = Cinternal * ZB; double Real_Cground = Cground * ZB; double Real_Ctotal = Ctotal * ZB; double[3] Real_Cfilter = Cfilter * ZB; double Real_Linternal = Linternal * ZB; double Real_Lground = Lground * ZB; double Real_Ltotal = Ltotal * ZB; double[3] Real_Lfilter = Lfilter * ZB; tst = complex(Real_Rground,Real_Lground); AMx[0][0] = complex(Real_Rinternal,Real_Linternal) + tst; AMx[1][1] = complex(Real_Rinternal,Real_Linternal) + tst; AMx[2][2] = complex(Real_Rinternal,Real_Linternal) + tst; // AMx[0][0] = AMx[1][1] = AMx[2][2] = complex(Real_Rs+Real_Rg,Real_Xs+Real_Xg); AMx[0][1] = AMx[0][2] = AMx[1][0] = AMx[1][2] = AMx[2][0] = AMx[2][1] = tst; */ //all other variables set in input file through public parameters switch(rectifier_type_v){ case ONE_PULSE: efficiency = 0.5; break; case TWO_PULSE: efficiency = 0.7; break; case THREE_PULSE: efficiency = 0.7; break; case SIX_PULSE: efficiency = 0.8; break; case TWELVE_PULSE: efficiency = 0.9; break; default: efficiency = 0.8; break; } internal_switch_resistance(switch_type_choice); filter_circuit_impact((power_electronics::FILTER_TYPE)filter_type_v, (power_electronics::FILTER_IMPLEMENTATION)filter_imp_v); gl_verbose("rectifier init: about to exit"); return 1; }