----------------------------------------------------
n行n列の行列で MxM を計算する場合を例として、
FORTRAN77言語とC言語の基本的な相違点を
紹介します
n行n列の MxMの行列計算のサブルーチンMXM()
と
これを呼ぶメインルーチン
をFORTRAN77で書いたものと、Cで書いたものは以下の様になります
<<FORTRAN77>>
// -----MAIN ROUTINE-----
DIMENSION A(2,2), B(2,2), C(2,2)
INTEGER I,J
A(1,1)=1;
A(1,2)=2;
A(2,1)=3;
A(2,2)=4;
B(1,1)=5;
B(1,2)=6;
B(2,1)=7;
B(2,2)=8;
DO l I=1,2
DO 2 J=1,2
C(I,J)=0.0;
2 CONTINUE
1 CONIINUE
CALL MXM(A, B, C, 2)
END
// ------SUB ROUTINE MXM -------
SUBROUTIN MXM(A,B,C,N)
DIMENSION A(N,N), B(N,N), C(N,N)
INTEGER I,J,K
DOUBLE PRECISION S
DO l I=1,N
DO 2 J=1,N
S=0.0
DO 6 K=1,N
S=S+A(I,K) * B(K,J)
3 CONTINUE
C(I,J)=S
2 CONTINUE
1 CONIINUE
RETURN
END
<<FORTRAN77>>
// -----MAIN ROUTINE-----
DIMENSION A(2,2), B(2,2), C(2,2)
INTEGER I,J
A(1,1)=1;
A(1,2)=2;
A(2,1)=3;
A(2,2)=4;
B(1,1)=5;
B(1,2)=6;
B(2,1)=7;
B(2,2)=8;
DO l I=1,2
DO 2 J=1,2
C(I,J)=0.0;
2 CONTINUE
1 CONIINUE
CALL MXM(A, B, C, 2)
END
// ------SUB ROUTINE MXM -------
SUBROUTIN MXM(A,B,C,N)
DIMENSION A(N,N), B(N,N), C(N,N)
INTEGER I,J,K
DOUBLE PRECISION S
DO l I=1,N
DO 2 J=1,N
S=0.0
DO 6 K=,N
S=S+A(I,K) * B(K,J)
3 CONTINUE
C(I,J)=S
2 CONTINUE
1 CONIINUE
RETURN
END
<<C>>
#include <malloc.h>
#include <stdlib.h>
bool MxM(double** M1, double** M2, double** Mout, int n);
int _tmain(int argc, _TCHAR* argv[])
{
int n=2;
double **A;
double **B;
double **C;
bool ret;
//各ポインタに対して、サイズを割り当てる
A = (double **)(malloc (sizeof(double*) * n));
for (int i = 0; i < n; i++)
A[i] = (double *)malloc(sizeof(double) * n);
B = (double **)(malloc (sizeof(double*) * n));
for (int i = 0; i < n; i++)
B[i] = (double *)malloc(sizeof(double) * n);
C = (double **)(malloc (sizeof(double*) * n));
for (int i = 0; i < n; i++)
C[i] = (double *)malloc(sizeof(double) * n);
A[0][0]=1;
A[0][1]=2;
A[1][0]=3;
A[1][1]=4;
B[0][0]=5;
B[0][1]=6;
B[1][0]=7;
B[1][1]=8;
for (int j = 0; j < n; j++) {
for (int i = 0; i < n; i++) {
C[j][i] = 0.0;
}
}
ret=MxM(A, B, C, n);
//A, B, Cの解放
if (A) {
for (int i = 0; i < n; i++) {
if (A[i]) free(A[i]);
}
}
free(A);
if (B) {
for (int i = 0; i < n; i++) {
if (B[i]) free(B[i]);
}
}
free(B);
if (C) {
for (int i = 0; i < n; i++) {
if (C[i]) free(C[i]);
}
}
free(C);
return ret;
}
//--------------------------------------------
// Sub routine M x M
//--------------------------------------------
bool MxM(double** M1, double** M2, double** Mout, int n)
{
double s;
if(n<1) return false; //error
//M1 x M2
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
s=0.0;
for (int k = 0; k < n; k++) {
s=s + M1[i][k] * M2[k][j];
}
Mout[i][j]=s;
}
}
return true;
}
「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる : 目次 |
0 件のコメント:
コメントを投稿