00001
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045 #include <errno.h>
00046 #include <math.h>
00047 #include <iostream>
00048 using namespace std;
00049
00050 #include "node.h"
00051 #include "line.h"
00052
00053 CLASS* line::oclass = NULL;
00054 CLASS* line::pclass = NULL;
00055 CLASS *line_class = NULL;
00056
00057 line::line(MODULE *mod) : link(mod) {
00058 if(oclass == NULL)
00059 {
00060 pclass = link::oclass;
00061
00062 line_class = oclass = gl_register_class(mod,"line",sizeof(line),PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN|PC_UNSAFE_OVERRIDE_OMIT);
00063 if(oclass == NULL)
00064 GL_THROW("unable to register object class implemented by %s",__FILE__);
00065 if(gl_publish_variable(oclass,
00066 PT_INHERIT, "link",
00067 PT_object, "configuration",PADDR(configuration),
00068 PT_double, "length[ft]",PADDR(length),
00069 NULL) < 1) GL_THROW("unable to publish line properties in %s",__FILE__);
00070 }
00071 }
00072
00073 int line::create()
00074 {
00075 int result = link::create();
00076
00077 configuration = NULL;
00078 length = 0;
00079
00080 return result;
00081 }
00082
00083 int line::init(OBJECT *parent)
00084 {
00085 int result = link::init(parent);
00086
00087
00088 node *pFrom = OBJECTDATA(from,node);
00089 node *pTo = OBJECTDATA(to,node);
00090
00091
00092 if ((pFrom->nominal_voltage - pTo->nominal_voltage) > fabs(0.001*pFrom->nominal_voltage))
00093 throw "from and to node nominal voltage mismatch of greater than 0.1%";
00094
00095 if (solver_method == SM_NR && length == 0.0)
00096 throw "Newton-Raphson method does not support zero length lines at this time";
00097
00098 return result;
00099 }
00100
00101 int line::isa(char *classname)
00102 {
00103 return strcmp(classname,"line")==0 || link::isa(classname);
00104 }
00105
00106
00108
00110
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 EXPORT int create_line(OBJECT **obj, OBJECT *parent)
00133 {
00134 try
00135 {
00136 *obj = gl_create_object(line::oclass);
00137 if (*obj!=NULL)
00138 {
00139 line *my = OBJECTDATA(*obj,line);
00140 gl_set_parent(*obj,parent);
00141 return my->create();
00142 }
00143 }
00144 catch (const char *msg)
00145 {
00146 gl_error("create_line: %s", msg);
00147 }
00148 return 0;
00149 }
00150
00151 EXPORT TIMESTAMP sync_line(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00152 {
00153 line *pObj = OBJECTDATA(obj,line);
00154 try {
00155 TIMESTAMP t1 = TS_NEVER;
00156 switch (pass) {
00157 case PC_PRETOPDOWN:
00158 return pObj->presync(t0);
00159 case PC_BOTTOMUP:
00160 return pObj->sync(t0);
00161 case PC_POSTTOPDOWN:
00162 t1 = pObj->postsync(t0);
00163 obj->clock = t0;
00164 return t1;
00165 default:
00166 throw "invalid pass request";
00167 }
00168 } catch (const char *error) {
00169 GL_THROW("%s (line:%d): %s", pObj->get_name(), pObj->get_id(), error);
00170 return 0;
00171 } catch (...) {
00172 GL_THROW("%s (line:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00173 return 0;
00174 }
00175 }
00176
00177 EXPORT int init_line(OBJECT *obj)
00178 {
00179 line *my = OBJECTDATA(obj,line);
00180 try {
00181 return my->init(obj->parent);
00182 }
00183 catch (const char *msg)
00184 {
00185 GL_THROW("%s (line:%d): %s", my->get_name(), my->get_id(), msg);
00186 return 0;
00187 }
00188 }
00189
00190 EXPORT int isa_line(OBJECT *obj, char *classname)
00191 {
00192 return OBJECTDATA(obj,line)->isa(classname);
00193 }
00194