Mercurial > dive4elements > river
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 : |