All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fudaa.dodico.telemac.io.TelemacSeuilSiphonReader Maven / Gradle / Ivy

The newest version!
/**
 * @creation 29 nov. 2004
 * @modification $Date: 2006-09-19 14:45:49 $
 * @license GNU General Public License 2
 * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
 * @mail [email protected]
 */
package org.fudaa.dodico.telemac.io;

import java.io.EOFException;
import java.io.IOException;

import org.fudaa.ctulu.CtuluLibMessage;
import org.fudaa.ctulu.CtuluLibString;

import org.fudaa.dodico.fortran.FileOpReadCharSimpleAbstract;
import org.fudaa.dodico.h2d.resource.H2dResource;

/**
 * @author Fred Deniger
 * @version $Id: TelemacSeuilSiphonReader.java,v 1.8 2006-09-19 14:45:49 deniger Exp $
 */
public class TelemacSeuilSiphonReader extends FileOpReadCharSimpleAbstract {

  boolean containsSeuil_;

  public final boolean isContainsSeuil() {
    return containsSeuil_;
  }

  public final void setContainsSeuil(final boolean _containsSeuil) {
    containsSeuil_ = _containsSeuil;
  }

  @Override
  protected Object internalRead() {
    TelemacSeuilSiphonContainer cont = null;
    try {

      if (containsSeuil_) {
        cont = readSeuils();
      }

      in_.setJumpBlankLine(true);
      // Le commentaire du d?but des siphons
      in_.readLine();
      in_.setJumpBlankLine(false);
      in_.readFields();
      if (cont == null) {
        cont = new TelemacSeuilSiphonContainer();
      }
      cont.relaxation_ = in_.doubleField(0);
      final int nbSiphon = in_.intField(1);
      // les entetes
      in_.readLine();
      cont.siphons_ = new TelemacSiphonItem[nbSiphon];
      int count = 0;
      for (int i = 0; i < nbSiphon; i++) {
        in_.readFields();
        if (in_.getNumberOfFields() != 14) {
          analyze_.addError(H2dResource.getS("Le nombre de valeurs pour le siphon {0} n'est pas valide", CtuluLibString
              .getString(i + 1)), in_.getLineNumber());
          continue;

        }
        final TelemacSiphonItem it = new TelemacSiphonItem();
        cont.siphons_[count++] = it;
        int idx = 0;
        it.i1_ = in_.intField(idx++) - 1;
        it.i2_ = in_.intField(idx++) - 1;
        it.d1_ = in_.doubleField(idx++);
        it.d2_ = in_.doubleField(idx++);
        it.ce1_ = in_.doubleField(idx++);
        it.ce2_ = in_.doubleField(idx++);
        it.cs1_ = in_.doubleField(idx++);
        it.cs2_ = in_.doubleField(idx++);
        it.s12_ = in_.doubleField(idx++);
        it.l12_ = in_.doubleField(idx++);
        it.z1_ = in_.doubleField(idx++);
        it.z2_ = in_.doubleField(idx++);
        it.a1_ = in_.doubleField(idx++);
        it.a2_ = in_.doubleField(idx++);

      }
      if (count != nbSiphon) {
        final TelemacSiphonItem[] save = cont.siphons_;
        cont.siphons_ = new TelemacSiphonItem[count];
        System.arraycopy(save, 0, cont.siphons_, 0, count);
      }
    } catch (final EOFException e) {
      CtuluLibMessage.debug("Fin du fichier");
    } catch (final IOException _e) {
      // exception ajoutee a l'analyseur
      analyze_.manageException(_e);
    } catch (final NumberFormatException _fmt) {
      analyze_.addError(H2dResource.getS("Ce fichier n'est pas un fichier seuil/siphon"), -1);
      return null;
    }
    return cont;
  }

  private TelemacSeuilSiphonContainer readSeuils() throws IOException {
    TelemacSeuilSiphonContainer cont;
    // premiere ligne de commentaire lue
    in_.readLine();
    // la ligne doit comporter 2 valeurs
    // on ne sait pas encore ce que c'est : seuil ou syphon
    in_.readFields();
    final double v1 = in_.doubleField(0);
    final double v2 = in_.doubleField(1);
    cont = new TelemacSeuilSiphonContainer();
    final int nbSeuil = (int) v1;
    cont.optionTraitementVitesseT_ = (int) v2;
    cont.seuils_ = new TelemacSeuilItem[nbSeuil];
    int count = 0;
    for (int i = 0; i < nbSeuil; i++) {
      // ------- singularite 1
      in_.readLine();
      // nb de Points
      in_.readLine();
      in_.readFields();
      // Lecture du nombre de point
      final int nbPoint = in_.intField(0);
      // Points cotes 1
      in_.readLine();
      in_.readFields();
      boolean valide = true;
      if (in_.getNumberOfFields() != nbPoint) {
        analyze_.addError(H2dResource.getS("Le nombre de points annonc?s pour le seuil {0} n'est pas valide",
            CtuluLibString.getString(i + 1)), in_.getLineNumber());
        valide = false;
      }
      final TelemacSeuilItem it = valide ? new TelemacSeuilItem() : null;
      if (valide) {
        it.idxPt1_ = new int[nbPoint];
        it.idxPt2_ = new int[nbPoint];
        for (int j = 0; j < nbPoint; j++) {
          // les indices commencent a zero
          it.idxPt1_[j] = in_.intField(j) - 1;
        }
      }
      // Points cotes 2
      in_.readLine();
      in_.readFields();
      if (in_.getNumberOfFields() != nbPoint) {
        analyze_.addError(H2dResource.getS("Le nombre de points annonc?s pour le seuil {0} n'est pas valide",
            CtuluLibString.getString(i + 1)), in_.getLineNumber());
        valide = false;
      }
      if (valide) {
        for (int j = 0; j < nbPoint; j++) {
          // les indices commencent a zero
          it.idxPt2_[j] = in_.intField(j) - 1;
        }
        cont.seuils_[count++] = it;
      }
      // Cotes de digues
      in_.readLine();
      in_.readFields();
      if (in_.getNumberOfFields() != nbPoint) {
        analyze_.addError(H2dResource.getS("Le nombre de points utilis?s pour la c?te du seuil {0} n'est pas valide",
            CtuluLibString.getString(i + 1)), in_.getLineNumber());
      }
      it.cotes_ = new double[nbPoint];
      int max = Math.min(nbPoint, in_.getNumberOfFields());
      for (int j = 0; j < max; j++) {
        // les indices commencent a zero
        it.cotes_[j] = in_.doubleField(j);
      }
      // Coefficient de d?bit
      in_.readLine();
      in_.readFields();
      if (in_.getNumberOfFields() != nbPoint) {
        analyze_.addError(H2dResource.getS("Le nombre de points utilis?s pour le d?bit du seuil {0} n'est pas valide",
            CtuluLibString.getString(i + 1)), in_.getLineNumber());
      }
      it.debit_ = new double[nbPoint];
      max = Math.min(nbPoint, in_.getNumberOfFields());
      for (int j = 0; j < max; j++) {
        // les indices commencent a zero
        it.debit_[j] = in_.doubleField(j);
      }
    }
    if (count != cont.seuils_.length) {
      final TelemacSeuilItem[] save = cont.seuils_;
      cont.seuils_ = new TelemacSeuilItem[count];
      System.arraycopy(save, 0, cont.seuils_, 0, count);
    }
    return cont;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy