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 }

http://dive4elements.wald.intevation.org