@Serafin escreveu:
Pessoal, preciso fazer um trabalho sobre o Mapa de Distribuição de calor e estou tendo algumas dificuldades. Segue abaixo o que precisa ser feito:
"Desenvolver um programa paralelo (usando threads ou subprocessos comunicantes) que receba como entrada uma grade inicial com valores de temperatura e execute um número de passos da equação 1 e, ao fim, apresente a matriz de saída. A entrada pode ser feita a partir de um arquivo no seguinte formato:
2 2
0.4 2.1
-0.1 2.0Esta entrada indica que o arquivo contém uma grade 2 2 com os valores 0:4 e 2:1 na primeira linha e 0:1 e 2:0 na
segunda. A saída pode utilizar este mesmo formato, guardando em um arquivo o resultado.
A quantidade de passos a efetuar e a quantidade de tarefas a criar podem ser solicitadas durante a execução."Abaixo segue o que eu consegui até o momento, porém travei, não sei mais o que fazer agora hehe. Alguém tem alguma sugestão ou exemplo?
E-mail: serafinpuc@gmail.com
LeitorArquivo.java import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class LeitorArquivo { private FileReader fr; private BufferedReader br; public LeitorArquivo() { try { String caminho = new File("").getAbsolutePath(); caminho = caminho + File.separator + "src\\TestInput"; this.fr = new FileReader(new File(caminho)); this.br = new BufferedReader(this.fr); } catch (FileNotFoundException ex) { System.out.println("Arquivo não encontrado."); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } public FileReader abreArquivo() { try { String caminho = new File("").getAbsolutePath(); caminho = caminho + File.separator + "src\\TestInput"; FileReader fr = new FileReader(new File(caminho)); return fr; } catch (FileNotFoundException ex) { System.out.println("Arquivo não encontrado."); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } return null; } public String lePrimeiraLinha() throws IOException { String strTexto; strTexto = this.br.readLine(); return strTexto; } public String leArquivo() throws IOException { String strTexto = ""; BufferedReader br = new BufferedReader(fr); strTexto = br.readLine(); return strTexto; } public double[][] montaMatriz(int nRow, int nCol) throws IOException { int cntLinha = 0; double[][] matrix = new double[nRow][nCol]; for (String line; (line = this.br.readLine()) != null;) { String[] lMatrix = line.split(" "); for (int k = 0; k < lMatrix.length; k++) { String tmp = lMatrix[k]; try { matrix[cntLinha][k] = Double.parseDouble(tmp); } catch (NumberFormatException ne) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ne); } } cntLinha++; } return matrix; } public void imprimeMatriz(double[][] matrix, int nRow, int nCol) { System.out.println("\tCol 0\tCol 1\tCol 2\tCol 3\tCol 4\tCol 5\tCol 6\tCol 7\tCol 8\tCol 9\tCol 10"); for (int i = 0; i < nRow; i++) { System.out.print("Lin "+ i + ":\t"); for (int j = 0; j < nCol; j++) { System.out.print(matrix[i][j] + "\t"); } System.out.println(""); } } } ============================ ThermalProcessor.java import java.text.DecimalFormat; public class ThermalProcessor { public void calculaTemperatura(double[][] matrix) { int xi, yi; int TAMX = 11, TAMY = 11, STEPS = 1000; double[][] novaMatriz = new double[TAMX][TAMY]; //Cx e Cy são fatores que indicam quão rápido o calor dissipa entre as posições da grade. double cx = 0.1, cy = 0.1; String tmpValorPos; double vizinhoEsq, vizinhoDir, vizinhoCima, vizinhoBaixo, centro; DecimalFormat formato = new DecimalFormat("#.###"); // inicializa U0 for (int ts = 0; ts < STEPS; ts++) { for (yi = 1; yi < TAMY - 1; yi++) { for (xi = 1; xi < TAMX - 1; xi++) { //Captura e guarda os valores dos vizinhos vizinhoEsq = matrix[xi - 1][yi]; vizinhoDir = matrix[xi + 1][yi]; vizinhoCima = matrix[xi][yi + 1]; vizinhoBaixo = matrix[xi][yi - 1]; centro = matrix[xi][yi]; //novaMatriz[xi][yi] = Double.parseDouble(formato.format(centro tmpValorPos = formato.format(centro + cx * (vizinhoEsq + vizinhoDir - (2.0 * centro)) + cy * (vizinhoBaixo + vizinhoCima - (2.0 * centro)) ); tmpValorPos = tmpValorPos.replace(",", "."); novaMatriz[xi][yi] = Double.parseDouble(tmpValorPos); } } matrix = novaMatriz; System.out.println("Calor dissipado após passo: " + (ts + 1)); imprimeMatriz(novaMatriz, TAMX, TAMY); } } public void imprimeMatriz(double[][] matrix, int nRow, int nCol) { System.out.println("\tCol 0\tCol 1\tCol 2\tCol 3\tCol 4\tCol 5\tCol 6\tCol 7\tCol 8\tCol 9\tCol 10"); for (int i = 0; i < nRow; i++) { System.out.print("Lin "+ i + ":\t"); for (int j = 0; j < nCol; j++) { System.out.print(matrix[i][j] + "\t"); } System.out.println(""); } } } ============================= Main.java import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { LeitorArquivo leitor = new LeitorArquivo(); String[] vDef = leitor.lePrimeiraLinha().split(" "); int nRow = Integer.parseInt(vDef[0]); int nCol = Integer.parseInt(vDef[1]); double[][] matrix = new double[nRow][nCol]; matrix = leitor.montaMatriz(nRow, nCol); leitor.imprimeMatriz(matrix, nRow, nCol); ThermalProcessor tp = new ThermalProcessor(); tp.calculaTemperatura(matrix); } }
Aqui, o arquivo com os numeros testados até o momento.
11 11
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 40 1 1 1 1 1
1 1 1 1 30 50 10 1 1 1 1
1 1 1 1 1 20 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
Mensagens: 1
Participantes: 1