comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/ode/sampling/NordsieckStepInterpolator.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.ode.sampling;<a name="line.18"></a>
22 <FONT color="green">019</FONT> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.io.IOException;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import java.io.ObjectInput;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import java.io.ObjectOutput;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import java.util.Arrays;<a name="line.23"></a>
27 <FONT color="green">024</FONT> <a name="line.24"></a>
28 <FONT color="green">025</FONT> import org.apache.commons.math.linear.Array2DRowRealMatrix;<a name="line.25"></a>
29 <FONT color="green">026</FONT> import org.apache.commons.math.ode.DerivativeException;<a name="line.26"></a>
30 <FONT color="green">027</FONT> <a name="line.27"></a>
31 <FONT color="green">028</FONT> /**<a name="line.28"></a>
32 <FONT color="green">029</FONT> * This class implements an interpolator for integrators using Nordsieck representation.<a name="line.29"></a>
33 <FONT color="green">030</FONT> *<a name="line.30"></a>
34 <FONT color="green">031</FONT> * &lt;p&gt;This interpolator computes dense output around the current point.<a name="line.31"></a>
35 <FONT color="green">032</FONT> * The interpolation equation is based on Taylor series formulas.<a name="line.32"></a>
36 <FONT color="green">033</FONT> *<a name="line.33"></a>
37 <FONT color="green">034</FONT> * @see org.apache.commons.math.ode.nonstiff.AdamsBashforthIntegrator<a name="line.34"></a>
38 <FONT color="green">035</FONT> * @see org.apache.commons.math.ode.nonstiff.AdamsMoultonIntegrator<a name="line.35"></a>
39 <FONT color="green">036</FONT> * @version $Revision: 811827 $ $Date: 2009-09-06 11:32:50 -0400 (Sun, 06 Sep 2009) $<a name="line.36"></a>
40 <FONT color="green">037</FONT> * @since 2.0<a name="line.37"></a>
41 <FONT color="green">038</FONT> */<a name="line.38"></a>
42 <FONT color="green">039</FONT> <a name="line.39"></a>
43 <FONT color="green">040</FONT> public class NordsieckStepInterpolator extends AbstractStepInterpolator {<a name="line.40"></a>
44 <FONT color="green">041</FONT> <a name="line.41"></a>
45 <FONT color="green">042</FONT> /** Serializable version identifier */<a name="line.42"></a>
46 <FONT color="green">043</FONT> private static final long serialVersionUID = -7179861704951334960L;<a name="line.43"></a>
47 <FONT color="green">044</FONT> <a name="line.44"></a>
48 <FONT color="green">045</FONT> /** State variation. */<a name="line.45"></a>
49 <FONT color="green">046</FONT> protected double[] stateVariation;<a name="line.46"></a>
50 <FONT color="green">047</FONT> <a name="line.47"></a>
51 <FONT color="green">048</FONT> /** Step size used in the first scaled derivative and Nordsieck vector. */<a name="line.48"></a>
52 <FONT color="green">049</FONT> private double scalingH;<a name="line.49"></a>
53 <FONT color="green">050</FONT> <a name="line.50"></a>
54 <FONT color="green">051</FONT> /** Reference time for all arrays.<a name="line.51"></a>
55 <FONT color="green">052</FONT> * &lt;p&gt;Sometimes, the reference time is the same as previousTime,<a name="line.52"></a>
56 <FONT color="green">053</FONT> * sometimes it is the same as currentTime, so we use a separate<a name="line.53"></a>
57 <FONT color="green">054</FONT> * field to avoid any confusion.<a name="line.54"></a>
58 <FONT color="green">055</FONT> * &lt;/p&gt;<a name="line.55"></a>
59 <FONT color="green">056</FONT> */<a name="line.56"></a>
60 <FONT color="green">057</FONT> private double referenceTime;<a name="line.57"></a>
61 <FONT color="green">058</FONT> <a name="line.58"></a>
62 <FONT color="green">059</FONT> /** First scaled derivative. */<a name="line.59"></a>
63 <FONT color="green">060</FONT> private double[] scaled;<a name="line.60"></a>
64 <FONT color="green">061</FONT> <a name="line.61"></a>
65 <FONT color="green">062</FONT> /** Nordsieck vector. */<a name="line.62"></a>
66 <FONT color="green">063</FONT> private Array2DRowRealMatrix nordsieck;<a name="line.63"></a>
67 <FONT color="green">064</FONT> <a name="line.64"></a>
68 <FONT color="green">065</FONT> /** Simple constructor.<a name="line.65"></a>
69 <FONT color="green">066</FONT> * This constructor builds an instance that is not usable yet, the<a name="line.66"></a>
70 <FONT color="green">067</FONT> * {@link AbstractStepInterpolator#reinitialize} method should be called<a name="line.67"></a>
71 <FONT color="green">068</FONT> * before using the instance in order to initialize the internal arrays. This<a name="line.68"></a>
72 <FONT color="green">069</FONT> * constructor is used only in order to delay the initialization in<a name="line.69"></a>
73 <FONT color="green">070</FONT> * some cases.<a name="line.70"></a>
74 <FONT color="green">071</FONT> */<a name="line.71"></a>
75 <FONT color="green">072</FONT> public NordsieckStepInterpolator() {<a name="line.72"></a>
76 <FONT color="green">073</FONT> }<a name="line.73"></a>
77 <FONT color="green">074</FONT> <a name="line.74"></a>
78 <FONT color="green">075</FONT> /** Copy constructor.<a name="line.75"></a>
79 <FONT color="green">076</FONT> * @param interpolator interpolator to copy from. The copy is a deep<a name="line.76"></a>
80 <FONT color="green">077</FONT> * copy: its arrays are separated from the original arrays of the<a name="line.77"></a>
81 <FONT color="green">078</FONT> * instance<a name="line.78"></a>
82 <FONT color="green">079</FONT> */<a name="line.79"></a>
83 <FONT color="green">080</FONT> public NordsieckStepInterpolator(final NordsieckStepInterpolator interpolator) {<a name="line.80"></a>
84 <FONT color="green">081</FONT> super(interpolator);<a name="line.81"></a>
85 <FONT color="green">082</FONT> scalingH = interpolator.scalingH;<a name="line.82"></a>
86 <FONT color="green">083</FONT> referenceTime = interpolator.referenceTime;<a name="line.83"></a>
87 <FONT color="green">084</FONT> if (interpolator.scaled != null) {<a name="line.84"></a>
88 <FONT color="green">085</FONT> scaled = interpolator.scaled.clone();<a name="line.85"></a>
89 <FONT color="green">086</FONT> }<a name="line.86"></a>
90 <FONT color="green">087</FONT> if (interpolator.nordsieck != null) {<a name="line.87"></a>
91 <FONT color="green">088</FONT> nordsieck = new Array2DRowRealMatrix(interpolator.nordsieck.getDataRef(), true);<a name="line.88"></a>
92 <FONT color="green">089</FONT> }<a name="line.89"></a>
93 <FONT color="green">090</FONT> if (interpolator.stateVariation != null) {<a name="line.90"></a>
94 <FONT color="green">091</FONT> stateVariation = interpolator.stateVariation.clone();<a name="line.91"></a>
95 <FONT color="green">092</FONT> }<a name="line.92"></a>
96 <FONT color="green">093</FONT> }<a name="line.93"></a>
97 <FONT color="green">094</FONT> <a name="line.94"></a>
98 <FONT color="green">095</FONT> /** {@inheritDoc} */<a name="line.95"></a>
99 <FONT color="green">096</FONT> @Override<a name="line.96"></a>
100 <FONT color="green">097</FONT> protected StepInterpolator doCopy() {<a name="line.97"></a>
101 <FONT color="green">098</FONT> return new NordsieckStepInterpolator(this);<a name="line.98"></a>
102 <FONT color="green">099</FONT> }<a name="line.99"></a>
103 <FONT color="green">100</FONT> <a name="line.100"></a>
104 <FONT color="green">101</FONT> /** Reinitialize the instance.<a name="line.101"></a>
105 <FONT color="green">102</FONT> * &lt;p&gt;Beware that all arrays &lt;em&gt;must&lt;/em&gt; be references to integrator<a name="line.102"></a>
106 <FONT color="green">103</FONT> * arrays, in order to ensure proper update without copy.&lt;/p&gt;<a name="line.103"></a>
107 <FONT color="green">104</FONT> * @param y reference to the integrator array holding the state at<a name="line.104"></a>
108 <FONT color="green">105</FONT> * the end of the step<a name="line.105"></a>
109 <FONT color="green">106</FONT> * @param forward integration direction indicator<a name="line.106"></a>
110 <FONT color="green">107</FONT> */<a name="line.107"></a>
111 <FONT color="green">108</FONT> @Override<a name="line.108"></a>
112 <FONT color="green">109</FONT> public void reinitialize(final double[] y, final boolean forward) {<a name="line.109"></a>
113 <FONT color="green">110</FONT> super.reinitialize(y, forward);<a name="line.110"></a>
114 <FONT color="green">111</FONT> stateVariation = new double[y.length];<a name="line.111"></a>
115 <FONT color="green">112</FONT> }<a name="line.112"></a>
116 <FONT color="green">113</FONT> <a name="line.113"></a>
117 <FONT color="green">114</FONT> /** Reinitialize the instance.<a name="line.114"></a>
118 <FONT color="green">115</FONT> * &lt;p&gt;Beware that all arrays &lt;em&gt;must&lt;/em&gt; be references to integrator<a name="line.115"></a>
119 <FONT color="green">116</FONT> * arrays, in order to ensure proper update without copy.&lt;/p&gt;<a name="line.116"></a>
120 <FONT color="green">117</FONT> * @param time time at which all arrays are defined<a name="line.117"></a>
121 <FONT color="green">118</FONT> * @param stepSize step size used in the scaled and nordsieck arrays<a name="line.118"></a>
122 <FONT color="green">119</FONT> * @param scaledDerivative reference to the integrator array holding the first<a name="line.119"></a>
123 <FONT color="green">120</FONT> * scaled derivative<a name="line.120"></a>
124 <FONT color="green">121</FONT> * @param nordsieckVector reference to the integrator matrix holding the<a name="line.121"></a>
125 <FONT color="green">122</FONT> * nordsieck vector<a name="line.122"></a>
126 <FONT color="green">123</FONT> */<a name="line.123"></a>
127 <FONT color="green">124</FONT> public void reinitialize(final double time, final double stepSize,<a name="line.124"></a>
128 <FONT color="green">125</FONT> final double[] scaledDerivative,<a name="line.125"></a>
129 <FONT color="green">126</FONT> final Array2DRowRealMatrix nordsieckVector) {<a name="line.126"></a>
130 <FONT color="green">127</FONT> this.referenceTime = time;<a name="line.127"></a>
131 <FONT color="green">128</FONT> this.scalingH = stepSize;<a name="line.128"></a>
132 <FONT color="green">129</FONT> this.scaled = scaledDerivative;<a name="line.129"></a>
133 <FONT color="green">130</FONT> this.nordsieck = nordsieckVector;<a name="line.130"></a>
134 <FONT color="green">131</FONT> <a name="line.131"></a>
135 <FONT color="green">132</FONT> // make sure the state and derivatives will depend on the new arrays<a name="line.132"></a>
136 <FONT color="green">133</FONT> setInterpolatedTime(getInterpolatedTime());<a name="line.133"></a>
137 <FONT color="green">134</FONT> <a name="line.134"></a>
138 <FONT color="green">135</FONT> }<a name="line.135"></a>
139 <FONT color="green">136</FONT> <a name="line.136"></a>
140 <FONT color="green">137</FONT> /** Rescale the instance.<a name="line.137"></a>
141 <FONT color="green">138</FONT> * &lt;p&gt;Since the scaled and Nordiseck arrays are shared with the caller,<a name="line.138"></a>
142 <FONT color="green">139</FONT> * this method has the side effect of rescaling this arrays in the caller too.&lt;/p&gt;<a name="line.139"></a>
143 <FONT color="green">140</FONT> * @param stepSize new step size to use in the scaled and nordsieck arrays<a name="line.140"></a>
144 <FONT color="green">141</FONT> */<a name="line.141"></a>
145 <FONT color="green">142</FONT> public void rescale(final double stepSize) {<a name="line.142"></a>
146 <FONT color="green">143</FONT> <a name="line.143"></a>
147 <FONT color="green">144</FONT> final double ratio = stepSize / scalingH;<a name="line.144"></a>
148 <FONT color="green">145</FONT> for (int i = 0; i &lt; scaled.length; ++i) {<a name="line.145"></a>
149 <FONT color="green">146</FONT> scaled[i] *= ratio;<a name="line.146"></a>
150 <FONT color="green">147</FONT> }<a name="line.147"></a>
151 <FONT color="green">148</FONT> <a name="line.148"></a>
152 <FONT color="green">149</FONT> final double[][] nData = nordsieck.getDataRef();<a name="line.149"></a>
153 <FONT color="green">150</FONT> double power = ratio;<a name="line.150"></a>
154 <FONT color="green">151</FONT> for (int i = 0; i &lt; nData.length; ++i) {<a name="line.151"></a>
155 <FONT color="green">152</FONT> power *= ratio;<a name="line.152"></a>
156 <FONT color="green">153</FONT> final double[] nDataI = nData[i];<a name="line.153"></a>
157 <FONT color="green">154</FONT> for (int j = 0; j &lt; nDataI.length; ++j) {<a name="line.154"></a>
158 <FONT color="green">155</FONT> nDataI[j] *= power;<a name="line.155"></a>
159 <FONT color="green">156</FONT> }<a name="line.156"></a>
160 <FONT color="green">157</FONT> }<a name="line.157"></a>
161 <FONT color="green">158</FONT> <a name="line.158"></a>
162 <FONT color="green">159</FONT> scalingH = stepSize;<a name="line.159"></a>
163 <FONT color="green">160</FONT> <a name="line.160"></a>
164 <FONT color="green">161</FONT> }<a name="line.161"></a>
165 <FONT color="green">162</FONT> <a name="line.162"></a>
166 <FONT color="green">163</FONT> /**<a name="line.163"></a>
167 <FONT color="green">164</FONT> * Get the state vector variation from current to interpolated state.<a name="line.164"></a>
168 <FONT color="green">165</FONT> * &lt;p&gt;This method is aimed at computing y(t&lt;sub&gt;interpolation&lt;/sub&gt;)<a name="line.165"></a>
169 <FONT color="green">166</FONT> * -y(t&lt;sub&gt;current&lt;/sub&gt;) accurately by avoiding the cancellation errors<a name="line.166"></a>
170 <FONT color="green">167</FONT> * that would occur if the subtraction were performed explicitly.&lt;/p&gt;<a name="line.167"></a>
171 <FONT color="green">168</FONT> * &lt;p&gt;The returned vector is a reference to a reused array, so<a name="line.168"></a>
172 <FONT color="green">169</FONT> * it should not be modified and it should be copied if it needs<a name="line.169"></a>
173 <FONT color="green">170</FONT> * to be preserved across several calls.&lt;/p&gt;<a name="line.170"></a>
174 <FONT color="green">171</FONT> * @return state vector at time {@link #getInterpolatedTime}<a name="line.171"></a>
175 <FONT color="green">172</FONT> * @see #getInterpolatedDerivatives()<a name="line.172"></a>
176 <FONT color="green">173</FONT> * @throws DerivativeException if this call induces an automatic<a name="line.173"></a>
177 <FONT color="green">174</FONT> * step finalization that throws one<a name="line.174"></a>
178 <FONT color="green">175</FONT> */<a name="line.175"></a>
179 <FONT color="green">176</FONT> public double[] getInterpolatedStateVariation()<a name="line.176"></a>
180 <FONT color="green">177</FONT> throws DerivativeException {<a name="line.177"></a>
181 <FONT color="green">178</FONT> // compute and ignore interpolated state<a name="line.178"></a>
182 <FONT color="green">179</FONT> // to make sure state variation is computed as a side effect<a name="line.179"></a>
183 <FONT color="green">180</FONT> getInterpolatedState();<a name="line.180"></a>
184 <FONT color="green">181</FONT> return stateVariation;<a name="line.181"></a>
185 <FONT color="green">182</FONT> }<a name="line.182"></a>
186 <FONT color="green">183</FONT> <a name="line.183"></a>
187 <FONT color="green">184</FONT> /** {@inheritDoc} */<a name="line.184"></a>
188 <FONT color="green">185</FONT> @Override<a name="line.185"></a>
189 <FONT color="green">186</FONT> protected void computeInterpolatedStateAndDerivatives(final double theta, final double oneMinusThetaH) {<a name="line.186"></a>
190 <FONT color="green">187</FONT> <a name="line.187"></a>
191 <FONT color="green">188</FONT> final double x = interpolatedTime - referenceTime;<a name="line.188"></a>
192 <FONT color="green">189</FONT> final double normalizedAbscissa = x / scalingH;<a name="line.189"></a>
193 <FONT color="green">190</FONT> <a name="line.190"></a>
194 <FONT color="green">191</FONT> Arrays.fill(stateVariation, 0.0);<a name="line.191"></a>
195 <FONT color="green">192</FONT> Arrays.fill(interpolatedDerivatives, 0.0);<a name="line.192"></a>
196 <FONT color="green">193</FONT> <a name="line.193"></a>
197 <FONT color="green">194</FONT> // apply Taylor formula from high order to low order,<a name="line.194"></a>
198 <FONT color="green">195</FONT> // for the sake of numerical accuracy<a name="line.195"></a>
199 <FONT color="green">196</FONT> final double[][] nData = nordsieck.getDataRef();<a name="line.196"></a>
200 <FONT color="green">197</FONT> for (int i = nData.length - 1; i &gt;= 0; --i) {<a name="line.197"></a>
201 <FONT color="green">198</FONT> final int order = i + 2;<a name="line.198"></a>
202 <FONT color="green">199</FONT> final double[] nDataI = nData[i];<a name="line.199"></a>
203 <FONT color="green">200</FONT> final double power = Math.pow(normalizedAbscissa, order);<a name="line.200"></a>
204 <FONT color="green">201</FONT> for (int j = 0; j &lt; nDataI.length; ++j) {<a name="line.201"></a>
205 <FONT color="green">202</FONT> final double d = nDataI[j] * power;<a name="line.202"></a>
206 <FONT color="green">203</FONT> stateVariation[j] += d;<a name="line.203"></a>
207 <FONT color="green">204</FONT> interpolatedDerivatives[j] += order * d;<a name="line.204"></a>
208 <FONT color="green">205</FONT> }<a name="line.205"></a>
209 <FONT color="green">206</FONT> }<a name="line.206"></a>
210 <FONT color="green">207</FONT> <a name="line.207"></a>
211 <FONT color="green">208</FONT> for (int j = 0; j &lt; currentState.length; ++j) {<a name="line.208"></a>
212 <FONT color="green">209</FONT> stateVariation[j] += scaled[j] * normalizedAbscissa;<a name="line.209"></a>
213 <FONT color="green">210</FONT> interpolatedState[j] = currentState[j] + stateVariation[j];<a name="line.210"></a>
214 <FONT color="green">211</FONT> interpolatedDerivatives[j] =<a name="line.211"></a>
215 <FONT color="green">212</FONT> (interpolatedDerivatives[j] + scaled[j] * normalizedAbscissa) / x;<a name="line.212"></a>
216 <FONT color="green">213</FONT> }<a name="line.213"></a>
217 <FONT color="green">214</FONT> <a name="line.214"></a>
218 <FONT color="green">215</FONT> }<a name="line.215"></a>
219 <FONT color="green">216</FONT> <a name="line.216"></a>
220 <FONT color="green">217</FONT> /** {@inheritDoc} */<a name="line.217"></a>
221 <FONT color="green">218</FONT> @Override<a name="line.218"></a>
222 <FONT color="green">219</FONT> public void writeExternal(final ObjectOutput out)<a name="line.219"></a>
223 <FONT color="green">220</FONT> throws IOException {<a name="line.220"></a>
224 <FONT color="green">221</FONT> <a name="line.221"></a>
225 <FONT color="green">222</FONT> // save the state of the base class<a name="line.222"></a>
226 <FONT color="green">223</FONT> writeBaseExternal(out);<a name="line.223"></a>
227 <FONT color="green">224</FONT> <a name="line.224"></a>
228 <FONT color="green">225</FONT> // save the local attributes<a name="line.225"></a>
229 <FONT color="green">226</FONT> out.writeDouble(scalingH);<a name="line.226"></a>
230 <FONT color="green">227</FONT> out.writeDouble(referenceTime);<a name="line.227"></a>
231 <FONT color="green">228</FONT> <a name="line.228"></a>
232 <FONT color="green">229</FONT> final int n = (currentState == null) ? -1 : currentState.length;<a name="line.229"></a>
233 <FONT color="green">230</FONT> if (scaled == null) {<a name="line.230"></a>
234 <FONT color="green">231</FONT> out.writeBoolean(false);<a name="line.231"></a>
235 <FONT color="green">232</FONT> } else {<a name="line.232"></a>
236 <FONT color="green">233</FONT> out.writeBoolean(true);<a name="line.233"></a>
237 <FONT color="green">234</FONT> for (int j = 0; j &lt; n; ++j) {<a name="line.234"></a>
238 <FONT color="green">235</FONT> out.writeDouble(scaled[j]);<a name="line.235"></a>
239 <FONT color="green">236</FONT> }<a name="line.236"></a>
240 <FONT color="green">237</FONT> }<a name="line.237"></a>
241 <FONT color="green">238</FONT> <a name="line.238"></a>
242 <FONT color="green">239</FONT> if (nordsieck == null) {<a name="line.239"></a>
243 <FONT color="green">240</FONT> out.writeBoolean(false);<a name="line.240"></a>
244 <FONT color="green">241</FONT> } else {<a name="line.241"></a>
245 <FONT color="green">242</FONT> out.writeBoolean(true);<a name="line.242"></a>
246 <FONT color="green">243</FONT> out.writeObject(nordsieck);<a name="line.243"></a>
247 <FONT color="green">244</FONT> }<a name="line.244"></a>
248 <FONT color="green">245</FONT> <a name="line.245"></a>
249 <FONT color="green">246</FONT> // we don't save state variation, it will be recomputed<a name="line.246"></a>
250 <FONT color="green">247</FONT> <a name="line.247"></a>
251 <FONT color="green">248</FONT> }<a name="line.248"></a>
252 <FONT color="green">249</FONT> <a name="line.249"></a>
253 <FONT color="green">250</FONT> /** {@inheritDoc} */<a name="line.250"></a>
254 <FONT color="green">251</FONT> @Override<a name="line.251"></a>
255 <FONT color="green">252</FONT> public void readExternal(final ObjectInput in)<a name="line.252"></a>
256 <FONT color="green">253</FONT> throws IOException, ClassNotFoundException {<a name="line.253"></a>
257 <FONT color="green">254</FONT> <a name="line.254"></a>
258 <FONT color="green">255</FONT> // read the base class<a name="line.255"></a>
259 <FONT color="green">256</FONT> final double t = readBaseExternal(in);<a name="line.256"></a>
260 <FONT color="green">257</FONT> <a name="line.257"></a>
261 <FONT color="green">258</FONT> // read the local attributes<a name="line.258"></a>
262 <FONT color="green">259</FONT> scalingH = in.readDouble();<a name="line.259"></a>
263 <FONT color="green">260</FONT> referenceTime = in.readDouble();<a name="line.260"></a>
264 <FONT color="green">261</FONT> <a name="line.261"></a>
265 <FONT color="green">262</FONT> final int n = (currentState == null) ? -1 : currentState.length;<a name="line.262"></a>
266 <FONT color="green">263</FONT> final boolean hasScaled = in.readBoolean();<a name="line.263"></a>
267 <FONT color="green">264</FONT> if (hasScaled) {<a name="line.264"></a>
268 <FONT color="green">265</FONT> scaled = new double[n];<a name="line.265"></a>
269 <FONT color="green">266</FONT> for (int j = 0; j &lt; n; ++j) {<a name="line.266"></a>
270 <FONT color="green">267</FONT> scaled[j] = in.readDouble();<a name="line.267"></a>
271 <FONT color="green">268</FONT> }<a name="line.268"></a>
272 <FONT color="green">269</FONT> } else {<a name="line.269"></a>
273 <FONT color="green">270</FONT> scaled = null;<a name="line.270"></a>
274 <FONT color="green">271</FONT> }<a name="line.271"></a>
275 <FONT color="green">272</FONT> <a name="line.272"></a>
276 <FONT color="green">273</FONT> final boolean hasNordsieck = in.readBoolean();<a name="line.273"></a>
277 <FONT color="green">274</FONT> if (hasNordsieck) {<a name="line.274"></a>
278 <FONT color="green">275</FONT> nordsieck = (Array2DRowRealMatrix) in.readObject();<a name="line.275"></a>
279 <FONT color="green">276</FONT> } else {<a name="line.276"></a>
280 <FONT color="green">277</FONT> nordsieck = null;<a name="line.277"></a>
281 <FONT color="green">278</FONT> }<a name="line.278"></a>
282 <FONT color="green">279</FONT> <a name="line.279"></a>
283 <FONT color="green">280</FONT> if (hasScaled &amp;&amp; hasNordsieck) {<a name="line.280"></a>
284 <FONT color="green">281</FONT> // we can now set the interpolated time and state<a name="line.281"></a>
285 <FONT color="green">282</FONT> stateVariation = new double[n];<a name="line.282"></a>
286 <FONT color="green">283</FONT> setInterpolatedTime(t);<a name="line.283"></a>
287 <FONT color="green">284</FONT> } else {<a name="line.284"></a>
288 <FONT color="green">285</FONT> stateVariation = null;<a name="line.285"></a>
289 <FONT color="green">286</FONT> }<a name="line.286"></a>
290 <FONT color="green">287</FONT> <a name="line.287"></a>
291 <FONT color="green">288</FONT> }<a name="line.288"></a>
292 <FONT color="green">289</FONT> <a name="line.289"></a>
293 <FONT color="green">290</FONT> }<a name="line.290"></a>
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354 </PRE>
355 </BODY>
356 </HTML>