Skip to content
Snippets Groups Projects
Select Git revision
  • 77305f09753a0414ae0090ed1ad966b7414b92bb
  • master default
  • 1.1
  • 1.0
4 results

finitetr.cpp

Blame
  • finitetr.cpp 2.85 KiB
    #include "finitetr.h"
    #include <cstdlib>
    #include <math.h>
    
    #include "eisgenerator/componant.h"
    #include "eisgenerator/paralellseriel.h"
    #include "eisgenerator/resistor.h"
    #include "paralellseriel.h"
    #include "cap.h"
    #include "resistor.h"
    #include "log.h"
    #include "strops.h"
    
    using namespace eis;
    
    FiniteTransmitionline::FiniteTransmitionline(fvalue c, fvalue r, unsigned int n): _C(c), _R(r), _n(n)
    {
    
    	if(n < 1)
    	{
    		Log(Log::WARN)<<__func__<<" n must be > 0 setting n to 4";
    		_n = 4;
    	}
    
    	ranges.clear();
    	ranges.push_back(Range(_C, _C, 1));
    	ranges.push_back(Range(_R, _R, 1));
    	ranges.push_back(Range(_n, _n, 1));
    
    	subComponant = createTransmitionLine(_C, _R, _n);
    }
    
    void FiniteTransmitionline::setDefaultParam()
    {
    	_C = 1e-6;
    	_R = 1000;
    	_n = 4;
    
    	ranges.clear();
    	ranges.push_back(Range(_C, _C, 1));
    	ranges.push_back(Range(_R, _R, 1));
    	ranges.push_back(Range(_n, _n, 1));
    }
    
    FiniteTransmitionline::FiniteTransmitionline(std::string paramStr, size_t count)
    {
    	ranges = Range::rangesFromParamString(paramStr, count);
    
    	if(ranges.size() != paramCount())
    	{
    		Log(Log::WARN)<<"invalid parameter string "<<paramStr<<" given to "<<__func__<<", will not be applied\n";
    		setDefaultParam();
    	}
    
    	if(subComponant)
    			delete subComponant;
    	subComponant = createTransmitionLine(_C, _R, _n);
    }
    
    FiniteTransmitionline::FiniteTransmitionline(const FiniteTransmitionline& in)
    {
    	ranges = in.ranges;
    	_R = in._R;
    	_C = in._C;
    	_n = in._n;
    	if(subComponant)
    		delete subComponant;
    	subComponant = createTransmitionLine(_C, _R, _n);
    }
    
    std::complex<fvalue> FiniteTransmitionline::execute(fvalue omega)
    {
    	if(subComponant)
    	{
    		updateValues();
    		return subComponant->execute(omega);
    	}
    	else
    	{
    		Log(Log::WARN)<<"Invalid transmitionline used";
    		return std::complex<fvalue>(1, 0);
    	}
    }
    
    char FiniteTransmitionline::getComponantChar() const
    {
    	return FiniteTransmitionline::staticGetComponantChar();
    }
    
    size_t FiniteTransmitionline::paramCount()
    {
    	return 3;
    }
    
    Componant* FiniteTransmitionline::createTransmitionLine(fvalue c, fvalue r, unsigned int n)
    {
    	Parallel* par = new Parallel;
    	par->componants.push_back(new Cap(c));
    	par->componants.push_back(new Resistor(r));
    
    	for(unsigned int i = 0; i < n; ++i)
    	{
    		Serial* ser = new Serial;
    		ser->componants.push_back(new Resistor(r));
    		ser->componants.push_back(par);
    
    		par = new Parallel;
    		par->componants.push_back(ser);
    		par->componants.push_back(new Cap(c));
    	}
    
    	return par;
    }
    
    FiniteTransmitionline::~FiniteTransmitionline()
    {
    	if(subComponant)
    		delete subComponant;
    }
    
    void FiniteTransmitionline::updateValues()
    {
    	assert(ranges.size() == paramCount());
    	if(ranges[0].stepValue() != _C || ranges[1].stepValue() != _R || static_cast<size_t>(ranges[2].stepValue()) != _n)
    	{
    		_C = ranges[0].stepValue();
    		_R = ranges[2].stepValue();
    		_n = ranges[3].stepValue();
    		if(subComponant)
    			delete subComponant;
    		subComponant = createTransmitionLine(_C, _R, _n);
    	}
    }