0

おやすみ; 一部の 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

誰かが助けてくれれば、私はうれしいです。前もって感謝します。

4

2 に答える 2

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 に答える
1

あなたは興味深い難問に直面しています。MATLAB のような行列ベースのシステムへのループに基づく Fortran 90/95 (.faceIndicatorArray が F2003 オブジェクトの一部であるため、これはすべてより複雑でない限り) から移動しているという事実は、あなたが失うことになることを意味します。関連する計算を変更しないと、非常に効率的です。この効率の低下が許容できると仮定すると、コードをクリーンアップして、将来的により柔軟なものに簡単に変換できるようにするための代替手段を検討してください。

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 に答える