diff --git a/componant/cap.cpp b/componant/cap.cpp
index ff4e349400ec49a793904992fd13153532f862ad..05ab41e1c9b97e95e6c3ceb8f5f8c04c04aaa22b 100644
--- a/componant/cap.cpp
+++ b/componant/cap.cpp
@@ -20,15 +20,29 @@ Cap::Cap(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(1e-10, 1e-4, count, true));
-		else
-			ranges.push_back(Range(1e-6, 1e-6, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Cap::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(1e-10, 1e-4, 2, true));
+	else
+		out.push_back(Range(1e-6, 1e-6, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Cap::execute(fvalue omega)
 {
 	assert(ranges.size() > 0);
@@ -40,7 +54,7 @@ char Cap::getComponantChar() const
 	return Cap::staticGetComponantChar();
 }
 
-size_t Cap::paramCount()
+size_t Cap::paramCount() const
 {
 	return 1;
 }
diff --git a/componant/componant.cpp b/componant/componant.cpp
index dcaed9a1c9020b8865d34322c46ffb4616d06a4e..d0487829dcaf01f8701f1b29973c11a819dcd9d5 100644
--- a/componant/componant.cpp
+++ b/componant/componant.cpp
@@ -28,6 +28,13 @@ std::vector<eis::Range> Componant::getParamRanges() const
 	return ranges;
 }
 
+std::vector<eis::Range> Componant::getDefaultRange(bool range) const
+{
+	(void)range;
+	assert(paramCount() == 0);
+	return std::vector<eis::Range>();
+}
+
 std::string Componant::getComponantString(bool currentValue) const
 {
 	std::stringstream out;
diff --git a/componant/constantphase.cpp b/componant/constantphase.cpp
index 89fed415a6e0eda11a95e19bd71c043acaaf5396..ca9ddf1f02a430b0fb750bdb457365ff947840ba 100644
--- a/componant/constantphase.cpp
+++ b/componant/constantphase.cpp
@@ -40,17 +40,31 @@ Cpe::Cpe(std::string paramStr, size_t count, bool defaultToRange)
 
 void Cpe::setDefaultParam(size_t count, bool defaultToRange)
 {
-	ranges.clear();
+	ranges = getDefaultRange(defaultToRange);
 	if(defaultToRange)
 	{
-		ranges.push_back(Range(1e-10, 1e-4, count, true));
-		ranges.push_back(Range(0.5, 0.9, count));
+		for(eis::Range& range : ranges)
+			range.count = count;
+	}
+}
+
+std::vector<eis::Range> Cpe::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+	{
+		out.push_back(Range(1e-10, 1e-4, 2, true));
+		out.push_back(Range(0.5, 0.9, 2));
 	}
 	else
 	{
-		ranges.push_back(Range(1e-7, 1e-7, 1));
-		ranges.push_back(Range(0.9, 0.9, 1));
+		out.push_back(Range(1e-7, 1e-7, 1));
+		out.push_back(Range(0.9, 0.9, 1));
 	}
+
+	assert(out.size() == paramCount());
+	return out;
 }
 
 std::complex<fvalue> Cpe::execute(fvalue omega)
@@ -61,7 +75,7 @@ std::complex<fvalue> Cpe::execute(fvalue omega)
 	return std::complex<fvalue>(real, imag);
 }
 
-size_t Cpe::paramCount()
+size_t Cpe::paramCount() const
 {
 	return 2;
 }
diff --git a/componant/finitetr.cpp b/componant/finitetr.cpp
index 13d2767e1ed21cb33ec1c55ebd18b7da8d093392..f1a89dfd771d6e8b2a71b3d2a0523b06641c443f 100644
--- a/componant/finitetr.cpp
+++ b/componant/finitetr.cpp
@@ -7,7 +7,6 @@
 #include "componant/resistor.h"
 #include "componant/cap.h"
 #include "log.h"
-#include "strops.h"
 
 using namespace eis;
 
@@ -33,19 +32,38 @@ void FiniteTransmitionline::setDefaultParam(size_t count, bool defaultToRange)
 	_R = 1000;
 	_n = 4;
 
-	ranges.clear();
+	ranges = getDefaultRange(defaultToRange);
+
 	if(defaultToRange)
 	{
-		ranges.push_back(Range(1e-10, 1e-4, count, true));
-		ranges.push_back(Range(1, 1e4, count, true));
-		ranges.push_back(Range(_n, _n, 1));
+		for(eis::Range& range : ranges)
+			range.count = count;
+	}
+}
+
+std::vector<eis::Range> FiniteTransmitionline::getDefaultRange(bool range) const
+{
+	const fvalue C = 1e-6;
+	const fvalue R = 1000;
+	const fvalue n = 4;
+
+	std::vector<eis::Range> out(paramCount());
+
+	if(range)
+	{
+		out[0] = Range(1e-10, 1e-4, 2, true);
+		out[1] = Range(1, 1e4, 2, true);
+		out[2] = Range(n, n, 1);
 	}
 	else
 	{
-		ranges.push_back(Range(_C, _C, 1));
-		ranges.push_back(Range(_R, _R, 1));
-		ranges.push_back(Range(_n, _n, 1));
+		out[0] = Range(C, C, 1);
+		out[1] = Range(R, R, 1);
+		out[2] = Range(n, n, 1);
 	}
+
+	assert(out.size() == paramCount());
+	return out;
 }
 
 FiniteTransmitionline::FiniteTransmitionline(std::string paramStr, size_t count, bool defaultToRange)
