1 ضمیمه
دستور if به درستی اجرا نمی شود!!!
سلام
کد زیر در قسمت آخر جایی که دستور if قرار داره یک مشکلی هست که من متوجه آن نمیشم.
این If برای یک سری داده ها جواب نمیده با این که شرط برای اون داده ها برقراره و من مجبورم برم از تو فایل عدد مورد نظر رو پیدا کنم
اگر کسی میدونه ممنون میشم بگه
مشکل به این صورت است که برای عدد CFL 0.8 و به ازای dt های مختلف محاسبه بشه و مقدار U برای x=2 , در زمان t=1 رو به خروجی بده
تا dt=0.05 شرط جواب میده ولی برای dt های کوچکتر جوابی به خروجی نمیده و فقط تو فایل ذخیره میکنه که باید از اونجا یادداشت کنم.:گریه::گریه::گریه:
فایل ضمیمه شده ممنون میشم اگه کسی جواب بده ضمیمه 149333
نقل قول: دستور if به درستی اجرا نمی شود!!!
نقل قول:
نوشته شده توسط
Mostafa.Aero
سلام
کد زیر در قسمت آخر جایی که دستور if قرار داره یک مشکلی هست که من متوجه آن نمیشم.
این If برای یک سری داده ها جواب نمیده با این که شرط برای اون داده ها برقراره و من مجبورم برم از تو فایل عدد مورد نظر رو پیدا کنم
اگر کسی میدونه ممنون میشم بگه
مشکل به این صورت است که برای عدد CFL 0.8 و به ازای dt های مختلف محاسبه بشه و مقدار U برای x=2 , در زمان t=1 رو به خروجی بده
تا dt=0.05 شرط جواب میده ولی برای dt های کوچکتر جوابی به خروجی نمیده و فقط تو فایل ذخیره میکنه که باید از اونجا یادداشت کنم.:گریه::گریه::گریه:
فایل ضمیمه شده ممنون میشم اگه کسی جواب بده
ضمیمه 149333
سورس کدتون را همین جا قرار بدید!
نقل قول: دستور if به درستی اجرا نمی شود!!!
// Explicit Method
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
ofstream expli("explicit.txt");
int main()
{
expli<<"VARIABLES = X,U"<<endl;
double dt,dx,c,t;
double length=4; //cm
double a=1; // cm/s
double j,p;
int i;
cout<<"Enter the Time_Step (dt)"<<endl;
cin>>dt;
cout<<"Enter the CFL Number"<<endl;
cin>>c;
dx=a*dt/c;
int Ngrid=(length/dx)+1; // number of grid
double U_old[Ngrid],U_new[Ngrid];
cout<<"Number of Grid : "<<Ngrid<<endl;
cout<<"dx : "<<dx<<endl;
//////////////////////// Solvation Explicit Upwind
expli<<"ZONE T=\"Time= "<<0<<"\""<<endl;
expli<<"solutiontime= "<<0<<endl;
expli<<"I="<<Ngrid<<endl<<"CFL Number="<<c<<endl<<"dx="<<dx<<endl<<"dt="<<dt<<end l<<"F=POINT"<<endl;
for (i=0;i<=Ngrid-1;i++)
{
if ((i*dx)<0.25)
U_old[i]=0;
if ((i*dx)>1.25)
U_old[i]=0;
if ((i*dx)>=0.25 && (i*dx)<=1.25)
U_old[i]=sin((3.14*i*dx)-(3.14/4));
expli<<i*dx<<" "<<U_old[i]<<endl;
}
while (U_old[Ngrid-1]<=0.001)
{
t=t+dt;
expli<<endl<<"VARIABLES = X,U"<<endl;
expli<<"ZONE T=\"Time= "<<t<<"\""<<endl;
expli<<"solutiontime= "<<t<<""<<endl;
expli<<"I="<<Ngrid<<endl<<"F=POINT"<<endl;
U_old[0]=0;
expli<<0<<" "<<U_old[0]<<endl;
for (i=1;i<=Ngrid-1;i++)
{
U_new[i]=-c*(U_old[i]-U_old[i-1])+U_old[i];
if(i*dx==2)
cout<<"x= "<<i*dx<<" U= "<<U_new[i]<<" Time= "<<t<<endl;
}
for (i=1;i<=Ngrid-1;i++)
{
U_old[i]=U_new[i];
expli<<i*dx<<" "<<U_old[i]<<endl;
}
}
cout<<"The End";
return 0;
}
نقل قول: دستور if به درستی اجرا نمی شود!!!
متغییر dx شما از نوع double هست، و توی شرطتون، شما دارید ضرب یک double در int رو که نتیجش double هست رو با عدد 2 که unsigned int هست مقایسه میکنید. این کارتونو راه میندازه:
if (static_cast<unsigned int>(i * dx) == 2)
نقل قول: دستور if به درستی اجرا نمی شود!!!
نقل قول:
نوشته شده توسط
borderliner
متغییر dx شما از نوع double هست، و توی شرطتون، شما دارید ضرب یک double در int رو که نتیجش double هست رو با عدد 2 که unsigned int هست مقایسه میکنید. این کارتونو راه میندازه:
if (static_cast<unsigned int>(i * dx) == 2)
درسته که implicit cast در شرط فوق به نوع بزرگتر double تبدیل می شود ولی عدد 2 در زمان کامپایل به یک ثابت عددی double تفسیر می شود نه unsigned int پس بنابراین شرط فوق بدون نیاز به تبدیل صریح کار خواهد کرد و احتیاجی به static_cast نخواهد بود.!