Nektar++
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | Private Attributes | Friends | List of all members
Nektar::FilterElectrogram Class Reference

#include <FilterElectrogram.h>

Inheritance diagram for Nektar::FilterElectrogram:
[legend]

Public Member Functions

 FilterElectrogram (const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< SolverUtils::EquationSystem > &pEquation, const ParamMap &pParams)
 Electrogram filter constructor.
 
 ~FilterElectrogram () override
 Electrogram filter destructor.
 
- Public Member Functions inherited from Nektar::SolverUtils::Filter
SOLVER_UTILS_EXPORT Filter (const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< EquationSystem > &pEquation)
 
virtual SOLVER_UTILS_EXPORT ~Filter ()
 
SOLVER_UTILS_EXPORT void Initialise (const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
 
SOLVER_UTILS_EXPORT void Update (const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
 
SOLVER_UTILS_EXPORT void Finalise (const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time)
 
SOLVER_UTILS_EXPORT bool IsTimeDependent ()
 
SOLVER_UTILS_EXPORT std::string SetupOutput (const std::string ext, const ParamMap &pParams)
 
SOLVER_UTILS_EXPORT std::string SetupOutput (const std::string ext, const std::string inname)
 
SOLVER_UTILS_EXPORT void SetUpdateOnInitialise (bool flag)
 

Static Public Member Functions

static SolverUtils::FilterSharedPtr create (const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< SolverUtils::EquationSystem > &pEquation, const ParamMap &pParams)
 Creates an instance of this class.
 

Static Public Attributes

static std::string className
 Name of the class.
 

Protected Member Functions

void v_Initialise (const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
 Initialises the electrogram filter and open output file.
 
void v_Update (const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
 Compute extracellular potential at egm points at current time.
 
void v_Finalise (const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
 Finalise the electrogram filter and close output file.
 
bool v_IsTimeDependent () override
 Filter is time-dependent and should be called at each time-step.
 
- Protected Member Functions inherited from Nektar::SolverUtils::Filter
virtual SOLVER_UTILS_EXPORT std::string v_SetupOutput (const std::string ext, const ParamMap &pParams)
 
virtual SOLVER_UTILS_EXPORT std::string v_SetupOutput (const std::string ext, const std::string inname)
 

Protected Attributes

SpatialDomains::EntityHolder m_holder
 
- Protected Attributes inherited from Nektar::SolverUtils::Filter
LibUtilities::SessionReaderSharedPtr m_session
 
const std::weak_ptr< EquationSystemm_equ
 
bool m_updateOnInitialise = true
 

Private Attributes

Array< OneD, Array< OneD, NekDouble > > m_grad_R_x
 Gradient of the radius from each electrogram point in x-direction.
 
Array< OneD, Array< OneD, NekDouble > > m_grad_R_y
 Gradient of the radius from each electrogram point in y-direction.
 
Array< OneD, Array< OneD, NekDouble > > m_grad_R_z
 Gradient of the radius from each electrogram point in z-direction.
 
std::vector< SpatialDomains::PointGeom * > m_electrogramPoints
 List of electrogram points.
 
unsigned int m_index
 Counts number of calls to update (number of timesteps)
 
unsigned int m_outputFrequency
 Number of timesteps between outputs.
 
std::string m_outputFile
 Filename to output electrogram data to.
 
std::ofstream m_outputStream
 Output file stream for electrogram data.
 
std::stringstream m_electrogramStream
 Point coordinate input string.
 

Friends

class MemoryManager< FilterElectrogram >
 

Additional Inherited Members

- Public Types inherited from Nektar::SolverUtils::Filter
typedef std::map< std::string, std::string > ParamMap
 

Detailed Description

Definition at line 44 of file FilterElectrogram.h.

Constructor & Destructor Documentation

◆ FilterElectrogram()

Nektar::FilterElectrogram::FilterElectrogram ( const LibUtilities::SessionReaderSharedPtr pSession,
const std::shared_ptr< SolverUtils::EquationSystem > &  pEquation,
const ParamMap pParams 
)

Electrogram filter constructor.

Definition at line 50 of file FilterElectrogram.cpp.

54 : Filter(pSession, pEquation)
55{
56 // OutputFile
57 std::string ext = ".ecg";
58 m_outputFile = Filter::SetupOutput(ext, pParams);
59
60 // OutputFrequency
61 auto it = pParams.find("OutputFrequency");
62 if (it == pParams.end())
63 {
65 }
66 else
67 {
68 LibUtilities::Equation equ(m_session->GetInterpreter(), it->second);
69 m_outputFrequency = floor(equ.Evaluate());
70 }
71
72 // Points
73 it = pParams.find("Points");
74 ASSERTL0(it != pParams.end(), "Missing parameter 'Points'.");
75 m_electrogramStream.str(it->second);
76 m_index = 0;
77}
#define ASSERTL0(condition, msg)
std::string m_outputFile
Filename to output electrogram data to.
unsigned int m_outputFrequency
Number of timesteps between outputs.
unsigned int m_index
Counts number of calls to update (number of timesteps)
std::stringstream m_electrogramStream
Point coordinate input string.
SOLVER_UTILS_EXPORT std::string SetupOutput(const std::string ext, const ParamMap &pParams)
Definition Filter.h:139
LibUtilities::SessionReaderSharedPtr m_session
Definition Filter.h:93
SOLVER_UTILS_EXPORT Filter(const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< EquationSystem > &pEquation)

References ASSERTL0, Nektar::LibUtilities::Equation::Evaluate(), m_electrogramStream, m_index, m_outputFile, m_outputFrequency, Nektar::SolverUtils::Filter::m_session, and Nektar::SolverUtils::Filter::SetupOutput().

◆ ~FilterElectrogram()

Nektar::FilterElectrogram::~FilterElectrogram ( )
override

Electrogram filter destructor.

Definition at line 82 of file FilterElectrogram.cpp.

83{
84}

Member Function Documentation

◆ create()

static SolverUtils::FilterSharedPtr Nektar::FilterElectrogram::create ( const LibUtilities::SessionReaderSharedPtr pSession,
const std::shared_ptr< SolverUtils::EquationSystem > &  pEquation,
const ParamMap pParams 
)
inlinestatic

Creates an instance of this class.

Definition at line 50 of file FilterElectrogram.h.

54 {
57 pSession, pEquation, pParams);
58 return p;
59 }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< Filter > FilterSharedPtr
A shared pointer to a Driver object.
Definition Filter.h:52
std::vector< double > p(NPUPPER)

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ v_Finalise()

void Nektar::FilterElectrogram::v_Finalise ( const Array< OneD, const MultiRegions::ExpListSharedPtr > &  pFields,
const NekDouble time 
)
overrideprotectedvirtual

Finalise the electrogram filter and close output file.

Implements Nektar::SolverUtils::Filter.

Definition at line 247 of file FilterElectrogram.cpp.

250{
251 if (pFields[0]->GetComm()->GetRank() == 0)
252 {
253 m_outputStream.close();
254 }
255}
std::ofstream m_outputStream
Output file stream for electrogram data.

References m_outputStream.

◆ v_Initialise()

void Nektar::FilterElectrogram::v_Initialise ( const Array< OneD, const MultiRegions::ExpListSharedPtr > &  pFields,
const NekDouble time 
)
overrideprotectedvirtual

Initialises the electrogram filter and open output file.

Implements Nektar::SolverUtils::Filter.

Definition at line 89 of file FilterElectrogram.cpp.

92{
93 ASSERTL0(!m_electrogramStream.fail(), "No history points in stream.");
94
95 m_index = 0;
96 Array<OneD, NekDouble> gloCoord(3, 0.0);
97 LibUtilities::CommSharedPtr vComm = pFields[0]->GetComm();
98
99 // Read electrogram points
100 // Always use dim = 3 to allow electrode to be above surface
101 const size_t dim = 3;
102 size_t i = 0;
103
104 while (!m_electrogramStream.fail())
105 {
106 m_electrogramStream >> gloCoord[0] >> gloCoord[1] >> gloCoord[2];
107 if (!m_electrogramStream.fail())
108 {
111 dim, i, gloCoord[0], gloCoord[1], gloCoord[2]);
112
113 m_electrogramPoints.push_back(vert.get());
114 m_holder.m_pointVec.push_back(std::move(vert));
115 ++i;
116 }
117 }
118
119 if (vComm->GetRank() == 0)
120 {
121 // Open output stream
122 m_outputStream.open(m_outputFile.c_str());
123 m_outputStream << "# Electrogram data for variables (:";
124
125 for (size_t i = 0; i < pFields.size(); ++i)
126 {
127 m_outputStream << m_session->GetVariable(i) << ",";
128 }
129
130 m_outputStream << ") at points:" << endl;
131
132 for (size_t i = 0; i < m_electrogramPoints.size(); ++i)
133 {
134 m_electrogramPoints[i]->GetCoords(gloCoord[0], gloCoord[1],
135 gloCoord[2]);
136
137 m_outputStream << "# \t" << i;
138 m_outputStream.width(8);
139 m_outputStream << gloCoord[0];
140 m_outputStream.width(8);
141 m_outputStream << gloCoord[1];
142 m_outputStream.width(8);
143 m_outputStream << gloCoord[2];
144 m_outputStream << endl;
145 }
146 }
147
148 // Compute the distance function for each electrogram point
149 const size_t nq = pFields[0]->GetNpoints();
150 const size_t npts = m_electrogramPoints.size();
151 NekDouble px, py, pz;
152 m_grad_R_x = Array<OneD, Array<OneD, NekDouble>>(npts);
153 m_grad_R_y = Array<OneD, Array<OneD, NekDouble>>(npts);
154 m_grad_R_z = Array<OneD, Array<OneD, NekDouble>>(npts);
155
156 Array<OneD, NekDouble> oneOverR(nq, 0.0);
157
158 for (size_t i = 0; i < npts; ++i)
159 {
160 m_grad_R_x[i] = Array<OneD, NekDouble>(nq, 0.0);
161 m_grad_R_y[i] = Array<OneD, NekDouble>(nq, 0.0);
162 m_grad_R_z[i] = Array<OneD, NekDouble>(nq, 0.0);
163
164 Array<OneD, NekDouble> x(nq, 0.0);
165 Array<OneD, NekDouble> y(nq, 0.0);
166 Array<OneD, NekDouble> z(nq, 0.0);
167
168 // Compute 1/R
169 m_electrogramPoints[i]->GetCoords(px, py, pz);
170 pFields[0]->GetCoords(x, y, z);
171
172 Vmath::Sadd(nq, -px, x, 1, x, 1);
173 Vmath::Sadd(nq, -py, y, 1, y, 1);
174 Vmath::Sadd(nq, -pz, z, 1, z, 1);
175 Vmath::Vvtvvtp(nq, x, 1, x, 1, y, 1, y, 1, oneOverR, 1);
176 Vmath::Vvtvp(nq, z, 1, z, 1, oneOverR, 1, oneOverR, 1);
177 Vmath::Vsqrt(nq, oneOverR, 1, oneOverR, 1);
178 Vmath::Sdiv(nq, 1.0, oneOverR, 1, oneOverR, 1);
179
180 // Compute grad 1/R
181 pFields[0]->PhysDeriv(oneOverR, m_grad_R_x[i], m_grad_R_y[i],
182 m_grad_R_z[i]);
183 }
184
185 // Compute electrogram point for initial condition
186 v_Update(pFields, time);
187}
Array< OneD, Array< OneD, NekDouble > > m_grad_R_z
Gradient of the radius from each electrogram point in z-direction.
Array< OneD, Array< OneD, NekDouble > > m_grad_R_x
Gradient of the radius from each electrogram point in x-direction.
Array< OneD, Array< OneD, NekDouble > > m_grad_R_y
Gradient of the radius from each electrogram point in y-direction.
SpatialDomains::EntityHolder m_holder
std::vector< SpatialDomains::PointGeom * > m_electrogramPoints
List of electrogram points.
void v_Update(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
Compute extracellular potential at egm points at current time.
static std::unique_ptr< DataType, UniquePtrDeleter > AllocateUniquePtr(const Args &...args)
std::vector< PointGeomUniquePtr > m_pointVec
Definition MeshGraph.h:112
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition Comm.h:55
unique_ptr_objpool< PointGeom > PointGeomUniquePtr
Definition MeshGraph.h:93
std::vector< double > z(NPUPPER)
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
Definition Vmath.hpp:340
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Definition Vmath.hpp:366
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/x.
Definition Vmath.hpp:154
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
Definition Vmath.hpp:194
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
Definition Vmath.hpp:439

References Nektar::ObjPoolManager< DataType >::AllocateUniquePtr(), ASSERTL0, m_electrogramPoints, m_electrogramStream, m_grad_R_x, m_grad_R_y, m_grad_R_z, m_holder, m_index, m_outputFile, m_outputStream, Nektar::SpatialDomains::EntityHolder::m_pointVec, Nektar::SolverUtils::Filter::m_session, Vmath::Sadd(), Vmath::Sdiv(), v_Update(), Vmath::Vsqrt(), Vmath::Vvtvp(), and Vmath::Vvtvvtp().

◆ v_IsTimeDependent()

bool Nektar::FilterElectrogram::v_IsTimeDependent ( )
overrideprotectedvirtual

Filter is time-dependent and should be called at each time-step.

Implements Nektar::SolverUtils::Filter.

Definition at line 260 of file FilterElectrogram.cpp.

261{
262 return true;
263}

◆ v_Update()

void Nektar::FilterElectrogram::v_Update ( const Array< OneD, const MultiRegions::ExpListSharedPtr > &  pFields,
const NekDouble time 
)
overrideprotectedvirtual

Compute extracellular potential at egm points at current time.

Implements Nektar::SolverUtils::Filter.

Definition at line 192 of file FilterElectrogram.cpp.

195{
196 // Only output every m_outputFrequency.
197 if ((m_index++) % m_outputFrequency)
198 {
199 return;
200 }
201
202 const size_t nq = pFields[0]->GetNpoints();
203 const size_t npoints = m_electrogramPoints.size();
204 LibUtilities::CommSharedPtr vComm = pFields[0]->GetComm();
205
206 size_t i = 0;
207 Array<OneD, NekDouble> e(npoints);
208
209 // Compute grad V
210 Array<OneD, NekDouble> grad_V_x(nq), grad_V_y(nq), grad_V_z(nq);
211 pFields[0]->PhysDeriv(pFields[0]->GetPhys(), grad_V_x, grad_V_y, grad_V_z);
212
213 for (i = 0; i < npoints; ++i)
214 {
215 // Multiply together
216 Array<OneD, NekDouble> output(nq);
217 Vmath::Vvtvvtp(nq, m_grad_R_x[i], 1, grad_V_x, 1, m_grad_R_y[i], 1,
218 grad_V_y, 1, output, 1);
219 Vmath::Vvtvp(nq, m_grad_R_z[i], 1, grad_V_z, 1, output, 1, output, 1);
220
221 e[i] = pFields[0]->Integral(output);
222 }
223
224 // Exchange history data
225 // This could be improved to reduce communication but works for now
226 vComm->AllReduce(e, LibUtilities::ReduceSum);
227
228 // Only the root process writes out electrogram data
229 if (vComm->GetRank() == 0)
230 {
231 m_outputStream.width(8);
232 m_outputStream << setprecision(6) << time;
233
234 // Write data values point by point
235 for (i = 0; i < m_electrogramPoints.size(); ++i)
236 {
237 m_outputStream.width(25);
238 m_outputStream << setprecision(16) << e[i];
239 }
240 m_outputStream << endl;
241 }
242}

References m_electrogramPoints, m_grad_R_x, m_grad_R_y, m_grad_R_z, m_index, m_outputFrequency, m_outputStream, Nektar::LibUtilities::ReduceSum, Vmath::Vvtvp(), and Vmath::Vvtvvtp().

Referenced by v_Initialise().

Friends And Related Symbol Documentation

◆ MemoryManager< FilterElectrogram >

friend class MemoryManager< FilterElectrogram >
friend

Definition at line 1 of file FilterElectrogram.h.

Member Data Documentation

◆ className

std::string Nektar::FilterElectrogram::className
static
Initial value:
=
"Electrogram", FilterElectrogram::create)
static SolverUtils::FilterSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< SolverUtils::EquationSystem > &pEquation, const ParamMap &pParams)
Creates an instance of this class.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
FilterFactory & GetFilterFactory()

Name of the class.

Definition at line 62 of file FilterElectrogram.h.

◆ m_electrogramPoints

std::vector<SpatialDomains::PointGeom *> Nektar::FilterElectrogram::m_electrogramPoints
private

List of electrogram points.

Definition at line 98 of file FilterElectrogram.h.

Referenced by v_Initialise(), and v_Update().

◆ m_electrogramStream

std::stringstream Nektar::FilterElectrogram::m_electrogramStream
private

Point coordinate input string.

Definition at line 108 of file FilterElectrogram.h.

Referenced by FilterElectrogram(), and v_Initialise().

◆ m_grad_R_x

Array<OneD, Array<OneD, NekDouble> > Nektar::FilterElectrogram::m_grad_R_x
private

Gradient of the radius from each electrogram point in x-direction.

Definition at line 92 of file FilterElectrogram.h.

Referenced by v_Initialise(), and v_Update().

◆ m_grad_R_y

Array<OneD, Array<OneD, NekDouble> > Nektar::FilterElectrogram::m_grad_R_y
private

Gradient of the radius from each electrogram point in y-direction.

Definition at line 94 of file FilterElectrogram.h.

Referenced by v_Initialise(), and v_Update().

◆ m_grad_R_z

Array<OneD, Array<OneD, NekDouble> > Nektar::FilterElectrogram::m_grad_R_z
private

Gradient of the radius from each electrogram point in z-direction.

Definition at line 96 of file FilterElectrogram.h.

Referenced by v_Initialise(), and v_Update().

◆ m_holder

SpatialDomains::EntityHolder Nektar::FilterElectrogram::m_holder
protected

Definition at line 88 of file FilterElectrogram.h.

Referenced by v_Initialise().

◆ m_index

unsigned int Nektar::FilterElectrogram::m_index
private

Counts number of calls to update (number of timesteps)

Definition at line 100 of file FilterElectrogram.h.

Referenced by FilterElectrogram(), v_Initialise(), and v_Update().

◆ m_outputFile

std::string Nektar::FilterElectrogram::m_outputFile
private

Filename to output electrogram data to.

Definition at line 104 of file FilterElectrogram.h.

Referenced by FilterElectrogram(), and v_Initialise().

◆ m_outputFrequency

unsigned int Nektar::FilterElectrogram::m_outputFrequency
private

Number of timesteps between outputs.

Definition at line 102 of file FilterElectrogram.h.

Referenced by FilterElectrogram(), and v_Update().

◆ m_outputStream

std::ofstream Nektar::FilterElectrogram::m_outputStream
private

Output file stream for electrogram data.

Definition at line 106 of file FilterElectrogram.h.

Referenced by v_Finalise(), v_Initialise(), and v_Update().