2016-12-11 17 views
1

私は2次元のLid-Driven Cavity Flowと呼ばれるものをシミュレートするMatlabコードを持っています。このコードでは、私は、以下の構造を有する:Matlab:マル​​チスレッド/並列計算を使用してコードを実行するには?

for i = 1:timeStep 
    %Lets call this Part 1 
    for a1 = 1:N 
    for b1 = 1:N 
    %calculates things 
    end 
    end 
    %Lets call this Part 2 
    for a2 = 1:N 
    for b2 = 1:N 
    %calculates things 
    end 
    end 
    %Lets call this Part 3 
    for a3 = 1:N 
    for b3 = 1:N 
    %calculates things 
    end 
    end 
end 

パート1、パート2およびパート3ので、私は並列に計算するよう、またはマルチスレッドそれらをあろう互いにPF独立しているが、すべての時間がありますtimeStep(1次forループのすべての反復)。私はこれを達成する方法はありますか? ありがとう!あなたが並行してジョブを実行するためのparforを使用することができます

Nx = 50; 
Ny = 50; 
numTimesteps = 10000; 
reynoldsNum = 1000; 
dt = 0.0025; 
numIter = 100000; 
Beta = 1.5; 
maxErr = 0.001; 
ds = 1/(Nx + 1); 
x1 = 0:ds:1; 
x2 = 0:ds:1; 
time = 0; 
boundarySpeed = 1; 

PHI = zeros(Nx+2, Ny+2); 
OMEGA = zeros(Nx+2, Ny+2); 
U = zeros(Nx+2, Ny+2); 
V = zeros(Nx+2, Ny+2); 
x2d = zeros(Nx+2, Ny+2); 
y2d = zeros(Nx+2, Ny+2); 
PRESSURE = zeros(Nx+2, Ny+2); 
B = zeros(Nx+2, Ny+2); 
pressureOLD = zeros(Nx+2, Ny+2); 
W = zeros(Nx+2, Ny+2); 

for i = 1:Nx+2 
    for j = 1:Ny+2 
     x2d(i,j) = x1(i); 
     y2d(i,j) = x2(j); 
    end 
end 

for timeStep = 1:numTimesteps 

    if(mod(timeStep,10000) == 0) 
     disp(timeStep); 
    end 

    OLDPHI = PHI; 
    OLDOMEGA = OMEGA; 
    OLDPRESSURE = PRESSURE; 

    parfor parJob = 1:4 

     switch parJob 
%{ 
---------------------------------- 
    STREAM FUNCTION CALCULATION 
---------------------------------- 
%} 
     case 1 
     for iter = 1:numIter 
      ERRMATRIX = OLDPHI; 
      for i = 2:Nx+1 
       for j = 2:Ny+1 
        PHI(i,j) = (1/4) * Beta * (OLDPHI(i+1,j) + OLDPHI(i-1,j) + OLDPHI(i,j+1) + OLDPHI(i,j-1) + ... 
           ds * ds * OLDOMEGA(i,j)) + (1 - Beta) * OLDPHI(i,j); 
       end 
      end 
      Err = 0; 
      for i = 1:Nx+2 
       for j = 1:Ny+2 
        Err = Err + abs(ERRMATRIX(i,j) - PHI(i,j)); 
       end 
      end 
      if (Err <= maxErr) 
       break; 
      end 
      OLDPHI = PHI; 
     end 
%{ 
---------------------------------- 
BOUNDARY CONDITIONS FOR VORTICITY 
---------------------------------- 
%} 
     case 2 
     for i = 2:Nx+1 
      for j = 2:Ny+1 
       OMEGA(i,1) = -2 * OLDPHI(i,2)/(ds * ds); % bottom wall 
       OMEGA(i,Ny+2) = -2 * OLDPHI(i,Ny+1)/(ds * ds) - 2 * boundarySpeed/ds; % top wall 
       OMEGA(1,j) = -2 * OLDPHI(2,j)/(ds * ds); % right wall 
       OMEGA(Nx+2,j) = -2 * OLDPHI(Nx+1,j)/(ds * ds); % left wall 
      end 
     end 