@@ -93,7 +111,7 @@ char FiniteTransmitionline::getComponantChar() const
 	return FiniteTransmitionline::staticGetComponantChar();
 }
 
-size_t FiniteTransmitionline::paramCount()
+size_t FiniteTransmitionline::paramCount() const
 {
 	return 3;
 }
diff --git a/componant/inductor.cpp b/componant/inductor.cpp
index d2d8ea134b6d9e3c4e69f683bcc57ae5c0bb5297..b0b3f019284f3b19d54ea6d87db52d4771e68ec1 100644
--- a/componant/inductor.cpp
+++ b/componant/inductor.cpp
@@ -20,22 +20,36 @@ Inductor::Inductor(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(1e-10, 1e-4, count, true));
-		else
-			ranges.push_back(Range(1e-6, 1e-6, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Inductor::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(1e-10, 1e-4, 2, true));
+	else
+		out.push_back(Range(1e-6, 1e-6, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Inductor::execute(fvalue omega)
 {
 	assert(ranges.size() == paramCount());
 	return std::complex<fvalue>(0, ranges[0][ranges[0].step]*omega);
 }
 
-size_t Inductor::paramCount()
+size_t Inductor::paramCount() const
 {
 	return 1;
 }
diff --git a/componant/resistor.cpp b/componant/resistor.cpp
index 17fdbe9b830ccfc851234d56e4002084eb726542..06d370157dbf1350cc851e0528fd9d9c9f8ee2f9 100644
--- a/componant/resistor.cpp
+++ b/componant/resistor.cpp
@@ -20,15 +20,29 @@ Resistor::Resistor(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(1, 1e4, count, true));
-		else
-			ranges.push_back(Range(100, 100, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Resistor::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(1, 1e4, 2, true));
+	else
+		out.push_back(Range(100, 100, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Resistor::execute(fvalue omega)
 {
 	(void)omega;
@@ -36,7 +50,7 @@ std::complex<fvalue> Resistor::execute(fvalue omega)
 	return std::complex<fvalue>(ranges[0].stepValue(), 0);
 }
 
-size_t Resistor::paramCount()
+size_t Resistor::paramCount() const
 {
 	return 1;
 }
diff --git a/componant/warburg.cpp b/componant/warburg.cpp
index 4471230b9677c23d59559f385117b7e8534c11fd..c5b58a9af8232ff3d7059d6c7f6c51672a228f9c 100644
--- a/componant/warburg.cpp
+++ b/componant/warburg.cpp
@@ -20,15 +20,29 @@ Warburg::Warburg(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(10, 100, count, true));
-		else
-			ranges.push_back(Range(50, 50, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Warburg::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(10, 100, 2, true));
+	else
+		out.push_back(Range(50, 50, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Warburg::execute(fvalue omega)
 {
 	assert(ranges.size() == paramCount());
@@ -36,7 +50,7 @@ std::complex<fvalue> Warburg::execute(fvalue omega)
 	return std::complex<fvalue>(N, 0-N);
 }
 
-size_t Warburg::paramCount()
+size_t Warburg::paramCount() const
 {
 	return 1;
 }
diff --git a/eisgenerator/componant/cap.h b/eisgenerator/componant/cap.h
index 78070597fb4a8dc02f31a8f162748b405b08e65e..31038c217c4beca14c2a411145365eb7b8e85769 100644
--- a/eisgenerator/componant/cap.h
+++ b/eisgenerator/componant/cap.h
@@ -13,12 +13,13 @@ public:
 	Cap(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	Cap(fvalue c = 1e-6);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'c';}
 	virtual std::string componantName() const override {return "Capacitor";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual ~Cap() = default;
 };
 
diff --git a/eisgenerator/componant/componant.h b/eisgenerator/componant/componant.h
index 5b8432da27750083d1ab8fb84597539487c0825e..93e33e0a4b11e5480942e36474ade921836c00e9 100644
--- a/eisgenerator/componant/componant.h
+++ b/eisgenerator/componant/componant.h
@@ -26,7 +26,8 @@ class Componant
 		virtual void setParamRanges(const std::vector<eis::Range>& ranges);
 		virtual std::vector<eis::Range>& getParamRanges();
 		virtual std::vector<eis::Range> getParamRanges() const;
-		virtual size_t paramCount(){return 0;}
+		virtual std::vector<eis::Range> getDefaultRange(bool range = true) const;
+		virtual size_t paramCount() const {return 0;};
 		virtual ~Componant() = default;
 		virtual char getComponantChar() const = 0;
 		virtual std::string getComponantString(bool currentValue = true) const;
diff --git a/eisgenerator/componant/constantphase.h b/eisgenerator/componant/constantphase.h
index 15e3acf2a21636fddebc60c505944e54b942873a..e4252f5d93548380c51f7156084e7f222e6979c8 100644
--- a/eisgenerator/componant/constantphase.h
+++ b/eisgenerator/componant/constantphase.h
@@ -16,11 +16,12 @@ public:
 	Cpe(fvalue q, fvalue alpha);
 	Cpe();
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'p';}
 	virtual std::string componantName() const override {return "ConstantPhase";}
 	virtual ~Cpe() = default;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 };
diff --git a/eisgenerator/componant/finitetr.h b/eisgenerator/componant/finitetr.h
index ca4afde8432a9191bb71bc837da5273cf5e4a85c..dfd4277597085e684bb03e67d5344a9dee7f32e0 100644
--- a/eisgenerator/componant/finitetr.h
+++ b/eisgenerator/componant/finitetr.h
@@ -21,7 +21,8 @@ public:
 	FiniteTransmitionline(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	FiniteTransmitionline(const FiniteTransmitionline& in);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount();
+	virtual size_t paramCount() const override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual ~FiniteTransmitionline();
 	virtual char getComponantChar() const override;
 	virtual std::string componantName() const override {return "FiniteTransmitionline";}
diff --git a/eisgenerator/componant/inductor.h b/eisgenerator/componant/inductor.h
index a6e7129b8b2771c60f1053b4a0de249ce5e290e8..e4afd6c6e2e98c6d1d9dafcc126e31c67d99785f 100644
--- a/eisgenerator/componant/inductor.h
+++ b/eisgenerator/componant/inductor.h
@@ -13,11 +13,12 @@ public:
 	Inductor(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	Inductor(fvalue L = 1e-6);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'l';}
 	virtual std::string componantName() const override {return "Inductor";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 	virtual ~Inductor() = default;
 };
diff --git a/eisgenerator/componant/resistor.h b/eisgenerator/componant/resistor.h
index 154c01b2de6d822f1d9ca4212e2092869ea8b4df..26575346f110cd594b603c51fb8a885ef1a98ca7 100644
--- a/eisgenerator/componant/resistor.h
+++ b/eisgenerator/componant/resistor.h
@@ -11,11 +11,12 @@ public:
 	Resistor(fvalue r);
 	Resistor(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	virtual std::complex<fvalue> execute(fvalue omega)  override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'r';}
 	virtual std::string componantName() const override {return "Resistor";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 	virtual ~Resistor() = default;
 };
diff --git a/eisgenerator/componant/warburg.h b/eisgenerator/componant/warburg.h
index 4dfa02da9ca6d8a58cc460e061d2c34f4860cc19..7529bf7bdbf029582be0baf1e324ea4a5c5f83f6 100644
--- a/eisgenerator/componant/warburg.h
+++ b/eisgenerator/componant/warburg.h
@@ -13,11 +13,12 @@ public:
 	Warburg(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	Warburg(fvalue a = 2e4);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'w';}
 	virtual std::string componantName() const override {return "Warburg";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 	virtual ~Warburg() = default;
 };
diff --git a/eisgenerator/eistype.h b/eisgenerator/eistype.h
index e13f2525aa7d4bed9090abd03f2cd78c0b647719..09aa1ae1c4db59931392a4bdfeb96656a4b05d71 100644
--- a/eisgenerator/eistype.h
+++ b/eisgenerator/eistype.h
@@ -84,6 +84,10 @@ public:
 	{
 		return at(step);
 	}
+	fvalue center() const
+	{
+		return (start+end)/2;
+	}
 	fvalue at(size_t index) const
 	{
 		assert(index < count || (index == 0 && count == 0));