fortran 配列実行結果のファイル書き出し方法は?

このQ&Aのポイント
  • fortranのプログラムで、実行結果の配列をファイルに書き出す方法を教えてください。
  • プログラムの中で最後のntimeだけの配列をファイルに書き出す方法はありますか?
  • 実行結果の配列をファイルに書き出すために、どのようにwrite文を書けばいいのでしょうか?
回答を見る
  • ベストアンサー

fortran 配列実行結果

以下のプログラムの中で実行結果で最後の  n = ntime (ntime =600) だけ、つまりwth, wphの最後のntimeだけをファイルに書き出したい場合どのようにwrite文を書けばよいのでしょうか?わかる方がいらっしゃたら教えて下さい。よろしくお願いします。 subroutine far_output use consts use fdtd implicit none integer :: n, i, td real(8) :: s real(8) :: theta, phi real(8) :: sx, sy, sz, px, py real(8) :: wth, wph, uth, uph real(8) :: eth(mmax), eph(mmax) real(8) :: ceth, ceph open(10,file="far_field_eth.dat") open(20,file="far_field_eph.dat") theta = 0.0d0 phi = 0.0d0 sx = cos(theta)*cos(phi) sy = cos(theta)*sin(phi) sz = -sin(theta) px = -sin(phi) py = cos(phi) do n = 1, ntime wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz wph = wx(l,n)*px+wy(l,n)*py uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz uph = ux(l,n)*px+uy(l,n)*py eth(n) = -z0*wth-uph eph(n) = -z0*wph+uth write(10,*) eth write(20,*) eph enddo call fft_eth(ntime,eth,ceth) call fft_eph(ntime,eph,ceph) close(10) close(20) return end subroutine

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8016/17133)
回答No.2

ループが終了した時点では,wth(1:ntime)に値が入っているのだから,その時点でwth(ntime)を出力すればよいだけ。 ついでに wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz はタイポだよね。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

eth(ntime) や eph(ntime) が計算されるのは最後だから, do ループの「中」で出力させてもしょうがない. ループが終わってから出力しないと. #2 でも「ループが終了した時点で」って言われてるよね.

  • f272
  • ベストアンサー率46% (8016/17133)
回答No.4

あ,私も勘違いしてる。wth(ntime)こんなモノはなかった。 > あと, このサブルーチンの中で l を定義していないんだけどそれは大丈夫? constsか,fdtdで定義していることを期待します。

528612
質問者

補足

lは別のサブルーチン(出力前のプログラム)でdoループで l = 1, 180という計算をさせています。fdtdで定義しています。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ああ, eth とか eph じゃないですね. すみません. ... あれ? だとしたら単に「do を抜けてから uth とか wph を表示する」だけでいいような気がするんだけど.... 何か盛大に勘違いしてるのか? あと, このサブルーチンの中で l を定義していないんだけどそれは大丈夫?

528612
質問者

補足

すみません。こちらのタイプミスです。出力したいのはeth(n), eph(n)の配列の最後の部分の n =ntime だけです。最初のアドバイスだとdoループ内で(今書いてある位置で)eth(ntime), eph(ntime)と書けばよいのでしょうか?よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

write(10,*) eth(ntime) とか write(20,*) eph(ntime) とは書けない事情があるのですか?

