...
Example
...
1,
...
using
...
a
...
separate
...
input
...
items
...
for
...
x,
...
y,
...
z,
...
t
...
and
...
1
...
output
...
item
...
for f
Code Block | ||||
---|---|---|---|---|
| ||||
f {graphviz} digraph flow { rankdir=LR; node [shape = circle, len=1.00]; x y z t f; node [shape = rectangle]; function; x -> function; y -> function; z -> function; t -> function; function -> f; } {graphviz} h4. Example 2, using an input items containing element set with 1 point for x, y, z and one time for t which is connected as input of the function and computing values in the output item for f {graphviz} digraph flow { rankdir=LR; node [shape = circle, len=1.00]; src xyzt f; node [shape = rectangle]; function; src -> xyzt -> function -> f; } {graphviz} h4. Example 3, using input item which has element set with 1 point for x, y, z and one time for t. Then it is connected to the 1st output item of the function. When values in the function are computed - they are passed to that input item. {graphviz} digraph flow { rankdir=LR; node [shape = circle, len=1.00]; xyzt f; node [shape = rectangle]; function; function -> f -> xyzt; } {graphviz} {code:java} namespace Oatc.OpenMI.Sdk.Backbone.IntegrationTests { [TestFixture] public class AnalyticalFunctionTests { private static readonly ILog log = LogManager.GetLogger(typeof(AnalyticalFunctionTests)); [SetUp] public void SetUp() { BasicConfigurator.Configure(); } [Test] public void AnalyticalFunction() { AnalyticalFunctionComponent function = new AnalyticalFunctionComponent(); function.Initialize(null); IInputItem x = function.InputItems[0]; IInputItem y = function.InputItems[1]; IInputItem z = function.InputItems[2]; IInputItem t = function.InputItems[3]; IOutputItem f = function.OutputItems[0]; Assert.AreEqual(1, x.Values.Count); Assert.AreEqual(1, y.Values.Count); Assert.AreEqual(1, z.Values.Count); Assert.AreEqual(1, t.Values.Count); Assert.AreEqual(1, f.Values.Count); x.Values[0] = 1.0; y.Values[0] = 0.0; z.Values[0] = 10.0; t.Values[0] = new System.TimeSpan(20, 10, 0, 0); function.Update(); // computes f(x,y,z,t) = sin(x + y) + z * t log.DebugFormat("Computed analytical function value f({0}, {1}, {2}, {3}) = {4}", x.Values[0], y.Values[0], z.Values[0], t.Values[0], f.Values[0]); Assert.AreEqual(17640000.841470987d, (double)f.Values[0], 0.00001); } |
Example 2, using an input items containing element set with 1 point for x, y, z and one time for t which is connected as input of the function and computing values in the output item for f
Code Block | ||||
---|---|---|---|---|
| ||||
[Test] public void AnalyticalFunction2() { AnalyticalFunctionComponent2 function = new AnalyticalFunctionComponent2(); function.Initialize(null); Assert.AreEqual(1, function.InputItems.Count); Assert.AreEqual(1, function.OutputItems.Count); OutputItem source = new OutputItem(); FillItem(source, 0.1, 0.1, 0.5, DateTime.Now); source.AddConsumer(function.InputItems[0]); Assert.AreEqual(default(double), function.OutputItems[0].Values[0]); function.Update(); Assert.AreNotEqual(default(double), function.OutputItems[0].Values[0]); } |
Example 3, using input item which has element set with 1 point for x, y, z and one time for t. Then it is connected to the 1st output item of the function. When values in the function are computed - they are passed to that input item.
Code Block | ||||
---|---|---|---|---|
| ||||
/// <summary> /// This is the way (conceptually) how it worked in v1. /// </summary> [Test] public void AnalyticalFunction3() { AnalyticalFunctionComponent3 function = new AnalyticalFunctionComponent3(); function.Initialize(null); Assert.AreEqual(0, function.InputItems.Count); Assert.AreEqual(1, function.OutputItems.Count); // create an element set InputItem requiredInput = new InputItem(); FillItem(requiredInput, 0.1, 0.1, 0.5, DateTime.Now); function.OutputItems[0].Consumers.Add(requiredInput); Assert.AreEqual(default(double), function.OutputItems[0].Values[0]); // compute function.Update(); Assert.AreNotEqual(default(double), requiredInput.Values[0], "value in the input item must be changed"); } |
Helper method to fill element set and time into exchange item
Code Block | ||||
---|---|---|---|---|
| ||||
// TODO: we have to make construction of such thing simpler private void FillItem(ExchangeItem item, double x, double y, double z, DateTime t) { ElementSet elementSet = new ElementSet("1 point element set"); elementSet.ElementType = ElementType.XYZPoint; Element point = new Element(string.Empty); point.AddVertex(new Coordinate(x, y, z)); elementSet.AddElement(point); // set required elements and times item.ElementSet = elementSet; item.Temporal = new Temporal(); item.Temporal.Times.Add(new TimeStamp(CalendarConverter.Gregorian2ModifiedJulian(t))); } } } {code} |