From ef962f6008f25ab7cbd4ca21bcc72b97a1e2d76f Mon Sep 17 00:00:00 2001 From: Ruben Undheim Date: Tue, 5 Jul 2016 18:02:38 +0200 Subject: Imported Upstream version 0.0.34 --- openEMS/FDTD/extensions/engine_ext_steadystate.cpp | 112 +++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 openEMS/FDTD/extensions/engine_ext_steadystate.cpp (limited to 'openEMS/FDTD/extensions/engine_ext_steadystate.cpp') diff --git a/openEMS/FDTD/extensions/engine_ext_steadystate.cpp b/openEMS/FDTD/extensions/engine_ext_steadystate.cpp new file mode 100644 index 0000000..9e5d0ce --- /dev/null +++ b/openEMS/FDTD/extensions/engine_ext_steadystate.cpp @@ -0,0 +1,112 @@ +/* +* Copyright (C) 2015 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 . +*/ + +#include "engine_ext_steadystate.h" +#include "operator_ext_steadystate.h" +#include "FDTD/engine_sse.h" +#include "FDTD/engine_interface_fdtd.h" + +Engine_Ext_SteadyState::Engine_Ext_SteadyState(Operator_Ext_SteadyState* op_ext): Engine_Extension(op_ext) +{ + m_Op_SS = op_ext; + m_Priority = ENG_EXT_PRIO_STEADYSTATE; + + for (size_t n=0;nm_E_probe_dir.size();++n) + { + double* rec = new double[m_Op_SS->m_TS_period*2]; + m_E_records.push_back(rec); + } + m_last_max_diff = 1; + last_total_energy = 0; + m_Eng_Interface = NULL; +} + +Engine_Ext_SteadyState::~Engine_Ext_SteadyState() +{ + for (size_t n=0;nm_TS_period; + unsigned int TS = m_Eng->GetNumberOfTimesteps(); + unsigned int rel_pos = m_Eng->GetNumberOfTimesteps()%(2*p); + for (size_t n=0;nGetVolt(m_Op_SS->m_E_probe_dir.at(n), m_Op_SS->m_E_probe_pos[0].at(n), m_Op_SS->m_E_probe_pos[1].at(n), m_Op_SS->m_E_probe_pos[2].at(n)); + if ((TS%(m_Op_SS->m_TS_period)==0) && (TS>=2*p)) + { + bool no_valid = true; + m_last_max_diff = 0; + double curr_total_energy = m_Eng_Interface->CalcFastEnergy(); + if (last_total_energy>0) + { + m_last_max_diff = abs(curr_total_energy-last_total_energy)/last_total_energy; + no_valid = false; + } + //cerr << curr_total_energy << "/" << last_total_energy << "=" << abs(curr_total_energy-last_total_energy)/last_total_energy << endl; + last_total_energy = curr_total_energy; + unsigned int old_pos = 0; + unsigned int new_pos = p; + if (rel_pos<=p) + { + new_pos = 0; + old_pos = p; + } + //cerr << TS << "/" << rel_pos << ": one period complete, new_pos" << new_pos << " old pos: " << old_pos << endl; + double *curr_pow = new double[m_E_records.size()]; + double *diff_pow = new double[m_E_records.size()]; + double max_pow = 0; + for (size_t n=0;nmax_pow*1e-2) + { + m_last_max_diff = max(m_last_max_diff, diff_pow[n]/curr_pow[n]); + //cerr << m_last_max_diff << endl; + no_valid = false; + } + } + if ((no_valid) || (m_last_max_diff>1)) + m_last_max_diff = 1; + delete[] curr_pow; curr_pow = NULL; + //cerr << m_last_max_diff << endl; + } +} + +void Engine_Ext_SteadyState::Apply2Current() +{ + +} -- cgit v1.2.3