首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Fortran转换为Matlab

将Fortran转换为Matlab
EN

Stack Overflow用户
提问于 2013-01-24 02:04:42
回答 2查看 357关注 0票数 0

晚上好,我正在尝试将一些fortran代码转换成matlab,但我不明白是什么

代码语言:javascript
运行
复制
ist = grp%brp%faceIndicatorArray(-20)
ien = grp%brp%faceIndicatorArray(-19)

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

代码语言:javascript
运行
复制
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

如果有人能帮上忙,我会很高兴。提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2013-01-24 07:46:08

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

当我转换这种类型的东西时,我只是在matlab中将(|使用的最大负索引|+ 1)加到这个数组的所有索引上。例如,此fortran:

代码语言:javascript
运行
复制
ist = grp%brp%faceIndicatorArray(-20);

ien = grp%brp%faceIndicatorArray(-19);

在matlab中可能会变成这样:

代码语言:javascript
运行
复制
ist = grp.brp.faceIndicatorArray(-20+20+1);

ien = grp.brp.faceIndicatorArray(-19+20+1);

并在整个子例程中执行此操作。例如,这也会发生变化:

代码语言:javascript
运行
复制
ip = grp%brp%faceIndicatorArray(i)

代码语言:javascript
运行
复制
ip = grp.brp.faceIndicatorArray(i+20+1);
票数 1
EN

Stack Overflow用户

发布于 2013-01-31 10:08:23

你面临着一个有趣的困境。你正在从Fortran90/95(除非.faceIndicatorArray是F2003对象的一部分,因此这一切都比较复杂)转移到像MATLAB这样的基于矩阵的系统,这意味着如果你不改变所涉及的数学运算,你将会失去很多效率。假设这种效率损失是可以接受的,那么考虑一种替代方案来清理代码,并使其更容易在未来转换为更灵活的东西。

当我在Fortran 90/95模拟代码中看到像这样的负数组索引时,它是从FORTRAN 77代码中直接翻译过来的。在我工作过的代码中,大多数时候负索引表示辅助数据不是数据集的一部分,但由于FORTRAN 77没有数据结构的事实,它将实际数据和辅助数据保留在一起。您几乎可以立即看出,此代码是从变量名直接从FORTRAN转换而来的:

代码语言:javascript
运行
复制
IMPLICIT NONE

是最近随着变量的声明而完成的:

代码语言:javascript
运行
复制
integer :: i, ist, ien, ip

它属于缺省值:

代码语言:javascript
运行
复制
REAL(A-H, O-Z), INTEGER(I-N)

有了这些知识,应该会很明显地发现,它很快就被转换为与类型结构一起使用。

由于我不知道GridSolverData类型中表示的整个结构集以及它包含的类型,所以我只能给您一些模糊的建议。brp元素可能代表"brep“,这是此类型求解器的常见文件类型。我不知道其余的负数组索引做什么,但将辅助值拆分到其他数组中会很有帮助,因为这很有意义,并使用带有get/put方法的classdef来切换使用负数组索引时要访问的内容。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14486363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档