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

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

The newest version!
package org.fudaa.dodico.telemac.io;

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

import org.fudaa.ctulu.CtuluActivity;
import org.fudaa.ctulu.CtuluLibFile;
import org.fudaa.ctulu.fileformat.FileFormatVersionInterface;
import org.fudaa.dodico.fortran.FileOpReadCharSimpleAbstract;
import org.fudaa.dodico.h2d.resource.H2dResource;

/**
 * Classe reader de fichier au format scope Gene, evolu? par rapport a s ou t. Utilise fortranReader
 *
 * @author Adrien Hadoux
 *
 */
public class ScopeReaderGene extends FileOpReadCharSimpleAbstract implements CtuluActivity {

  FileFormatVersionInterface v_;
  private String name_;
  ScopeKeyWord key = new ScopeKeyWord();
  private int nbOctets_;
  private String extension_;

  public ScopeReaderGene(final FileFormatVersionInterface _v) {
    v_ = _v;
  }

  @Override
  protected void processFile(final File _f) {
    name_ = CtuluLibFile.getSansExtension(_f.getName());
    nbOctets_ = (int) _f.length();
    extension_ = CtuluLibFile.getExtension(_f.getName());
  }

  @Override
  protected Object internalRead() {
    return readStructure();
  }

  @Override
  public void stop() {
  }

  public void setProgression(int val, String desc) {
    if (progress_ != null) {
      progress_.setProgression(val);
      progress_.setDesc(desc);
    }
  }

  /**
   * Lit selon l extension un format gen ou alors s ou t plsu simple a lire.
   *
   * @return
   */
  ScopeStructure.Gene readStructure() {

    if (super.in_ == null) {
      analyze_.addError(H2dResource.getS("Flux d'entr?e non trouv?"), 0);
      return null;
    }

    ScopeStructure.Gene structure = new ScopeStructure.Gene();



    try {
      if ((progress_ != null) && (nbOctets_ > 0)) {
        setProgression(0, H2dResource.getS("R?cup?ration des titres et nons des variables"));
      }

      // -- creation du type de courbe contenu dans les datas --//
      structure.type = extension_;

      // --on lit touts les titres tant qu il y a un com --//

      readHeader(structure);


      readVariable(structure);

      setProgression(30, H2dResource.getS("R?cup?ration des valeurs"));

      // --on lit le tableau IPARAM --//
      in_.readFields();
      final int MODE_ECLATE = in_.intField(0);
      final int SEPARATOR = in_.intField(1);

      int indicePasDeTemps = -1;

      in_.readFields();
      // -- on lit toutes les pas de temps --//
      try {
        while (true) {


          if (!key.isBlocCommentaireGENE(in_.getLine())) {

            if (MODE_ECLATE == 0) {

              readValuesModeNonEclate(structure, SEPARATOR);

            } else if (MODE_ECLATE == 1) {

              readValuesModeEclate(structure, SEPARATOR);

            } else {
              in_.readFields();
            }
          } else {
            in_.readFields();
          }
        }

      } catch (EOFException Exc) {
        return structure;
      }

    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }

  }

  public void readHeader(ScopeStructure.Gene structure) throws IOException {
    String ligne = null;
    do {
      in_.readFields();

      ligne = in_.getLine();
      // titre
      if (key.isBlocCommentaireGENE(ligne)) {
        structure.addTitle(ligne);
      }

    } while (key.isBlocCommentaireGENE(ligne));

  }

  public void readVariable(ScopeStructure.Gene structure) throws IOException {
    // --on lit le nombre de variables--//
    int nbVar = in_.intField(0);

    // -- on lit les params des pas de temps et on init les liste de var
    // associees
    for (int i = 0; i < nbVar; i++) {
      in_.readFields();

      structure.addVariable(in_.getLine());
    }
  }

  /**
   * MODE ECLATE 0 == toutes les valeurs des variabels sont sur la meme ligne
   *
   * @param structure
   * @param SEPARATOR
   * @param indicePasDeTemps
   * @throws IOException
   */
  public void readValuesModeNonEclate(ScopeStructure.Gene structure, int SEPARATOR)
          throws IOException {
    if (in_.getLine().startsWith(key.getScopeGENESeparator(SEPARATOR))) {

      // -- on est arriv? a une ligne de pas de temps, on ajoute le pas de temps
      // dans la structure --//
      String valuePasDetemps = in_.getLine();
      structure.addSeparator(valuePasDetemps);


      in_.readFields();

      // -- tant qu'on ne revient pas a un nouveau pas de temps on
      // ajoute les var --//
      while (!in_.getLine().startsWith(key.getScopeGENESeparator(SEPARATOR))) {
        if (!key.isBlocCommentaireGENE(in_.getLine())) {
          // ce sont des var on les ajoute toutes
          int nbFields = in_.getNumberOfFields();
          for (int i = 0; i < nbFields; i++) {
            // on inscrit la valeur pour la variable du pas de temps
            // correspondant
            double value = key.VALUE_UNDEFINED;
            if (!key.isUndefined(in_.stringField(i))) {
              value = in_.doubleField(i);
            }


            structure.addValueForVariableAtSeparator(value, i, valuePasDetemps);
          }
        }
        // on lit la suite
        in_.readFields();
      }

    } else {
      in_.readFields();
    }
  }

  /**
   * MODE ECLATE 1 == toutes les valeurs des variabels sont sur la meme ligne
   *
   * @param structure
   * @param SEPARATOR
   * @param indicePasDeTemps
   * @throws IOException
   */
  public void readValuesModeEclate(ScopeStructure.Gene structure, int SEPARATOR)
          throws IOException {
    if (in_.getLine().startsWith(key.getScopeGENESeparator(SEPARATOR))) {

      // -- on est arriv? a une ligne de pas de temps --//

      String valuePasDetemps = in_.getLine();
      structure.addSeparator(valuePasDetemps);

      in_.readFields();

      // -- tant qu'on ne revient pas a un nouveau pas de temps on
      // ajoute les var --//
      while (!in_.getLine().startsWith(key.getScopeGENESeparator(SEPARATOR))) {

        // -- il faut passer les lignes qui comencent par VARIABLE= ou
        // commentaire --//
        if (!key.isBlocCommentaireGENE(in_.getLine()) && !in_.getLine().startsWith("VARIABLE =")) {

          // ce sont des var on les lis ligne par ligne
          int indiceVar = 0;
          // tant qu on ne revient pas sur une ligne du type VAR=
          while (!in_.getLine().startsWith("VARIABLE =")) {


            // on inscrit la valeur pour la variable du pas de temps
            // correspondant
            double value = in_.doubleField(0);
            structure.addValueForVariableAtSeparator(value, indiceVar, valuePasDetemps);
            indiceVar++;

            // on lit la var suivante
            in_.readFields();
          }

        } else // on lit la suite
        {
          in_.readFields();
        }
      }

    }

  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy