我正在编写代码以在NI * NJ大小的网格上执行有限体积方法操作,其中所有值都存储在一维数组中,在注释部分1中定义。双循环移动每个网格元素并执行计算对于网格元素,它是周围元素(东,北,西,南)的各种功能。
我在下面有一个示例代码块,我的挑战是清理代码以消除我看到的一些重复。我想知道是否以某种方式使用包含属性e, w, n, s
的类将是一个有益的方法解决问题,虽然我不精通类构造。
可以看出,我已经定义了一个匿名函数,然后调用它来计算每一侧的某个值(e,w,n,s)。这种模式在整个代码中多次重复出现,将一些四元组代码块组合成一行简单代码会更好。
arrayRe = initialize; % goes from 1:(NI*NJ)
arrayRn = initialize;
for i = 2:NI-1
for j = 2:NJ-1
% 1. coordinates (P is the center; all others are located around it (north, east, west, south))
iP = NI*(j-1) + i;
iE = iP + 1;
iW = iP - 1;
iN = iP + NI;
iS = iP - NI;
% 2. interpolation ratios
R.e = arrayRe(iP);
R.w = 1 - arrayRe(iW);
R.n = arrayRn(iP);
R.s = 1 - arrayRn(iS);
% interpolate a given value
interpolatevalue = @(array, R, i) ...
R*array(i) + (1-R)*array(iP);
% ax calc
ax_e = interpolatevalue(axArray, R.e, iE);
ax_w = interpolatevalue(axArray, R.w, iW);
ay_n = interpolatevalue(ayArray, R.n, iN);
ay_s = interpolatevalue(ayArray, R.s, iS);
% bx calc
bx_e = interpolatevalue(bxArray, R.e, iE);
bx_w = interpolatevalue(bxArray, R.w, iW);
by_n = interpolatevalue(byArray, R.n, iN);
by_s = interpolatevalue(byArray, R.s, iS);
end
end
我试过的东西是删除特定块的4行并将它们放入返回结构的函数m文件中。例如:
function a = axycalc(axArray, ayArray, R, iStruct, interpfun)
iE = iStruct.e ;
iW = iStruct.w ;
iS = iStruct.s ;
iN = iStruct.n ;
a.x_e = interpfun(axArray, R_e, iE);
a.x_w = interpfun(axArray, R_w, iW);
a.y_n = interpfun(ayArray, R_n, iN);
a.y_s = interpfun(ayArray, R_s, iS);
end
然后按如下方式调用该函数:
a = axycalc(axArray, ayArray, R, struct('e',iE,'w',iW,'n',iN,'s',iS), @interpolatevalue)
我不知道这在可读性方面是否增加了很多,并且创建了大量其他m 10行m文件,然后我需要跟踪它们。还有更好的方法吗?