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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

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

Q&A

解決済

1回答

1720閲覧

cannot convert 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} to 'double'

drilllaser

総合スコア2

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

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

0グッド

0クリップ

投稿2022/02/17 06:14

流体解析の勉強をしており,
結果をcsvに保存しようとしているのですが
タイトルのようなエラーが出てしまいます.

errorに直接関係があると思われるところのコードを下に示します.
さらにその下に全てのコードを記しておきます.
string型をdouble型には変換できないということを警告されているのですが,
関数の定義では,string型で定義しているのに何故このerrorが出力されるのかわからない状態です.

log_dirはstring型で,csvファイルのパス,他の引数はdouble型の数値を示しています.

c++

1//直接関係していると考えられる部分 2write_log(log_dir, pmin, pmax, umax, umin, vmax, vmin); //ここでerror cannot convert 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} to 'double' 3 4void write_log(std::string file_path, double pmin, double pmax, double umin, double umax, double vmin, double vmax){ 5 std::ofstream file(file_path); 6 file << "pmin," << "pmax," << "umin," << "umax," << "vmin," << "vmax" << std::endl; 7 file << pmin << "," << pmax << "," << umin << "," << umax << "," << vmin << "," << vmax << std::endl; 8 file.close(); 9}

c++

1//コード全体 2 3//=========================== 4// 変数の定義など 5//=========================== 6 7//***** cavity_fvm_smac.cpp と cavity_simple.cpp で共通するもの ***** 8 9#include <iostream> 10#include <filesystem> 11#include <string> 12#include <direct.h> 13#include <math.h> 14#include <fstream> 15#include <stdarg.h> 16//#include <format> 17#define MAX(a,b) ((a)>(b)?(a):(b)) 18#define MIN(a,b) ((a)<(b)?(a):(b)) 19 20//#define ni 10 // 格子分割数(x方向) 21//#define nj 10 // 格子分割数(y方向) 22 23#define ni 20 // 格子分割数(x方向) 24#define nj 20 // 格子分割数(y方向) 25 26//#define ni 40 // 格子分割数(x方向) 27//#define nj 40 // 格子分割数(y方向) 28 29//#define ni 80 // 格子分割数(x方向) 30//#define nj 80 // 格子分割数(y方向) 31 32double u0= 1, // 上壁の速度 33 Lx= 1, Ly= 1, // 計算領域の大きさ(x方向,y方向) 34 35 re= 100, // レイノルズ数 36 //re= 400, // レイノルズ数 37 alpha= 1.8, // SORの加速係数 38 converge= 1.e-6, // SORの収束の判定基準 39 40 u[ni+2][nj+2] , v[ni+2][nj+2], // 速度 41 p[ni+2][nj+2], pc[ni+2][nj+2], // 圧力,圧力補正 42 ae[ni+2][nj+2], aw[ni+2][nj+2], // 離散化方程式の係数 43 an[ni+2][nj+2], as[ni+2][nj+2], 44 ap[ni+2][nj+2], b[ni+2][nj+2], 45 dx, dy, // 格子サイズ 46 visc, // 動粘性係数 47 dvmax, // 速度vの変化量の最大値 48 pcnew, err, 49 smax,smin, // 流れ関数の最大値,最小値 50 umax, umin, 51 vmax, vmin, 52 pmax, pmin; 53 54 55int i, j, iter ; 56 57void sor_pc(); // 圧力補正のポアソン式をSOR法で解くルーチン 58void PlotVector(), PlotStreamline(), PlotPresure(), SaveData(); // 結果の表示ルーチン等 59void output_file(std::string, int, double data[ni+2][nj+2]), write_log(double, double, double, double, double, double); 60FILE *fp ; // gnuplotとの接続のためのファイルポインタ 61 62//**** それ以外のもの ***** 63 64double cn= 0.5, // 時間きざみを決定する係数 (0<cn<1) 65 unew[ni+2][nj+2], vnew[ni+2][nj+2], // 新しい時刻の速度 66 flux_e[ni+2][nj+2], // 検査体積の右界面の流束 67 flux_n[ni+2][nj+2], // 検査体積の上界面の流束 68 ue,vn, // セル界面の速度(右界面,上界面) 69 time, dt, // 時刻、時間きざみ 70 dudt, dvdt, vold; 71 72int n, // 時刻ステップ 73 //nend= 1000; // 計算ステップ数 74 //nend= 2000; // 計算ステップ数 75 nend= 5000; // 計算ステップ数 76 //nend= 10000; // 計算ステップ数 77 78//=========================== 79// メインプログラム 80//=========================== 81 82int main() { 83 //***** gnuplot と接続 ***** 84 //fp = _popen(GNUPLOT_PATH , "w"); 85 //fprintf(fp, "set terminal wxt title '速度ベクトル' size 600,600 \n"); 86 87 std::string out_dir = "C:/.../smac_cavity", 88 p_folder = out_dir + "/p", 89 u_folder = out_dir + "/u", 90 v_folder = out_dir + "/v", 91 log_dir = out_dir + "/log.csv"; 92 93 if (!_mkdir(p_folder.c_str())){ 94 std::cout << "p_folder was made!"; 95 } 96 else std::cout << "couldnt make p_folder"; 97 98 if (!_mkdir(u_folder.c_str())){ 99 std::cout << "u_folder was made!"; 100 } 101 else std::cout << "couldnt make u_folder"; 102 103 if (!_mkdir(v_folder.c_str())){ 104 std::cout << "v_folder was made!"; 105 } 106 else std::cout << "couldnt make v_folder"; 107 108 //***** 定数 ***** 109 visc = 1./re; 110 dx = Lx/(double)ni ; 111 dy = Ly/(double)nj ; 112 dt = cn/(u0/dx + 2*visc*(1/dx/dx + 1/dy/dy)); 113 114 //***** 圧力ポアソン方程式の係数 ***** 115 for(i=1; i<=ni; i++){ 116 for(j=1; j<=nj; j++){ 117 aw[i][j] = 1./dx/dx ; ae[i][j] = 1./dx/dx ; 118 as[i][j] = 1./dy/dy ; an[i][j] = 1./dy/dy ; 119 ap[i][j] = 2./dx/dx + 2./dy/dy; 120 121 // 境界条件を考慮した係数の変更 122 if(j==1) {ap[i][j] = ap[i][j] - as[i][j] ; as[i][j] = 0;} 123 if(j==nj){ap[i][j] = ap[i][j] - an[i][j] ; an[i][j] = 0;} 124 if(i==1) {ap[i][j] = ap[i][j] - aw[i][j] ; aw[i][j] = 0;} 125 if(i==ni){ap[i][j] = ap[i][j] - ae[i][j] ; ae[i][j] = 0;} 126 }} 127 128 pmax = 0.; 129 pmin = 0.; 130 umax = 0.; 131 umin = 0.; 132 vmax = 0.; 133 vmin = 0.; 134 135 //************************************************** 136 // 時間前進 137 //************************************************** 138do{ 139 n = n+1; 140 time = time + dt; 141 142 //***** 境界条件(境界接線方向速度) ***** 143 for(i=1; i<=ni; i++){ 144 u[i][0] = -u[i][1]; // 下境界 u=0 145 u[i][nj+1] = 2*u0-u[i][nj]; // 上境界 u=u0 146 } 147 for(j=1; j<=nj; j++){ 148 v[0][j] = -v[1][j]; // 左境界 v=0 149 v[ni+1][j] = -v[ni][j]; // 右境界 v=0 150 } 151 152 //***** NS方程式:次の時刻の速度の仮の値 ***** 153 154 //----- unew ----- 155 // 流束 156 for(i=0; i<=ni-1; i++){ 157 for(j=0; j<=nj; j++){ 158 ue = (u[i][j]+u[i+1][j])/2; 159 vn = (v[i][j]+v[i+1][j])/2; 160 161// flux_e[i][j] = ue*(u[i+1][j]+u[i][j])/2 - (visc/dx + fabs(ue)/2)*(u[i+1][j]-u[i][j]); //1次風上 162// flux_n[i][j] = vn*(u[i][j+1]+u[i][j])/2 - (visc/dy + fabs(vn)/2)*(u[i][j+1]-u[i][j]); //1次風上 163 164 flux_e[i][j] = ue*(u[i+1][j]+u[i][j])/2 - visc/dx*(u[i+1][j]-u[i][j]); //中心(6.25) 165 flux_n[i][j] = vn*(u[i][j+1]+u[i][j])/2 - visc/dy*(u[i][j+1]-u[i][j]); //中心 166 }} 167 168 // 次の時刻の値 169 for(i=1; i<=ni-1; i++){ 170 for(j=1; j<=nj; j++){ 171 dudt = (flux_e[i-1][j]-flux_e[i][j])/dx + (flux_n[i][j-1]-flux_n[i][j])/dy + (p[i][j]-p[i+1][j])/dx;//(6.10)(6.18) 172 unew[i][j] = u[i][j]+dudt*dt; 173 }} 174 175 //----- vnew ----- 176 // 流束 177 for(i=0; i<=ni; i++){ 178 for(j=0; j<=nj-1; j++){ 179 ue = (u[i][j]+u[i][j+1])/2; 180 vn = (v[i][j]+v[i][j+1])/2; 181 182// flux_e[i][j] = ue*(v[i+1][j]+v[i][j])/2 - (visc/dx + fabs(ue)/2)*(v[i+1][j]-v[i][j]); //1次風上 183// flux_n[i][j] = vn*(v[i][j+1]+v[i][j])/2 - (visc/dy + fabs(vn)/2)*(v[i][j+1]-v[i][j]); //1次風上 184 185 flux_e[i][j] = ue*(v[i+1][j]+v[i][j])/2 - visc/dx*(v[i+1][j]-v[i][j]); //中心 186 flux_n[i][j] = vn*(v[i][j+1]+v[i][j])/2 - visc/dy*(v[i][j+1]-v[i][j]); //中心 187 }} 188 // 次の時刻の値 189 for(i=1; i<=ni; i++){ 190 for(j=1; j<=nj-1; j++){ 191 dvdt = (flux_e[i-1][j]-flux_e[i][j])/dx + (flux_n[i][j-1]-flux_n[i][j])/dy + (p[i][j]-p[i][j+1])/dy; 192 vnew[i][j] = v[i][j]+dvdt*dt; 193 }} 194 195 //***** 速度のdivergence ***** 196 for(i=1; i<=ni; i++){ 197 for(j=1; j<=nj; j++){ 198 b[i][j] = -( (unew[i][j]-unew[i-1][j])/dx + (vnew[i][j]-vnew[i][j-1])/dy )/dt;//(6.36) 199 pc[i][j] = 0; //sorで求める圧力補正の初期値 200 }} 201 202 //***** 圧力補正pcをSOR法で解く ***** 203 sor_pc();//(6,14) 204 205 //***** 速度・圧力を修正し,前の値を更新する *****(6.13)(6.11) 206 dvmax = 0.; 207 for(i=1; i<=ni; i++){ 208 for(j=1; j<=nj; j++){ 209 vold = v[i][j]; 210 if(i != ni) u[i][j] = unew[i][j] + (pc[i][j]-pc[i+1][j])/dx*dt; 211 if(j != nj) v[i][j] = vnew[i][j] + (pc[i][j]-pc[i][j+1])/dy*dt; 212 if(umax < u[i][j]) umax = u[i][j]; 213 if(umin > u[i][j]) umin = u[i][j]; 214 if(vmax < v[i][j]) vmax = v[i][j]; 215 if(vmin > v[i][j]) vmin = v[i][j]; 216 p[i][j] = p[i][j] + pc[i][j]; 217 if(pmax < p[i][j]) pmax = p[i][j]; 218 if(pmin > p[i][j]) pmin = p[i][j]; 219 dvmax = MAX(dvmax, fabs(v[i][j]-vold)); 220 }} 221 222 if (!((int)n%(nend%10))) std::cout << n << "/" << nend << std::endl; 223 224 output_file(p_folder, n, p); 225 output_file(u_folder, n, u); 226 output_file(v_folder, n, v); 227 228}while (n<nend); 229 std::cout << "end!" << std::endl; 230 write_log(log_dir, pmin, pmax, umax, umin, vmax, vmin); 231} 232 233//********************************************************************** 234// 圧力補正のポアソン方程式をSOR法で解く 235//********************************************************************** 236void sor_pc(){ 237 iter = 0; 238 do { 239 iter = iter + 1; 240 err = 0. ; 241 for(i=1; i<=ni; i++) { 242 for(j=1; j<=nj; j++){ 243 pcnew = (aw[i][j]*pc[i-1][j]+ae[i][j]*pc[i+1][j] 244 +as[i][j]*pc[i][j-1]+an[i][j]*pc[i][j+1]+b[i][j])/ap[i][j] ; 245 err = MAX(err, fabs(pcnew-pc[i][j])); 246 pc[i][j] = pc[i][j] + alpha*(pcnew-pc[i][j]); 247 }} 248 //if(iter%10000 == 0) printf("iter=%d err=%f \n",iter, err); 249 } while (err>converge); 250} 251 252void output_file(std::string path_name, int epoch, double data[ni+2][nj+2]){ 253 std::string epoch_s = std::to_string(epoch); 254 255 std::string file_name = path_name + "/" + epoch_s + ".csv"; 256 257 std::ofstream file(file_name); 258 259 for (int i=1; i<ni+2; i++){ 260 for (int j=1; j<nj+2; j++){ 261 file << data[i][j] << ","; 262 } 263 file << std::endl; 264 } 265 file.close(); 266} 267 268void write_log(std::string file_path, double pmin, double pmax, double umin, double umax, double vmin, double vmax){ 269 std::ofstream file(file_path); 270 271 file << "pmin," << "pmax," << "umin," << "umax," << "vmin," << "vmax" << std::endl; 272 file << pmin << "," << pmax << "," << umin << "," << umax << "," << vmin << "," << vmax << std::endl; 273 file.close(); 274}

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

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

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

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

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

guest

回答1

0

ベストアンサー

c++

1void output_file(std::string, int, double data[ni+2][nj+2]), 2 write_log(double, double, double, double, double, double);

ここのプロトタイプ宣言で、第一引数がdoubleだと言ってます。

投稿2022/02/17 06:35

int32_t

総合スコア20839

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

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

drilllaser

2022/02/17 06:37

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問