質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

受付中

fortran:2次元ラプラス方程式の有限要素法による解析

oguran
oguran

総合スコア6

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0回答

0リアクション

0クリップ

435閲覧

投稿2022/03/16 06:06

前提・実現したいこと

fortran初学者です.
表題の通り,2次元ラプラス方程式を有限要素法によって近似し,2次元ポテンシャル流れを解析(速度ポテンシャルを求める)しようと考えています.質問としましては,作成したプログラムのエラーを自力で解決できないのでその点に関してご助言頂きたい所存で御座います.特に配列の宣言のルールなどは参考書をみながら手を進めてまいりましたがいささか怪しいです.
有限要素法の理論的な部分は理解し,計算の方法も分かるのですが,それをfortranプログラムで表現するところで躓いております.
そもそもfortranを学び始めたばかりで初歩的な部分かもしれませんが,次の様なプログラムを作成したところプログラム全体にわたって似たようなエラーが複数発生いたしました.

発生している問題・エラーメッセージ(一部)

189 | g(ik,j) = 0.0 | 1 Error: Unclassifiable statement at (1) 213 | a(k,k+1:n) = ar * a(k,k+1:n) | 1 217 | a(i, k+1 :n) = a(i, k+1 : n) - a(i, k) * a(k,k+1:n) | 1 Error: 'a' at (1) is not a variable 158 | g(n3,n3) = (b3*b3 + c3*c3) * S * g(n3,n3) | 1 Error: The function result on the lhs of the assignment at (1) must have the pointer attribute. 13 | call datain(nn,ne,ne1,nn2,x,y,np1,np2,np3,na,nb,qhata,qhatb,ifix,phat) !・ 1 Error: Type mismatch in argument 'x' at (1); passed REAL(8) to REAL(4)

該当のソースコード

fortran

