Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java @ 427:909196be11a0
First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
flys-artifacts/trunk@1925 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 15 May 2011 21:08:41 +0000 |
parents | c6b7ca0febcb |
children | 5d65fe4c08d5 |
comparison
equal
deleted
inserted
replaced
426:c6b7ca0febcb | 427:909196be11a0 |
---|---|
3 import java.io.Serializable; | 3 import java.io.Serializable; |
4 | 4 |
5 import de.intevation.flys.model.River; | 5 import de.intevation.flys.model.River; |
6 import de.intevation.flys.model.Wst; | 6 import de.intevation.flys.model.Wst; |
7 import de.intevation.flys.model.WstColumn; | 7 import de.intevation.flys.model.WstColumn; |
8 | |
9 import de.intevation.flys.artifacts.math.LinearRemap; | |
8 | 10 |
9 import de.intevation.flys.artifacts.cache.CacheFactory; | 11 import de.intevation.flys.artifacts.cache.CacheFactory; |
10 | 12 |
11 import de.intevation.flys.backend.SessionHolder; | 13 import de.intevation.flys.backend.SessionHolder; |
12 | 14 |
439 } | 441 } |
440 | 442 |
441 oqs[index] = weight(kmWeight, oq, tq); | 443 oqs[index] = weight(kmWeight, oq, tq); |
442 ows[index] = weight(kmWeight, ow, tw); | 444 ows[index] = weight(kmWeight, ow, tw); |
443 } | 445 } |
446 | |
447 public void storeWQ( | |
448 QPosition qPosition, | |
449 LinearRemap remap, | |
450 double [] ows, | |
451 double [] oqs, | |
452 int index | |
453 ) { | |
454 int qIdx = qPosition.index; | |
455 double qWeight = qPosition.weight; | |
456 | |
457 oqs[index] = remap.eval(km, qWeight == 1.0 | |
458 ? qs[qIdx] | |
459 : weight(qWeight, qs[qIdx-1], qs[qIdx])); | |
460 | |
461 ows[index] = interpolateW(oqs[index]); | |
462 } | |
463 | |
464 public void storeWQ( | |
465 Row other, | |
466 double km, | |
467 QPosition qPosition, | |
468 LinearRemap remap, | |
469 double [] ows, | |
470 double [] oqs, | |
471 int index | |
472 ) { | |
473 double kmWeight = factor(km, this.km, other.km); | |
474 | |
475 double tq, tw; | |
476 double oq, ow; | |
477 | |
478 int qIdx = qPosition.index; | |
479 double qWeight = qPosition.weight; | |
480 | |
481 if (qWeight == 1.0) { | |
482 tq = remap.eval(this.km, qs[qIdx]); | |
483 oq = remap.eval(other.km, other.qs[qIdx]); | |
484 } | |
485 else { | |
486 tq = remap.eval( | |
487 this.km, | |
488 weight(qWeight, qs[qIdx-1], qs[qIdx])); | |
489 oq = remap.eval( | |
490 other.km, | |
491 weight(qWeight, other.qs[qIdx-1], other.qs[qIdx])); | |
492 } | |
493 | |
494 tw = interpolateW(tq); | |
495 ow = other.interpolateW(oq); | |
496 | |
497 oqs[index] = weight(kmWeight, oq, tq); | |
498 ows[index] = weight(kmWeight, ow, tw); | |
499 } | |
444 } | 500 } |
445 // class Row | 501 // class Row |
446 | 502 |
447 protected List<Row> rows; | 503 protected List<Row> rows; |
448 | 504 |
513 Row r2 = rows.get(rowIndex); | 569 Row r2 = rows.get(rowIndex); |
514 | 570 |
515 return r1.interpolateWQ(r2, km, steps); | 571 return r1.interpolateWQ(r2, km, steps); |
516 } | 572 } |
517 | 573 |
518 public boolean interpolate( | 574 public void interpolate( |
575 double [] kms, | |
576 double [] ws, | |
577 double [] qs, | |
578 QPosition qPosition, | |
579 LinearRemap remap | |
580 ) { | |
581 int R1 = rows.size()-1; | |
582 | |
583 Row kmKey = new Row(); | |
584 for (int i = 0; i < kms.length; ++i) { | |
585 kmKey.km = kms[i]; | |
586 int rowIndex = Collections.binarySearch(rows, kmKey); | |
587 | |
588 if (rowIndex >= 0) { | |
589 // direct row match | |
590 rows.get(rowIndex).storeWQ(qPosition, remap, ws, qs, i); | |
591 continue; | |
592 } | |
593 | |
594 rowIndex = -rowIndex -1; | |
595 | |
596 if (rowIndex < 1 || rowIndex >= R1) { | |
597 // do not extrapolate | |
598 ws[i] = qs[i] = Double.NaN; | |
599 continue; | |
600 } | |
601 Row r1 = rows.get(rowIndex-1); | |
602 Row r2 = rows.get(rowIndex); | |
603 r1.storeWQ(r2, kms[i], qPosition, remap, ws, qs, i); | |
604 } | |
605 } | |
606 | |
607 public QPosition interpolate( | |
519 double q, | 608 double q, |
520 int referenceIndex, | 609 int referenceIndex, |
521 double [] kms, | 610 double [] kms, |
522 double [] ws, | 611 double [] ws, |
523 double [] qs | 612 double [] qs |
536 else { | 625 else { |
537 rowIndex = -rowIndex -1; | 626 rowIndex = -rowIndex -1; |
538 | 627 |
539 if (rowIndex < 1 || rowIndex >= R1) { | 628 if (rowIndex < 1 || rowIndex >= R1) { |
540 // do not extrapolate | 629 // do not extrapolate |
541 return false; | 630 return null; |
542 } | 631 } |
543 | 632 |
544 // interpolation case | 633 // interpolation case |
545 Row r1 = rows.get(rowIndex-1); | 634 Row r1 = rows.get(rowIndex-1); |
546 Row r2 = rows.get(rowIndex); | 635 Row r2 = rows.get(rowIndex); |
548 qPosition = r1.getQPosition(r2, kms[referenceIndex], q); | 637 qPosition = r1.getQPosition(r2, kms[referenceIndex], q); |
549 } | 638 } |
550 | 639 |
551 if (qPosition == null) { | 640 if (qPosition == null) { |
552 // we cannot locate q in reference row | 641 // we cannot locate q in reference row |
553 return false; | 642 return null; |
554 } | 643 } |
555 | 644 |
556 for (int i = 0; i < kms.length; ++i) { | 645 for (int i = 0; i < kms.length; ++i) { |
557 kmKey.km = kms[i]; | 646 kmKey.km = kms[i]; |
558 rowIndex = Collections.binarySearch(rows, kmKey); | 647 rowIndex = Collections.binarySearch(rows, kmKey); |
573 Row r1 = rows.get(rowIndex-1); | 662 Row r1 = rows.get(rowIndex-1); |
574 Row r2 = rows.get(rowIndex); | 663 Row r2 = rows.get(rowIndex); |
575 r1.storeWQ(r2, kms[i], qPosition, ws, qs, i); | 664 r1.storeWQ(r2, kms[i], qPosition, ws, qs, i); |
576 } | 665 } |
577 | 666 |
578 return true; | 667 return qPosition; |
579 } | 668 } |
580 | 669 |
581 public static WstValueTable getTable(River river) { | 670 public static WstValueTable getTable(River river) { |
582 return getTable(river, 0); | 671 return getTable(river, 0); |
583 } | 672 } |