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

org.fudaa.dodico.reflux.io.INPReaderV5P1 Maven / Gradle / Ivy

There is a newer version: 2.7
Show newest version
/*
 * @creation 21 mars 2003
 * @modification $Date: 2007-06-29 15:10:24 $
 * @license GNU General Public License 2
 * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
 * @mail [email protected]
 */
package org.fudaa.dodico.reflux.io;

import gnu.trove.TIntArrayList;

import java.io.IOException;

import com.memoire.fu.Fu;
import com.memoire.fu.FuLog;

import org.fudaa.ctulu.CtuluLibArray;

import org.fudaa.dodico.ef.EfNode;
import org.fudaa.dodico.h2d.H2dNodalPropertyMixteMutable;
import org.fudaa.dodico.h2d.reflux.H2dRefluxBordIndexGeneral;
import org.fudaa.dodico.h2d.reflux.H2dRefluxBoundaryConditionMutable;
import org.fudaa.dodico.h2d.resource.H2dResource;
import org.fudaa.dodico.h2d.type.H2dBcType;
import org.fudaa.dodico.h2d.type.H2dBoundaryType;
import org.fudaa.dodico.mesure.EvolutionReguliere;

/**
 * @author deniger
 * @version $Id: INPReaderV5P1.java,v 1.1 2007-06-29 15:10:24 deniger Exp $
 */
public class INPReaderV5P1 extends INPReaderAbstract {

  H2dRefluxBoundaryConditionMutable[] cl_;

  TIntArrayList elemWithNoGroup_;

  TIntArrayList[] groupeByElem_;

  /**
   * le reader : format par defaut (le dernier).
   */
  public INPReaderV5P1() {
    this(INPFileFormat.getInstance().getLastV5P1Impl());
  }

  /**
   * @param _f la version a utiliser.
   */
  public INPReaderV5P1(final RefluxINPV5P1Version _f) {
    super(_f);
  }

  @Override
  protected void analyzeElemMailEntete() {
    nbGroupElem_ = in_.intField(4);
    nbPropEle_ = in_.intField(5);
    groupeByElem_ = initArrayListForGroup();
    elemWithNoGroup_ = new TIntArrayList(50);
  }

  /**
   * D?ja cr?e dans le bloc POIN.
   */
  @Override
  protected H2dRefluxBoundaryConditionMutable[] createConditionLimites() {
    return cl_;
  }

  @Override
  protected int[][] defineGroupe(final TemplateGroupeElement[] _propElem) throws IOException {
    int nb;
    // cas bizarre rencontr? avec reflux V5P0: indice null= libre pour toutes les propri?t?s
    if (elemWithNoGroup_.size() > 0) {
      nb = elemWithNoGroup_.size();
      for (int i = 0; i < nb; i++) {
        int idx = elemWithNoGroup_.getQuick(i);
        for (int j = 0; j < nbPropEle_; j++) {
          _propElem[j].ajouteLibre(idx);
        }
      }
    }
    return CtuluLibArray.toArray(groupeByElem_);

  }

  @Override
  protected boolean finishCreationInElemBloc(int _idxElt, int _nbPtPerElement, H2dRefluxBordIndexGeneral _general) {
    if (_general != null) {
      int bordCode = in_.intField(_nbPtPerElement + 1);
      H2dBoundaryType bordType = version_.getBordType(bordCode);
      if (bordType != null) {
        if (Fu.DEBUG && FuLog.isDebug()) FuLog.debug("DRE: L3 n?= " + bordType.getName());
      } else {
        analyze_.addFatalError(H2dResource.getS("Code d'?l?ment inconnu") + "(" + bordCode + ")", in_.getLineNumber());
        addAnalyzeLigneLue();
        return false;
      }
      _general.setBord(bordType);
    }
    int gr = in_.intField(_nbPtPerElement + 2) - 1;
    if (gr < 0) elemWithNoGroup_.add(_idxElt);
    else
      groupeByElem_[gr].add(_idxElt);
    return true;

  }

  @Override
  protected boolean isElemBord(int _nbPtPerElement) {
    // le nouveau format de reflux indique le code de l'element en 8eme colonne
    return in_.intField(_nbPtPerElement + 1) != version_.getCodeFond();
  }

  @Override
  protected void readBlocElem() throws IOException {
    in_.analyzeCurrentLine(version_.getELEMFormat());
  }

