2012-03-06 15 views
1

が、これは今、私はジャック= [J1 J2 J13 J3 J4ように1つの行列ジャック(68,68) にすべてのこれらの行列を入れたい取り扱い

program matrix 
real :: J1(38,38),J2(38,29),J3(29,38),J4(29,29) 
real :: J13(38,1),J23(29,1),J33(1,68),Jac(68,68) 
!!all matrices contains some values except Jac 

Jac=[J1 J2 J13 
    J3 J4 J23 
    J33  ] 
end program matrix 

私のプログラムでありますJ23 J33] fortranコードはどうすればいいですか?

+2

使用2 DOループ(ネストされた)を持っています。 – milancurcic

+0

これで何をしていますか?何らかの種類(名前Jから推測)振動解析 - スティフナーマトリックス? – Rook

答えて

1

Jacを繰り返し、Jx(.,.)の要素をJac(i,j)に割り当てる必要があります。たとえば、これはあなたがJ1Jacへの左端の上位ブロックに割り当てる方法です:あなたは書き込みがあなたが書くことができるループが気に入らない場合は

DO i = 1, 38 
    DO j = 1, 38 
    Jac(i,j) = J1(i,j) 
    END DO 
END DO 
10

か、と。

Jac(1:38,1:38) = J1 
Jac(1:38,39:38+29) = J2 

など。

EDIT

私はこのビットが対象としています場合は、投稿したものから、言うことはできませんが、私はこれが含まれていないFortranの知識のレベルを推測

...

あなたが定義することができます。

real, target :: jac(68,68) 
real, dimension(:,:), pointer :: j1, j2, j3, j4, j13, j23, j33 

と、このように、これらのサブ配列を使用する:

j1 => jac(1:38,1:38) 
j33 => jac(1,:) 

など。この方法では、メモリ内のデータのコピーが1つしかありません。そのような小さな配列の場合、おそらく問題はありません。サブアレイの内容とスーパーアレイの内容が異なる必要がある場合は、誤ったアプローチです。

3

それを少し入れるには、より簡潔なあなたも

JAC(1:38, 1:38) = J1 (1:38,1:38) 
JAC(1:38,39:67) = J2 (1:38,1:29) 
JAC(1:38, 68) = J13(1:38, 1) 
JAC(39:67, 1:38) = J3 (1:29,1:38) 
JAC(39:67,39:67) = J4 (1:29,1:29) 
JAC(39:67, 68) = J23(1:29, 1) 
JAC( 68, 1:68) = J33( 1,1:68) 

を使用することができますが、コピーは良いアイデアではないかもしれない大きな配列を、持っている場合、私はあなたが自動的にインデックスを変換する関数を記述し示唆しています。楽しみのために、以下で明示的に指定することなくすべてのサブマトリックスを含むカスタムタイプMATRIXを追加しました。だから、ジャックでのcorrespongingの場所にJ1..J33から各要素を入れてジャックの要素やインデックスオフセットを反復する

REAL FUNCTION JAC(I,J, JAC_MAT) 
    INTEGER, INTENT(IN) :: I,J 
    TYPE(MATRIX), INTENT(IN) :: JAC_MAT 
    IF(I.LE.38.AND.J.LE.38)THEN 
    JAC = JAC_MAT%J1(I,J) 
    ELSEIF(I.LE.38.AND.J.LE.67)THEN 
    JAC = JAC_MAT%J2(I,J-38) 
    ... 
    ENDIF 
END FUNCTION