00001
00013 #include <stdlib.h>
00014 #include <stdio.h>
00015 #include <errno.h>
00016 #include <math.h>
00017
00018 #include "house_a.h"
00019 #include "plugload.h"
00020
00022
00024 CLASS* plugload::oclass = NULL;
00025 CLASS* plugload::pclass = NULL;
00026
00027 plugload::plugload(MODULE *module) : residential_enduse(module)
00028 {
00029
00030 if (oclass==NULL)
00031 {
00032
00033 oclass = gl_register_class(module,"plugload",sizeof(plugload),PC_BOTTOMUP);
00034 if (oclass==NULL)
00035 GL_THROW("unable to register object class implemented by %s",__FILE__);
00036
00037
00038 if (gl_publish_variable(oclass,
00039 PT_INHERIT, "residential_enduse",
00040 PT_double,"circuit_split",PADDR(circuit_split),
00041 PT_double,"demand[unit]",PADDR(shape.load),
00042 PT_double,"installed_power[kW]",PADDR(shape.params.analog.power), PT_DESCRIPTION, "installed plugs capacity",
00043 NULL)<1)
00044 GL_THROW("unable to publish properties in %s",__FILE__);
00045 }
00046 }
00047
00048 plugload::~plugload()
00049 {
00050 }
00051
00052 int plugload::create()
00053 {
00054 int res = residential_enduse::create();
00055
00056
00057 load.name = oclass->name;
00058 load.power = load.admittance = load.current = load.total = complex(0,0,J);
00059 load.heatgain_fraction = 0.90;
00060 load.power_factor = 0.90;
00061
00062 load.voltage_factor = 1.0;
00063 shape.load = gl_random_uniform(0, 0.1);
00064 return res;
00065 }
00066
00067 int plugload::init(OBJECT *parent)
00068 {
00069 OBJECT *hdr = OBJECTHDR(this);
00070 hdr->flags |= OF_SKIPSAFE;
00071
00072 load.breaker_amps = 40;
00073
00074 return residential_enduse::init(parent);
00075 }
00076
00077 int plugload::isa(char *classname)
00078 {
00079 return (strcmp(classname,"plugload")==0 || residential_enduse::isa(classname));
00080 }
00081
00082 TIMESTAMP plugload::sync(TIMESTAMP t0, TIMESTAMP t1)
00083 {
00084 TIMESTAMP t2 = TS_NEVER;
00085 double val = 0.0;
00086
00087 if (pCircuit!=NULL)
00088 load.voltage_factor = pCircuit->pV->Mag() / 120;
00089
00090 t2 = residential_enduse::sync(t0,t1);
00091
00092 if (pCircuit->status==BRK_CLOSED)
00093 {
00094 if (shape.type == MT_UNKNOWN)
00095 {
00096 if(shape.load < 0.0){
00097 gl_error("plugload demand cannot be negative, capping");
00098 shape.load = 0.0;
00099 }
00100 load.power = load.power_fraction * shape.load;
00101 load.current = load.current_fraction * shape.load;
00102 load.admittance = load.impedance_fraction * shape.load;
00103 if(fabs(load.power_factor) < 1 && load.power_factor != 0.0){
00104 val = (load.power_factor < 0 ? -1.0 : 1.0) * load.power.Re() * sqrt(1/(load.power_factor * load.power_factor) - 1);
00105 } else {
00106 val = 0;
00107 }
00108 load.power.SetRect(load.power.Re(), val);
00109 }
00110 }
00111 else
00112 load.power = load.current = load.admittance = complex(0,0,J);
00113
00114 gl_enduse_sync(&(residential_enduse::load),t1);
00115 return t2;
00116 }
00117
00119
00121
00122 EXPORT int create_plugload(OBJECT **obj, OBJECT *parent)
00123 {
00124 *obj = gl_create_object(plugload::oclass);
00125 if (*obj!=NULL)
00126 {
00127 plugload *my = OBJECTDATA(*obj,plugload);;
00128 gl_set_parent(*obj,parent);
00129 my->create();
00130 return 1;
00131 }
00132 return 0;
00133 }
00134
00135 EXPORT int init_plugload(OBJECT *obj)
00136 {
00137 plugload *my = OBJECTDATA(obj,plugload);
00138 return my->init(obj->parent);
00139 }
00140
00141 EXPORT int isa_plugload(OBJECT *obj, char *classname)
00142 {
00143 if(obj != 0 && classname != 0){
00144 return OBJECTDATA(obj,plugload)->isa(classname);
00145 } else {
00146 return 0;
00147 }
00148 }
00149
00150 EXPORT TIMESTAMP sync_plugload(OBJECT *obj, TIMESTAMP t0)
00151 {
00152 plugload *my = OBJECTDATA(obj, plugload);
00153 TIMESTAMP t1 = my->sync(obj->clock, t0);
00154 obj->clock = t0;
00155 return t1;
00156 }
00157