晚上好,我正在尝试将一些fortran代码转换成matlab,但我不明白是什么
ist = grp%brp%faceIndicatorArray(-20)
ien = grp%brp%faceIndicatorArray(-19)表示在以下子例程中。我不习惯在matlab中使用负索引,所以这个(-20)和(-19)对应于数组中的哪个元素或什么元素?下面是all子例程:
subroutine calculateLiftAndDrag(grp,ivd,lift,drag,momentum)
! as the name says
IMPLICIT NONE
type(GridSolverData) :: grp
type(InputVariablesData) :: ivd
real :: lift,drag,momentum
integer :: i,ist,ien,ip
real :: flowTangent(2),flowNormal(2),wallTangent(2),wallNormal(2),r(2)
real :: p,tau_t,tau_n,PI,alphaRad,sum
lift = 0.0
drag = 0.0
momentum = 0.0
PI = 4.0*atan(1.0)
alphaRad = ivd%alpha*PI/180.
flowTangent(1) = cos(alphaRad)
flowTangent(2) = sin(alphaRad)
flowNormal(1) = - flowTangent(2)
flowNormal(2) = flowTangent(1)
! inviscid faces
ist = grp%brp%faceIndicatorArray(-20)
ien = grp%brp%faceIndicatorArray(-19)
do i=ist,ien
ip = grp%brp%faceIndicatorArray(i)
wallTangent(1) = grp%brp%faceTangentArray(ip,1)
wallTangent(2) = grp%brp%faceTangentArray(ip,2)
wallNormal(1) = -wallTangent(2)
wallNormal(2) = wallTangent(1)
p = grp%p(ip)
r = grp%coordinates(ip,:)-ivd%momentumPoint
lift = lift - 2.0*grp%wallLength(ip)*p(wallNormal(1)*flowNormal(1)+wallNormal(2)*flowNormal(2))
drag = drag - 2.0*grp%wallLength(ip)*p*(wallNormal(1)*flowTangent(1)+wallNormal(2)*flowTangent(2))
momentum = momentum - 2.0*grp%wallLength(ip)*p*(r(1)*wallNormal(2)-r(2)*wallNormal(1))
end do如果有人能帮上忙,我会很高兴。提前谢谢你。
发布于 2013-01-24 07:46:08
了解类型(GridSolverData)的完整定义将有所帮助。Fortran允许零和负数组索引,但matlab不允许。
当我转换这种类型的东西时,我只是在matlab中将(|使用的最大负索引|+ 1)加到这个数组的所有索引上。例如,此fortran:
ist = grp%brp%faceIndicatorArray(-20);
ien = grp%brp%faceIndicatorArray(-19);在matlab中可能会变成这样:
ist = grp.brp.faceIndicatorArray(-20+20+1);
ien = grp.brp.faceIndicatorArray(-19+20+1);并在整个子例程中执行此操作。例如,这也会发生变化:
ip = grp%brp%faceIndicatorArray(i)至
ip = grp.brp.faceIndicatorArray(i+20+1);发布于 2013-01-31 10:08:23
你面临着一个有趣的困境。你正在从Fortran90/95(除非.faceIndicatorArray是F2003对象的一部分,因此这一切都比较复杂)转移到像MATLAB这样的基于矩阵的系统,这意味着如果你不改变所涉及的数学运算,你将会失去很多效率。假设这种效率损失是可以接受的,那么考虑一种替代方案来清理代码,并使其更容易在未来转换为更灵活的东西。
当我在Fortran 90/95模拟代码中看到像这样的负数组索引时,它是从FORTRAN 77代码中直接翻译过来的。在我工作过的代码中,大多数时候负索引表示辅助数据不是数据集的一部分,但由于FORTRAN 77没有数据结构的事实,它将实际数据和辅助数据保留在一起。您几乎可以立即看出,此代码是从变量名直接从FORTRAN转换而来的:
IMPLICIT NONE是最近随着变量的声明而完成的:
integer :: i, ist, ien, ip它属于缺省值:
REAL(A-H, O-Z), INTEGER(I-N)有了这些知识,应该会很明显地发现,它很快就被转换为与类型结构一起使用。
由于我不知道GridSolverData类型中表示的整个结构集以及它包含的类型,所以我只能给您一些模糊的建议。brp元素可能代表"brep“,这是此类型求解器的常见文件类型。我不知道其余的负数组索引做什么,但将辅助值拆分到其他数组中会很有帮助,因为这很有意义,并使用带有get/put方法的classdef来切换使用负数组索引时要访问的内容。
在将来,这种方法将允许您在更充分地理解这些负值之后,及时在代码之间切换使用这些负值,同时允许您复制当前的功能。
https://stackoverflow.com/questions/14486363
复制相似问题