OpenSees Blog 日本語 目次

最初に「このブログをみるためのガイド」をご覧ください。

Update中OpenSees コマンド 日本語解説 の 目次 OpenSeesコマンド はじめての方は「ここから
このblogで使用しているOpenSeesコマンド集は「ここ」 Update中
OpenSees のソースコード 解析に挑戦してみる 目次最初のページは「ソースコードのダウンロードとビルド」
Appendix:C言語での 「有限要素法における平面トラスの解析」目次最初のページは「Microsoft Visual Studioの導入方法」







目次の中で、更新したページにはNewがついています

このブログ内の単語を検索したい場合は、左上OpenSeesロゴの上に検索窓から検索できます。


2015年1月1日木曜日

FORTRAN77言語とC言語の基本的な相違点 (1)

あけましておめでとうございます。2015年が皆様にとっても、素晴らしい年でありますように。。。
----------------------------------------------------

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;
}

次のページ →
FORTRAN77言語とC言語の基本的な相違点 (2)

「有限要素法における平面トラスの解析」プログラムをC言語で書いてみる : 目次

0 件のコメント:

コメントを投稿