00001 // ConcentrationObserver.cpp: implementation of the ConcentrationObserver class. 00002 // 00004 00005 #include "ConcentrationObserver.h" 00006 #include "ReactionMover.h" 00007 #include "ReactionNetwork.h" 00008 #include <assert.h> 00009 00011 // Construction/Destruction 00013 00014 00015 ConcentrationObserver::ConcentrationObserver(int numberOfChemicals, int numberOfTimeSteps) 00016 { 00017 this->numberOfChemicals = numberOfChemicals; 00018 this->numberOfTimeSteps = numberOfTimeSteps; 00019 00020 summedConcentration = new double *[numberOfChemicals]; 00021 summedConcentration[0] = new double[numberOfChemicals*numberOfTimeSteps]; 00022 00023 for (int chem = 1; chem < numberOfChemicals; chem++) 00024 { 00025 summedConcentration[chem] = &(summedConcentration[0][chem*numberOfTimeSteps]); 00026 } 00027 00028 ZeroConcentrations(); 00029 } 00030 00031 ConcentrationObserver::~ConcentrationObserver() 00032 { 00033 delete [] summedConcentration[0]; 00034 delete [] summedConcentration; 00035 } 00036 00037 void ConcentrationObserver::Update(Subject *theChangedSubject) 00038 { 00039 // cast dynamically for safety 00040 // CReactionMover *reactionMover = dynamic_cast<CReactionMover *>(theChangedSubject); 00041 00042 // static cast may be dangerous 00043 CReactionMover *reactionMover = (CReactionMover *)theChangedSubject; 00044 ReactionNetwork *reactionNetwork = reactionMover->GetReactionNetwork(); 00045 00046 int count = reactionMover->GetTimeCount(); 00047 assert(count <= numberOfTimeSteps); 00048 00049 for (int chem = 0; chem < reactionNetwork->GetNumberOfChemicals(); chem++) 00050 { 00051 summedConcentration[chem][count-1] = summedConcentration[chem][count-1] + reactionNetwork->GetChemical(chem)->GetAmount(); 00052 } 00053 00054 } 00055 00056 void ConcentrationObserver::ZeroConcentrations() 00057 { 00058 for (int chem = 0; chem< numberOfChemicals; chem++) 00059 { 00060 for (int count=0; count < numberOfTimeSteps; count++) 00061 { 00062 summedConcentration[chem][count] = 0; 00063 } 00064 } 00065 }