powerflow/triplex_node.cpp

Go to the documentation of this file.
00001 
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011 #include <errno.h>
00012 #include <math.h>
00013 
00014 #include "node.h"
00015 
00016 CLASS* triplex_node::oclass = NULL;
00017 CLASS* triplex_node::pclass = NULL;
00018 triplex_node *triplex_node::defaults = NULL;
00019 
00020 triplex_node::triplex_node(MODULE *mod):load(mod)
00021 {
00022     if(oclass == NULL)
00023     {
00024         pclass = load::oclass;
00025         
00026         oclass = gl_register_class(mod,"triplex_node",PC_BOTTOMUP|PC_POSTTOPDOWN);
00027         if(oclass == NULL)
00028             GL_THROW("unable to register object class implemented by %s",__FILE__);
00029         
00030         if(gl_publish_variable(oclass,
00031                 PT_double,"sync_V_limit[V]",PADDR(sync_V_limit),
00032             PT_complex, "line1_voltage[V]", PADDR(phaseA_V),
00033             PT_complex, "line2_voltage[V]", PADDR(phaseB_V),
00034             PT_complex, "lineN_voltage[V]", PADDR(phaseC_V),
00035             PT_set, "phases", PADDR(phases),
00036                PT_KEYWORD, "A",PHASE_A,
00037                PT_KEYWORD, "B",PHASE_B,
00038                PT_KEYWORD, "C",PHASE_C,
00039                PT_KEYWORD, "N",PHASE_N,
00040                PT_KEYWORD, "S",PHASE_S,
00041             NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00042         
00043         // Set up defaults
00044         memset(this,0,sizeof(triplex_node));
00045         defaults = this;
00046     }
00047 }
00048 
00049 int triplex_node::isa(char *classname)
00050 {
00051     return strcmp(classname,"triplex_node")==0 || node::isa(classname);
00052 }
00053 
00054 int triplex_node::init(OBJECT *parent)
00055 {
00056     return load::init(parent);
00057 }
00058 
00059 int triplex_node::create(void)
00060 {
00061     int result = load::create();
00062     memcpy(this,defaults,sizeof(triplex_node));
00063     return result;
00064 }
00065 
00066 TIMESTAMP triplex_node::sync(TIMESTAMP t0)
00067 {
00068     return load::sync(t0);
00069 }
00070 
00071 TIMESTAMP triplex_node::postsync(TIMESTAMP t0)
00072 {
00073     return load::postsync(t0);
00074 }
00075 
00077 // IMPLEMENTATION OF CORE LINKAGE: triplex_node
00079 
00087 EXPORT int create_triplex_node(OBJECT **obj, OBJECT *parent)
00088 {
00089     try
00090     {
00091         *obj = gl_create_object(triplex_node::oclass,sizeof(triplex_node));
00092         if (*obj!=NULL)
00093         {
00094             triplex_node *my = OBJECTDATA(*obj,triplex_node);
00095             gl_set_parent(*obj,parent);
00096             return my->create();
00097         }
00098     }
00099     catch (char *msg)
00100     {
00101         gl_error("create_triplex_node: %s", msg);
00102     }
00103     return 1;
00104 }
00105 
00112 EXPORT int init_triplex_node(OBJECT *obj)
00113 {
00114     triplex_node *my = OBJECTDATA(obj,triplex_node);
00115     try {
00116         return my->init();
00117     }
00118     catch (char *msg)
00119     {
00120         GL_THROW("%s (triplex_node:%d): %s", my->get_name(), my->get_id(), msg);
00121         return 0; 
00122     }
00123 }
00124 
00132 EXPORT TIMESTAMP sync_triplex_node(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00133 {
00134     triplex_node *pObj = OBJECTDATA(obj,triplex_node);
00135     try {
00136         if (pass==PC_BOTTOMUP)
00137             return pObj->sync(t0);
00138         else if (pass==PC_POSTTOPDOWN)
00139         {
00140             TIMESTAMP t1 = pObj->postsync(t0);
00141             obj->clock = t0;
00142             return t1;
00143         }
00144         else
00145             throw "invalid pass request";
00146     } catch (const char *error) {
00147         GL_THROW("%s (%s:%d): %s", pObj->get_name(), pObj->get_id(), error);
00148         return 0; 
00149     } catch (...) {
00150         GL_THROW("%s (%s:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00151         return 0;
00152     }
00153 }
00154 
00155 EXPORT int isa_triplex_node(OBJECT *obj, char *classname)
00156 {
00157     return OBJECTDATA(obj,triplex_node)->isa(classname);
00158 }
00159 

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