/******************************************************* * * DESCRIPTION: QBG transformer class * * AUTHOR: Mariana C. D'Abreu * * EMAIL: mdabreu@dc.uba.ar * ********************************************************/ #include "qbg_transformer.h" #include "ini.h" #include "message.h" #include "mainsimu.h" #include "defaults.h" const RealValue QBGTransformer::DefaultTurnsRatio = 1; /******************************************************************* * Function Name: QBGTransformer * Description: constructor ********************************************************************/ QBGTransformer::QBGTransformer( const string &name ) : Atomic( name ) , e1p( addInputPort( "e1p" ) ) , f2p( addInputPort( "f2p" ) ) , e2p( addOutputPort( "e2p" ) ) , f1p( addOutputPort( "f1p" ) ) { try { try { // turns ratio string tr( MainSimulator::Instance().getParameter( description(), "T" ) ); T = atof( tr.data() ); } catch ( MException &exc ) { T = DefaultTurnsRatio; } if ( T == 0 ) { throw MException( "Invalid Turns ratio value : " + Value2StrReal( T ) ); } // Output file try { outFileName = MainSimulator::Instance().getParameter( description(), "outputFile" ); } catch ( MException &e ) { outFileName = DEFAULT_QBG_OUTFILENAME; } } catch ( MException &e ) { e.print( cerr ); MTHROW( e ) ; } } /******************************************************************* * Function Name: ~QBGTransformer * Destructor ********************************************************************/ QBGTransformer::~QBGTransformer() { outFile.close(); } /******************************************************************* * Function Name: initFunction ********************************************************************/ Model &QBGTransformer::initFunction() { e1 = e2 = 0; f1 = f2 = 0; // out file outFile.open( outFileName.c_str() ); outFile << "\nTime,Flow1, Effort1, Flow2, Effort2"; passivate(); return *this ; } /******************************************************************* * Function Name: externalFunction ********************************************************************/ Model &QBGTransformer::externalFunction( const ExternalMessage &msg ) { RealValue value = msg.value(); if ( msg.port() == e1p ) { e1 = value; } else if( msg.port() == f2p ) { f2 = value; } calculateValues(); holdIn( active, Time::Zero ); return *this; } /******************************************************************* * Function Name: internalFunction ********************************************************************/ Model &QBGTransformer::internalFunction( const InternalMessage & ) { passivate(); return *this ; } /******************************************************************* * Function Name: outputFunction ********************************************************************/ Model &QBGTransformer::outputFunction( const InternalMessage &msg ) { sendOutput( msg.time(), f1p, f1 ); sendOutput( msg.time(), e2p, e2 ); outFile << "\n" << msg.time().asMsecs() << "," << f1 << "," << e1 << "," << f2 << "," << e2; return *this ; } /******************************************************************* * Function Name: calculateValues ********************************************************************/ QBGTransformer &QBGTransformer::calculateValues() { MASSERT( T != 0 ); e2 = (1/T) * e1; f1 = -1 * T * f2; return *this; }