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.0
Esta 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