とりあえず並列化について。
マルチコアなら並列化しないと、CPUがもったいないです。
こんな感じで、内側のループが独立しているところについて、Executorで並列処理するといいかも。
int procs = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors(); ExecutorService exec = Executors.newFixedThreadPool(procs); //粒子密度を計算しておく for(int idx = 0; idx < elementCount; ++idx){ final int i = idx; exec.execute(new Runnable() { public void run() { for(int j = 0; j < i; ++j){ double d = Math.sqrt( (elements[i].x - elements[j].x) * (elements[i].x - elements[j].x) + (elements[i].y - elements[j].y) * (elements[i].y - elements[j].y)); double wd = (d < relap * parcSize) ? parcSize * relap / d - 1 : 0; w[i][j] = wd; w[j][i] = wd; } } }); } try{ exec.shutdown(); exec.awaitTermination(3, TimeUnit.MINUTES); }catch(InterruptedException e){ }