00001
00014 #include <stdlib.h>
00015 #include <stdio.h>
00016 #include <errno.h>
00017 #include <math.h>
00018
00019 #include "series_reactor.h"
00020 #include "node.h"
00021
00023
00025 CLASS* series_reactor::oclass = NULL;
00026 CLASS* series_reactor::pclass = NULL;
00027
00028 series_reactor::series_reactor(MODULE *mod) : link_object(mod)
00029 {
00030 if(oclass == NULL)
00031 {
00032 pclass = link_object::oclass;
00033
00034 oclass = gl_register_class(mod,"series_reactor",sizeof(series_reactor),PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN|PC_UNSAFE_OVERRIDE_OMIT|PC_AUTOLOCK);
00035 if (oclass==NULL)
00036 throw "unable to register class series_reactor";
00037 else
00038 oclass->trl = TRL_PROVEN;
00039
00040 if(gl_publish_variable(oclass,
00041 PT_INHERIT, "link",
00042 PT_complex, "phase_A_impedance[Ohm]",PADDR(phase_A_impedance),PT_DESCRIPTION,"Series impedance of reactor on phase A",
00043 PT_double, "phase_A_resistance[Ohm]",PADDR(phase_A_impedance.Re()),PT_DESCRIPTION,"Resistive portion of phase A's impedance",
00044 PT_double, "phase_A_reactance[Ohm]",PADDR(phase_A_impedance.Im()),PT_DESCRIPTION,"Reactive portion of phase A's impedance",
00045 PT_complex, "phase_B_impedance[Ohm]",PADDR(phase_B_impedance),PT_DESCRIPTION,"Series impedance of reactor on phase B",
00046 PT_double, "phase_B_resistance[Ohm]",PADDR(phase_B_impedance.Re()),PT_DESCRIPTION,"Resistive portion of phase B's impedance",
00047 PT_double, "phase_B_reactance[Ohm]",PADDR(phase_B_impedance.Im()),PT_DESCRIPTION,"Reactive portion of phase B's impedance",
00048 PT_complex, "phase_C_impedance[Ohm]",PADDR(phase_C_impedance),PT_DESCRIPTION,"Series impedance of reactor on phase C",
00049 PT_double, "phase_C_resistance[Ohm]",PADDR(phase_C_impedance.Re()),PT_DESCRIPTION,"Resistive portion of phase C's impedance",
00050 PT_double, "phase_C_reactance[Ohm]",PADDR(phase_C_impedance.Im()),PT_DESCRIPTION,"Reactive portion of phase C's impedance",
00051 PT_double, "rated_current_limit[A]",PADDR(rated_current_limit),PT_DESCRIPTION,"Rated current limit for the reactor",
00052 NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00053
00054
00055 if (gl_publish_function(oclass, "interupdate_pwr_object", (FUNCTIONADDR)interupdate_link)==NULL)
00056 GL_THROW("Unable to publish series reactor deltamode function");
00057
00058
00059 if (gl_publish_function(oclass, "update_power_pwr_object", (FUNCTIONADDR)updatepowercalc_link)==NULL)
00060 GL_THROW("Unable to publish series reactor external power calculation function");
00061 if (gl_publish_function(oclass, "check_limits_pwr_object", (FUNCTIONADDR)calculate_overlimit_link)==NULL)
00062 GL_THROW("Unable to publish series reactor external power limit calculation function");
00063 }
00064 }
00065
00066 int series_reactor::isa(char *classname)
00067 {
00068 return strcmp(classname,"series_reactor")==0 || link_object::isa(classname);
00069 }
00070
00071 int series_reactor::create()
00072 {
00073 int result = link_object::create();
00074 phase_A_impedance = phase_B_impedance = phase_C_impedance = 0.0;
00075
00076 return result;
00077 }
00078
00079 int series_reactor::init(OBJECT *parent)
00080 {
00081 int result = link_object::init(parent);
00082
00083 a_mat[0][0] = d_mat[0][0] = A_mat[0][0] = (has_phase(PHASE_A)) ? 1.0 : 0.0;
00084 a_mat[1][1] = d_mat[1][1] = A_mat[1][1] = (has_phase(PHASE_B)) ? 1.0 : 0.0;
00085 a_mat[2][2] = d_mat[2][2] = A_mat[2][2] = (has_phase(PHASE_C)) ? 1.0 : 0.0;
00086
00087 if (solver_method==SM_FBS)
00088 {
00089 c_mat[0][0] = 0.0;
00090 c_mat[1][1] = 0.0;
00091 c_mat[2][2] = 0.0;
00092
00093
00094 b_mat[0][0] = B_mat[0][0] = phase_A_impedance;
00095 b_mat[1][1] = B_mat[1][1] = phase_B_impedance;
00096 b_mat[2][2] = B_mat[2][2] = phase_C_impedance;
00097
00098 }
00099 else
00100 {
00101
00102 SpecialLnk = SWITCH;
00103
00104
00105 From_Y[0][1] = From_Y[0][2] = From_Y[1][0] = 0.0;
00106 From_Y[1][2] = From_Y[2][0] = From_Y[2][1] = 0.0;
00107
00108
00109
00110 if (has_phase(PHASE_A))
00111 {
00112 if (phase_A_impedance==0.0)
00113 From_Y[0][0] = complex(1e4,1e4);
00114 else
00115 From_Y[0][0] = complex(1.0,0.0)/phase_A_impedance;
00116 }
00117 else
00118 From_Y[0][0] = 0.0;
00119
00120 if (has_phase(PHASE_B))
00121 {
00122 if (phase_B_impedance==0.0)
00123 From_Y[1][1] = complex(1e4,1e4);
00124 else
00125 From_Y[1][1] = complex(1.0,0.0)/phase_B_impedance;
00126 }
00127 else
00128 From_Y[1][1] = 0.0;
00129
00130 if (has_phase(PHASE_C))
00131 {
00132 if (phase_C_impedance==0.0)
00133 From_Y[2][2] = complex(1e4,1e4);
00134 else
00135 From_Y[2][2] = complex(1.0,0.0)/phase_C_impedance;
00136 }
00137 else
00138 From_Y[2][2] = 0.0;
00139 }
00140
00141 return result;
00142 }
00143
00145
00147
00155 EXPORT TIMESTAMP commit_series_reactor(OBJECT *obj, TIMESTAMP t1, TIMESTAMP t2)
00156 {
00157 if (solver_method==SM_FBS)
00158 {
00159 series_reactor *plink = OBJECTDATA(obj,series_reactor);
00160 plink->calculate_power();
00161 }
00162 return TS_NEVER;
00163 }
00164 EXPORT int create_series_reactor(OBJECT **obj, OBJECT *parent)
00165 {
00166 try
00167 {
00168 *obj = gl_create_object(series_reactor::oclass);
00169 if (*obj!=NULL)
00170 {
00171 series_reactor *my = OBJECTDATA(*obj,series_reactor);
00172 gl_set_parent(*obj,parent);
00173 return my->create();
00174 }
00175 else
00176 return 0;
00177 }
00178 CREATE_CATCHALL(series_reactor);
00179 }
00180
00187 EXPORT int init_series_reactor(OBJECT *obj)
00188 {
00189 try {
00190 series_reactor *my = OBJECTDATA(obj,series_reactor);
00191 return my->init(obj->parent);
00192 }
00193 INIT_CATCHALL(series_reactor);
00194 }
00195
00204 EXPORT TIMESTAMP sync_series_reactor(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00205 {
00206 try {
00207 series_reactor *pObj = OBJECTDATA(obj,series_reactor);
00208 TIMESTAMP t1 = TS_NEVER;
00209 switch (pass) {
00210 case PC_PRETOPDOWN:
00211 return pObj->presync(t0);
00212 case PC_BOTTOMUP:
00213 return pObj->sync(t0);
00214 case PC_POSTTOPDOWN:
00215 t1 = pObj->postsync(t0);
00216 obj->clock = t0;
00217 return t1;
00218 default:
00219 throw "invalid pass request";
00220 }
00221 }
00222 SYNC_CATCHALL(series_reactor);
00223 }
00224
00225 EXPORT int isa_series_reactor(OBJECT *obj, char *classname)
00226 {
00227 return OBJECTDATA(obj,series_reactor)->isa(classname);
00228 }
00229