00001
00002
00003
00004
00005 #include <stdlib.h>
00006 #include <stdio.h>
00007 #include <errno.h>
00008 #include <math.h>
00009 #include "gridlabd.h"
00010
00011 #define _RELIABILITY_CPP
00012 #include "reliability.h"
00013 #undef _RELIABILITY_CPP
00014
00015 #include "metrics.h"
00016 #include "eventgen.h"
00017
00018 EXPORT CLASS *init(CALLBACKS *fntable, MODULE *module, int argc, char *argv[])
00019 {
00020 if (set_callback(fntable)==NULL)
00021 {
00022 errno = EINVAL;
00023 return NULL;
00024 }
00025
00026
00027 gl_global_create("reliability::enable_subsecond_models", PT_bool, &enable_subsecond_models,PT_DESCRIPTION,"Flag to enable deltamode functionality in the reliability module",NULL);
00028 gl_global_create("reliability::maximum_event_length",PT_double,&event_max_duration,PT_UNITS,"s",PT_DESCRIPTION,"Maximum duration of any faulting event",NULL);
00029 gl_global_create("reliability::report_event_log",PT_bool,&metrics::report_event_log,PT_DESCRIPTION,"Should the metrics object dump a logfile?",NULL);
00030 gl_global_create("reliability::deltamode_timestep", PT_int32, &deltamode_timestep,PT_DESCRIPTION,"Default timestep for reliability deltamode operations",NULL);
00031
00032 new metrics(module);
00033 new eventgen(module);
00034
00035
00036 return metrics::oclass;
00037 }
00038
00039
00040 void schedule_deltamode_start(TIMESTAMP tstart)
00041 {
00042 if (enable_subsecond_models == true)
00043 {
00044 if ( (tstart<deltamode_starttime) && ((tstart-gl_globalclock)<0x7fffffff ))
00045 deltamode_starttime = tstart;
00046 }
00047 else
00048 {
00049 GL_THROW("reliability: a call was made to deltamode functions, but subsecond models are not enabled!");
00050
00051
00052
00053
00054
00055
00056 }
00057 }
00058
00059
00060
00061
00062
00063
00064
00065 EXPORT unsigned long deltamode_desired(int *flags)
00066 {
00067 unsigned long dt_val;
00068
00069 if (enable_subsecond_models == true)
00070 {
00071
00072 if ((deltamode_starttime>=gl_globalclock) && (deltamode_starttime<TS_NEVER))
00073 {
00074
00075 *flags |= DMF_SOFTEVENT;
00076
00077
00078 dt_val = (unsigned long)(deltamode_starttime - gl_globalclock);
00079
00080 gl_debug("reliability: deltamode desired in %d", dt_val);
00081 return dt_val;
00082 }
00083 else
00084 {
00085
00086 return DT_INFINITY;
00087 }
00088 }
00089 else
00090 {
00091 return DT_INFINITY;
00092 }
00093 }
00094
00095
00096
00097
00098
00099 EXPORT unsigned long preupdate(MODULE *module, TIMESTAMP t0, unsigned int64 dt)
00100 {
00101 if (enable_subsecond_models == true)
00102 {
00103 return deltamode_timestep;
00104 }
00105 else
00106 {
00107 return DT_INFINITY;
00108 }
00109 }
00110
00111
00112
00113
00114
00115 EXPORT SIMULATIONMODE interupdate(MODULE *module, TIMESTAMP t0, unsigned int64 delta_time, unsigned long dt, unsigned int iteration_count_val)
00116 {
00117 int curr_object_number;
00118 SIMULATIONMODE function_status = SM_EVENT;
00119 bool event_driven = true;
00120 bool delta_iter = false;
00121
00122 if (enable_subsecond_models == true)
00123 {
00124
00125 for (curr_object_number=0; curr_object_number<eventgen_object_count; curr_object_number++)
00126 {
00127
00128 if ((delta_objects[curr_object_number]->in_svc_double <= gl_globaldeltaclock) && (delta_objects[curr_object_number]->out_svc_double >= gl_globaldeltaclock))
00129 {
00130
00131 try
00132 {
00133
00134 function_status = ((SIMULATIONMODE (*)(OBJECT *, unsigned int64, unsigned long, unsigned int))(*delta_functions[curr_object_number]))(delta_objects[curr_object_number],delta_time,dt,iteration_count_val);
00135 }
00136 catch (const char *msg)
00137 {
00138 gl_error("reliability:interupdate: %s", msg);
00139 function_status = SM_ERROR;
00140 }
00141 catch (...)
00142 {
00143 gl_error("reliability:interupdate: unknown exception");
00144 function_status = SM_ERROR;
00145 }
00146
00147
00148 if (function_status == SM_DELTA)
00149 {
00150 gl_verbose("Reliability object:%d - %s - requested deltamode to continue",delta_objects[curr_object_number]->id,(delta_objects[curr_object_number]->name ? delta_objects[curr_object_number]->name : "Unnamed"));
00151
00152 event_driven = false;
00153 }
00154 else if (function_status == SM_DELTA_ITER)
00155 {
00156 gl_verbose("Reliability object:%d - %s - requested a deltamode reiteration",delta_objects[curr_object_number]->id,(delta_objects[curr_object_number]->name ? delta_objects[curr_object_number]->name : "Unnamed"));
00157
00158 event_driven = false;
00159 delta_iter = true;
00160 }
00161 else if (function_status == SM_ERROR)
00162 {
00163 gl_error("Reliability object:%d - %s - deltamode function returned an error!",delta_objects[curr_object_number]->id,(delta_objects[curr_object_number]->name ? delta_objects[curr_object_number]->name : "Unnamed"));
00164
00165
00166
00167
00168 return SM_ERROR;
00169 }
00170 }
00171 else
00172 function_status = SM_EVENT;
00173 }
00174
00175
00176 if (event_driven == false)
00177 {
00178 if (delta_iter == true)
00179 return SM_DELTA_ITER;
00180 else
00181 return SM_DELTA;
00182 }
00183 else
00184 return SM_EVENT;
00185 }
00186 else
00187 {
00188 return SM_EVENT;
00189 }
00190 }
00191
00192
00193
00194
00195 EXPORT STATUS postupdate(MODULE *module, TIMESTAMP t0, unsigned int64 dt)
00196 {
00197 if (enable_subsecond_models == true)
00198 {
00199
00200 deltamode_starttime = TS_NEVER;
00201
00202 return SUCCESS;
00203 }
00204 else
00205 {
00206 return SUCCESS;
00207 }
00208 }
00209
00210
00211 CDECL int do_kill()
00212 {
00213
00214 return 0;
00215 }
00216
00217 EXPORT int check()
00218 {
00219 return 0;
00220 }
00221