我能够编译该程序,但无法运行它。我需要插入 N=11、dtmax=0.0003 并使用 M=11、21、41 和 61 进行试验。我尝试使用常量输入值,并在
writeln
中说明它们,但它不起作用。
在我的
writeln
语句中,我尝试输入值 11。我不知道出了什么问题。
uses
crt, printer;
const
N = 11; {radial nodes}
M = 21; {axial nodes}
k = 40.0; {thermal conductivity (W/mK)}
alpha = 1e-5; {thermal diffusivity (m^2/s)}
Rs = 0.025; {disk radius (m)}
Zs = 0.005; {disk thickness (m)}
qmax = 3.0e6; {peak flux (W/m^2)}
Ro = 0.05; {parameter in flux equation (m)}
Tinit = 20.0; {initial temperature (C)}
Tmax = 300.0; {maximum desired temperature at top of axis (C)}
var
dr, dz, rhoC, dtMax, dt, time : real;
i, j : Longint;
C, R, L, U, D : array [1..N,1..M] of real;
q, V, Aco, Aci, Af : array [1..N] of real;
Told, Tnew : array [1..N+1,1..M+1] of real;
begin
{Size of the control volumes}
dr := Rs/(N - 1);
dz := Zs/(M - 1);
rhoC:= k/alpha;
{Control volume surface areas and volumes}
Af[1] := pi*dr*dr/4.0;
Af[N] := pi*dr*(Rs - dr/4.0);
for i := 2 to N - 1 do
Af[i] := 2.0*pi*dr*dr*(i - 1);
for i := 1 to N do
V[i] := Af[i]*dz;
Aco[N] := 2.0*pi*Rs*dz;
for i := 1 to N - 1 do
Aco[i] := 2.0*pi*dr*dz*(i - 0.5);
Aci[1] := 0.0;
for i := 2 to N do
Aci[i] := 2.0*pi*dr*dz*(i - 1.5);
{Absorbed flux as function of i}
q [1] := pi/4.0*qmax*dr*dr*(1.0 - 0.9/8.0*sqr(dr/Ro));
q [N] := pi*qmax*dr*dr*(N - 1.25-0.9/8.0*sqr(dr/Ro)*(2.0*N*N*N -7.5*N*N
+ 9.5*N - 65.0/16.0));
for i := 2 to N - 1 do
q [i] := pi*qmax*dr*dr*(2.0*(1 - 1.0) - 0.9/4.0*sqr(dr/Ro)*(4.0*i*i*i - 12.0*i*
i + 13.0*i - 5.0));
{Coefficient matrices}
for i := 1 to N do
for j := 1 to M do
begin
R[i, j] := 0.0;
L[i, j] := 0.0;
U[i, j] := 0.0;
D[i, j] := 0.0;
C[i, j] := 0.0;
end;
For i := 2 to N - 1 do
For j := 2 to M - 1 do
begin;
R[i, j] := Aco[i]/dr;
L[i, j] := Aci[i]/dr;
U[i, j] := Af[i]/dz;
D[i, j] := Af[i]/dz;
end;
i := 1;
for j := 2 to M - 1 do
begin
R[i, j] := Aco[i]/dr;
U[i, j] := Af[i]/dz;
D[i, j] := Af[i]/dz;
end;
i := 1;
j := M;
R[i, j] := Aco[i]/dr;
D[i, j] := Af[i]/dz;
i := 1;
j := 1;
R[i, j] := Aco[i]/dr;
U[i, j] := Af[i]/dz;
i := N;
for j := 2 to M - 1 do
begin
L[i, j] := Aci[i]/dr;
U[i, j] := Af[i]/dz;
D[i, j] := Af[i]/dz;
end;
i := N;
j := M;
L[i, j] := Aci[i]/dr;
D[i, j] := Af[i]/dz;
i := N;
j := 1;
L[i, j] := Aci[i]/dr;
U[i, j] := Af[i]/dz;
j := M;
for I := 2 to N - 1 do
begin
R[i, j] := Aco[i]/dr;
L[i, j] := Aci[i]/dr;
D [i, j] := Af[i]/dz;
end;
j := 1;
for I := 2 to N - 1 do
begin
R [i, j] := Aco[i]/dr;
L [i, j] := Aci[i]/dr;
U [i, j] := Af[i]/dz;
end;
{Maximum permissible dt}
dtMax := 0.0;
for i := 1 to N do
for j := 1 to M do
begin
dt := V[i]/alpha/(R[i, j] + L[i, j] + U[i, j] + D[i, j]);
if dt > dtMax then
dtMax := dt;
end;
dt := 0.5*dtMax; {actual value}
{fill in the cij matrix}
for i := 1 to N do
C[1, M] := dt*q [i]/rhoC/V[i];
{Initial conditions}
for i := 1 to N do
for j := 1 to M do
Told [i, j] := Tinit;
{carry out the solution}
time := 0.0;
repeat
time:= time + dt;
writeln (time: 10:5);
for i:= 1 to N do
for j:= 1 to M do
Tnew [i,j] := Told [i,j]*(1.0 - alpha*dt/V[i]*(R[i,j]+ L[i,j]+ U[i,j]+
D[i,j])
+ alpha*dt/V[i]*(R[i, j]*Told [i + 1, j] + L[i, j]*Told [i - 1, j] + U[i, j]*Told
[i, j + 1] + D[i, j]*Told [i, j - 1]) + C[i, j]);
if Tnew[1,m] > Tmax then {print out distribution and quit}
begin
writeln(11, time : 8 : 4, 'sec dt =', dt : 15 : 10);
write(11,' ');
for i := 1 to N do
write (11, 1 : 10);
writeln(11);
for j := M downto 1 do
begin
write(11, j : 4);
for i := 1 to N do
write(11, Tnew[i,j]: 10 : 5);
writeln(11);
end;
writeln(11);
halt;
end;
for i := 1 to N do
for j := 1 to M do
Told[i, j]:= Tnew[i, j];
until time < - 1.0;
end.
我查找了如何调试退出代码 201 并将
integer
更改为 Longint
但没有解决问题。我尝试在 writeln
语句中插入值,但它不起作用。我可以看到弹出的屏幕,但我无法阅读它,因为它消失了。
帕斯卡退出代码 201
编程语言Pascal 不定义任何退出代码,而是定义您的实现(在本例中为 FreePascal)。 不同 Pascal 实现可能会报告不同退出代码(如果有的话)。
[…]我查找了如何调试退出代码 201 并将整数更改为 Longin,但它[没有]解决它。 […]
FreePascal 编译器将 RTE 201 定义为范围检查错误。 您必须启用它们,一般来说,您应该始终启用它们,或者至少在开发阶段启用它们,如果速度很重要的话。 正如
Stuart 已经指出的那样,第 157 行中的 tNew
赋值表达式以及后续访问,或者“尝试”访问(如果打开了范围检查)、不存在的数组元素。
这是由您的
+ 1
和 − 1
计算引起的。本着您的编码风格的精神,“快速而肮脏”的修复方法是替换
i + 1
i + ord(i < N)
i ‑ 1
与 i ‑ ord(i > 1)
j + 1
与 j + ord(j < M)
j ‑ 1
与 j ‑ ord(j > 1)
另一个浪费的伪解决方案是通过必要的附加行和列来扩展表格。
Told, Tnew : array [0..N+1,0..M+1] of real;
请注意,两个维度的新最小值均为零。 如果您已将附加行和列初始化为不影响计算的值(例如适当的加法或乘法的
neutral元素),则此方法效果很好。
旁注:
uses
11
(writeLn
const
ant。主循环的终止条件是time < −1.0
。
除非你发明了时间机器,否则我建议你严格按照时间前进,即。 e.确保 dt
time ≔ time + dt
)不能是正数。单字符标识符太多。
如果您无法想出更好的名称来一目了然地揭示其含义,请至少使用非常通用的 row
或 columnMaximum
program
的主要部分。
将任务拆分为例程似乎会带来复杂性,但有利于提高可读性。
请记住,您的编程在视觉上划分你的代码,这是我在编程时在汇编中所做的事情。