関連するQ&A

  • fortran 配列実行結果

    以下のように実行結果のプログラムを書いたのですが、実行結果の値の(配列)の内容がどのようになっているのか混乱しています。実行結果の値は、 n = 1, l = 1, 2, 3,...,180, n = 2, l = 1, 2, 3, .....180 ...... n = ntime, l = 1, 2, 3, ...180 と書き出されているのでしょうか?どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。 subroutine far_output use consts use fdtd implicit none integer :: n, i, td real(8) :: s real(8) :: theta, phi real(8) :: sx, sy, sz, px, py real(8) :: wth, wph, uth, uph real(8) :: eth(1000), eph(1000) open(10,file="far_field_eth.dat") open(20,file="far_field_eph.dat") open(30,file="far_field.dat") ! s = pi/180.0d0 theta = 0.0d0 ! do i = 0, 360 ! td = i ! phi = s*td phi = 0.0d0 sx = cos(theta)*cos(phi) sy = cos(theta)*sin(phi) sz = -sin(theta) px = -sin(phi) py = cos(phi) do n = 1, ntime ! s = pi/180.0d0 ! theta = 0.0d0 ! do i = 0, 360 ! td = i ! phi = s*td wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz wph = wx(l,n)*px+wy(l,n)*py uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz uph = ux(l,n)*px+uy(l,n)*py eth(n) = -z0*wth-uph eph(n) = -z0*wph+uth write(10,*) eth write(20,*) eph write(30,*) wx(l,n) enddo ! enddo l(エル)は前の(別の)プログラムで l = 1, 180 のdoループで計算させています。

  • fortran 配列宣言

    以下のプログラムの中でeth(n), eph(n)は、配列なのですが、配列宣言はどのようにしたらよいのでしょうか?doループでnが決まるのでどのように配列宣言したらよいかわかりません。いろいろと試してはみたのですがコンパイルの際エラーがでてしまいます。わかる方がいらっしゃったら教えて下さい。よろしくお願いします。 subroutine far_output use consts use fdtd implicit none integer :: n, i, td real(8) :: s real(8) :: theta, phi real(8) :: sx, sy, sz, px, py real(8) :: wth, wph, uth, uph real(8) :: eth(1000), eph(1000) open(10,file="far_field.dat") ! s = pi/180.0d0 phi = 0.0d0 ! do i = 0, 180 ! td = i ! theta = s*td theta = pi/3.0d0 sx = cos(theta)*cos(phi) sy = cos(theta)*sin(phi) sz = -sin(theta) px = -sin(phi) py = cos(phi) do n = 1, ntime wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz wph = wx(l,n)*px+wy(l,n)*py uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz uph = ux(l,n)*px+uy(l,n)*py eth(n) = -z0*wth-uph eph(n) = -z0*wph+uth write(10,*) eth, eph enddo ! enddo close(10) return end subroutine

  • fortran FFT output

    FDTD法で遠方界の計算部分でフーリエ変換した値を使って、極座標変換した遠方界を出力するプログラムを作ったのですがコンパイルの際以下の様なエラーが出てしまいました。 z0も宣言しています。エラーの意味がよくわからず困っています。どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。 ubroutine far_output use consts use fdtd implicit none integer :: n real(8) :: theta, phi real(8) :: sx, sy, sz, px, py real(8) :: wth, wph, uth, uph, eth, eph open(10,file="far_field.dat") theta = 0 do phi = 1, 2*pi sx = cos(theta)*cos(phi) sy = cos(theta)*sin(phi) sz = -sin(theta) px = -sin(phi) py = cos(phi) do n = 1, ntime wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz wph = wx(l,n)*px+wy(l,n)*py uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz uph = ux(l,n)*px+uy(l,n)*py eth(n) = -z0*wth-uph eph(n) = -z0*wph+uth enddo enddo write(10,*) eth(n), eph(n) close(10) return end subroutine コンパイルすると In file far_output.f90:25 eth(n) = -z0*wth-uph 1 Error: Unexpected STATEMENT FUNCTION statement at (1) In file far_output.f90:26 eph(n) = -z0*wph+uth 1 とエラーが出ます。

  • 電界の球座標(Fortran)

    FDTD法で求めたex(i,j,k), ey(i,j,k), ez(i,j,k) を使ってEr, Eθ,Eφを求めたいのですが、以下のプログラムではうまくいきません。式自体が間違っているのでしょうか? 詳しい方がいらっしゃったら教えて下さい。よろしくお願いします。 subroutine efield_spherical use consts use fdtd implicit none integer :: i, j, k, n, td real(8) :: e_r, e_the, e_phi real(8) :: r, theta, phi, s real(8) :: sx, sy, sz real(8) :: tx, ty, tz real(8) :: rx, ry open(10,file="e_r.dat") open(20,file="e_the.dat") open(30,file="e_phi.dat") sx = sin(theta)*cos(phi) sy = sin(theta)*sin(phi) sz = cos(theta) tx = cos(theta)*cos(phi) ty = cos(theta)*sin(phi) tz = sin(theta) rx = sin(phi) ry = cos(phi) theta = 0.0d0 s = pi/180d0 do n = 0, 360 phi = s*n ! Er e_r = ex(i,j,k)*sx+ey(i,j,k)*sy+ez(i,j,k)*sz ! E_theta e_the = ex(i,j,k)*tx+ey(i,j,k)*ty-ez(i,j,k)*tz ! E_phi e_phi = -ex(i,j,k)*rx+ey(i,j,k)*ry write(10,*) e_r write(20,*) e_the write(30,*) e_phi enddo close(10) close(20) close(30) return end subroutine

  • このプログラムの実行結果についてお助け下さい1

    まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。 このプログラムを実行すると、upperのU1、U2と、lowerのU1、U2の結果において、最後のelseの中のプログラムが実行されていないせいで、「ここまでが~」が表示されるだけになり、「抜き出した~」の前の実行結果が初期値通り0になってしまっています。何故どれも最後のelse文が実行されないのか・・・お教え頂けると助かります。あまりにも長いので(コンパクトにできていないので)2回の質問に分けてしまいます・・・。そして非常に見にくくて済みません #include<stdio.h> #include<math.h> int main(void) { int L,M,N,A,B,C; double U1,U2,x,y,z,X,Y,Z,r,ux1,uy1,uz1,ux2,uy2,uz2,Hdx,Hdy,Hdz; double Hdx1,Hdy1,Hdz1,Hdx2,Hdy2,Hdz2,Hdip1,Hdip2,Hdip3,Hdip4,Hdip5,Hdip6,uB,fai,sita,RAD,a,b,c; double Hdx3,Hdy3,Hdz3,Hdx4,Hdy4,Hdz4,Hdx5,Hdy5,Hdz5; double Hdx6,Hdy6,Hdz6,Hdx7,Hdy7,Hdz7,Hdx8,Hdy8,Hdz8; double Hdx9,Hdy9,Hdz9,Hdx10,Hdy10,Hdz10,Hdx11,Hdy11,Hdz11; double Hdx12,Hdy12,Hdz12,Hdx13,Hdy13,Hdz13,Hdx14,Hdy14,Hdz14; double Hdx15,Hdy15,Hdz15,Hdx16,Hdy16,Hdz16,Hdx17,Hdy17,Hdz17; double Hdx18,Hdy18,Hdz18,Hdx19,Hdy19,Hdz19,Hdx20,Hdy20,Hdz20; double Hdx21,Hdy21,Hdz21,Hdx22,Hdy22,Hdz22; double Px1,Py1,Pz1,Px2,Py2,Pz2,THDX11,THDY11,THDZ11; double THDX12,THDY12,THDZ12,THDX21,THDY21,THDZ21; double THDX22,THDY22,THDZ22,R,gamma,Beta,CPA,CPB,CPC,upper,lower; uB=9.274; U1=3.41*uB; U2=-U1; RAD=3.14159265358979/180; a=7.256; b=8.575; c=3.544; Beta=7.55*RAD; CPA=0.0604; CPB=0.3; CPC=0.156; //プロトンの位置 Px1=CPA*a*cos(Beta); Py1=CPB*b; Pz1=CPC*c-CPA*a*sin(Beta); Px2=-Px1; Py2=Py1; Pz2=-Pz1; sita=90*RAD; fai=90*RAD; Hdx5=0; Hdy5=0; Hdz5=0; Hdx6=0; Hdy6=0; Hdz6=0; Hdx7=0; Hdy7=0; Hdz7=0; Hdx8=0; Hdy8=0; Hdz8=0; Hdx9=0; Hdy9=0; Hdz9=0; Hdx15=0; Hdy15=0; Hdz15=0; Hdx16=0; Hdy16=0; Hdz16=0; Hdx17=0; Hdy17=0; Hdz17=0; Hdx18=0; Hdy18=0; Hdz18=0; Hdx19=0; Hdy19=0; Hdz19=0; THDX11=0; THDY11=0; THDZ11=0; THDX12=0; THDY12=0; THDZ12=0; Hdx4=0; Hdy4=0; Hdz4=0; Hdx10=0; Hdy10=0; Hdz10=0; THDX21=0; THDY21=0; THDZ21=0; THDX22=0; THDY22=0; THDZ22=0; Hdx14=0; Hdy14=0; Hdz14=0; Hdx20=0; Hdy20=0; Hdz20=0; R=6; gamma=4.25775; A=(R/a)+1; B=(R/b)+1; C=(R/c)+1; ux1=U1*sin(sita)*cos(fai); uy1=U1*sin(sita)*sin(fai); uz1=U1*cos(sita); ux2=U2*sin(sita)*cos(fai); uy2=U2*sin(sita)*sin(fai); uz2=U2*cos(sita); //upper //U1のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=L*a*cos(Beta); y=M*b; z=N*c-L*a*sin(Beta); X=x-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx1=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy1=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz1=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx2=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy2=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz2=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else if(L==0&&M==0&&N==-1){ Hdx3=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy3=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz3=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else{ Hdx=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); THDX11=THDX11+Hdx; THDY11=THDY11+Hdy; THDZ11=THDZ11+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx4=Hdx1+Hdx2+Hdx3; Hdy4=Hdy1+Hdy2+Hdy3; Hdz4=Hdz1+Hdz2+Hdz3; printf("ここまでがupperのU1の時のL,M,N、それぞれの値\n"); 続きを2に載せます。

  • 電子のS軌道について

    P軌道は、磁気量子数-L,-L+1,.....,0,.....,L で、 -1,0,1 の3つの磁気量子数を取り得る。→PxPyPzが存在。 ・・・・ここまでの確認はできています。 となると、S軌道は、 磁気量子数 0 のみ つまり、Sx のみ、ということになるのですよね? とすると、 炭素Cの電子は 1s(2)2s(2)2p(2) なので、1Sx(2)2Sx(2)2Px(1)2Py(1) になり、価電子は、不対電子4ケには、ならないと 思うのですが、なぜ、不対電子4ケになるのでしょうか? NOやNO2のなぞを解くために、軌道を細かく調べています。 よろしくお願いいたします。

  • 高校数学の行列の問題です、再質問の問題です

    平面上の1次変換fが直交するベクトルの組をつねに直交するベクトルの組に移すとき、↑0でない任意のベクトル↑aに対して|f(↑a)|/|↑a|が 一定値1である1次変換は、原点からの距離を常に不変に保つ1次変換である これは原点のまわりの回転と原点を通る直線に関する対称移動からなる合同変換であることを証明しなさい 解説:fを(p,q,r,s)とする 直交する任意の2ベクトル(x,y),)(-y,x)のfによる像(p,q,r,s)(x,y)=(px+qy,rx+sy),(p,q,r,s)(-y,x)=(-py+qx,-ry+sx)が常に直交する条件は(px+qy)(-py+qx)+(rx+sy)(-ry+sx)=0 すなわち(pq+rx)x^2+(-p^2+q^2-r^2+s^2)xy-(pq+rs)y^2=0が任意の実数x,yに対して成り立つことである(1) よってpq+rs=0かつp^2+r^2=q^2+s^2 この時、任意のベクトル↑a=(x,y)≠0に対して |f(↑a)|^2=(px+qy)^2+(rx+sy)^2=(p^2+r^2)x^2+2(pq+rs)xy+(q^2+s^2)y^2 =(p^2+r^2)|↑a|^2 よって|f(↑a)|/|↑a|=√(p^2+r^2=1、(1)から(p,r)と(q,s)は直交する単位ベクトルである よって実数θ(0<=θ<2π)を用いて (p,q)=(cosθ,sinθ),(q,s)=(cos(θ±π/2),sin(θ±π/2)) =(-+sinθ、±cosθ)(前のsinの-+は-が上で+が下、復号同順) と表せる よって(p,q,r,s)=(cosθ,-sinθ,sinθ,cosθ)(原点を中心とする角θの回転) (cosθ、sinθ,sinθ,-cosθ)(直線xsinθ/2=ycosθ/2に関する対称移動) (cosθ,-sinθ,sinθ,cosθ)(原点を中心とする角θの回転)の方は分かったのですが(直線xsinθ/2=ycosθ/2に関する対称移動)の方が何故そうなるのか分からないです と質問したら 行列 A=(cosθ, sinθ, sinθ, -cosθ)と定義した段階で、対称移動させる直線は、直線Lとなります。直線L: xsin(θ/2) = ycos(θ/2) のことです。 と教えてもらったのですが、何故A=(cosθ, sinθ, sinθ, -cosθ)と定義した段階で、対称移動させる直線は、直線Lとなるのか分かりません、自分でも考えましたが、分からなかったので、是非ともよろしくお願いします

  • 高校数学の行列の問題です

    平面上の1次変換fが直交するベクトルの組をつねに直交するベクトルの組に移すとき、↑0でない任意のベクトル↑aに対して|f(↑a)|/|↑a|が 一定値1である1次変換は、原点からの距離を常に不変に保つ1次変換である これは原点のまわりの回転と原点を通る直線に関する対称移動からなる合同変換であることを証明しなさい 解説:fを(p,q,r,s)とする 直交する任意の2ベクトル(x,y),)(-y,x)のfによる像(p,q,r,s)(x,y)=(px+qy,rx+sy),(p,q,r,s)(-y,x)=(-py+qx,-ry+sx)が常に直交する条件は(px+qy)(-py+qx)+(rx+sy)(-ry+sx)=0 すなわち(pq+rx)x^2+(-p^2+q^2-r^2+s^2)xy-(pq+rs)y^2=0が任意の実数x,yに対して成り立つことである(1) よってpq+rs=0かつp^2+r^2=q^2+s^2 この時、任意のベクトル↑a=(x,y)≠0に対して |f(↑a)|^2=(px+qy)^2+(rx+sy)^2=(p^2+r^2)x^2+2(pq+rs)xy+(q^2+s^2)y^2 =(p^2+r^2)|↑a|^2 よって|f(↑a)|/|↑a|=√(p^2+r^2=1、(1)から(p,r)と(q,s)は直交する単位ベクトルである よって実数θ(0<=θ<2π)を用いて (p,q)=(cosθ,sinθ),(q,s)=(cos(θ±π/2),sin(θ±π/2)) =(-+sinθ、±cosθ)(前のsinの-+は-が上で+が下、復号同順) と表せる よって(p,q,r,s)=(cosθ,-sinθ,sinθ,cosθ)(原点を中心とする角θの回転) (cosθ、sinθ,sinθ,-cosθ)(直線xsinθ/2=ycosθ/2に関する対称移動) (cosθ,-sinθ,sinθ,cosθ)(原点を中心とする角θの回転)の方は分かったのですが(直線xsinθ/2=ycosθ/2に関する対称移動)の方が何故そうなるのか分からないです

  • 物理の問題について

    物理を独学で勉強しています。 今度大学院を受験します。 その過去問についてです。 物理について質問できる友達はおろか先生すらいないので ご協力お願いします。 自信のない問題について質問させていただきます。 問題の下に『→』と書いて僕の意見や考え等とします。 1. 角運動量の定義を述べよ    →『ある物体が持っている回転の強さを表す物理量でL=r×pで表される』  はあってますか? 2. 演算子a,a+,Nを  a=(ip+mωx)/√(2mωh),a+=(-ip+mωx)/√(2mωh),N=a+a  により定義する。    【1】 Nの固有値nに属する規格化された固有ベクトルを|n >で表す。    演算子Nの0以上の整数であることがわかっている。a|0>=0であることを示せ。        →『a|0>=a×1|0>      =a(aa+-a+a)|0>      =a(N+-N)|0>      Nの固有値は0以上の整数だから      a|0>=a(N+-N)|0>=a(n+-n)|0>      となる。』      であってますか?  【2】 a+|n>がNの固有値n+1に属する固有ベクトルであることを示せ。        →『交換関係より     Na+|n>=a+N|n>+a+|n> =na+|n>+a+|n> =(n+1)a+|n> となる』     であっていますか?  【3】 |n+1>=Cna+|n>を満たす定数Cn(>0)を求めよ。        →さっぱりわかりません。  【4】 H0=p^2/2m + mω^2x^2/2    をaとa+で表し、|n>がH0の固有ベクトルであることを示せ。また、|n>のエネルギー固有値を求め    よ。        →a+aとaa+からそれぞれ     H0=ωh(a+a + 1/2) H0=ωh(aa+ - 1/2)     が得られ両方ともH0の固有ベクトルだといえると思いますし、エネルギー固有値も     E=ωh(n + 1/2)|n>     と一致しますがどちらが正しいのでしょうか?    【5】 b=a - c, b+=a+ -c    により定義する。ここで、c=(F/hω)√(h/2mω)は定数、a,a+は先述した演算子である。    H=H0-Fx (H0は先述したもので、Fは一定です)    を演算子bとb+を用いて表しHの基底状態のエネルギーを求めよ。        →【4】の答えに合わせてbb+かb+bと思ったんですけど、      変な形というかどうもさっぱりしませんでした。 3. 演算子x,y,px、pyの交換関係について述べよ    →【px,x】=【py,y】=-ih 【x,px】=【y,py】=ih    【px,px】=【py,py】=【x,x】=【y,y】=【px,y】=【py,x】=【y,px】=【x,py】=0    よって【略】=0のものは同時観測が可能である    であってますか?関係について述べよとあったので全部求めて説明したつもりなんですけど…。    普通は≠0のところだけですよね? 以上です。 物理の試験を受けたことがないので、 どのように解答したらよいかわからないです。 高校で物理をとってた友人に「数式ばっかじゃ試験官にすぐバツつけられちゃうよ」 といわれてしまいましたが、どこで、何をどのように説明したら良いかわからないです。 この辺についてもよろしければコメントよろしくお願いします。

  • このプログラムのエラーの原因を教えて下さいNo.1

    まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。 このプログラムを実行すると、Hdx3no2が宣言なしで使われているとエラーが出るのですが理由がわかりません。どこがおかしいのか教えてもらえると助かります。あまりにも長いので(コンパクトにできていないので)3回の質問に分けてしまいます・・・。そして非常に見にくくて済みません。 #include<stdio.h> #include<math.h> int main(void) { int L,M,N,A,B,C; double U1,U2,x,y,z,X,Y,Z,r,ux1,uy1,uz1,ux2,uy2,uz2,Hdx,Hdy,Hdz; double Hdx1,Hdy1,Hdz1,Hdx2,Hdy2,Hdz2,Hdip1,Hdip2,uB,fai,sita,RAD,a,b,c; double Hdx3,Hdy3,Hdz3,Hdx3no1,Hdy3no1,Hdz3no1,Hdx3no2,Hdy3no2,Hdz3no2; double Hdx4,Hdy4,Hdz4,Hdx4no1,Hdy4no1,Hdz4no1,Hdx4no2,Hdy4no2,Hdz4no2; double Px1,Py1,Pz1,Px2,Py2,Pz2,THDX11,THDY11,THDZ11; double THDX12,THDY12,THDZ12,THDX21,THDY21,THDZ21; double THDX22,THDY22,THDZ22,R,gamma,Beta,CPA,CPB,CPC,upper,lower; uB=9.274; U1=3.41*uB; U2=-U1; RAD=3.14159265358979/180; a=7.256; b=8.575; c=3.544; Beta=7.55*RAD; CPA=0.0604; CPB=0.3; CPC=0.156; //プロトンの位置 Px1=CPA*a*cos(Beta); Py1=CPB*b; Pz1=CPC*c-CPA*a*sin(Beta); Px2=-Px1; Py2=Py1; Pz2=-Pz1; sita=90*RAD; fai=90*RAD; THDX11=0; THDY11=0; THDZ11=0; THDX12=0; THDY12=0; THDZ12=0; THDX21=0; THDY21=0; THDZ21=0; THDX22=0; THDY22=0; THDZ22=0; R=6; gamma=4.25775; A=(R/a)+1; B=(R/b)+1; C=(R/c)+1; ux1=U1*sin(sita)*cos(fai); uy1=U1*sin(sita)*sin(fai); uz1=U1*cos(sita); ux2=U2*sin(sita)*cos(fai); uy2=U2*sin(sita)*sin(fai); uz2=U2*cos(sita); //upper //U1のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=L*a*cos(Beta); y=M*b; z=N*c-L*a*sin(Beta); X=x-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R&&L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){ Hdx=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); THDX11=THDX11+Hdx; THDY11=THDY11+Hdy; THDZ11=THDZ11+Hdz; printf("L=%d M=%d N=%d R=%lf\nAAA\n",L,M,N,r); } else if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){ Hdx3no1=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy3no1=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz3no1=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else{ continue; } } } } //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R&&L!=-1&&M!=0&&N!=-1||L!=-1&&M!=0&&N!=0||L!=-1&&M!=0&&N!=1){ if(L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2+Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2+Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2+Z)/pow(r,5)); THDX12=THDX12+Hdx; THDY12=THDY12+Hdy; THDZ12=THDZ12+Hdz; printf("L=%d M=%d N=%d R=%lf\nBBB\n",L,M,N,r); } } else if(L==-1&&M==0&&N==-1||L==-1&&M==0&&N==0||L==-1&&M==0&&N==1){ if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){ Hdx3no2=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy3no2=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz3no2=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } } else{ continue; } } } } これをNo.1として続きのプログラムをNo.2に挙げます。

専門家に質問してみよう