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-04 10:53:58 +00:00
# include "processcurrent.h"
2010-04-12 07:38:24 +00:00
# include <iomanip>
2010-03-04 10:53:58 +00:00
ProcessCurrent : : ProcessCurrent ( Operator * op , Engine * eng ) : Processing ( op , eng )
{
}
ProcessCurrent : : ~ ProcessCurrent ( )
{
}
void ProcessCurrent : : OpenFile ( string outfile )
{
if ( file . is_open ( ) ) file . close ( ) ;
file . open ( outfile . c_str ( ) ) ;
if ( file . is_open ( ) = = false )
{
cerr < < " Can't open file: " < < outfile < < endl ;
return ;
}
}
void ProcessCurrent : : DefineStartStopCoord ( double * dstart , double * dstop )
{
2010-04-09 13:58:15 +00:00
if ( Op - > SnapToMesh ( dstart , start , true , m_start_inside ) = = false ) cerr < < " ProcessCurrent::DefineStartStopCoord: Warning: Snapped line outside field domain!! " < < endl ;
if ( Op - > SnapToMesh ( dstop , stop , true , m_stop_inside ) = = false ) cerr < < " ProcessCurrent::DefineStartStopCoord: Warning: Snapped line outside field domain!! " < < endl ;
2010-03-04 10:53:58 +00:00
}
2010-03-10 11:15:14 +00:00
int ProcessCurrent : : Process ( )
2010-03-04 10:53:58 +00:00
{
2010-03-29 08:01:38 +00:00
FDTD_FLOAT * * * * curr = Eng - > GetCurrents ( ) ;
2010-03-10 11:15:14 +00:00
if ( Enabled = = false ) return - 1 ;
if ( CheckTimestep ( ) = = false ) return GetNextInterval ( ) ;
2010-03-04 10:53:58 +00:00
FDTD_FLOAT current = 0 ;
for ( int n = 0 ; n < 3 ; + + n )
{
if ( start [ n ] > stop [ n ] )
{
unsigned int help = start [ n ] ;
start [ n ] = stop [ n ] ;
stop [ n ] = help ;
2010-04-09 13:58:15 +00:00
bool b_help = m_start_inside [ n ] ;
m_start_inside [ n ] = m_stop_inside [ n ] ;
m_stop_inside [ n ] = b_help ;
2010-03-04 10:53:58 +00:00
}
2010-04-11 21:42:54 +00:00
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-03-04 10:53:58 +00:00
}
//x-current
2010-04-09 13:58:15 +00:00
if ( m_start_inside [ 1 ] & & m_start_inside [ 2 ] )
for ( unsigned int i = start [ 0 ] ; i < stop [ 0 ] ; + + i )
current + = curr [ 0 ] [ i ] [ start [ 1 ] ] [ start [ 2 ] ] ;
2010-03-04 10:53:58 +00:00
//y-current
2010-04-09 13:58:15 +00:00
if ( m_stop_inside [ 0 ] & & m_start_inside [ 2 ] )
for ( unsigned int i = start [ 1 ] ; i < stop [ 1 ] ; + + i )
current + = curr [ 1 ] [ stop [ 0 ] ] [ i ] [ start [ 2 ] ] ;
2010-03-04 10:53:58 +00:00
//z-current
2010-04-09 13:58:15 +00:00
if ( m_stop_inside [ 0 ] & & m_stop_inside [ 1 ] )
for ( unsigned int i = start [ 2 ] ; i < stop [ 2 ] ; + + i )
current + = curr [ 2 ] [ stop [ 0 ] ] [ stop [ 1 ] ] [ i ] ;
2010-03-04 10:53:58 +00:00
//x-current
2010-04-09 13:58:15 +00:00
if ( m_stop_inside [ 1 ] & & m_stop_inside [ 2 ] )
for ( unsigned int i = start [ 0 ] ; i < stop [ 0 ] ; + + i )
current - = curr [ 0 ] [ i ] [ stop [ 1 ] ] [ stop [ 2 ] ] ;
2010-03-04 10:53:58 +00:00
//y-current
2010-04-09 13:58:15 +00:00
if ( m_start_inside [ 0 ] & & m_stop_inside [ 2 ] )
for ( unsigned int i = start [ 1 ] ; i < stop [ 1 ] ; + + i )
current - = curr [ 1 ] [ start [ 0 ] ] [ i ] [ stop [ 2 ] ] ;
2010-03-04 10:53:58 +00:00
//z-current
2010-04-09 13:58:15 +00:00
if ( m_start_inside [ 0 ] & & m_start_inside [ 1 ] )
for ( unsigned int i = start [ 2 ] ; i < stop [ 2 ] ; + + i )
current - = curr [ 2 ] [ start [ 0 ] ] [ start [ 1 ] ] [ i ] ;
2010-03-04 10:53:58 +00:00
// cerr << "ts: " << Eng->numTS << " i: " << current << endl;
v_current . push_back ( current ) ;
2010-04-09 19:15:44 +00:00
//current is sampled half a timestep later then the voltages
2010-04-12 07:38:24 +00:00
file < < setprecision ( m_precision ) < < ( 0.5 + ( double ) Eng - > GetNumberOfTimesteps ( ) ) * Op - > GetTimestep ( ) < < " \t " < < current < < endl ;
2010-03-10 11:15:14 +00:00
return GetNextInterval ( ) ;
2010-03-04 10:53:58 +00:00
}