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-05-28 13:13:14 +00:00
# include "tools/global.h"
2010-03-04 10:53:58 +00:00
# include "processcurrent.h"
2010-12-06 09:44:25 +00:00
# include "FDTD/engine_interface_fdtd.h"
2010-04-12 07:38:24 +00:00
# include <iomanip>
2010-03-04 10:53:58 +00:00
2010-12-06 08:59:42 +00:00
ProcessCurrent : : ProcessCurrent ( Operator_Base * op ) : ProcessIntegral ( op )
2010-03-04 10:53:58 +00:00
{
2010-08-11 10:28:09 +00:00
m_TimeShift = op - > GetTimestep ( ) / 2.0 ;
m_dualMesh = true ;
2010-03-04 10:53:58 +00:00
}
ProcessCurrent : : ~ ProcessCurrent ( )
{
}
2010-08-11 10:28:09 +00:00
double ProcessCurrent : : CalcIntegral ( )
2010-03-04 10:53:58 +00:00
{
FDTD_FLOAT current = 0 ;
2010-12-02 13:29:46 +00:00
Engine_Interface_FDTD * EI_FDTD = dynamic_cast < Engine_Interface_FDTD * > ( m_Eng_Interface ) ;
2010-06-18 10:52:02 +00:00
2010-12-02 13:29:46 +00:00
if ( EI_FDTD )
2010-03-04 10:53:58 +00:00
{
2010-12-02 13:29:46 +00:00
const Engine * Eng = EI_FDTD - > GetFDTDEngine ( ) ;
int Dump_Dim = 0 ;
int NormDir = 0 ;
2010-12-06 12:04:37 +00:00
for ( int n = 0 ; n < 3 ; + + n )
2010-03-04 10:53:58 +00:00
{
2010-12-02 13:29:46 +00:00
if ( start [ n ] > stop [ n ] )
{
unsigned int help = start [ n ] ;
start [ n ] = stop [ n ] ;
stop [ n ] = help ;
bool b_help = m_start_inside [ n ] ;
m_start_inside [ n ] = m_stop_inside [ n ] ;
m_stop_inside [ n ] = b_help ;
}
if ( m_stop_inside [ n ] = = false ) // integrate up to the wall, Operator::SnapToMesh would give numLines[n]-2
stop [ n ] = Op - > GetNumberOfLines ( n ) - 1 ;
2010-06-18 10:52:02 +00:00
2010-12-02 13:29:46 +00:00
if ( stop [ n ] > start [ n ] )
+ + Dump_Dim ;
if ( stop [ n ] = = start [ n ] )
NormDir = n ;
}
2010-06-18 10:52:02 +00:00
2010-12-02 13:29:46 +00:00
if ( Dump_Dim ! = 2 )
{
cerr < < " ProcessCurrent::Process(): Warning Current Integration Box \" " < < m_filename < < " \" is not a surface (found dimension: " < < Dump_Dim < < " ) --> i = 0 " < < endl ;
current = 0 ;
return 0.0 ;
}
2010-06-18 10:52:02 +00:00
2010-12-02 13:29:46 +00:00
switch ( NormDir )
{
case 0 :
//y-current
if ( m_stop_inside [ 0 ] & & m_start_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 1 ] + 1 ; i < = stop [ 1 ] ; + + i )
2010-12-02 13:29:46 +00:00
current + = Eng - > GetCurr ( 1 , stop [ 0 ] , i , start [ 2 ] ) ;
//z-current
if ( m_stop_inside [ 0 ] & & m_stop_inside [ 1 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 2 ] + 1 ; i < = stop [ 2 ] ; + + i )
2010-12-02 13:29:46 +00:00
current + = Eng - > GetCurr ( 2 , stop [ 0 ] , stop [ 1 ] , i ) ;
//y-current
if ( m_start_inside [ 0 ] & & m_stop_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 1 ] + 1 ; i < = stop [ 1 ] ; + + i )
2010-12-02 13:29:46 +00:00
current - = Eng - > GetCurr ( 1 , start [ 0 ] , i , stop [ 2 ] ) ;
//z-current
if ( m_start_inside [ 0 ] & & m_start_inside [ 1 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 2 ] + 1 ; i < = stop [ 2 ] ; + + i )
2010-12-02 13:29:46 +00:00
current - = Eng - > GetCurr ( 2 , start [ 0 ] , start [ 1 ] , i ) ;
break ;
case 1 :
//z-current
if ( m_start_inside [ 0 ] & & m_start_inside [ 1 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 2 ] + 1 ; i < = stop [ 2 ] ; + + i )
2010-12-02 13:29:46 +00:00
current + = Eng - > GetCurr ( 2 , start [ 0 ] , start [ 1 ] , i ) ;
//x-current
if ( m_stop_inside [ 1 ] & & m_stop_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 0 ] + 1 ; i < = stop [ 0 ] ; + + i )
2010-12-02 13:29:46 +00:00
current + = Eng - > GetCurr ( 0 , i , stop [ 1 ] , stop [ 2 ] ) ;
//z-current
if ( m_stop_inside [ 0 ] & & m_stop_inside [ 1 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 2 ] + 1 ; i < = stop [ 2 ] ; + + i )
2010-12-02 13:29:46 +00:00
current - = Eng - > GetCurr ( 2 , stop [ 0 ] , stop [ 1 ] , i ) ;
//x-current
if ( m_start_inside [ 1 ] & & m_start_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 0 ] + 1 ; i < = stop [ 0 ] ; + + i )
2010-12-02 13:29:46 +00:00
current - = Eng - > GetCurr ( 0 , i , start [ 1 ] , start [ 2 ] ) ;
break ;
case 2 :
//x-current
if ( m_start_inside [ 1 ] & & m_start_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 0 ] + 1 ; i < = stop [ 0 ] ; + + i )
2010-12-02 13:29:46 +00:00
current + = Eng - > GetCurr ( 0 , i , start [ 1 ] , start [ 2 ] ) ;
//y-current
if ( m_stop_inside [ 0 ] & & m_start_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 1 ] + 1 ; i < = stop [ 1 ] ; + + i )
2010-12-02 13:29:46 +00:00
current + = Eng - > GetCurr ( 1 , stop [ 0 ] , i , start [ 2 ] ) ;
//x-current
if ( m_stop_inside [ 1 ] & & m_stop_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 0 ] + 1 ; i < = stop [ 0 ] ; + + i )
2010-12-02 13:29:46 +00:00
current - = Eng - > GetCurr ( 0 , i , stop [ 1 ] , stop [ 2 ] ) ;
//y-current
if ( m_start_inside [ 0 ] & & m_stop_inside [ 2 ] )
2010-12-06 12:04:37 +00:00
for ( unsigned int i = start [ 1 ] + 1 ; i < = stop [ 1 ] ; + + i )
2010-12-02 13:29:46 +00:00
current - = Eng - > GetCurr ( 1 , start [ 0 ] , i , stop [ 2 ] ) ;
break ;
default :
//this cannot happen...
return 0.0 ;
break ;
}
2010-03-04 10:53:58 +00:00
}
2010-08-11 10:28:09 +00:00
return current ;
2010-03-04 10:53:58 +00:00
}