Programmet: http://www.nada.kth.se/~ayt/programs/eulsolv.m
Nu har ju inte alla matlab hemma, men det borde även fungera med nån av gratisvarianterna som finns. Kan möjligen bli problem med grafiken. Jag har dock ingen länk till något sånt program. Någon?
Den viktigaste delen där det mesta av lösningen räknas ut:
Kod: Markera allt
for nr = 1:nrmax,
%
% Inviscid, convective fluxes
%
f(nfirst:nlast,1) = (w(nfirst+1:nlast+1,2)-w(nfirst-1:nlast-1,2))*0.5;
f(nfirst:nlast,2) = ((w(nfirst+1:nlast+1,2).*u(nfirst+1:nlast+1) + ...
p(nfirst+1:nlast+1)) - ...
(w(nfirst-1:nlast-1,2).*u(nfirst-1:nlast-1) + ...
p(nfirst-1:nlast-1)))*0.5;
f(nfirst:nlast,3) = ((w(nfirst+1:nlast+1,3) + p(nfirst+1:nlast+1)).*...
u(nfirst+1:nlast+1) - ...
(w(nfirst-1:nlast-1,3) + p(nfirst-1:nlast-1)).*...
u(nfirst-1:nlast-1))*0.5;
%
% Update artificial dissipation for the first 2 R-K stages
%
if (nr < 3),
mu = abs((p(nfirst:nlast+2) - 2*p(nfirst-1:nlast+1) + ...
p(nfirst-2:nlast))./(p(nfirst:nlast+2) + ...
2*p(nfirst-1:nlast+1) + p(nfirst-2:nlast)));
%
eps2 = art2*max(mu(1:n+1),mu(2:n+2));
eps4 = max(zeros(size(eps2)),art4 - eps2);
%
fd(nfirst:nlast,1) = ...
0.5*(lambda(nfirst+1:nlast+1) + lambda(nfirst:nlast)).* ...
(eps2(2:n+1).*(w(nfirst+1:nlast+1,1)-w(nfirst:nlast, 1)) -...
eps4(2:n+1).*(w(nfirst+2:nlast+2,1)-3*w(nfirst+1:nlast+1,1)+...
3* w(nfirst:nlast ,1) - w(nfirst-1:nlast-1,1))) -...
0.5*(lambda(nfirst:nlast) + lambda(nfirst-1:nlast-1)).* ...
(eps2(1:n).* (w(nfirst:nlast, 1)-w(nfirst-1:nlast-1,1)) -...
eps4(1:n).* (w(nfirst+1:nlast+1,1) - 3*w(nfirst:nlast,1) +...
3* w(nfirst-1:nlast-1,1) - w(nfirst-2:nlast-2,1)));
fd(nfirst:nlast,2) = ...
0.5*(lambda(nfirst+1:nlast+1) + lambda(nfirst:nlast)).* ...
(eps2(2:n+1).*(w(nfirst+1:nlast+1,2) - w(nfirst:nlast, 2)) -...
eps4(2:n+1).*(w(nfirst+2:nlast+2,2)-3*w(nfirst+1:nlast+1,2)+...
3* w(nfirst:nlast ,2) - w(nfirst-1:nlast-1,2))) -...
0.5*(lambda(nfirst:nlast) + lambda(nfirst-1:nlast-1)).* ...
(eps2(1:n).* (w(nfirst:nlast, 2) - w(nfirst-1:nlast-1,2)) -...
eps4(1:n).*(w(nfirst+1:nlast+1,2)-3*w(nfirst:nlast, 2) +...
3* w(nfirst-1:nlast-1,2) - w(nfirst-2:nlast-2,2)));
fd(nfirst:nlast,3) = ...
0.5*(lambda(nfirst+1:nlast+1) + lambda(nfirst:nlast)).* ...
(eps2(2:n+1).*(w(nfirst+1:nlast+1,3) - w(nfirst:nlast, 3)) -...
eps4(2:n+1).*(w(nfirst+2:nlast+2,3)-3*w(nfirst+1:nlast+1,3)+...
3* w(nfirst:nlast ,3) - w(nfirst-1:nlast-1,3))) -...
0.5*(lambda(nfirst:nlast) + lambda(nfirst-1:nlast-1)).* ...
(eps2(1:n).* (w(nfirst:nlast,3) - w(nfirst-1:nlast-1,3)) -...
eps4(1:n).* (w(nfirst+1:nlast+1,3) - 3*w(nfirst:nlast,3) +...
3* w(nfirst-1:nlast-1,3) - w(nfirst-2:nlast-2,3)));
end
%
if (timeaccurate & dualt),
%
% Add the source term and flux for the dual time stepping to the
% convective flux
%
if (outerstep > 1),
% 2nd order backward difference
fac = 1.5/dtout;
else
% 1st order backward Euler
fac = 1/dtout;
end
%
f(nfirst:nlast,:) = f(nfirst:nlast,:) + fac*w(nfirst:nlast,:).*...
vol(nfirst:nlast,:) + duals(nfirst:nlast,:);
end
%
% Update the state vector
%
w(nfirst:nlast,1) = wt(nfirst:nlast,1)-nrcoef(nr)*dt(nfirst:nlast).*(...
f(nfirst:nlast,1) - fd(nfirst:nlast,1));
w(nfirst:nlast,2) = wt(nfirst:nlast,2)-nrcoef(nr)*dt(nfirst:nlast).*(...
f(nfirst:nlast,2) - fd(nfirst:nlast,2));
w(nfirst:nlast,3) = wt(nfirst:nlast,3)-nrcoef(nr)*dt(nfirst:nlast).*(...
f(nfirst:nlast,3) - fd(nfirst:nlast,3));
%
% Update the boundary condition
%
w(nlast+1,1) = w(nlast,1);
w(nlast+2,1) = w(nlast-1,1);
w(nlast+1,2) = -w(nlast,2);
w(nlast+2,2) = -w(nlast-1,2);
w(nlast+1,3) = w(nlast,3);
w(nlast+2,3) = w(nlast-1,3);
%
% Update pressure, velocity and square of sound velocity
%
w(:,1) = abs(w(:,1));
u = w(:,2)./w(:,1);
p = gammafac*(w(:,3) - 0.5*u.*u.*w(:,1));
c2 = gamma*p./w(:,1);
%
end