ActivationOutputModifier.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "ActivationOutputModifier.hpp"
00037 #include "OutputFileHandler.hpp"
00038 #include "HeartConfig.hpp"
00039
00040 void ActivationOutputModifier::InitialiseAtStart(DistributedVectorFactory* pVectorFactory)
00041 {
00042 mLocalSize = pVectorFactory->GetLocalOwnership();
00043 mFirstActivitationTimes.resize(mLocalSize, -1.0);
00044 mFirstRecoveryTimes.resize(mLocalSize, -1.0);
00045 mSecondActivitationTimes.resize(mLocalSize, -1.0);
00046 mSecondRecoveryTimes.resize(mLocalSize, -1.0);
00047 }
00048
00049 void ActivationOutputModifier::FinaliseAtEnd()
00050 {
00051
00052 OutputFileHandler output_handler(HeartConfig::Instance()->GetOutputDirectory(), false);
00053 PetscTools::BeginRoundRobin();
00054 {
00055 out_stream file_stream = out_stream(NULL);
00056
00057 if (PetscTools::AmMaster())
00058 {
00059 file_stream = output_handler.OpenOutputFile(mFilename);
00060 }
00061 else
00062 {
00063 file_stream = output_handler.OpenOutputFile(mFilename, std::ios::app);
00064 }
00065 for (unsigned i=0; i<mLocalSize; i++)
00066 {
00067 (*file_stream) << mFirstActivitationTimes[i] <<",\t"
00068 << mFirstRecoveryTimes[i] <<",\t"
00069 << mSecondActivitationTimes[i] <<",\t"
00070 << mSecondRecoveryTimes[i] <<"\n";
00071 }
00072 file_stream->close();
00073 }
00074 PetscTools::EndRoundRobin();
00075 }
00076
00077 void ActivationOutputModifier::ProcessSolutionAtTimeStep(double time, Vec solution, unsigned problemDim)
00078 {
00079 double* p_solution;
00080 VecGetArray(solution, &p_solution);
00081 for (unsigned local_index=0; local_index < mLocalSize; local_index++)
00082 {
00083 double v = p_solution[local_index*problemDim];
00084 if(v > mThreshold && mFirstActivitationTimes[local_index] < 0.0)
00085 {
00086 mFirstActivitationTimes[local_index] = time;
00087 }
00088 #define COVERAGE_IGNORE // Continuous tests are not long enough to allow recover
00089 else if (mFirstActivitationTimes[local_index] >= 0.0 && mFirstRecoveryTimes[local_index] < 0.0 && v < mThreshold)
00090 {
00092 mFirstRecoveryTimes[local_index] = time;
00093 }
00094 else if (mFirstRecoveryTimes[local_index] >= 0.0 && mSecondActivitationTimes[local_index] < 0.0 && v > mThreshold)
00095 {
00096 mSecondActivitationTimes[local_index] = time;
00097 }
00098 else if (mSecondActivitationTimes[local_index] >= 0.0 && mSecondRecoveryTimes[local_index] < 0.0 && v < mThreshold)
00099 {
00100 mSecondRecoveryTimes[local_index] = time;
00101 }
00102 #undef COVERAGE_IGNORE // Continuous tests are not long enough to allow recover
00103 }
00104 VecRestoreArray(solution, &p_solution);
00105 }
00106
00107 #include "SerializationExportWrapperForCpp.hpp"
00108 CHASTE_CLASS_EXPORT(ActivationOutputModifier)