program FEM3 implicit real(8)(a-h, o-z) real(8), dimension(1000,1000)::m1, m2 dimension a(1000,1000) dimension g(1000,1000) dimension r(1000), x(1000), y(1000), qhata(1000), qhatb(1000), phat(1000) dimension b(1000), w(1000), ip(1000) dimension np1(1000), np2(1000), np3(1000) dimension na(1000), nb(1000), ifix(1000) dimension ug(1000), vg(1000), ru(1000), rv(1000) call datain(nn,ne,ne1,nn2,x,y,np1,np2,np3,na,nb,qhata,qhatb,ifix,phat) !入力 call asmbly(nn,ne,ne1,ne2,nn2,x,y,np1,np2,np3,na,nb,qhata,qhatb) !行列GとベクトルRの組み立て call bound(ifix,g,r,phat) !ディリクレ型境界条件の導入 call lineq(g, phat, r, n) !連立1次代数方程式の求解 call output(phat,ug,vg) !出力 end program FEM3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine datain(nn,ne,ne1,nn2,x,y,np1,np2,np3,na,nb,qhata,qhatb,ifix,phat) !入力 open (11, file='NP.dat', status='old') !implicit real(8)(a-h, o-z) !dimension g(1000,1000) !dimension r(1000), x(1000), y(1000), qhata(1000), qhatb(1000), phat(1000) !dimension b(1000) !dimension np1(1000), np2(1000), np3(1000) !dimension na(1000), nb(1000), ifix(1000) k = 0 read (11, '()') do read (11, *) np1, np2, np3 k = k + 1 end do rewind (11) read (11, '()') do n = 1, k read (11, *) k, np1, np2, np3 end do close (11) open(21,file='xy.dat',status='old') i = 0 read (21, '()') do read (21, *) x, y i = i + 1 end do rewind (21) read (21, '()') do j = 1, i read (21, *) i, x, y end do close(21) open(31,file='k.dat',status='old') k = 0 read (31, '()') do read (31, *) na,nb,qhata,qhatb k = k + 1 end do rewind (31) read (31, '()') do l = 1, k read (31, *) k,na,nb,qhata,qhatb end do close(31) open(41,file='I.dat',status='old') i = 0 read (41, '()') do read (41, *) ifix,phat i = i + 1 end do rewind (41) read (41, '()') do m = 1, i read (41, *) i,ifix,phat end do close(41) end subroutine datain subroutine asmbly(nn,ne,ne1,ne2,nn2,x,y,np1,np2,np3,na,nb,qhata,qhatb) !行列GとベクトルRの組み立て !implicit real(8)(a-h, o-z) !dimension g(1000,1000) !dimension r(1000), x(1000), y(1000), qhata(1000), qhatb(1000), phat(1000) !dimension b(1000) !dimension np1(1000), np2(1000), np3(1000) !dimension na(1000), nb(1000), ifix(1000) do j=1,nn do i=1,nn g(i,j) = 0.0 end do end do do je=1, ne n1 = np1(je) n2 = np2(je) n3 = np3(je) x1 = x(n1) x2 = x(n2) x3 = x(n3) y1 = y(n1) y2 = y(n2) y3 = y(n3) S2 = x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2) S = S2 * 0.5 S2 = 1.0 / S2 b1 = (y2-y3) * S2 !Bを作成 b2 = (y3-y1) * S2 b3 = (y1-y2) * S2 c1 = (x3-x2) * S2 !Cを作成 c2 = (x1-x3) * S2 c3 = (x2-x1) * S2 g(n1,n1) = (b1*b1 + c1*c1) * S * g(n1,n1) !Gを作成 g(n2,n1) = (b2*b1 + c2*c1) * S * g(n2,n1) g(n3,n1) = (b3*b1 + c3*c1) * S * g(n3,n1) g(n1,n2) = (b1*b2 + c1*c2) * S * g(n1,n2) g(n2,n2) = (b2*b2 + c2*c2) * S * g(n2,n2) g(n3,n2) = (b3*b2 + c3*c2) * S * g(n3,n2) g(n1,n3) = (b1*b3 + c1*c3) * S * g(n1,n3) g(n2,n3) = (b2*b3 + c2*c3) * S * g(n2,n3) g(n3,n3) = (b3*b3 + c3*c3) * S * g(n3,n3) end do do i=1, nn R(i) = 0.0 end do do k=1, ne1 n1 = na(k) n2 = nb(k) dx = x(n1) - x(n2) dy = y(n1) - y(n2) dlk = sqrt(dx*dx + dy*dy) qa = qhata(k) qb = qhatb(k) r(n1) = (2.0*qa + qb)*dlk / 6.0 + r(n1) r(n2) = (qa + 2.0*qb)*dlk / 6.0 + r(n2) end do end subroutine asmbly subroutine bound(ifix,g,r,phat) !ディリクレ型境界条件の導入 do k=1 , nn2 ik = ifix(k) do j=1 , nn g(ik,j) = 0.0 end do g(ik,ik) = 1.0 r(ik) = phat(k) end do end subroutine bound subroutine lineq(g, phat, r, n) !連立1次代数方程式の求解(ガウスージョルダン法) !implicit real(8)(a-h, o-z) !dimension g(1000,1000) !dimension r(1000), x(1000), y(1000), qhata(1000), qhatb(1000), phat(1000) !dimension b(1000) !dimension np1(1000), np2(1000), np3(1000) !dimension na(1000), nb(1000), ifix(1000) real(8) ar, a a(:,:) = g(:,:) x(:) = r(:) do k=1, n if(a(k,k) == 0.0d0) stop ar = 1.0d0 / a(k,k) a(k,k) = 1.0d0 a(k,k+1:n) = ar * a(k,k+1:n) x(k) = ar * x(k) do i = 1,n if(i /= k) then a(i, k+1 :n) = a(i, k+1 : n) - a(i, k) * a(k,k+1:n) x(i) = x(i) a(i,k) = 0.0d0 end if end do end do end subroutine lineq subroutine output(phat,k,nn) !出力 !implicit real(8)(a-h, o-z) !dimention phat(1000) open(51,file='output.dat',status='replace') do k=1 , nn write(51,*)'phat(k)=',phat(k) end do close(51) end subroutine output

試したこと

*サブルーチン内での宣言がよく分からなかったことと,他のエラーを解決するためにサブルーチン内での再宣言をコメント化しました.

*サブルーチンを使わないで考えてみました.

補足情報(FW/ツールのバージョンなど)

本問題を参考程度に添付いたします.
イメージ説明

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

chirimen

2022/03/17 02:43

サブルーチン側での変数宣言は必要です。 "Error: Unclassifiable statement at (1)" というのもそのエラーです。 Fortran の学習はどのように進めているのでしょうか。 参考書を読んでいるのであれば、その内容をまず把握してみましょう。参考書の記述の意味が解らなければ内容について質問することもよいかと思います。 講義を受けているのであれば、指導教官に質問するとか、クラスメイトと相談するとかしてみてはいかがでしょうか。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。