summaryrefslogtreecommitdiff
path: root/openEMS/FDTD/engine.h
diff options
context:
space:
mode:
Diffstat (limited to 'openEMS/FDTD/engine.h')
-rw-r--r--openEMS/FDTD/engine.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/openEMS/FDTD/engine.h b/openEMS/FDTD/engine.h
new file mode 100644
index 0000000..72d17e1
--- /dev/null
+++ b/openEMS/FDTD/engine.h
@@ -0,0 +1,104 @@
+/*
+* Copyright (C) 2010 Thorsten Liebig (Thorsten.Liebig@gmx.de)
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef ENGINE_H
+#define ENGINE_H
+
+#include <fstream>
+#include "operator.h"
+
+namespace NS_Engine_Multithread
+{
+class thread; // evil hack to access numTS from multithreading context
+}
+
+class Engine_Extension;
+
+class Engine
+{
+public:
+ enum EngineType
+ {
+ BASIC, SSE, UNKNOWN
+ };
+
+ static Engine* New(const Operator* op);
+ virtual ~Engine();
+
+ virtual void Init();
+ virtual void Reset();
+
+ //!Iterate a number of timesteps
+ virtual bool IterateTS(unsigned int iterTS);
+
+ virtual unsigned int GetNumberOfTimesteps() {return numTS;}
+
+ //this access functions muss be overloaded by any new engine using a different storage model
+ inline virtual FDTD_FLOAT GetVolt( unsigned int n, unsigned int x, unsigned int y, unsigned int z ) const { return volt[n][x][y][z]; }
+ inline virtual FDTD_FLOAT GetVolt( unsigned int n, const unsigned int pos[3] ) const { return volt[n][pos[0]][pos[1]][pos[2]]; }
+ inline virtual FDTD_FLOAT GetCurr( unsigned int n, unsigned int x, unsigned int y, unsigned int z ) const { return curr[n][x][y][z]; }
+ inline virtual FDTD_FLOAT GetCurr( unsigned int n, const unsigned int pos[3] ) const { return curr[n][pos[0]][pos[1]][pos[2]]; }
+
+ inline virtual void SetVolt( unsigned int n, unsigned int x, unsigned int y, unsigned int z, FDTD_FLOAT value) { volt[n][x][y][z]=value; }
+ inline virtual void SetVolt( unsigned int n, const unsigned int pos[3], FDTD_FLOAT value ) { volt[n][pos[0]][pos[1]][pos[2]]=value; }
+ inline virtual void SetCurr( unsigned int n, unsigned int x, unsigned int y, unsigned int z, FDTD_FLOAT value) { curr[n][x][y][z]=value; }
+ inline virtual void SetCurr( unsigned int n, const unsigned int pos[3], FDTD_FLOAT value ) { curr[n][pos[0]][pos[1]][pos[2]]=value; }
+
+ //! Execute Pre-Voltage extension updates
+ virtual void DoPreVoltageUpdates();
+ //! Main FDTD engine voltage updates
+ virtual void UpdateVoltages(unsigned int startX, unsigned int numX);
+ //! Execute Post-Voltage extension updates
+ virtual void DoPostVoltageUpdates();
+ //! Apply extension voltage changes
+ virtual void Apply2Voltages();
+
+ //! Execute Pre-Current extension updates
+ virtual void DoPreCurrentUpdates();
+ //! Main FDTD engine current updates
+ virtual void UpdateCurrents(unsigned int startX, unsigned int numX);
+ //! Execute Post-Current extension updates
+ virtual void DoPostCurrentUpdates();
+ //! Apply extension current changes
+ virtual void Apply2Current();
+
+ inline size_t GetExtensionCount() {return m_Eng_exts.size();}
+ inline Engine_Extension* GetExtension(size_t nr) {return m_Eng_exts.at(nr);}
+ virtual void SortExtensionByPriority();
+
+ EngineType GetType() const {return m_type;}
+
+protected:
+ EngineType m_type;
+
+ Engine(const Operator* op);
+ const Operator* Op;
+
+ unsigned int numLines[3];
+
+ FDTD_FLOAT**** volt;
+ FDTD_FLOAT**** curr;
+ unsigned int numTS;
+
+ virtual void InitExtensions();
+ virtual void ClearExtensions();
+ vector<Engine_Extension*> m_Eng_exts;
+
+ friend class NS_Engine_Multithread::thread; // evil hack to access numTS from multithreading context
+};
+
+#endif // ENGINE_H