comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 402:eb22ffe4d74c

Implemented methods to retrieve and compute the data used to create discharge longitudinal sections. flys-artifacts/trunk@1843 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 06 May 2011 14:19:27 +0000
parents befedd7629d5
children 5d65fe4c08d5
comparison
equal deleted inserted replaced
401:34de11dcf355 402:eb22ffe4d74c
23 import de.intevation.flys.model.Gauge; 23 import de.intevation.flys.model.Gauge;
24 import de.intevation.flys.model.River; 24 import de.intevation.flys.model.River;
25 25
26 import de.intevation.flys.artifacts.states.DefaultState; 26 import de.intevation.flys.artifacts.states.DefaultState;
27 import de.intevation.flys.artifacts.context.FLYSContext; 27 import de.intevation.flys.artifacts.context.FLYSContext;
28 import de.intevation.flys.artifacts.math.BackJumpCorrector;
28 import de.intevation.flys.artifacts.model.MainValuesFactory; 29 import de.intevation.flys.artifacts.model.MainValuesFactory;
30 import de.intevation.flys.artifacts.model.WQCKms;
29 import de.intevation.flys.artifacts.model.WQDay; 31 import de.intevation.flys.artifacts.model.WQDay;
30 import de.intevation.flys.artifacts.model.WQKms; 32 import de.intevation.flys.artifacts.model.WQKms;
31 import de.intevation.flys.artifacts.model.WstValueTable; 33 import de.intevation.flys.artifacts.model.WstValueTable;
32 34
33 35
442 wqkms.add(ws[i], qs[i], location); 444 wqkms.add(ws[i], qs[i], location);
443 } 445 }
444 446
445 return wqkms; 447 return wqkms;
446 } 448 }
449
450
451 /**
452 * Returns the data computed by the discharge longitudinal section
453 * computation.
454 *
455 * @return an array of WQKms object - one object for each given Q value.
456 */
457 public WQKms[] getDischargeLongitudinalSectionData() {
458 logger.debug("WINFOArtifact.getDischargeLongitudinalSectionData");
459
460 River river = getRiver();
461 if (river == null) {
462 logger.error("No river selected.");
463 }
464
465 WstValueTable wst = WstValueTable.getTable(river);
466 if (wst == null) {
467 logger.error("No Wst found for selected river.");
468 }
469
470 double[][] dist = getSplittedDistance();
471 int num = dist != null ? dist.length : 0;
472
473 WQKms[][] wqkms = new WQKms[num][];
474
475 for (int i = 0; i < num; i++) {
476 double[] kms = getKms(dist[i]);
477 if (kms == null) {
478 // XXX maybe we should cancel this operation here.
479 continue;
480 }
481
482 double[] qs = getQs(dist[i]);
483 if (qs == null) {
484 logger.debug("Determine Q values based on a set of W values.");
485
486 double[] ws = getWs(dist[i]);
487 qs = getQsForWs(ws);
488 }
489
490 wqkms[i] = computeWaterlevelData(kms, qs, wst);
491 }
492
493 WQKms[] merged = WQKms.merge(wqkms);
494 int numMerged = merged.length;
495 WQKms[] computed = new WQKms[numMerged];
496
497 for (int i = 0; i < numMerged; i++) {
498 computed[i] = computeDischargeLongitudinalSectionData(merged[i]);
499 }
500
501 // TODO Introduce a caching mechanism here!
502
503 return computed;
504 }
505
506
507 /**
508 * Computes the data used for a discharge longitudinal section based on a
509 * given WQKms object. If there are backjumps while computing the data, a
510 * WQCKms object is returned, otherwise the incoming wqkms object.
511 *
512 * @param wqkms The WQKms object that contains W, Q and Kms.
513 *
514 * @return an instance of WQKms or WQCKms.
515 */
516 public static WQKms computeDischargeLongitudinalSectionData(WQKms wqkms) {
517 logger.info("WINFOArtifact.computeDischargeLongitudinalSectionData");
518
519 BackJumpCorrector bjc = new BackJumpCorrector();
520
521 bjc.doCorrection(wqkms.getKms(), wqkms.getWs());
522
523 if (bjc.hasBackJumps()) {
524 logger.info("Discharge longitudinal section has backjumps.");
525 return new WQCKms(
526 wqkms.getKms(),
527 wqkms.getQs(),
528 wqkms.getWs(),
529 bjc.getCorrected());
530 }
531 else {
532 logger.info("Discharge longitudinal section has no backjumps.");
533 return wqkms;
534 }
535 }
447 } 536 }
448 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 537 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org