00001
00011 #include <stdlib.h>
00012 #include <stdio.h>
00013 #include <errno.h>
00014 #include <math.h>
00015
00016 #include "node.h"
00017
00018 CLASS* load::oclass = NULL;
00019 CLASS* load::pclass = NULL;
00020 load *load::defaults = NULL;
00021
00022 load::load(MODULE *mod) : node(mod)
00023 {
00024 if(oclass == NULL)
00025 {
00026 pclass = node::oclass;
00027
00028 oclass = gl_register_class(mod,"load",PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN);
00029 if(oclass == NULL)
00030 GL_THROW("unable to register object class implemented by %s",__FILE__);
00031
00032 if(gl_publish_variable(oclass,
00033 PT_double,"sync_V_limit[V]",PADDR(sync_V_limit),
00034 PT_complex, "phaseA_V[V]", PADDR(phaseA_V),
00035 PT_complex, "phaseB_V[V]", PADDR(phaseB_V),
00036 PT_complex, "phaseC_V[V]", PADDR(phaseC_V),
00037 PT_complex, "phaseA_VA[VA]", PADDR(phaseA_VA),
00038 PT_complex, "phaseB_VA[VA]", PADDR(phaseB_VA),
00039 PT_complex, "phaseC_VA[VA]", PADDR(phaseC_VA),
00040 PT_complex, "phaseA_Z[ohm]", PADDR(phaseA_Z),
00041 PT_complex, "phaseB_Z[ohm]", PADDR(phaseB_Z),
00042 PT_complex, "phaseC_Z[ohm]", PADDR(phaseC_Z),
00043 PT_complex, "phaseA_I[A]", PADDR(phaseA_I),
00044 PT_complex, "phaseB_I[A]", PADDR(phaseB_I),
00045 PT_complex, "phaseC_I[A]", PADDR(phaseC_I),
00046 PT_set, "phases", PADDR(phases),
00047 PT_KEYWORD, "A",PHASE_A,
00048 PT_KEYWORD, "B",PHASE_B,
00049 PT_KEYWORD, "C",PHASE_C,
00050 PT_KEYWORD, "N",PHASE_N,
00051 PT_KEYWORD, "D",PHASE_D,
00052 PT_KEYWORD, "S",PHASE_S,
00053 PT_enumeration, "load_class", PADDR(load_class),
00054 PT_KEYWORD, "U", LC_UNKNOWN,
00055 PT_KEYWORD, "R", LC_RESIDENTIAL,
00056 PT_KEYWORD, "C", LC_COMMERCIAL,
00057 PT_KEYWORD, "I", LC_INDUSTRIAL,
00058 PT_KEYWORD, "A", LC_AGRICULTURAL,
00059 NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00060
00061
00062 memset(this,0,sizeof(load));
00063 defaults = this;
00064 sync_V_limit = 0;
00065 phaseA_Z = phaseB_Z = phaseC_Z = INFINITY;
00066 load_class = LC_UNKNOWN;
00067 }
00068 }
00069
00070 int load::isa(char *classname)
00071 {
00072 return strcmp(classname,"load")==0 || node::isa(classname);
00073 }
00074
00075 int load::create(void)
00076 {
00077 int res = node::create();
00078 memcpy(this,defaults,sizeof(load));
00079 return res;
00080 }
00081
00082
00083 TIMESTAMP load::sync(TIMESTAMP t0)
00084 {
00085 complex I;
00086
00087 if (has_phase(PHASE_D)) {
00088 complex I_A,I_B,I_C;
00089
00090 if ((I = I_INJ(phaseA_V-phaseB_V, phaseA_VA, phaseA_Z, phaseA_I)).IsFinite())
00091 I_A = I;
00092
00093 if ((I = I_INJ(phaseB_V-phaseC_V, phaseB_VA, phaseB_Z, phaseB_I)).IsFinite())
00094 I_B = I;
00095
00096 if ((I = I_INJ(phaseC_V-phaseA_V, phaseC_VA, phaseC_Z, phaseC_I)).IsFinite())
00097 I_C = I;
00098
00099 phaseA_I_in += I_A - I_C;
00100 phaseB_I_in += I_B - I_A;
00101 phaseC_I_in += I_C - I_B;
00102
00103 } else {
00104 if ((I = I_INJ(phaseA_V, phaseA_VA, phaseA_Z, phaseA_I)).IsFinite())
00105 phaseA_I_in += I;
00106
00107 if ((I = I_INJ(phaseB_V, phaseB_VA, phaseB_Z, phaseB_I)).IsFinite())
00108 phaseB_I_in += I;
00109
00110 if ((I = I_INJ(phaseC_V, phaseC_VA, phaseC_Z, phaseC_I)).IsFinite())
00111 phaseC_I_in += I;
00112 }
00113
00114 return node::sync(t0);
00115 }
00116
00117 TIMESTAMP load::postsync(TIMESTAMP t0)
00118 {
00119 return node::postsync(t0);
00120 }
00121
00123
00125
00133 EXPORT int create_load(OBJECT **obj, OBJECT *parent)
00134 {
00135 try
00136 {
00137 *obj = gl_create_object(load::oclass,sizeof(load));
00138 if (*obj!=NULL)
00139 {
00140 load *my = OBJECTDATA(*obj,load);
00141 gl_set_parent(*obj,parent);
00142 return my->create();
00143 }
00144 }
00145 catch (char *msg)
00146 {
00147 gl_error("create_load: %s", msg);
00148 }
00149 return 1;
00150 }
00151
00158 EXPORT int init_load(OBJECT *obj)
00159 {
00160 int result = 1;
00161 try {
00162 result = ((load*) (obj + 1))->init();
00163 } catch (const char *error) {
00164 GL_THROW("%s:%d: %s", obj->oclass->name, obj->id, error);
00165 return 0;
00166 } catch (...) {
00167 GL_THROW("%s:%d: %s", obj->oclass->name, obj->id, "unknown exception");
00168 return 0;
00169 }
00170 return result;
00171 }
00172
00180 EXPORT TIMESTAMP sync_load(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00181 {
00182 load *pObj = OBJECTDATA(obj,load);
00183 try {
00184 TIMESTAMP t1 = TS_NEVER;
00185 switch (pass) {
00186 case PC_PRETOPDOWN:
00187 return pObj->presync(t0);
00188 case PC_BOTTOMUP:
00189 return pObj->sync(t0);
00190 case PC_POSTTOPDOWN:
00191 t1 = pObj->postsync(t0);
00192 obj->clock = t0;
00193 return t1;
00194 default:
00195 throw "invalid pass request";
00196 }
00197 } catch (const char *error) {
00198 GL_THROW("%s (%s:%d): %s", pObj->get_name(), pObj->get_id(), error);
00199 return 0;
00200 } catch (...) {
00201 GL_THROW("%s (%s:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00202 return 0;
00203 }
00204 }
00205
00206 EXPORT int isa_load(OBJECT *obj, char *classname)
00207 {
00208 return OBJECTDATA(obj,load)->isa(classname);
00209 }
00210