Преобразование Фортрана в Матлаб

спокойной ночи; Я пытаюсь преобразовать некоторый код фортрана в матлаб, и я не понимаю, что

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

Если кто может помочь, буду рад. Заранее спасибо.


person Noname    schedule 23.01.2013    source источник
comment
см. mathworks.com/matlabcentral/fileexchange/5260-f2matlab для конвертера   -  person Rachel Gallen    schedule 23.01.2013
comment
Является ли faceIndicatorArray массивом или функцией? Не могли бы вы показать его объявление в любом типе brp.   -  person John Alexiou    schedule 24.01.2013


Ответы (2)


Вы сталкиваетесь с интересным затруднением. Сам факт, что вы переходите с 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», который является общим типом файла для этого типа решателя. Я не знаю, что делают остальные ваши отрицательные индексы массива, но было бы полезно разделить вспомогательные значения на другие массивы, поскольку это имеет смысл, и использовать classdef с методом get/put для переключения того, к чему обращаются, когда вы используйте отрицательные индексы массива.

Такой подход в будущем позволит вам вовремя отказаться от использования этих отрицательных значений в коде, когда вы его полностью поймете, и в то же время позволит вам воспроизвести текущие возможности.

person Davron    schedule 31.01.2013

Знание полного определения типа (GridSolverData) поможет. Fortran допускает нулевые и отрицательные индексы массива, а Matlab — нет.

Когда я конвертирую этот тип вещей, я просто добавляю (|самый большой отрицательный используемый индекс| + 1) ко всем индексам этого массива в Matlab. Например, этот фортран:

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)

to

ip = grp.brp.faceIndicatorArray(i+20+1);
person Ben Barrowes    schedule 23.01.2013