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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

1回答

622閲覧

while で同じ動作を何回も繰り返したい

kisara11235

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2022/12/19 05:13

編集2022/12/19 17:48

前提

プログラムは量子物性
whileで同じ動作を繰り返したい。

実現したいこと

whileの中にある動作を一定回数繰り返してほしいが、コンパイルしても同じ値しか出てこない

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

回数にかかわらず同じ値しか出てこない。

該当のソースコード

//グラフェンナノリボンエネルギーバンド 相互作用 #include <stdio.h> #include <math.h> #include <complex.h> #include <stdlib.h> #define M 6 // 存在するサイト数 #define N 12 //サイト数×2 A+Bの個数 #define L 24 //対角化に必要 N*2 #define P 400 //リボン長 全電子数 P*L #define EPS 0.000001 //収束範囲 #define Q 10 //回数 double b_pi,N_c; double complex t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_8, T_1, T_2, T_3, T_4,T_int; //,t_方向 double e[P+1],k_x[P+1]; double B_1[N][N], B_2[N][N],D[N][N]; double complex C[N][N]; double a[L][L],A[N]; double Energy[P+1][N]; double DOS[P+1][P+1][N]; double ddd[P+1][P+1],dd[P+1]; double fermi[P+1][N],fermisum_1[P+1],f[P+1]; double complex u[P+1][N][N]; //固有ベクトル double u_2[P+1][N],u_3[P+1],u_4[P+1],u_5[P+1][N][N],u_6[P+1][N],u_7[N],u_8[N]; double gap[P+1],meow[P+1][N],min_gap; //Eg,フェルミエネルギーバンド、最小Eg int main(int argc, char** argv){ b_pi=M_PI; N_c=(P+1)*N; double k_xx = -b_pi; double ene=-3.0; double delta_E=2.75*pow(10,-2); //エネルギー分解能 double kt=0.00001*8.6171*pow(10,-5); //-273℃*ボルツマン定数(eV/K) double U=4.32; //相互作用エネルギーの平均(eV) double t=2.75; //飛び移り積分(eV) double n_up[N]; //代入する値 double ribbon_length; //リボン長 FILE* fp; FILE* fp_1; FILE* fp_2; FILE* fp_3; if ((fp = fopen("zigintene.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } if ((fp_1 = fopen("zigintdos.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } if ((fp_2 = fopen("zigintnup_1.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } fp_3 = fopen("zigintnup.txt", "r"); if(fp_3 == NULL) { printf("ファイルを開くことが出来ませんでした.¥n"); } for(int i=0;i<N;i++){ fscanf(fp_3, "%lf", &(n_up[i])); } double omori=0; //0 or 1 //刻み幅 for(int i=0;i<=P;i++){ e[i]=ene+6.0/P*i; k_x[i]=k_xx+2.0*b_pi/P*i; } //リボン幅 ribbon_length=0.246*pow(3,0.5)/2*(N-2)/2; //初期条件 /*for(int i=0;i<N;i++){ if(i%2==1){ n_up[i]=0.4; } else if(i%4==3){ n_up[i]=-0.3; } else{ n_up[i]=0; } }*/ int z=0; while(z<4){ //行列計算 for(int r=0;r<=P;r++){ t_4 = 1; t_5 = cexp(-1 * I * -1/ 2 * k_x[r]); t_6 = cexp(-1 * I *1/2 * k_x[r]); t_1 =1; t_2 = cexp(I * -1 / 2 * k_x[r]); t_3 = cexp(I * 1 / 2 * k_x[r]); t_7 = -1 * t_4; t_8 = -1 * t_1; T_1 = t_5 + t_6; T_2 = t_2 + t_3; T_3 = -1 * T_1; T_4 = -1 * T_2; for (int k = 0;k < N;k++) { for (int h = 0;h < N;h++) { T_int=-U/t*n_up[k]; //強磁性 for (int i = 0;i < M - 2;i++) { if (h < M) { if (k < M) { C[h][k] = 0; C[k][k]=T_int; } else { C[0][M] = T_1; C[M - 1][N - 1] = T_1; C[M - 1][N - 2] = t_4; C[i + 1][M + i] = t_4; C[i + 1][M + i + 1] = T_1; } } else { if (k < M) { C[M][0] = T_2; C[M][1] = t_1; C[N - 1][M - 1] = T_2; C[M + i + 1][i + 1] = T_2; C[M + i + 1][i + 2] = t_1; } else { C[h][k] = 0; C[k][k]=T_int; } } } } } int k, h; for (k = 0;k < N;k++) { for (h = 0;h < N;h++) { D[h][k] = creal(C[h][k]); B_1[h][k] = -1 * cimag(C[h][k]); B_2[h][k] = cimag(C[h][k]); } } for (k = 0;k < L;k++) { for (h = 0;h < L;h++) { if (h < N) { if (k < N) { a[h][k] = D[h % N][k % N]; } else { a[h][k] = B_1[h % N][k % N]; } } else { if (k < N) { a[h][k] = B_2[h % N][k % N]; } else { a[h][k] = D[h % N][k % N]; } } } } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ u[r][i][j]=0.0; } } for(int i=0;i<N;i++){ u[r][i][i]=1.0; } while (1) { double alpha, beta, gamma; double s, c, w; double wa, wb, wc; double max; int i, j, p, q, x, y; //最大要素の行と列を検索 max = 0.0; for (i = 0;i < L - 1;i++) { for (j = i + 1;j < L;j++) if (fabs(a[i][j]) > max) { p = i; q = j; max = fabs(a[i][j]); } } //収束したら解答打ち出し if (max < EPS) break; //sin, cos 計算 wa = a[p][p]; wb = a[p][q]; wc = a[q][q]; alpha = -wb; beta = 0.5 * (wa - wc); gamma = fabs(beta) / sqrt(alpha * alpha + beta * beta); s = sqrt(0.5 * (1.0 - gamma)); if (alpha * beta < 0) s = -s; c = sqrt(1.0 - s * s); //直行変換 for (j = 0;j < L;j++) { w = a[p][j] * c - a[q][j] * s; a[q][j] = a[p][j] * s + a[q][j] * c; a[p][j] = w; } for (j = 0;j < L;j++) { a[j][p] = a[p][j]; a[j][q] = a[q][j]; } w = 2.0 * wb * s * c; a[p][p] = wa * c * c + wc * s * s - w; a[q][q] = wa * s * s + wc * c * c + w; a[p][q] = 0; a[q][p] = 0; for (int i = 0;i < N;i++) { A[i] = a[i][i]; } double tmp; for (int i=0; i<N; i++) { for (int j=i+1; j<N ;j++) { if (A[i] > A[j]) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; } } } for(i=0;i<N;i++){ w=u[r][i][p]*c-u[r][i][q]*s; u[r][i][q]=u[r][i][p]*s+u[r][i][q]*c; u[r][i][p]=w; } } for(int i=0;i<N;i++){ Energy[r][i]=A[i]; } } /*for (int i=0; i<=P; i++) { gap[i]=Energy[i][M]-Energy[i][M-1]; //printf( "%2f %2f %2f\n",Energy[i][M-1],Energy[i][M],gap[i]); } for(int i = 0; i <=P; i++){ if(min_gap > gap[i]) { min_gap = gap[i]; } }*/ //フェルミエネルギー for(int i=0;i<=P;i++){ for(int j=0;j<N;j++){ meow[i][j]=(Energy[i][j]+Energy[i][N-1-j])/2; } } //状態密度 for(int i=0;i<=P;i++){ for(int j=0;j<=P;j++){ for(int k=0;k<N;k++){ DOS[i][j][k]=1/pow(b_pi*2,0.5)/delta_E/b_pi*exp(-1*pow(e[i]-Energy[j][k],2)/2/delta_E/delta_E); } } } for(int i=0;i<=P;i++){ for(int j=0;j<=P;j++){ for(int k=0;k<N;k++){ ddd[i][j]+=DOS[i][j][k]; } } } for(int i=0;i<=P;i++){ for(int j=0;j<=P;j++){ dd[i]+=ddd[i][j]; } } //波動関数の二乗=確率 for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ u_2[l][i]+=pow(cabs(u[l][i][j]),2); } } } for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ u_3[l]+=u_2[l][i]; } } for(int l=0;l<=P;l++){ u_4[l]=u_3[l]/N; //printf( "%7.4lf\n", u_4[l]); //1になって然るべき } //個数をフェルミ関数から計算 for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ fermi[l][i]=1/(1+exp((Energy[l][i]-meow[l][i%M])/kt)); } //printf( "%2f\n",fermi[l][0]); } for(int l=0;l<=P;l++){ for(int i=0;i<M;i++){ f[l]+=fermi[l][i]; //Mと等しくなる } //printf( "%2f\n",f[l]); } //printf( "%2f\n",f[0]); //粒子数(サイト数) for(int i=0;i<N;i++){ for(int l=0;l<=P;l++){ for(int j=0;j<N;j++){ u_5[l][i][j]=pow(cabs(u[l][i][j]),2)*fermi[l][j]; u_6[l][i]+=u_5[l][i][j]; } u_7[i]+=u_6[l][i]; } } for(int i=0;i<N;i++){ if(i%4==omori+1){ u_8[i]=n_up[i]; } else if(i%4==omori+2){ u_8[i]=n_up[i]; } else{ u_8[i]=u_7[i]; } u_8[i]=u_7[i]; n_up[i]=u_8[i]/(P+1); } z++; } for(int i=0;i<=P;i++){ for(int j=0;j<N;j++){ fprintf(fp, "%2f %lf %lf %lf\n",k_x[i],Energy[i][j]-meow[i][j],Energy[i][M-1]-meow[i][j],Energy[i][M]-meow[i][j]); //fprintf(fp, "%2f %lf %lf\n",k_x[i],Energy[i][M-1],Energy[i][M]); //最低バンド } } for(int i=0;i<=P;i++){ fprintf(fp_1, "%2f %lf\n",e[i],dd[i]); //状態密度 } for(int i=0;i<N;i++){ fprintf(fp_2,"%2f\n",u_8[i]/(P+1)); } printf("リボン長:%2f\n", ribbon_length); printf("最小ギャップ:%f\n",min_gap); fclose(fp); fclose(fp_1); fclose(fp_2); fclose(fp_3); return 0; }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pig_vba

2022/12/19 05:20

>回数にかかわらず同じ値しか出てこない。 処理の中身は読んでませんが「ファイルに同じ結果しか出力されない」って意味ですかね? if ((fp = fopen("zigintene.txt", "w")) == NULL)は毎ループで過去のデータ消去して上書きになりますが意図した仕様でしょうか? if ((fp = fopen("zigintene.txt", "a")) == NULL) こうだったりしませんか?
kisara11235

2022/12/19 05:28

コメントありがとうございます。 aですと追記してしまうのでwのようにまた新しい値を書くということでいいと思います。 このプログラムとしては既存のfp_3からデータを取り出してそれを計算してfp_2で書いてそのファイルをもういちどfp_3で開けて、、、みたいな動作を回数分繰り返したいです。
jimbe

2022/12/19 08:48

処理を分けておかないと、どこかの時点でダメになりそうなコードです。
guest

回答1

0

自己解決

コメントを参考に自己解決しました。具体的にはコードを見てもらえると。
主に変えた点はファイルを上書きするタイミングです。

投稿2022/12/19 06:15

kisara11235

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問