powerflow/capacitor.cpp

Go to the documentation of this file.
00001 // $Id: capacitor.cpp,v 1.7 2008/02/13 22:48:04 natet Exp $
00009 #include <stdlib.h> 
00010 #include <stdio.h>
00011 #include <errno.h>
00012 #include <math.h>
00013 
00014 #include "capacitor.h"
00015 
00017 // capacitor CLASS FUNCTIONS
00019 CLASS* capacitor::oclass = NULL;
00020 CLASS* capacitor::pclass = NULL;
00021 capacitor  *capacitor::defaults = NULL;
00022 
00029 capacitor::capacitor(MODULE *mod):node(mod)
00030 {
00031     if(oclass == NULL)
00032     {
00033         pclass = node::oclass;
00034         
00035         oclass = gl_register_class(mod,"capacitor",PC_BOTTOMUP|PC_POSTTOPDOWN);
00036         if(oclass == NULL)
00037             GL_THROW("unable to register object class implemented by %s",__FILE__);
00038 
00039         if(gl_publish_variable(oclass,
00040             PT_double,"sync_V_limit[V]",PADDR(sync_V_limit),
00041             PT_complex, "phaseA_V[V]", PADDR(phaseA_V),
00042             PT_complex, "phaseB_V[V]", PADDR(phaseB_V),
00043             PT_complex, "phaseC_V[V]", PADDR(phaseC_V),
00044             PT_set, "phases", PADDR(phases),
00045                 PT_KEYWORD, "A",PHASE_A,
00046                 PT_KEYWORD, "B",PHASE_B,
00047                 PT_KEYWORD, "C",PHASE_C,
00048                 PT_KEYWORD, "N",PHASE_N,
00049                 PT_KEYWORD, "D",PHASE_D,
00050                 PT_KEYWORD, "S",PHASE_S,
00051             PT_set, "pt_phase", PADDR(pt_phase),
00052                 PT_KEYWORD, "A",PHASE_A,
00053                 PT_KEYWORD, "B",PHASE_B,
00054                 PT_KEYWORD, "C",PHASE_C,
00055             PT_enumeration, "switch", switch_state,
00056                 PT_KEYWORD, "OPEN", OPEN,
00057                 PT_KEYWORD, "CLOSED", CLOSED,
00058             PT_enumeration, "control", control,
00059                 PT_KEYWORD, "MANUAL", MANUAL,
00060                 PT_KEYWORD, "VAR", VAR,
00061                 PT_KEYWORD, "VOLT", VOLT,
00062                 PT_KEYWORD, "VARVOLT", VARVOLT,
00063             NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00064 
00065         // Set up defaults
00066         memset(this,0,sizeof(capacitor));
00067         defaults = this;  
00068         switch_state = CLOSED;
00069         control = MANUAL;
00070         var_close = 0.0;
00071         var_open = 0.0;
00072         volt_close = 0.0;
00073         volt_open = 0.0;
00074         pt_ratio = 60;
00075         pt_phase = PHASE_A;
00076         time_delay = 0;
00077         time_to_change = 0.0;
00078       
00079     }
00080 }
00081 
00082 int capacitor::create()
00083 {
00084     int result = node::create();
00085     memcpy(this,defaults,sizeof(capacitor));
00086     return result;
00087 }
00088 
00089 TIMESTAMP capacitor::sync(TIMESTAMP t0)
00090 {
00091     if (switch_state==CLOSED) {
00092         switch (control) {
00093             case MANUAL:  // manual
00095                 break;
00096             case VAR:  // VAr
00098                 break;
00099             case VOLT:  // V
00101                 break;
00102             case VARVOLT:  // VAr, V
00104                 break;
00105             default:
00106                 break;
00107         }
00108     } else {
00109         switch (control) {
00110             case MANUAL:  // manual
00112                 break;
00113             case VAR:  // VAr
00115                 break;
00116             case VOLT:  // V
00118                 break;
00119             case VARVOLT:  // VAr, V
00121                 break;
00122             default:
00123                 break;
00124         }
00125     }
00126     return node::sync(t0);
00127 }
00128 
00129 TIMESTAMP capacitor::postsync(TIMESTAMP t0)
00130 {
00131     return node::postsync(t0);
00132 }
00133 
00134 int capacitor::isa(char *classname)
00135 {
00136     return strcmp(classname,"capacitor")==0 || node::isa(classname);
00137 }
00138 
00140 // IMPLEMENTATION OF CORE LINKAGE: capacitor
00142 
00150 EXPORT int create_capacitor(OBJECT **obj, OBJECT *parent)
00151 {
00152     try
00153     {
00154         *obj = gl_create_object(capacitor::oclass,sizeof(capacitor));
00155         if (*obj!=NULL)
00156         {
00157             capacitor *my = OBJECTDATA(*obj,capacitor);
00158             gl_set_parent(*obj,parent);
00159             return my->create();
00160         }
00161     }
00162     catch (char *msg)
00163     {
00164         gl_error("create_capacitor: %s", msg);
00165     }
00166     return 1;
00167 }
00168 
00169 
00170 
00177 EXPORT int init_capacitor(OBJECT *obj)
00178 {
00179     capacitor *my = OBJECTDATA(obj,capacitor);
00180     try {
00181         return my->init(obj->parent);
00182     }
00183     catch (char *msg)
00184     {
00185         GL_THROW("%s (capacitor:%d): %s", my->get_name(), my->get_id(), msg);
00186         return 0; 
00187     }
00188 }
00189 
00197 EXPORT TIMESTAMP sync_capacitor(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00198 {
00199     capacitor *pObj = OBJECTDATA(obj,capacitor);
00200     try {
00201         TIMESTAMP t1 = TS_NEVER;
00202         switch (pass) {
00203         case PC_PRETOPDOWN:
00204             return pObj->presync(t0);
00205         case PC_BOTTOMUP:
00206             return pObj->sync(t0);
00207         case PC_POSTTOPDOWN:
00208             t1 = pObj->postsync(t0);
00209             obj->clock = t0;
00210             return t1;
00211         default:
00212             throw "invalid pass request";
00213         }
00214     } catch (const char *error) {
00215         GL_THROW("%s (capacitor:%d): %s", pObj->get_name(), pObj->get_id(), error);
00216         return 0; 
00217     } catch (...) {
00218         GL_THROW("%s (capacitor:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00219         return 0;
00220     }
00221 }
00222 
00231 EXPORT int isa_capacitor(OBJECT *obj, char *classname)
00232 {
00233     return OBJECTDATA(obj,capacitor)->isa(classname);
00234 }
00235 

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