0

晚安; 我正在尝试将一些 fortran 代码转换为 matlab,但我不明白什么

ist = grp%brp%faceIndicatorArray(-20)
ien = grp%brp%faceIndicatorArray(-19)

表示在下面的子程序中。我不习惯matlab中的负索引,所以这个(-20)和(-19)对应于数组中的哪个元素或什么?这是所有子程序:

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

如果有人可以提供帮助,我会很高兴。先感谢您。

4

2 回答 2

1

你面临一个有趣的困境。您正在从 Fortran 90/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 来切换当您访问时访问的内容使用负数组索引。

将来,这种方法将允许您在更充分地理解代码后及时减少使用这些负值的代码,同时允许您复制当前功能。

于 2013-01-31T02:08:22.623 回答
1

了解 type(GridSolverData) 的完整定义会有所帮助。Fortran 允许零和负数组索引,但 matlab 不允许。

当我转换这种类型的东西时,我只是将 (|使用的最大负索引| + 1) 添加到 matlab 中该数组的所有索引。例如,这个 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-23T23:46:08.223 回答