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