package ejemplos;

import java.io.*;
import java.util.*;
import javax.swing.*;

/**
 * Programa para leer Un archivo en formato Pspice
 * Lee los datos de un archivo y soluciona el circuito.
 * Copyright: Copyright (c) 2003
 * Company: UMSNH
 * @author Dr. Felix Calderon Solorio.
 * @version 1.0
 */

public class ej028 {
  public static void main(String[] args)
  {

    int nodos;
    String archivo = "resnick.txt";
    nodos = NumNodos(archivo);
    Matriz G = new Matriz(nodos, nodos);
    Matriz I = new Matriz(nodos, 1);
    Matriz v = new Matriz(nodos, 1);

    LlenaSistema(G, I, archivo);
    G.imprime();
    I.imprime();
    v.eliminacion_gaussiana(G, I);
    G.imprime();
    v.sustitucion_hacia_atras(G, I);
    v.imprime();
  }

  public static int NumNodos(String archivo) {
    StringTokenizer st;
    String linea, elemento, inicio, fin;
    int nodos = 0, val;

    try {
      RandomAccessFile DIS = new RandomAccessFile(archivo, "r");

      while ( (linea = DIS.readLine()) != null) {
        st = new StringTokenizer(linea);
        if (st.countTokens() != 0) {

          elemento = st.nextToken();
          inicio   = st.nextToken();
          fin      = st.nextToken();

          val = (int) Double.valueOf(inicio).doubleValue();
          if(val > nodos) nodos = val;

          val = (int) Double.valueOf(fin).doubleValue();
          if(val > nodos) nodos = val;
        }

      }
      DIS.close();
    }
    catch (IOException e) {
      JOptionPane.showMessageDialog(null, "Error" + e.toString(), "ERROR",
                                    JOptionPane.ERROR_MESSAGE);
    }
    return nodos;
  }

  // ***********************************************************************

  public static void LlenaSistema(Matriz G, Matriz I, String archivo) {
    StringTokenizer st;
    String linea, elemento, inicio, fin, valor;
    char tipo ;
    int i, j;
    double val;

    try {
      RandomAccessFile DIS = new RandomAccessFile(archivo, "r");

      while ( (linea = DIS.readLine()) != null) {
        st = new StringTokenizer(linea);
        if (st.countTokens() != 0) {

          elemento = st.nextToken();
          inicio   = st.nextToken();
          fin      = st.nextToken();
          valor    = st.nextToken();

          tipo = elemento.charAt(0);
          i   = (int) Double.valueOf(inicio).doubleValue();
          j   = (int) Double.valueOf(fin).doubleValue();
          val =       Double.valueOf(valor).doubleValue();

          switch(tipo)
          {
            case 'R': case 'r':
              if(i!=0 && j != 0)
              {
                G.datos[i - 1][j - 1] -= 1.0/val;
                G.datos[j - 1][i - 1] -= 1.0/val;
              }
              if(i!=0) G.datos[i-1][i-1] += 1.0/val;
              if(j!=0) G.datos[j-1][j-1] += 1.0/val;
             break;

             case 'I': case 'i':
               if(i!=0) I.datos[i-1][0] -= val;
               if(j!=0) I.datos[j-1][0] += val;
               break;

             case 'V': case 'v':
               val = val / 1e-06;
               if(i!=0) I.datos[i-1][0] -= val;
               if(j!=0) I.datos[j-1][0] += val;

               val = 1e+06;

               if(i!=0 && j != 0)
               {
                 G.datos[i - 1][j - 1] -= val;
                 G.datos[j - 1][i - 1] -= val;
               }
               if(i!=0) G.datos[i-1][i-1] += val;
               if(j!=0) G.datos[j-1][j-1] += val;
          }
        }

      }
      DIS.close();
    }
    catch (IOException e) {
      JOptionPane.showMessageDialog(null, "Error" + e.toString(), "ERROR",
                                    JOptionPane.ERROR_MESSAGE);
    }
  }
}