| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 712 人关注过本帖
标题:我有个源程序,请问怎样实现可视化(流线图)
只看楼主 加入收藏
taoliu
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-3-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
我有个源程序,请问怎样实现可视化(流线图)
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<fstream>
#include<sstream>
#include<string>

using namespace std;        
const int Q=9;          //D2Q9模型
const int NX=256;        //x方向
const int NY=256;        //y方向
const double U=0.1;        //顶盖速度

int e[Q][2]={{0,0},{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1}};
double w[Q]={4.0/9,1.0/9,1.0/9,1.0/9,1.0/9,1.0/36,1.0/36,1.0/36,1.0/36};
double rho[NX+1][NY+1],u[NX+1][NY+1][2],u0[NX+1][NY+1][2],f[NX+1][NY+1][Q],F[NX+1][NY+1][Q];
int i,j,k,ip,jp,n;
double c,Re,dx,dy,Lx,Ly,dt,rho0,P0,tau_f,niu,error;

void init();
double feq(int k,double rho, double u[2]);
void evolution();
void output(int m);
void Error();

int main()
{
    using namespace std;
    init();
    for(n=0;;n++)
    {
        evolution();
        if(n%100==0)
        {
            Error();
            cout<<"The"<<n<<"th computation result:"<<endl;
            cout<<"The u,v of point(NX/2,NY/2) is: "<<setprecision(6)
                <<u[NX/2][NY/2][0]<<", "<<u[NX/2][NY/2][1]<<endl;
            cout<<"The max relative error of uv is: "
                <<setiosflags(ios::scientific)<<error<<endl;
            if(n>=1000)
            {
                if(n%1000==0) output(n);
                if(error<1.0e-6) break;
            }
        }
    }
    return 0;
}

void init()
{
    dx=1.0;
    dy=1.0;
    Lx=dx*double(NX);
    Ly=dy*double(NY);
    dt=dx;
    c=dx/dt;
    rho0=1.0;
    Re=1000;
    niu=U*Lx/Re;
    tau_f=3.0*niu+0.5;
    std::cout<<"tau_f= "<<tau_f<<endl;

    for(i=0;i<=NX;i++)    //初始化
        for(j=0;j<=NY;j++)
        {
            u[i][j][0]=0;
            u[i][j][1]=0;
            rho[i][j]=rho0;
            u[i][NY][0]=U;
            for(k=0; k<Q;k++)
                f[i][j][k]=feq(k,rho[i][j],u[i][j]);
        }
}

double feq(int k,double rho, double u[2])
{
    double eu,uv,feq;
    eu=(e[k][0]*u[0]+e[k][1]*u[1]);
    uv=(u[0]*u[0]+u[1]*u[1]);
    feq=w[k]*rho*(1.0+3.0*eu+4.5*eu*eu-1.5*uv);
    return feq;
}

void evolution()    //计算平衡态分布函数
{
    for(i=1;i<NX;i++)    //演化,采用标准的碰撞迁移规则
        for(j=1;j<NY;j++)
            for(k=0;k<Q;k++)
            {
                ip=i-e[k][0];
                jp=j-e[k][1];
                F[i][j][k]=f[ip][jp][k]+(feq(k,rho[ip][jp],u[ip][jp])-f[ip][jp][k])/tau_f;
            }

            for(i=1;i<NX;i++)    //计算宏观量
                for(j=1;j<NY;j++)
                {
                    u0[i][j][0]=u[i][j][0];
                    u0[i][j][1]=u[i][j][1];
                    rho[i][j]=0;
                    u[i][j][0]=0;
                    u[i][j][1]=0;
                    for(k=0;k<Q;k++)
                    {
                        f[i][j][k]=F[i][j][k];
                        rho[i][j]+=f[i][j][k];
                        u[i][j][0]+=e[k][0]*f[i][j][k];
                        u[i][j][1]+=e[k][1]*f[i][j][k];
                    }
                    u[i][j][0]/=rho[i][j];
                    u[i][j][1]/=rho[i][j];
                }

                //边界处理,采用非平衡态外推格式
                for(j=1;j<NY;j++)    //左右边界
                    for(k=0;k<Q;k++)
                    {
                        rho[NX][j]=rho[NX-1][j];
                        f[NX][j][k]=feq(k,rho[NX][j],u[NX][j])+f[NX-1][j][k]-feq(k,rho[NX-1][j],u[NX-1][j]);
                        rho[0][j]=rho[1][j];
                        f[0][j][k]=feq(k,rho[0][j],u[0][j])+f[1][j][k]-feq(k,rho[1][j],u[1][j]);
                    }

                for(i=1;i<NX;i++)    //上下边界
                    for(k=0;k<Q;k++)
                    {
                        rho[i][0]=rho[i][1];
                        f[i][0][k]=feq(k,rho[i][0],u[i][0])+f[i][1][k]-feq(k,rho[i][1],u[i][1]);

                        rho[i][NY]=rho[i][NY-1];
                        u[i][NY][0]=U;
                        f[i][NY][k]=feq(k,rho[i][NY],u[i][NY])+f[i][NY-1][k]-feq(k,rho[i][NY-1],u[i][NY-1]);
                    }
                    
}

void output(int m)    //输出
{
    ostringstream name;
    name<<"cavity_"<<m<<".dat";
    ofstream out(name.str().c_str());
    out<<"Title=\"LBM Lid Driven Flow\"\n"
        <<"VARIABLES=\"X\",\"Y\",\"U\",\"V\"\n"
        <<"ZONE T= \"BOX\", I= "
        <<NX+1<<", J="<<NY+1<<", F=POINT"<<endl;
    for(j=0; j<=NY; j++)
        for(i=0; i<=NX; i++)
        {
            out<<double(i)/Lx<<" "<<double(j)/Ly<<" "
                <<u[i][j][0]<<" "<<u[i][j][1]<<endl;
        }
}

void Error()
{
    double temp1,temp2;
    temp1=0;
    temp2=0;
    for(i=1; i<NX; i++)
        for(j=1;j<NY;j++)
        {
            temp1 += (u[i][j][0]-u0[i][j][0])*(u[i][j][0]-u0[i][j][0])+(u[i][j][1]-u0[i][j][1])*(u[i][j][1]-u0[i][j][1]);
            temp2 += u[i][j][0]*u[i][j][0]+u[i][j][1]*u[i][j][1];
        }
        temp1=sqrt(temp1);
        temp2=sqrt(temp2);
        error=temp1/(temp2+1e-30);
}
希望得到一个二维的流线图。请高手指点指点
搜索更多相关主题的帖子: 模型 include double 源程序 
2012-03-02 15:11
donggegege
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:125
专家分:368
注 册:2011-5-1
收藏
得分:14 
不知道你用的什么编译器,可视化编程简单点你可以用VC中的MFC进行编辑。
2012-03-04 20:00
taoliu
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-3-2
收藏
得分:0 
就是不知道用什么好,你有没有什么学习的资料了
2012-03-06 09:03
donggegege
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:125
专家分:368
注 册:2011-5-1
收藏
得分:0 
可以学习一下VC,vc++6.0编译器就够用啦,内部的MFC可以实现,(大致跟VB可视化编程差不多),C++是基础,vc是在基础之上封装了许多的类库,可以创建窗体,添加控件等等。
2012-03-06 12:10
taoliu
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-3-2
收藏
得分:0 
回复 4楼 donggegege
谢谢
2012-03-07 17:09
快速回复:我有个源程序,请问怎样实现可视化(流线图)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019618 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved