2010-03-11 15:47:40 +00:00
/*
2015-03-06 20:38:27 +00:00
* Copyright ( C ) 2010 - 2015 Thorsten Liebig ( Thorsten . Liebig @ gmx . de )
2010-03-11 15:47:40 +00:00
*
* 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/>.
*/
2010-03-01 18:35:28 +00:00
# ifndef PROCESSING_H
# define PROCESSING_H
2019-12-30 16:12:51 +00:00
# ifndef __GNUC__ // not GCC
# include <emmintrin.h>
# endif
2010-09-17 09:07:52 +00:00
# include <complex>
typedef std : : complex < double > double_complex ;
2010-10-20 05:26:16 +00:00
# define _I double_complex(0.0,1.0)
2010-09-17 09:07:52 +00:00
2010-03-01 18:35:28 +00:00
# include <iostream>
# include <fstream>
2010-06-28 16:05:03 +00:00
# include <cmath>
2010-12-06 08:59:42 +00:00
# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string>
# include <vector>
2019-12-30 16:12:51 +00:00
# define _USE_MATH_DEFINES
2010-12-02 12:51:34 +00:00
# include "Common/engine_interface_base.h"
2010-03-01 18:35:28 +00:00
2010-12-06 08:59:42 +00:00
class Operator_Base ;
2010-03-01 18:35:28 +00:00
class Processing
{
public :
virtual ~ Processing ( ) ;
2010-12-06 08:59:42 +00:00
enum MeshType { CARTESIAN_MESH , CYLINDRICAL_MESH } ;
2010-12-02 12:51:34 +00:00
//! Set the interface to the engine. Each processing needs its own engine interface. This class will take ownership and cleanup the interface on deletion!
void SetEngineInterface ( Engine_Interface_Base * eng_if ) ;
2015-06-18 19:45:22 +00:00
virtual void SetName ( std : : string val ) { m_Name = val ; }
virtual void SetName ( std : : string val , int number ) ;
virtual std : : string GetName ( ) const { return m_Name ; }
2010-06-28 16:27:41 +00:00
2011-01-18 09:34:13 +00:00
//! Get the name for this processing, will be used in file description.
2015-06-18 19:45:22 +00:00
virtual std : : string GetProcessingName ( ) const = 0 ;
2011-01-18 09:34:13 +00:00
2010-06-28 16:27:41 +00:00
virtual void InitProcess ( ) { } ;
2010-04-03 15:36:50 +00:00
virtual void Reset ( ) ;
2010-03-02 13:54:50 +00:00
virtual void DefineStartStopCoord ( double * dstart , double * dstop ) ;
2010-03-01 18:35:28 +00:00
2011-07-13 07:36:23 +00:00
virtual void ShowSnappedCoords ( ) ;
2019-12-30 16:12:51 +00:00
void SetProcessInterval ( unsigned int interval ) ;
2015-03-06 20:38:27 +00:00
void SetProcessStartStopTime ( double start , double stop ) ;
2010-04-03 15:36:50 +00:00
void AddStep ( unsigned int step ) ;
2015-06-18 19:45:22 +00:00
void AddSteps ( std : : vector < unsigned int > steps ) ;
2010-04-03 15:36:50 +00:00
2010-06-28 16:05:03 +00:00
void AddFrequency ( double freq ) ;
2015-06-18 19:45:22 +00:00
void AddFrequency ( std : : vector < double > * freqs ) ;
2010-06-28 16:05:03 +00:00
2010-04-03 15:36:50 +00:00
bool CheckTimestep ( ) ;
2010-12-17 14:13:43 +00:00
//! Process data prior to the simulation run.
virtual void PreProcess ( ) { } ;
//! Process data during simulation run.
2010-03-10 11:15:14 +00:00
virtual int Process ( ) { return GetNextInterval ( ) ; }
2010-03-01 18:35:28 +00:00
2010-12-17 14:13:43 +00:00
//! Process data after simulation has finished.
2011-01-05 15:25:50 +00:00
virtual void PostProcess ( ) ;
2010-12-17 14:13:43 +00:00
2010-07-16 08:41:12 +00:00
//! If disabled, Process() will do nothing...
2010-03-02 18:01:03 +00:00
virtual void SetEnable ( bool val ) { Enabled = val ; }
2010-07-16 08:41:12 +00:00
//! If disabled, Process() will do nothing...
2010-04-03 15:36:50 +00:00
virtual bool GetEnable ( ) const { return Enabled ; }
2010-03-02 18:01:03 +00:00
2010-06-16 10:50:19 +00:00
virtual void SetWeight ( double weight ) { m_weight = weight ; }
virtual double GetWeight ( ) { return m_weight ; }
2010-06-28 16:05:03 +00:00
//! Invoke this flag to flush all stored data to disk
virtual void FlushNext ( ) { m_Flush = true ; }
virtual void FlushData ( ) { } ;
2010-08-11 16:46:47 +00:00
void SetMeshType ( MeshType meshType ) { m_Mesh_Type = meshType ; }
2010-04-12 07:38:24 +00:00
//! Set the dump precision
void SetPrecision ( unsigned int val ) { m_precision = val ; }
2022-03-11 21:17:27 +00:00
//! Dump probe geometry to file (will obey main or dual mesh property)
2015-06-18 19:45:22 +00:00
virtual void DumpBox2File ( std : : string vtkfilenameprefix ) const { DumpBox2File ( vtkfilenameprefix , m_dualMesh ) ; }
2010-08-11 10:28:09 +00:00
//! Dump probe geometry to file
2015-06-18 19:45:22 +00:00
virtual void DumpBox2File ( std : : string vtkfilenameprefix , bool dualMesh ) const ;
2010-06-28 16:05:03 +00:00
2010-12-19 19:41:08 +00:00
virtual void SetDualMesh ( bool val ) { m_dualMesh = val ; }
virtual void SetDualTime ( bool val ) { m_dualTime = val ; }
2010-03-01 18:35:28 +00:00
protected :
2011-01-18 09:34:13 +00:00
Processing ( Engine_Interface_Base * eng_if ) ;
2010-12-02 12:51:34 +00:00
Engine_Interface_Base * m_Eng_Interface ;
2010-12-07 15:47:23 +00:00
const Operator_Base * Op ;
2010-08-11 16:46:47 +00:00
MeshType m_Mesh_Type ;
2010-04-12 07:38:24 +00:00
unsigned int m_precision ;
2010-03-02 13:54:50 +00:00
2015-06-18 19:45:22 +00:00
std : : string m_Name ;
2010-06-28 16:27:41 +00:00
2010-06-28 16:05:03 +00:00
bool m_Flush ;
2010-06-16 10:50:19 +00:00
double m_weight ;
2010-03-02 18:01:03 +00:00
bool Enabled ;
2010-04-03 15:36:50 +00:00
int GetNextInterval ( ) const ;
2010-03-10 11:15:14 +00:00
unsigned int ProcessInterval ;
2010-04-03 15:36:50 +00:00
size_t m_PS_pos ; //! current position in list of processing steps
2015-06-18 19:45:22 +00:00
std : : vector < unsigned int > m_ProcessSteps ; //! list of processing steps
2010-04-03 15:36:50 +00:00
2010-06-28 16:05:03 +00:00
//! Vector of frequency samples
2015-06-18 19:45:22 +00:00
std : : vector < double > m_FD_Samples ;
2010-06-28 16:05:03 +00:00
//! Number of samples already processed
unsigned int m_FD_SampleCount ;
//! Sampling interval needed for the FD_Samples
unsigned int m_FD_Interval ;
2010-08-11 10:28:09 +00:00
//! define if given coords are on main or dualMesh (default is false)
bool m_dualMesh ;
2010-12-19 19:41:08 +00:00
//! define if given processing uses the dual time concept (default is false);
bool m_dualTime ;
2011-07-22 08:01:19 +00:00
//! define the snap method used for this processing
int m_SnapMethod ;
//! dimension of the snapped box
int m_Dimension ;
2010-04-09 13:58:15 +00:00
//! define/store snapped start/stop coords as mesh index
2010-03-02 13:54:50 +00:00
unsigned int start [ 3 ] ;
unsigned int stop [ 3 ] ;
2010-03-11 09:48:00 +00:00
2015-03-06 20:38:27 +00:00
//! start/stop timestep
unsigned int startTS , stopTS ;
2010-04-09 13:58:15 +00:00
//! define/store if snapped start/stop coords are inside the field domain
bool m_start_inside [ 3 ] ;
bool m_stop_inside [ 3 ] ;
2015-06-18 19:45:22 +00:00
std : : ofstream file ;
std : : string m_filename ;
2010-04-19 14:09:41 +00:00
2015-06-18 19:45:22 +00:00
virtual void OpenFile ( std : : string outfile ) ;
2010-03-01 18:35:28 +00:00
} ;
2010-03-10 11:15:14 +00:00
class ProcessingArray
{
public :
2010-03-15 21:19:51 +00:00
ProcessingArray ( unsigned int maximalInterval ) { maxInterval = maximalInterval ; }
2010-03-10 11:15:14 +00:00
~ ProcessingArray ( ) { } ;
void AddProcessing ( Processing * proc ) ;
2011-02-16 09:11:39 +00:00
void InitAll ( ) ;
2010-06-28 16:05:03 +00:00
//! Invoke this flag to flush all stored data to disk for all processings on next Process()
void FlushNext ( ) ;
2010-04-03 15:36:50 +00:00
void Reset ( ) ;
2022-03-11 21:17:27 +00:00
//! Deletes all given processing's, can be helpful, but use carefully!!!
2010-03-10 11:15:14 +00:00
void DeleteAll ( ) ;
2010-12-17 14:13:43 +00:00
//! Invoke PreProcess() on all Processings.
void PreProcess ( ) ;
//! Invoke Process() on all Processings. Will return the smallest next iteration interval.
2010-03-10 11:15:14 +00:00
int Process ( ) ;
2010-12-17 14:13:43 +00:00
//! Invoke PostProcess() on all Processings.
void PostProcess ( ) ;
2015-06-18 19:45:22 +00:00
void DumpBoxes2File ( std : : string vtkfilenameprefix ) const ;
2010-04-19 14:09:41 +00:00
2011-02-16 09:11:39 +00:00
size_t GetNumberOfProcessings ( ) const { return ProcessArray . size ( ) ; }
Processing * GetProcessing ( size_t number ) { return ProcessArray . at ( number ) ; }
2010-03-10 11:15:14 +00:00
protected :
2010-03-15 21:19:51 +00:00
unsigned int maxInterval ;
2015-06-18 19:45:22 +00:00
std : : vector < Processing * > ProcessArray ;
2010-03-10 11:15:14 +00:00
} ;
2010-03-01 18:35:28 +00:00
# endif // PROCESSING_H