00001 #include "SystemFreqCalculator.h"
00002 using namespace std;
00003 using namespace adevs;
00004
00005 SystemFreqCalculator::SystemFreqCalculator(ElectricalModel* model,
00006 double cint, string model_name):
00007 EventListener<PortValue<BasicEvent*> >(),
00008 cint(cint),
00009 fout(string(model_name+"_sys_freq.dat").c_str()),
00010 sys_freq(0.0),
00011 t_last(0.0),
00012 src(model)
00013 {
00014 stateChange(model,0.0);
00015 }
00016
00017 void SystemFreqCalculator::stateChange(Atomic<PortValue<BasicEvent*> >* model,
00018 double t)
00019 {
00020 if (t == 0.0 || t-t_last >= cint)
00021 {
00022 double fsum1 = 0.0, fsum2 = 0.0, msum = 0.0;
00023 t_last = t;
00024 fout << t << " ";
00025 unsigned genrs = src->getElectricalData()->getGenrCount();
00026 for (unsigned i = 0; i < genrs; i++)
00027 {
00028 double m = src->getElectricalData()->getGenrParams(i).M;
00029 msum += m;
00030 fsum1 += src->getGenrFreq(i);
00031 fsum2 += src->getGenrFreq(i)*m;
00032 }
00033
00034 sys_freq = 60.0*fsum2/msum;
00035 fout << 60.0*fsum1/double(genrs) << " " << sys_freq << endl;
00036 }
00037 }
00038
00039 SystemFreqCalculator::~SystemFreqCalculator()
00040 {
00041 fout.close();
00042 }
00043