Explorar o código

Added DeltaTBlock

Randy Paredis %!s(int64=3) %!d(string=hai) anos
pai
achega
6b6a9a0d2d

+ 0 - 7
doc/CBD.linearsolver.rst

@@ -1,7 +0,0 @@
-CBD.linearsolver module
-=======================
-
-.. automodule:: CBD.linearsolver
-    :members:
-    :undoc-members:
-    :show-inheritance:

+ 7 - 0
doc/CBD.loopsolvers.linearsolver.rst

@@ -0,0 +1,7 @@
+CBD.loopsolvers.linearsolver module
+===================================
+
+.. automodule:: CBD.loopsolvers.linearsolver
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 13 - 0
doc/CBD.loopsolvers.rst

@@ -0,0 +1,13 @@
+CBD.loopsolvers module
+======================
+
+.. automodule:: CBD.loopsolvers
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+.. toctree::
+
+   CBD.loopsolvers.solver
+   CBD.loopsolvers.linearsolver
+   CBD.loopsolvers.sympysolver

+ 7 - 0
doc/CBD.loopsolvers.solver.rst

@@ -0,0 +1,7 @@
+CBD.loopsolvers.solver module
+=============================
+
+.. automodule:: CBD.loopsolvers.solver
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 7 - 0
doc/CBD.loopsolvers.sympysolver.rst

@@ -0,0 +1,7 @@
+CBD.loopsolvers.sympysolver module
+==================================
+
+.. automodule:: CBD.loopsolvers.sympysolver
+    :members:
+    :undoc-members:
+    :show-inheritance:

+ 1 - 1
doc/CBD.rst

@@ -27,6 +27,6 @@ Submodules
    CBD.preprocessing
    CBD.scheduling
    CBD.simulator
-   CBD.linearsolver
+   CBD.loopsolvers
    CBD.util
 

BIN=BIN
doc/_static/MSDLlogo.2.small.gif


+ 4 - 0
doc/_static/style.css

