annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/extreme/Curve.java @ 4259:5cc9453456a7

First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Oct 2012 17:25:37 +0200
parents 467efea19d15
children 2e8e00026059
rev   line source
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.artifacts.model.extreme;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import de.intevation.flys.artifacts.math.Function;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 import de.intevation.flys.artifacts.math.NaNFunction;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 import de.intevation.flys.artifacts.math.UnivariateRealFunctionFunction;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import de.intevation.flys.artifacts.math.fitting.FunctionFactory;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 import java.io.Serializable;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import java.lang.ref.SoftReference;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import org.apache.commons.math.analysis.interpolation.SplineInterpolator;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 import org.apache.commons.math.exception.MathIllegalArgumentException;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import org.apache.log4j.Logger;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 public class Curve
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 implements Serializable, Function
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 private static Logger log = Logger.getLogger(Curve.class);
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23
3737
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
24 protected double [] qs;
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
25 protected double [] ws;
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 protected String function;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 protected double [] coeffs;
4259
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
28 protected double chiSqr;
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 // The spline is pretty heavy weight so cache it with a soft ref only.
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 protected transient SoftReference<Function> spline;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 protected transient Function extrapolation;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 public Curve() {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36
3737
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
37 public Curve(
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
38 double [] qs,
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
39 double [] ws,
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
40 String function,
4259
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
41 double [] coeffs,
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
42 double chiSqr
3737
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
43 ) {
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
44 this.qs = qs;
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
45 this.ws = ws;
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 this.function = function;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 this.coeffs = coeffs;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49
3737
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
50 public double [] getQs() {
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
51 return qs;
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
52 }
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
53
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
54 public double [] getWs() {
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
55 return ws;
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 public String getFunction() {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 return function;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 public double [] getCoeffs() {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 return coeffs;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 @Override
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 public double value(double x) {
3737
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
68 if (x < qs[0]) return Double.NaN;
976be312a84c Simplified code for extreme curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3733
diff changeset
69 return (x <= qs[qs.length-1]
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 ? getSpline()
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 : getExtrapolation()).value(x);
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 protected synchronized Function getExtrapolation() {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 if (extrapolation == null) {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 de.intevation.flys.artifacts.math.fitting.Function
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 f = FunctionFactory.getInstance().getFunction(function);
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 extrapolation = f != null
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 ? f.instantiate(coeffs)
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 : NaNFunction.INSTANCE;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 return extrapolation;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85
4259
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
86 /**
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
87 * Gets the chiSqr for this instance.
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
88 *
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
89 * @return The chiSqr.
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
90 */
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
91 public double getChiSqr() {
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
92 return this.chiSqr;
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
93 }
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
94
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
95 /**
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
96 * Sets the chiSqr for this instance.
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
97 *
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
98 * @param chiSqr The chiSqr.
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
99 */
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
100 public void setChiSqr(double chiSqr) {
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
101 this.chiSqr = chiSqr;
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
102 }
5cc9453456a7 First complete but untested version of the 'Auslagerung extremer Wasserspiegellagen' calculation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 3742
diff changeset
103
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 protected synchronized Function getSpline() {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105 Function sp;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 if (spline != null) {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 if ((sp = spline.get()) != null) {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 return sp;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 }
3742
467efea19d15 Added type safety.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3737
diff changeset
111 spline = new SoftReference<Function>(sp = createSpline());
3733
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112 return sp;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115 protected Function createSpline() {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 SplineInterpolator interpolator = new SplineInterpolator();
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117 try {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 return new UnivariateRealFunctionFunction(
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119 interpolator.interpolate(qs, ws));
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
120 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121 catch (MathIllegalArgumentException miae) {
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122 log.debug("creation on spline failed", miae);
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 return NaNFunction.INSTANCE;
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 }
893b2477208f Some first models needed for the extreme waterlevels.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org