powerflow/load.cpp

Go to the documentation of this file.
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         // Set up defaults
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)) {    // 'Delta' connected load
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 {              // 'WYE' connected load
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 // IMPLEMENTATION OF CORE LINKAGE: load
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 

GridLAB-DTM Version 1.0
An open-source project initiated by the US Department of Energy