00001
00014 #include <stdlib.h>
00015 #include <stdio.h>
00016 #include <errno.h>
00017 #include <math.h>
00018
00019 #include "house_a.h"
00020 #include "zipload.h"
00021
00023
00025 CLASS* ZIPload::oclass = NULL;
00026 CLASS* ZIPload::pclass = NULL;
00027
00028 ZIPload::ZIPload(MODULE *module) : residential_enduse(module)
00029 {
00030
00031 if (oclass==NULL)
00032 {
00033
00034 oclass = gl_register_class(module,"ZIPload",sizeof(ZIPload),PC_BOTTOMUP);
00035 if (oclass==NULL)
00036 GL_THROW("unable to register object class implemented by %s",__FILE__);
00037
00038
00039 if (gl_publish_variable(oclass,
00040 PT_INHERIT, "residential_enduse",
00041 PT_double,"heat_fraction",PADDR(load.heatgain_fraction), PT_DESCRIPTION, "fraction of ZIPload that is transferred as heat",
00042 PT_double,"base_power[kW]",PADDR(base_power), PT_DESCRIPTION, "base real power of the overall load",
00043 PT_double,"power_pf",PADDR(power_pf), PT_DESCRIPTION, "power factor for constant power portion",
00044 PT_double,"current_pf",PADDR(current_pf), PT_DESCRIPTION, "power factor for constant current portion",
00045 PT_double,"impedance_pf",PADDR(impedance_pf), PT_DESCRIPTION, "power factor for constant impedance portion",
00046 PT_bool,"is_240",PADDR(is_240), PT_DESCRIPTION, "load is 220/240 V (across both phases)",
00047 PT_double,"breaker_val[A]",PADDR(breaker_val), PT_DESCRIPTION, "Amperage of connected breaker",
00048 NULL)<1)
00049
00050 GL_THROW("unable to publish properties in %s",__FILE__);
00051 }
00052 }
00053
00054 ZIPload::~ZIPload()
00055 {
00056 }
00057
00058 int ZIPload::create()
00059 {
00060 int res = residential_enduse::create();
00061
00062
00063 load.name = oclass->name;
00064 load.power = load.admittance = load.current = load.total = 0.0;
00065 base_power = 0.0;
00066 load.heatgain_fraction = 0.90;
00067 load.power_factor = 1.00;
00068 load.power_fraction = 1.0;
00069 load.current_fraction = load.impedance_fraction = 0.0;
00070 load.config = 0x0;
00071 breaker_val = 1000.0;
00072
00073
00074 power_pf = current_pf = impedance_pf = 1.0;
00075
00076 load.voltage_factor = 1.0;
00077 return res;
00078 }
00079
00080 int ZIPload::init(OBJECT *parent)
00081 {
00082 OBJECT *hdr = OBJECTHDR(this);
00083 hdr->flags |= OF_SKIPSAFE;
00084
00085 if (is_240)
00086 {
00087 load.config |= EUC_IS220;
00088 }
00089
00090 load.breaker_amps = breaker_val;
00091
00092 return residential_enduse::init(parent);
00093 }
00094
00095 int ZIPload::isa(char *classname)
00096 {
00097 return (strcmp(classname,"ZIPload")==0 || residential_enduse::isa(classname));
00098 }
00099
00100 TIMESTAMP ZIPload::sync(TIMESTAMP t0, TIMESTAMP t1)
00101 {
00102 TIMESTAMP t2 = TS_NEVER;
00103 double real_power = 0.0;
00104 double imag_power = 0.0;
00105 double angleval;
00106
00107 if (pCircuit!=NULL){
00108 if (is_240)
00109 {
00110 load.voltage_factor = pCircuit->pV->Mag() / 240;
00111 }
00112 else
00113 {
00114 load.voltage_factor = pCircuit->pV->Mag() / 120;
00115 }
00116 }
00117
00118 t2 = residential_enduse::sync(t0,t1);
00119
00120 if (pCircuit->status==BRK_CLOSED)
00121 {
00122
00123
00124
00125 real_power = base_power * load.power_fraction;
00126
00127 imag_power = (power_pf == 0.0) ? 0.0 : real_power * sqrt(1.0/(power_pf * power_pf) - 1.0);
00128
00129 if (power_pf < 0)
00130 {
00131 imag_power *= -1.0;
00132 }
00133
00134 load.power.SetRect(real_power,imag_power);
00135
00136
00137 real_power = base_power * load.current_fraction;
00138
00139 imag_power = (current_pf == 0.0) ? 0.0 : real_power * sqrt(1.0/(current_pf * current_pf) - 1.0);
00140
00141 if (current_pf < 0)
00142 {
00143 imag_power *= -1.0;
00144 }
00145
00146 load.current.SetRect(real_power,imag_power);
00147
00148
00149 real_power = base_power * load.impedance_fraction;
00150
00151 imag_power = (impedance_pf == 0.0) ? 0.0 : real_power * sqrt(1.0/(impedance_pf * impedance_pf) - 1.0);
00152
00153 if (impedance_pf < 0)
00154 {
00155 imag_power *= -1.0;
00156 }
00157
00158 load.admittance.SetRect(real_power,imag_power);
00159
00160
00161 load.total = load.power + load.current + load.admittance;
00162
00163
00164 angleval = load.total.Arg();
00165 load.power_factor = (angleval < 0) ? -1.0 * cos(angleval) : cos(angleval);
00166
00167
00168 load.heatgain = load.total.Re() * load.heatgain_fraction * BTUPHPKW;
00169 }
00170 else
00171 {
00172 load.total = 0.0;
00173 load.power = 0.0;
00174 load.current = 0.0;
00175 load.admittance = 0.0;
00176 load.heatgain = 0.0;
00177 load.power_factor = 0.0;
00178 }
00179
00180 return t2;
00181 }
00182
00184
00186
00187 EXPORT int create_ZIPload(OBJECT **obj, OBJECT *parent)
00188 {
00189 *obj = gl_create_object(ZIPload::oclass);
00190 if (*obj!=NULL)
00191 {
00192 ZIPload *my = OBJECTDATA(*obj,ZIPload);;
00193 gl_set_parent(*obj,parent);
00194 my->create();
00195 return 1;
00196 }
00197 return 0;
00198 }
00199
00200 EXPORT int init_ZIPload(OBJECT *obj)
00201 {
00202 ZIPload *my = OBJECTDATA(obj,ZIPload);
00203 return my->init(obj->parent);
00204 }
00205
00206 EXPORT int isa_ZIPload(OBJECT *obj, char *classname)
00207 {
00208 if(obj != 0 && classname != 0){
00209 return OBJECTDATA(obj,ZIPload)->isa(classname);
00210 } else {
00211 return 0;
00212 }
00213 }
00214
00215
00216 EXPORT TIMESTAMP sync_ZIPload(OBJECT *obj, TIMESTAMP t0)
00217 {
00218 ZIPload *my = OBJECTDATA(obj, ZIPload);
00219 TIMESTAMP t1 = my->sync(obj->clock, t0);
00220 obj->clock = t0;
00221 return t1;
00222 }
00223