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(mod)
00029 {
00030 if(oclass == NULL)
00031 {
00032 pclass = link::oclass;
00033
00034 oclass = gl_register_class(mod,"series_reactor",sizeof(series_reactor),PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN|PC_UNSAFE_OVERRIDE_OMIT);
00035 if(oclass == NULL)
00036 GL_THROW("unable to register object class implemented by %s",__FILE__);
00037
00038 if(gl_publish_variable(oclass,
00039 PT_INHERIT, "link",
00040 PT_complex, "phase_A_impedance[Ohm]",PADDR(phase_A_impedance),PT_DESCRIPTION,"Series impedance of reactor on phase A",
00041 PT_double, "phase_A_resistance[Ohm]",PADDR(phase_A_impedance.Re()),PT_DESCRIPTION,"Resistive portion of phase A's impedance",
00042 PT_double, "phase_A_reactance[Ohm]",PADDR(phase_A_impedance.Im()),PT_DESCRIPTION,"Reactive portion of phase A's impedance",
00043 PT_complex, "phase_B_impedance[Ohm]",PADDR(phase_B_impedance),PT_DESCRIPTION,"Series impedance of reactor on phase B",
00044 PT_double, "phase_B_resistance[Ohm]",PADDR(phase_B_impedance.Re()),PT_DESCRIPTION,"Resistive portion of phase B's impedance",
00045 PT_double, "phase_B_reactance[Ohm]",PADDR(phase_B_impedance.Im()),PT_DESCRIPTION,"Reactive portion of phase B's impedance",
00046 PT_complex, "phase_C_impedance[Ohm]",PADDR(phase_C_impedance),PT_DESCRIPTION,"Series impedance of reactor on phase C",
00047 PT_double, "phase_C_resistance[Ohm]",PADDR(phase_C_impedance.Re()),PT_DESCRIPTION,"Resistive portion of phase C's impedance",
00048 PT_double, "phase_C_reactance[Ohm]",PADDR(phase_C_impedance.Im()),PT_DESCRIPTION,"Reactive portion of phase C's impedance",
00049 PT_double, "rated_current_limit[A]",PADDR(rated_current_limit),PT_DESCRIPTION,"Rated current limit for the reactor",
00050 NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00051 }
00052 }
00053
00054 int series_reactor::isa(char *classname)
00055 {
00056 return strcmp(classname,"series_reactor")==0 || link::isa(classname);
00057 }
00058
00059 int series_reactor::create()
00060 {
00061 int result = link::create();
00062 phase_A_impedance = phase_B_impedance = phase_C_impedance = 0.0;
00063
00064 return result;
00065 }
00066
00067 int series_reactor::init(OBJECT *parent)
00068 {
00069 int result = link::init(parent);
00070
00071 a_mat[0][0] = d_mat[0][0] = A_mat[0][0] = (has_phase(PHASE_A)) ? 1.0 : 0.0;
00072 a_mat[1][1] = d_mat[1][1] = A_mat[1][1] = (has_phase(PHASE_B)) ? 1.0 : 0.0;
00073 a_mat[2][2] = d_mat[2][2] = A_mat[2][2] = (has_phase(PHASE_C)) ? 1.0 : 0.0;
00074
00075 if (solver_method==SM_FBS)
00076 {
00077 c_mat[0][0] = 0.0;
00078 c_mat[1][1] = 0.0;
00079 c_mat[2][2] = 0.0;
00080
00081
00082 b_mat[0][0] = B_mat[0][0] = phase_A_impedance;
00083 b_mat[1][1] = B_mat[1][1] = phase_B_impedance;
00084 b_mat[2][2] = B_mat[2][2] = phase_C_impedance;
00085
00086 }
00087 else
00088 {
00089
00090 SpecialLnk = SWITCH;
00091
00092
00093 From_Y[0][1] = From_Y[0][2] = From_Y[1][0] = 0.0;
00094 From_Y[1][2] = From_Y[2][0] = From_Y[2][1] = 0.0;
00095
00096
00097
00098 if (has_phase(PHASE_A))
00099 {
00100 if (phase_A_impedance==0.0)
00101 From_Y[0][0] = complex(1e4,1e4);
00102 else
00103 From_Y[0][0] = complex(1.0,0.0)/phase_A_impedance;
00104 }
00105 else
00106 From_Y[0][0] = 0.0;
00107
00108 if (has_phase(PHASE_B))
00109 {
00110 if (phase_B_impedance==0.0)
00111 From_Y[1][1] = complex(1e4,1e4);
00112 else
00113 From_Y[1][1] = complex(1.0,0.0)/phase_B_impedance;
00114 }
00115 else
00116 From_Y[1][1] = 0.0;
00117
00118 if (has_phase(PHASE_C))
00119 {
00120 if (phase_C_impedance==0.0)
00121 From_Y[2][2] = complex(1e4,1e4);
00122 else
00123 From_Y[2][2] = complex(1.0,0.0)/phase_C_impedance;
00124 }
00125 else
00126 From_Y[2][2] = 0.0;
00127 }
00128
00129 return result;
00130 }
00131
00133
00135
00143 EXPORT int commit_series_reactor(OBJECT *obj)
00144 {
00145 if (solver_method==SM_FBS)
00146 {
00147 series_reactor *plink = OBJECTDATA(obj,series_reactor);
00148 plink->calculate_power();
00149 }
00150 return 1;
00151 }
00152 EXPORT int create_series_reactor(OBJECT **obj, OBJECT *parent)
00153 {
00154 try
00155 {
00156 *obj = gl_create_object(series_reactor::oclass);
00157 if (*obj!=NULL)
00158 {
00159 series_reactor *my = OBJECTDATA(*obj,series_reactor);
00160 gl_set_parent(*obj,parent);
00161 return my->create();
00162 }
00163 }
00164 catch (const char *msg)
00165 {
00166 gl_error("create_series_reactor: %s", msg);
00167 }
00168 return 0;
00169 }
00170
00177 EXPORT int init_series_reactor(OBJECT *obj)
00178 {
00179 series_reactor *my = OBJECTDATA(obj,series_reactor);
00180 try {
00181 return my->init(obj->parent);
00182 }
00183 catch (const char *msg)
00184 {
00185 GL_THROW("%s (series_reactor:%d): %s", my->get_name(), my->get_id(), msg);
00186 return 0;
00187 }
00188 }
00189
00198 EXPORT TIMESTAMP sync_series_reactor(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00199 {
00200 series_reactor *pObj = OBJECTDATA(obj,series_reactor);
00201 try {
00202 TIMESTAMP t1 = TS_NEVER;
00203 switch (pass) {
00204 case PC_PRETOPDOWN:
00205 return pObj->presync(t0);
00206 case PC_BOTTOMUP:
00207 return pObj->sync(t0);
00208 case PC_POSTTOPDOWN:
00209 t1 = pObj->postsync(t0);
00210 obj->clock = t0;
00211 return t1;
00212 default:
00213 throw "invalid pass request";
00214 }
00215 } catch (const char *error) {
00216 GL_THROW("%s (series_reactor:%d): %s", pObj->get_name(), pObj->get_id(), error);
00217 return 0;
00218 } catch (...) {
00219 GL_THROW("%s (series_reactor:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00220 return 0;
00221 }
00222 }
00223
00224 EXPORT int isa_series_reactor(OBJECT *obj, char *classname)
00225 {
00226 return OBJECTDATA(obj,series_reactor)->isa(classname);
00227 }
00228