@@ -97,3 +97,7 @@ article.catalyst-article .class dl dt em.property {
 :not(.MathJax_Display) > .MathJax {
 	font-size: 110% !important;
 }
+
+.versionmodified, .versionadded {
+	font-style: italic;
+}

+ 3 - 0
doc/changelog.rst

@@ -4,6 +4,9 @@ Changelog
 .. code-block:: text
 
     Version 1.4
+        + Added DeltaTBlock
+        - Removed "delta_t" input port of IntegratorBlock and DerivatorBlock
+        + Added SympySolver
         * Bugfixes:
              #21: KeyError CBD <...> in LinearSolver.constructInput
              #22: AssertionError because a DelayBlock is part of an algebraic

+ 33 - 54
src/CBD/lib/std.py

@@ -488,11 +488,16 @@ class AddOneBlock(CBD):
 
 class DerivatorBlock(CBD):
 	"""
-	The derivator block is a CBD that calculates the derivative.
+	The derivator block is a CBD that calculates the derivative,
+	using the backwards formula.
+
+	.. versionchanged:: 1.4
+		Removed :code:`delta_t` input port.
 	"""
 	def __init__(self, block_name):
-		CBD.__init__(self, block_name, ["IN1", "delta_t", "IC"], ["OUT1"])
+		CBD.__init__(self, block_name, ["IN1", "IC"], ["OUT1"])
 		# TO IMPLEMENT
+		self.addBlock(DeltaTBlock(block_name="delta_t"))
 		self.addBlock(ProductBlock(block_name="multIc"))
 		self.addBlock(NegatorBlock(block_name="neg1"))
 		self.addBlock(AdderBlock(block_name="sum1"))
@@ -522,61 +527,14 @@ class IntegratorBlock(CBD):
 	"""
 	The integrator block is a CBD that calculates the integration.
 	The block is implemented according to the backwards Euler rule.
+
+	.. versionchanged:: 1.4
+		Removed :code:`delta_t` input port.
 	"""
 	def __init__(self, block_name):
-		CBD.__init__(self, block_name, ["IN1", "delta_t", "IC"], ["OUT1"])
-		# TO IMPLEMENT
-		# TRAPEZOID RULE // TODO: fix the circularity issue => other solver?
-		# # self.addBlock(ConstantBlock(block_name="zero", value=0.0))
-		# self.addBlock(ConstantBlock(block_name="half", value=0.5))
-		# self.addBlock(DelayBlock(block_name="delayIn"))
-		# self.addBlock(ProductBlock(block_name="multDelta"))
-		# self.addBlock(ProductBlock(block_name="multX"))
-		# self.addBlock(DelayBlock(block_name="delayState"))
-		# self.addBlock(AdderBlock(block_name="sumX"))
-		# self.addBlock(AdderBlock(block_name="sumState"))
-		# self.addBlock(NegatorBlock(block_name="neg"))
-		# # self.addBlock(TimedGateBlock(block_name="gate", time=0.0))
-		#
-		# self.addConnection("IN1", "delayIn")
-		# self.addConnection("IN1", "neg")
-		# # self.addConnection("zero", "delayIn", input_port_name="IC")
-		# self.addConnection("neg", "delayIn", input_port_name="IC")
-		# self.addConnection("IN1", "sumX")
-		# self.addConnection("delayIn", "sumX")
-		# self.addConnection("sumX", "multX")
-		# self.addConnection("delta_t", "multDelta")
-		# self.addConnection("half", "multDelta")
-		# self.addConnection("multDelta", "multX")
-		# self.addConnection("sumState", "delayState")
-		# # self.addConnection("zero", "gate", input_port_name="IN1")
-		# # self.addConnection("multX", "gate", input_port_name="IN2")
-		# # self.addConnection("gate", "sumState")
-		# self.addConnection("multX", "sumState")
-		# self.addConnection("IC", "delayState", input_port_name="IC")
-		# self.addConnection("delayState", "sumState")
-		# self.addConnection("sumState", "OUT1")
-
-		# FORWARD EULER:
-		# self.addBlock(ProductBlock("mul"))
-		# self.addBlock(AdderBlock("sum"))
-		# self.addBlock(AdderBlock("sum_ic"))
-		# self.addBlock(DelayBlock("delay"))
-		# self.addBlock(NegatorBlock("neg"))
-		#
-		# self.addConnection("IN1", "mul")
-		# self.addConnection("delta_t", "mul")
-		# self.addConnection("mul", "sum")
-		# self.addConnection("delay", "sum")
-		# self.addConnection("sum", "delay")
-		# self.addConnection("IC", "neg")
-		# self.addConnection("neg", "sum_ic")
-		# self.addConnection("sum_ic", "delay", input_port_name="IC")
-		# self.addConnection("mul", "sum_ic")
-		# self.addConnection("sum", "OUT1")
-
-		# BACKWARD EULER:
+		CBD.__init__(self, block_name, ["IN1", "IC"], ["OUT1"])
 		self.addBlock(ConstantBlock(block_name="zero", value=0))
+		self.addBlock(DeltaTBlock(block_name="delta_t"))
 		self.addBlock(DelayBlock(block_name="delayIn"))
 		self.addBlock(ProductBlock(block_name="multDelta"))
 		self.addBlock(DelayBlock(block_name="delayState"))
@@ -593,6 +551,18 @@ class IntegratorBlock(CBD):
 		self.addConnection("sumState", "OUT1")
 
 
+class DeltaTBlock(ConstantBlock):
+	"""
+	Helperblock that will always output the current time delta,
+	even when using adaptive stepsize.
+	"""
+	def __init__(self, block_name):
+		ConstantBlock.__init__(self, block_name)
+
+	def getValue(self):
+		return self.getClock().getDeltaT()
+
+
 class Clock(CBD):
 	"""
 	System clock. **Must be present in a simulation model.**
@@ -657,6 +627,12 @@ class Clock(CBD):
 		self.__start_time = start_time
 		self.getBlockByName("IC").setValue(start_time)
 
+	def getDeltaT(self):
+		dSig = self.getSignal("delta")
+		if len(dSig) == 0:
+			return 0.0
+		return dSig[-1]
+
 	def _rewind(self):
 		CBD._rewind(self)
 		time = self.getInputSignal(-1, "h").value
@@ -710,6 +686,9 @@ class DummyClock(BaseBlock):
 		"""
 		return self.getTime(curIt) - self.__start_time
 
+	def getDeltaT(self):
+		return self.__delta_t
+
 	def _rewind(self):
 		self.__start_time -= self.__delta_t
 

+ 2 - 2
src/CBD/preprocessing/rungekutta.py

@@ -488,8 +488,8 @@ if __name__ == '__main__':
 			self.addConnection("x0", "Ix", input_port_name='IC')
 
 			self.addFixedRateClock("clock", 0.1)
-			self.addConnection("clock-clock", "Iv", output_port_name="delta", input_port_name='delta_t')
-			self.addConnection("clock-clock", "Ix", output_port_name="delta", input_port_name='delta_t')
+			# self.addConnection("clock-clock", "Iv", output_port_name="delta", input_port_name='delta_t')
+			# self.addConnection("clock-clock", "Ix", output_port_name="delta", input_port_name='delta_t')
 
 	test = Test("Test")
 	# test.addFixedRateClock("clock", 0.1)

+ 0 - 4
src/test/stdCBDTest.py

@@ -472,13 +472,11 @@ class StdCBDTestCase(unittest.TestCase):
 		return CBDFunc
 
 	def testDerivatorBlock(self):
-		self.CBD.addBlock(ConstantBlock(block_name="c3", value=1.0))
 		self.CBD.addBlock(ConstantBlock(block_name="zero", value=0.0))
 		CBDFunc = self.initializeFuncDerBas()
 		self.CBD.addBlock(CBDFunc)
 		self.CBD.addBlock(DerivatorBlock(block_name="der"))
 
-		self.CBD.addConnection("c3", "der", input_port_name="delta_t")
 		self.CBD.addConnection("zero", "der", input_port_name="IC")
 		self.CBD.addConnection("function", "der")
 		self._run(5)
@@ -490,12 +488,10 @@ class StdCBDTestCase(unittest.TestCase):
 		epsilon = 0.002
 		self.CBD.addBlock(ConstantBlock(block_name="c1", value=6.0))
 		self.CBD.addBlock(ConstantBlock(block_name="c2", value=0.0))
-		self.CBD.addBlock(ConstantBlock(block_name="c3", value=dt))
 		self.CBD.addBlock(AdderBlock(block_name="a"))
 		self.CBD.addBlock(DelayBlock(block_name="d"))
 
 		self.CBD.addBlock(IntegratorBlock(block_name="int"))
-		self.CBD.addConnection("c3", "int", input_port_name="delta_t")
 		self.CBD.addConnection("a", "int")
 		self.CBD.addConnection("c2", "int", input_port_name="IC")