PDA

View Full Version : دستور if به درستی اجرا نمی شود!!!



Mostafa.Aero
چهارشنبه 07 آذر 1397, 00:03 صبح
سلام
کد زیر در قسمت آخر جایی که دستور if قرار داره یک مشکلی هست که من متوجه آن نمیشم.
این If برای یک سری داده ها جواب نمیده با این که شرط برای اون داده ها برقراره و من مجبورم برم از تو فایل عدد مورد نظر رو پیدا کنم
اگر کسی میدونه ممنون میشم بگه
مشکل به این صورت است که برای عدد CFL 0.8 و به ازای dt های مختلف محاسبه بشه و مقدار U برای x=2 , در زمان t=1 رو به خروجی بده
تا dt=0.05 شرط جواب میده ولی برای dt های کوچکتر جوابی به خروجی نمیده و فقط تو فایل ذخیره میکنه که باید از اونجا یادداشت کنم.:گریه::گریه::گریه:

فایل ضمیمه شده ممنون میشم اگه کسی جواب بده 149333

farhad_shiri_ex
چهارشنبه 07 آذر 1397, 09:20 صبح
سلام
کد زیر در قسمت آخر جایی که دستور if قرار داره یک مشکلی هست که من متوجه آن نمیشم.
این If برای یک سری داده ها جواب نمیده با این که شرط برای اون داده ها برقراره و من مجبورم برم از تو فایل عدد مورد نظر رو پیدا کنم
اگر کسی میدونه ممنون میشم بگه
مشکل به این صورت است که برای عدد CFL 0.8 و به ازای dt های مختلف محاسبه بشه و مقدار U برای x=2 , در زمان t=1 رو به خروجی بده
تا dt=0.05 شرط جواب میده ولی برای dt های کوچکتر جوابی به خروجی نمیده و فقط تو فایل ذخیره میکنه که باید از اونجا یادداشت کنم.:گریه::گریه::گریه:

فایل ضمیمه شده ممنون میشم اگه کسی جواب بده 149333

سورس کدتون را همین جا قرار بدید!

Mostafa.Aero
چهارشنبه 07 آذر 1397, 17:07 عصر
// 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<<endl<<"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;



}

borderliner
جمعه 07 دی 1397, 01:24 صبح
متغییر dx شما از نوع double هست، و توی شرطتون، شما دارید ضرب یک double در int رو که نتیجش double هست رو با عدد 2 که unsigned int هست مقایسه میکنید. این کارتونو راه میندازه:

if (static_cast<unsigned int>(i * dx) == 2)

farhad_shiri_ex
جمعه 07 دی 1397, 11:55 صبح
متغییر 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 نخواهد بود.!