  @Override
  protected EfNode[] readCoord() throws IOException {
    in_.readFields(version_.getCOORFormat());
    if (!"POIN".equals(in_.stringField(0))) {
      analyze_.addFatalError(H2dResource.getS("Le bloc des coordonn?es est introuvable"), in_.getLineNumber());
      addAnalyzeLigneLue();
      return null;
    }
    int nbCoord = in_.intField(2);
    if (nbCoord != 3) {
      analyze_.addFatalError(H2dResource.getS("Le nombre de coordonn?es doit ?tre ?gal ? 3"), in_.getLineNumber());
      addAnalyzeLigneLue();
      return null;
    }
    int nbPt = in_.intField(3);
    if (nbPt <= 0) {
      analyze_.addFatalError(H2dResource.getS("Le nombre de points est invalide"), in_.getLineNumber());
      addAnalyzeLigneLue();
      return null;
    }

    int nbPropNodal = in_.intField(5);
    // construction du maillage
    // SMaillageIndex maillage = new SMaillageIndex();
    final EfNode[] pts = new EfNode[nbPt];
    cl_ = new H2dRefluxBoundaryConditionMutable[nbPt];
    up_.setValue(10, nbPt);
    up_.majProgessionStateOnly(H2dResource.getS("Lecture des noeuds"));
    // l'indice dans les colonnes de la premieres donn?es concernant les props nodales
    final int idxDebPropNodal = 5;
    int nbPropNodalSup = nbPropNodal - 2;
    // normalement, reflux ne prevoit que 3 colonnes max, donc on aurait pu se passer du tableau
    // mais on ne sait jamais
    // la premiere colonne = angle
    // 2eme = debi
    // 3eme= precipitation
    // pas d'autre mais il se peut bien d'ou:
    H2dNodalPropertyMixteMutable[] propNodales = null;
    if (nbPropNodal > 2) {
      propNodales = new H2dNodalPropertyMixteMutable[nbPropNodalSup];
      propNodales[0] = new H2dNodalPropertyMixteMutable("precipitation", nbPt);
      for (int i = 1; i < nbPropNodalSup; i++) {
        propNodales[i] = new H2dNodalPropertyMixteMutable("col " + (nbPropNodal + i), nbPt);
      }
    }
    up_.majProgessionStateOnly("POIN");
    int idxPn = evolsPN_.size() + 1;
    up_.setValue(10, nbPt);
    for (int i = 0; i < nbPt; i++) {
      if (stop_) {
        return null;
      }
      // format libres
      in_.readFields();
      // le nombre de degre de liberte ( la 5eme colonne) ne sert a rien dans notre cas.
      // mis ici en commentaire au cas ou un jour cela serve.
      // int nbLiberte=in_.intField(4);
      pts[i] = new EfNode(in_.doubleField(1), in_.doubleField(2), in_.doubleField(3));
      int angleCode = in_.intField(idxDebPropNodal);
      if (angleCode == version_.getCodePermanent()) {
        cl_[i] = createDefaultCL();
        cl_[i].setIndexPt(i);
        cl_[i].setNormale(in_.doubleField(idxDebPropNodal + 1));
        int idxPrem = idxDebPropNodal + 2;
        int qCode = in_.intField(idxPrem);
        H2dBcType type = version_.getClType(qCode);
        if (type != H2dBcType.LIBRE) {
          // Pour r?cuperer la valeur du fichier inp
          cl_[i].setQTypePermanent(in_.doubleField(idxPrem + 1));
          if (type == H2dBcType.TRANSITOIRE) {
            EvolutionReguliere evol = new EvolutionReguliere("PN" + idxPn++);
            evolsPN_.add(evol);
            cl_[i].setQTransitoire(evol);
          }
        }
      }
      if (propNodales != null) {
        int idxPrem = idxDebPropNodal + 4;
        for (int j = 0; j < nbPropNodalSup; j++) {
          H2dBcType type = version_.getClType(in_.intField(idxPrem + (2 * j)));
          if (type == H2dBcType.PERMANENT) {
            propNodales[j].setFixed(i, in_.doubleField(idxPrem + (2 * j + 1)));
          } else if (type == H2dBcType.TRANSITOIRE) {
            EvolutionReguliere evol = new EvolutionReguliere("PN" + idxPn++);
            evolsPN_.add(evol);
            propNodales[j].setTransient(i, evol);
          }

        }
      }
      up_.majAvancement();
    }
    projet_.setPropNodales(propNodales);
    return pts;
  }

  // inutile dans ce format tout fait dans le bloc COORD/POIN
  @Override
  protected void readDLPN() throws IOException {}


  @Override
  protected boolean readPRELentete() throws IOException {
    return true;
  }

  /**
   * Deja fait dans le bloc COOR/POIN.
   */
  @Override
  protected boolean readPRND(H2dRefluxBoundaryConditionMutable[] _clTemp) throws IOException {
    return true;
  }

  @Override
  protected boolean readTPEL() throws IOException {
    return true;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy