00001
00010 #include <stdlib.h>
00011 #include <stdio.h>
00012 #include <errno.h>
00013 #include <math.h>
00014 #include "residential.h"
00015 #include "residential_enduse.h"
00016
00018
00020 CLASS* residential_enduse::oclass = NULL;
00021
00022
00023 residential_enduse::residential_enduse(MODULE *mod)
00024 {
00025
00026 if (oclass==NULL)
00027 {
00028
00029 oclass = gl_register_class(mod,"residential_enduse",sizeof(residential_enduse),PC_BOTTOMUP);
00030 if (oclass==NULL)
00031 GL_THROW("unable to register object class implemented by %s",__FILE__);
00032
00033
00034
00035
00036
00037
00038
00039 if (gl_publish_variable(oclass,
00040 PT_loadshape,"shape",PADDR(shape),
00041 PT_enduse,"",PADDR(load),
00042 PT_enumeration,"override",PADDR(override),
00043 PT_KEYWORD,"ON",OV_ON,
00044 PT_KEYWORD,"NORMAL",OV_NORMAL,
00045 PT_KEYWORD,"OFF",OV_OFF,
00046 PT_enumeration, "power_state", PADDR(power_state),
00047 PT_KEYWORD, "UNKNOWN", PS_UNKNOWN,
00048 PT_KEYWORD, "OFF", PS_OFF,
00049 PT_KEYWORD, "ON", PS_ON,
00050 NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00051
00052
00053
00054
00055
00056 }
00057 }
00058
00059
00060 int residential_enduse::create(bool connect_shape)
00061 {
00062
00063 load.end_obj = OBJECTHDR(this);
00064 if (connect_shape) load.shape = &shape;
00065 load.breaker_amps = 20;
00066 load.config = 0;
00067 load.heatgain_fraction = 1.0;
00068 override = OV_NORMAL;
00069 power_state = PS_UNKNOWN;
00070 return 1;
00071 }
00072
00073 int residential_enduse::init(OBJECT *parent)
00074 {
00075 OBJECT *hdr = OBJECTHDR(this);
00076 hdr->flags |= OF_SKIPSAFE;
00077 ATTACHFUNCTION attach = 0;
00078
00079
00080 if(parent)
00081 attach = (ATTACHFUNCTION)(gl_get_function(parent, "attach_enduse"));
00082 if(parent && attach)
00083 pCircuit = (*attach)(parent, &load, load.breaker_amps, (load.config&EUC_IS220)!=0);
00084 else if (parent)
00085 gl_warning("%s (%s:%d) parent %s (%s:%d) does not export attach_enduse function so voltage response cannot be modeled", hdr->name?hdr->name:"(unnamed)", hdr->oclass->name, hdr->id, parent->name?parent->name:"(unnamed)", parent->oclass->name, parent->id);
00086
00087
00088
00089
00090
00091
00092 if (load.shape!=NULL) {
00093 if (load.shape->schedule==NULL)
00094 {
00095 gl_verbose("%s (%s:%d) schedule is not specified so the load may be inactive", hdr->name?hdr->name:"(unnamed)", hdr->oclass->name, hdr->id);
00096
00097
00098
00099
00100
00101 }
00102 }
00103
00104 return 1;
00105 }
00106
00107 int residential_enduse::isa(char *classname){
00108 return strcmp(classname,"residential_enduse")==0;
00109 }
00110
00111 TIMESTAMP residential_enduse::sync(TIMESTAMP t0, TIMESTAMP t1)
00112 {
00113 OBJECT *obj = OBJECTHDR(this);
00114 gl_debug("%s shape load = %8g", obj->name, gl_get_loadshape_value(&shape));
00115 if (load.voltage_factor>1.2 || load.voltage_factor<0.8)
00116 gl_verbose("%s voltage is out of normal +/- 20%% range of nominal (vf=%.2f)", obj->name, load.voltage_factor);
00117
00118
00119
00120
00121
00122 return shape.t2>t1 ? shape.t2 : TS_NEVER;
00123 }
00124
00126
00128
00129 EXPORT int create_residential_enduse(OBJECT **obj, OBJECT *parent)
00130 {
00131 *obj = gl_create_object(residential_enduse::oclass);
00132 if (*obj!=NULL)
00133 {
00134 residential_enduse *my = OBJECTDATA(*obj,residential_enduse);
00135 gl_set_parent(*obj,parent);
00136 try {
00137 my->create();
00138 }
00139 catch (char *msg)
00140 {
00141 gl_error("%s::%s.create(OBJECT **obj={name='%s', id=%d},...): %s", (*obj)->oclass->module->name, (*obj)->oclass->name, (*obj)->name, (*obj)->id, msg);
00142 return 0;
00143 }
00144 return 1;
00145 }
00146 return 0;
00147 }
00148
00149 EXPORT int init_residential_enduse(OBJECT *obj)
00150 {
00151 residential_enduse *my = OBJECTDATA(obj,residential_enduse);
00152 try {
00153 return my->init(obj->parent);
00154 }
00155 catch (char *msg)
00156 {
00157 gl_error("%s::%s.init(OBJECT *obj={name='%s', id=%d}): %s", obj->oclass->module->name, obj->oclass->name, obj->name, obj->id, msg);
00158 return 0;
00159 }
00160 }
00161
00162 EXPORT int isa_residential_enduse(OBJECT *obj, char *classname)
00163 {
00164 if(obj != 0 && classname != 0){
00165 return OBJECTDATA(obj,residential_enduse)->isa(classname);
00166 } else {
00167 return 0;
00168 }
00169 }
00170
00171 EXPORT TIMESTAMP sync_residential_enduse(OBJECT *obj, TIMESTAMP t1)
00172 {
00173 residential_enduse *my = OBJECTDATA(obj,residential_enduse);
00174 try {
00175 TIMESTAMP t2 = my->sync(obj->clock, t1);
00176 obj->clock = t1;
00177 return t2;
00178 }
00179 catch (char *msg)
00180 {
00181 DATETIME dt;
00182 char ts[64];
00183 gl_localtime(t1,&dt);
00184 gl_strtime(&dt,ts,sizeof(ts));
00185 gl_error("%s::%s.init(OBJECT **obj={name='%s', id=%d},TIMESTAMP t1='%s'): %s", obj->oclass->module->name, obj->oclass->name, obj->name, obj->id, ts, msg);
00186 return 0;
00187 }
00188 }
00189