%{ 
---------------------------------- 
    VORTICITY CALCULATIONS 
---------------------------------- 
%} 
     for i = 2:Nx+1 
      for j = 2:Ny+1 
       W(i,j) = -(1/4) * ((OLDPHI(i,j+1) - OLDPHI(i,j-1)) * (OLDOMEGA(i+1,j) - OLDOMEGA(i-1,j)) ... 
         - (OLDPHI(i+1,j) - OLDPHI(i-1,j)) * (OLDOMEGA(i,j+1) - OLDOMEGA(i,j-1)))/(ds * ds) ... 
         +(1/reynoldsNum) * (OLDOMEGA(i+1,j) + OLDOMEGA(i-1,j) + OLDOMEGA(i,j+1) + ... 
         OLDOMEGA(i,j-1) - 4 * OLDOMEGA(i,j))/(ds * ds); 

      end 
     end 

     OMEGA(2:Nx+1,2:Ny+1) = OLDOMEGA(2:Nx+1,2:Ny+1) + dt * W(2:Nx+1,2:Ny+1); 

     time = time + dt; 

     for i = 1:Nx 
      for j = 1:Ny 
       x2d(i,j) = x1(i); 
       y2d(i,j) = x2(j); 
      end 
     end 

%{ 
---------------------------------- 
     U AND V CALCULATIONS 
---------------------------------- 
%} 
     case 3 
     for i = 2:Nx+1 
      for j = 2:Ny+1 
       U(i,j) = (OLDPHI(i,j+1) - OLDPHI(i,j))/(2 * ds); 
       V(i,j) = -(OLDPHI(i+1,j) - OLDPHI(i,j))/(2 * ds); 
       U(:,Ny+2) = 1; 
       V(Nx+2,:) = 0.0; 
      end 
     end 
%{ 
---------------------------------- 
     PRESSURE CALCULATIONS 
---------------------------------- 
%} 
     otherwise 
     for i = 2:Nx+1 
      for j = 2:Ny+1 
       PRESSURE(i,j) = (1/4) * (pressureOLD(i+1,j) + pressureOLD(i-1,j) + pressureOLD(i,j+1) ... 
           + pressureOLD(i,j-1)) - (1/2) * (((((OLDPHI(i-1,j) - 2 * OLDPHI(i,j) + ... 
           OLDPHI(i+1,j))/(ds^2)) * ((OLDPHI(i,j-1) - 2 * OLDPHI(i,j) + OLDPHI(i,j+1))/(ds^2))) ... 
           - (OLDPHI(i+1,j+1) - OLDPHI(i+1,j-1) - OLDPHI(i-1,j+1) + OLDPHI(i-1,j-1))/(4 * (ds^2))) * ds^2); 
      end 
      pressureOLD = PRESSURE; 
     end 
     end 
    end 

答えて

2

は、私が参照するために私のコードが含まれています。

result = cell(3, 1); 
parfor k = 1:3 
    result{k} = ['result-' num2str(k)]; 
    switch k 
     case 1 
      disp('do part one') 

     case 2 
      disp('do part two') 

     otherwise 
      disp('do part three') 
    end 
end 
+0

私はあなたが提案したことを試しましたが、「parforの変数PHIは評価できません」または「parforの変数OMEGAは評価できません」などのエラーで終了します。なぜそれが起こっているのかについてのヒント? – David

+0

スレッド間で変数を共有することはできませんが、セル配列を使用することも、3つの異なる変数(1つのパーツに1つずつ)を使用して計算結果と__after__を組み合わせることもできます。 –

+0

セルアレイの詳細を教えてください。私はあなたが何を渡そうとしているのか分かりません。 – David

関連する問題