2010-03-11 15:47:40 +00:00
/*
* 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/>.
*/
2010-03-01 18:35:28 +00:00
# ifndef PROCESSING_H
# define PROCESSING_H
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>
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 ;
using namespace std ;
2010-12-02 12:51:34 +00:00
2010-03-01 18:35:28 +00:00
class Processing
{
public :
2010-12-07 15:47:23 +00:00
Processing ( Engine_Interface_Base * eng_if ) ;
2010-03-01 18:35:28 +00:00
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 ) ;
2010-06-28 16:27:41 +00:00
virtual void SetName ( string val ) { m_Name = val ; }
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
2010-04-01 07:38:08 +00:00
void SetProcessInterval ( unsigned int interval ) { ProcessInterval = max ( ( unsigned int ) 1 , interval ) ; }
2010-04-03 15:36:50 +00:00
void AddStep ( unsigned int step ) ;
void AddSteps ( vector < unsigned int > steps ) ;
2010-06-28 16:05:03 +00:00
void AddFrequency ( double freq ) ;
2010-08-11 16:48:23 +00:00
void AddFrequency ( 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.
virtual void PostProcess ( ) { } ;
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 ; }
2010-08-11 10:28:09 +00:00
//! Dump probe geometry to file (will obay main or dual mesh property)
virtual void DumpBox2File ( string vtkfilenameprefix ) const { DumpBox2File ( vtkfilenameprefix , m_dualMesh ) ; }
//! Dump probe geometry to file
virtual void DumpBox2File ( string vtkfilenameprefix , bool dualMesh ) const ;
2010-06-28 16:05:03 +00:00
2010-03-01 18:35:28 +00:00
protected :
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
2010-06-28 16:27:41 +00:00
string m_Name ;
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
vector < unsigned int > m_ProcessSteps ; //! list of processing steps
2010-06-28 16:05:03 +00:00
//! Vector of frequency samples
vector < double > m_FD_Samples ;
//! Number of samples already processed
unsigned int m_FD_SampleCount ;
//! Sampling interval needed for the FD_Samples
unsigned int m_FD_Interval ;
2010-09-17 09:07:52 +00:00
void Dump_FD_Data ( vector < double_complex > value , double factor , string filename ) ;
2010-06-28 16:05:03 +00:00
2010-08-11 10:28:09 +00:00
//! define if given coords are on main or dualMesh (default is false)
bool m_dualMesh ;
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
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 ] ;
2010-04-19 14:09:41 +00:00
ofstream file ;
string m_filename ;
2010-06-28 16:27:41 +00:00
virtual void OpenFile ( 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 ) ;
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 ( ) ;
2010-03-10 11:15:14 +00:00
//! Deletes all given processing's, can be helpful, but use carefull!!!
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 ( ) ;
2010-04-19 14:09:41 +00:00
void DumpBoxes2File ( string vtkfilenameprefix ) const ;
2010-03-10 11:15:14 +00:00
protected :
2010-03-15 21:19:51 +00:00
unsigned int maxInterval ;
2010-03-10 11:15:14 +00:00
vector < Processing * > ProcessArray ;
} ;
2010-03-01 18:35:28 +00:00
# endif // PROCESSING_H