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 "dishwasher.h"
00020
00022
00024 CLASS* dishwasher::oclass = NULL;
00025 CLASS* dishwasher::pclass = NULL;
00026 dishwasher *dishwasher::defaults = NULL;
00027
00028 dishwasher::dishwasher(MODULE *module) : residential_enduse(module)
00029 {
00030
00031 if (oclass==NULL)
00032 {
00033
00034 oclass = gl_register_class(module,"dishwasher",sizeof(dishwasher),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,"installed_power[kW]",PADDR(shape.params.analog.power), PT_DESCRIPTION, "installed power draw",
00042 PT_double,"demand[unit]",PADDR(shape.load),
00043 NULL)<1)
00044 GL_THROW("unable to publish properties in %s",__FILE__);
00045 }
00046 }
00047
00048 dishwasher::~dishwasher()
00049 {
00050 }
00051
00052 int dishwasher::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.power_factor = 0.95;
00060 load.power_fraction = 1.0;
00061 load.shape->type = MT_PULSED;
00062
00063 return res;
00064 }
00065
00066 int dishwasher::init(OBJECT *parent)
00067 {
00068
00069 if(shape.params.analog.power == 0){
00070 shape.params.analog.power = gl_random_uniform(1000, 3000);
00071 }
00072 if(load.heatgain_fraction == 0){
00073 load.heatgain_fraction = 0.50;
00074 }
00075 if(load.power_factor == 0){
00076 load.power_factor = 0.95;
00077 }
00078
00079 OBJECT *hdr = OBJECTHDR(this);
00080 hdr->flags |= OF_SKIPSAFE;
00081
00082
00083 switch(shape.type){
00084 case MT_UNKNOWN:
00085 break;
00086 case MT_ANALOG:
00087 break;
00088 case MT_PULSED:
00089 break;
00090 case MT_MODULATED:
00091 break;
00092 case MT_QUEUED:
00093 break;
00094 default:
00095 char name[64];
00096 if(hdr->name == 0){
00097 sprintf(name, "%s:%s", hdr->oclass->name, hdr->id);
00098 }
00099 gl_error("dishwasher %s schedule of an unrecognized type", hdr->name ? hdr->name : name);
00100 }
00101
00102 return residential_enduse::init(parent);
00103 }
00104
00105 int dishwasher::isa(char *classname)
00106 {
00107 return (strcmp(classname,"dishwasher")==0 || residential_enduse::isa(classname));
00108 }
00109
00110
00111 TIMESTAMP dishwasher::sync(TIMESTAMP t0, TIMESTAMP t1)
00112 {
00113 TIMESTAMP t2 = residential_enduse::sync(t0, t1);
00114
00115 if (pCircuit!=NULL)
00116 load.voltage_factor = pCircuit->pV->Mag() / 120;
00117
00118 if(shape.type == MT_UNKNOWN){
00119 double real = 0.0, imag = 0.0;
00120 real = shape.params.analog.power * shape.load;
00121
00122 if(fabs(load.power_factor) < 1){
00123 imag = (load.power_factor<0?-1.0:1.0) * real * sqrt(1/(load.power_factor * load.power_factor) - 1);
00124 } else {
00125 imag = 0;
00126 }
00127
00128 load.power.SetRect(real, imag);
00129 }
00130
00131 gl_enduse_sync(&(residential_enduse::load), t1);
00132
00133 return t2;
00134 }
00135
00136
00138
00140
00141 EXPORT int create_dishwasher(OBJECT **obj, OBJECT *parent)
00142 {
00143 *obj = gl_create_object(dishwasher::oclass);
00144 if (*obj!=NULL)
00145 {
00146 dishwasher *my = OBJECTDATA(*obj,dishwasher);
00147 gl_set_parent(*obj,parent);
00148 my->create();
00149 return 1;
00150 }
00151 return 0;
00152 }
00153
00154 EXPORT int init_dishwasher(OBJECT *obj)
00155 {
00156 dishwasher *my = OBJECTDATA(obj,dishwasher);
00157 return my->init(obj->parent);
00158 }
00159
00160 EXPORT int isa_dishwasher(OBJECT *obj, char *classname)
00161 {
00162 if(obj != 0 && classname != 0){
00163 return OBJECTDATA(obj,dishwasher)->isa(classname);
00164 } else {
00165 return 0;
00166 }
00167 }
00168
00169 EXPORT TIMESTAMP sync_dishwasher(OBJECT *obj, TIMESTAMP t0)
00170 {
00171 dishwasher *my = OBJECTDATA(obj, dishwasher);
00172 TIMESTAMP t1 = my->sync(obj->clock, t0);
00173 obj->clock = t0;
00174 return t1;
00175 }
00176