diff --git a/CMakeLists.txt b/CMakeLists.txt index 81b27944f279a77c1d2a0a4508259a4b2a9c40d8..533ff6f2a65df765ac12d6782ebd345904842139 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ set(SRC_FILES cap.cpp resistor.cpp constantphase.cpp + warburg.cpp model.cpp tokenize.cpp ) diff --git a/cap.h b/cap.h index ad7cd7335c259ca858b5c59785d43d7c956d0cde..e8c72bd28e37dc3377d626046ecb85c68818710d 100644 --- a/cap.h +++ b/cap.h @@ -15,4 +15,5 @@ public: virtual std::vector<double> getParam() override; virtual void setParam(const std::vector<double>& param) override; virtual size_t paramCount() override; + virtual ~Cap() = default; }; diff --git a/componant.h b/componant.h index b93967f1938095346e219835cf606a2be9303d2b..7f0aa4229671a0e9b766ea20e0a747cd39b83d44 100644 --- a/componant.h +++ b/componant.h @@ -18,4 +18,5 @@ class Componant }; virtual void setParam(const std::vector<double>& param){}; virtual size_t paramCount(){return 0;} + virtual ~Componant() = default; }; diff --git a/constantphase.h b/constantphase.h index 81804ec9373664304ae3dd61f3efc2ee3af514a3..8092832e32ba719964e7863c23866effb990ac6c 100644 --- a/constantphase.h +++ b/constantphase.h @@ -16,4 +16,5 @@ public: virtual std::vector<double> getParam() override; virtual void setParam(const std::vector<double>& param) override; virtual size_t paramCount() override; + virtual ~Cpe() = default; }; diff --git a/main.cpp b/main.cpp index 064b8c4dae8fd6b6eb59538210bc252ad181bfd7..74ebc3e732954ac2a6824b7f1ff60f7daefb9edd 100644 --- a/main.cpp +++ b/main.cpp @@ -6,7 +6,7 @@ void runSingle() { - std::string modelStr("r{20e3}p{1e-7, 0.9}"); + std::string modelStr("w{20e3}p{1e-7, 0.9}"); std::vector<Model::DataPoint> results; @@ -47,7 +47,7 @@ void sweepCb(std::vector<Model::DataPoint>& data, const std::vector<double>& par void runSweep() { - std::string modelStr("r{20e3}p{1e-7, 0.9}"); + std::string modelStr("w{20e3}p{1e-7, 0.9}"); std::vector<Model::DataPoint> results; Model model(modelStr); @@ -70,6 +70,6 @@ void runSweep() int main(int argc, char** argv) { runSingle(); - runSweep(); + //runSweep(); return 0; } diff --git a/model.cpp b/model.cpp index fd167ff7466d2ca3f633c9b2da437fd7da6b3ecb..1b510ec3351baf5c94ecd3f032b4a4bed3dd3957 100644 --- a/model.cpp +++ b/model.cpp @@ -4,11 +4,18 @@ #include "cap.h" #include "resistor.h" #include "constantphase.h" +#include "warburg.h" Model::Paralell::Paralell(std::vector<Componant*> componantsIn): componants(componantsIn) { } +Model::Paralell::~Paralell() +{ + for(Componant* componant : componants) + delete componant; +} + std::complex<double> Model::Paralell::execute(double omega) { std::complex<double> accum(0,0); @@ -23,6 +30,12 @@ Model::Serial::Serial(std::vector<Componant*> componantsIn): componants(componan { } +Model::Serial::~Serial() +{ + for(Componant* componant : componants) + delete componant; +} + std::complex<double> Model::Serial::execute(double omega) { std::complex<double> accum(0,0); @@ -145,6 +158,11 @@ Componant *Model::processBracket(std::string& str) componants.push_back(new Cpe(getParamStr(nodeStr, i))); i = opposingBraket(nodeStr, i, '}'); break; + case 'w': + case 'W': + componants.push_back(new Warburg(getParamStr(nodeStr, i))); + i = opposingBraket(nodeStr, i, '}'); + break; case '{': i = opposingBraket(nodeStr, i, '}'); case '}': @@ -184,6 +202,11 @@ Model::Model(const std::string& str): _modelStr(str) _model = processBrackets(strCpy, bracketCounter); } +Model::~Model() +{ + delete _model; +} + Model::DataPoint Model::execute(double omega) { if(_model) @@ -280,7 +303,6 @@ bool Model::sweepParams(const std::vector<Range>& componantRanges, const Range& stepSize[i] = (componantRanges[i].end - componantRanges[i].start)/componantRanges[i].count; } - std::cout<<"Executing sweep. Steps requried: "<<stepsRequired<<std::endl; for(size_t i = 0; i < stepsRequired; ++i) @@ -329,11 +351,12 @@ char Model::getComponantChar(Componant* componant) { if(dynamic_cast<Resistor*>(componant)) return 'r'; - if(dynamic_cast<Cap*>(componant)) return 'c'; if(dynamic_cast<Cpe*>(componant)) return 'p'; + if(dynamic_cast<Warburg*>(componant)) + return 'w'; return 'x'; } diff --git a/model.h b/model.h index da11a0b0d62e8f17eccd8262209dd0ec79c44438..57076525d340df1f6e6556adb7ff9acbe7fd346c 100644 --- a/model.h +++ b/model.h @@ -31,6 +31,7 @@ private: std::vector<Componant*> componants; Paralell(std::vector<Componant*> componantsIn = std::vector<Componant*>()); + ~Paralell(); virtual std::complex<double> execute(double omaga) override; }; @@ -40,6 +41,7 @@ private: std::vector<Componant*> componants; Serial(std::vector<Componant*> componantsIn = std::vector<Componant*>()); + ~Serial(); virtual std::complex<double> execute(double omaga) override; }; @@ -58,6 +60,7 @@ private: public: Model(const std::string& str); + ~Model(); DataPoint execute(double omaga); std::vector<DataPoint> sweep(const Range& omega); bool sweepParams(const std::vector<Range>& componantRanges, const Range& omega, std::function<void(std::vector<DataPoint>&, const std::vector<double>&)> dataCb); diff --git a/resistor.h b/resistor.h index aa894cbfd98195042ebb50cbd95d70137c44b02d..d21a20e7326989787578362e819bd97436f99d25 100644 --- a/resistor.h +++ b/resistor.h @@ -14,4 +14,5 @@ public: virtual std::vector<double> getParam() override; virtual void setParam(const std::vector<double>& param) override; virtual size_t paramCount() override; + virtual ~Resistor() = default; }; diff --git a/warburg.cpp b/warburg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..96bb1e5b21e98b4b0e04a96f0d62a5cb9e7c7725 --- /dev/null +++ b/warburg.cpp @@ -0,0 +1,57 @@ +#include "warburg.h" +#include "tokenize.h" +#include <cstdlib> +#include <math.h> + +Warburg::Warburg(double a): _A(a) +{ + +} + +Warburg::Warburg(std::string paramStr) +{ + std::vector<std::string> tokens = tokenize(paramStr, ','); + if(tokens.size() < 1) + { + std::cout<<"Warning: to few parameters in "<<__func__<<" parameter string: "<<paramStr<<'\n'; + return; + } + else + { + try + { + _A = std::stod(tokens[0]); + } + catch(const std::invalid_argument& ia) + { + std::cout<<"Warning: cant parse parameter in "<<__func__<<" parameter: "<<tokens[0]<<'\n'; + } + } +} + +std::complex<double> Warburg::execute(double omega) +{ + double N = _A/(sqrt(omega)); + return std::complex<double>(N, 0-N); +} + +std::vector<double> Warburg::getParam() +{ + return std::vector<double>({_A}); +} + +void Warburg::setParam(const std::vector<double>& param) +{ + if(param.size() != paramCount()) + { + std::cout<<"Warning: invalid parameter list sent to "<<__func__<<'\n'; + return; + } + + _A = param[0]; +} + +size_t Warburg::paramCount() +{ + return 1; +} diff --git a/warburg.h b/warburg.h new file mode 100644 index 0000000000000000000000000000000000000000..f9f4011fb3fc711fd79598c0c23f00faa6d56af3 --- /dev/null +++ b/warburg.h @@ -0,0 +1,19 @@ +#pragma once +#include <complex> +#include <string> +#include <vector> +#include "componant.h" + +class Warburg: public Componant +{ +private: + double _A = 2e4; +public: + Warburg(std::string paramStr); + Warburg(double a = 2e4); + virtual std::complex<double> execute(double omega) override; + virtual std::vector<double> getParam() override; + virtual void setParam(const std::vector<double>& param) override; + virtual size_t paramCount() override; + virtual ~Warburg() = default; +};