diff --git a/drt.cpp b/drt.cpp index 6812217f7a3c90fc49d849485179f889d2377db9..c19ff0416e952665f9e79211536c6d341cb3f9df 100644 --- a/drt.cpp +++ b/drt.cpp @@ -168,7 +168,8 @@ static Eigen::Matrix<fv, Eigen::Dynamic, 2> calcBounds(Eigen::VectorX<std::compl } template<typename fv> -Eigen::VectorX<fv> calcDrt(Eigen::VectorX<std::complex<fv>>& impedanceSpectra, Eigen::VectorX<fv>& omegaTensor, FitMetics& fm, const FitParameters& fp) +Eigen::VectorX<fv> calcDrt(Eigen::VectorX<std::complex<fv>>& impedanceSpectra, Eigen::VectorX<fv>& omegaTensor, + FitMetics& fm, const FitParameters& fp, fv* rSeries) { Eigen::Matrix<fv, Eigen::Dynamic, Eigen::Dynamic> aMatrixImag = aImag<fv>(omegaTensor); Eigen::Matrix<fv, Eigen::Dynamic, Eigen::Dynamic> aMatrixReal = aReal<fv>(omegaTensor); @@ -201,14 +202,17 @@ Eigen::VectorX<fv> calcDrt(Eigen::VectorX<std::complex<fv>>& impedanceSpectra, E throw drt_errror(std::string(ex.what())); } - return x; + if(rSeries) + *rSeries = x[x.size()-1]; + + return x(Eigen::seq(0, x.size()-2)); } template Eigen::VectorX<double> calcDrt<double>(Eigen::VectorX<std::complex<double>>&, - Eigen::VectorX<double>&, FitMetics& fm, const FitParameters& fp); + Eigen::VectorX<double>&, FitMetics& fm, const FitParameters& fp, double* rSeries); template Eigen::VectorX<float> calcDrt<float>(Eigen::VectorX<std::complex<float>>&, - Eigen::VectorX<float>&, FitMetics& fm, const FitParameters& fp); + Eigen::VectorX<float>&, FitMetics& fm, const FitParameters& fp, float* rSeries); template<typename fv> fv testFn() @@ -220,21 +224,23 @@ fv testFn() template double testFn<double>(); #ifdef USE_EISGEN -std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm, const FitParameters& fp) +std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, + FitMetics& fm, const FitParameters& fp, fvalue* rSeries) { Eigen::VectorX<std::complex<fvalue>> impedanceSpectra = eistoeigen(data); Eigen::VectorX<fvalue> omega = Eigen::VectorX<fvalue>::Map(omegaVector.data(), omegaVector.size()); - Eigen::VectorX<fvalue> drt = calcDrt<fvalue>(impedanceSpectra, omega, fm, fp); + Eigen::VectorX<fvalue> drt = calcDrt<fvalue>(impedanceSpectra, omega, fm, fp, rSeries); std::vector<fvalue> stdvector(drt.data(), drt.data()+drt.size()); return stdvector; } -std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, FitMetics& fm, const FitParameters& fp) +std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, FitMetics& fm, const FitParameters& fp, fvalue* rSeries) { Eigen::VectorX<fvalue> omega; Eigen::VectorX<std::complex<fvalue>> impedanceSpectra = eistoeigen(data, &omega); - Eigen::VectorX<fvalue> drt = calcDrt<fvalue>(impedanceSpectra, omega, fm, fp); + Eigen::VectorX<fvalue> drt = calcDrt<fvalue>(impedanceSpectra, omega, fm, fp, rSeries); + std::cout<<omega.size()<<','<<impedanceSpectra.size()<<','<<drt.size()<<std::endl; std::vector<fvalue> stdvector(drt.data(), drt.data()+drt.size()); return stdvector; } diff --git a/eisdrt/eigendrt.h b/eisdrt/eigendrt.h index e21589f83b82c1eb623e6b470e24a2b5b51a3a20..7cc3338f526f2711089b3aeb87b6952cd8f24fbc 100644 --- a/eisdrt/eigendrt.h +++ b/eisdrt/eigendrt.h @@ -37,11 +37,13 @@ Api for use with Eigen applications * @param omegaTensor vector with the omega values that the impedances where mesured at * @param fm a fit metrics struct where this function returns information on the fit aquired * @param fp a struct with fit parameters + * @param rSeries an optional paramter where the seires resistance is stored * @return a vector with the drt values */ template<typename fv> -Eigen::VectorX<fv> calcDrt(Eigen::VectorX<std::complex<fv>>& impedanceSpectra, Eigen::VectorX<fv>& omegaTensor, FitMetics& fm, const FitParameters& fp); +Eigen::VectorX<fv> calcDrt(Eigen::VectorX<std::complex<fv>>& impedanceSpectra, Eigen::VectorX<fv>& omegaTensor, + FitMetics& fm, const FitParameters& fp, fv* rSeries = nullptr); /** .... diff --git a/eisdrt/eisdrt.h b/eisdrt/eisdrt.h index 4134d25b436848f97552363ab469bd94b9299c25..9052df665ac61f4e7d6ebdff3e2331e424eadaed 100644 --- a/eisdrt/eisdrt.h +++ b/eisdrt/eisdrt.h @@ -36,9 +36,11 @@ Api for use with eisgenerator applications * @param omegaVector vector with the omega values that the impedances where mesured at * @param fm a fit metrics struct where this function returns information on the fit aquired * @param fp a struct with fit parameters + * @param rSeries an optional paramter where the seires resistance is stored * @return a vector with the drt values */ -std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm, const FitParameters& fp); +std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std::vector<fvalue>& omegaVector, FitMetics& fm, + const FitParameters& fp, fvalue* rSeries = nullptr); /** * @brief calculate a drt on eisgenerator types @@ -46,9 +48,10 @@ std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, const std:: * @param data a vector of eisgenerator datapoints with the values to your expirament, embedded omega values are used * @param fm a fit metrics struct where this function returns information on the fit aquired * @param fp a struct with fit parameters + * @param rSeries an optional paramter where the seires resistance is stored * @return a vector with the drt values */ -std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, FitMetics& fm, const FitParameters& fp); +std::vector<fvalue> calcDrt(const std::vector<eis::DataPoint>& data, FitMetics& fm, const FitParameters& fp, fvalue* rSeries = nullptr); /** .... diff --git a/main.cpp b/main.cpp index 00455d60ebdf09a73e8473760c15aba194609b43..63cecf8996711670ffccf4620920ceda78c6e772 100644 --- a/main.cpp +++ b/main.cpp @@ -79,12 +79,16 @@ int main(int argc, char** argv) FitMetics fm; // calculate the drt for this spectrum - std::vector<fvalue> x = calcDrt(data, fm, FitParameters(1000)); + fvalue rSeries; + std::vector<fvalue> x = calcDrt(data, fm, FitParameters(1000), &rSeries); + + assert(x.size() == data.size()); // print some info on the drt std::cout<<"Iterations: "<<fm.iterations<<'\n'; std::cout<<"fx "<<fm.fx<<"\ndrt: "; printFvalueVector(x); + std::cout<<"r series: "<<rSeries<<'\n'; return 0; }