Problema da distribuição de calor - Sistemas Paralelos e Distribuidos

Java

28/09/2016

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
Serafin

Serafin

Curtidas 0
POSTAR