24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1904  |  回复: 7

zyj8119

木虫 (著名写手)

[交流] 【讨论】我收集到的状态方程编程已有1人参与

CODE:
// hardspherechain.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "math.h"
#include "iostream.h"
#include "fstream.h"
#include "stdlib.h"


#define N 240 //将狭缝分为N个区间
#define DIA 20//直径占的区间数
#define STEP 1800 //步数
#define YITA  0.05//对比密度
#define PI 3.141592653589796234
#define T 1.
#define L 1.5   //ramit
#define M 1 //链长
#define BV 0//链长
#define fix 0//从0开始到M-1
#define DELTA 0.00000001  //误差
#define K 250//链长
#define LL 1
#define P1 (-890.366+2510.86*sqrt(L)-2629.19*L+1212.91*L*sqrt(L)-208.167*L*L)
#define P2 (-957.906+2722.24*sqrt(L)-2872.35*L+1334.96*L*sqrt(L)-230.768*L*L)
#define P3 (943.572-2808.87*sqrt(L)+3082.31*L-1481.70*L*sqrt(L)+263.780*L*L)

#define deP1 (2510.86/2./sqrt(L)-2629.19+1.5*1212.91*sqrt(L)-2.*208.167*L)
#define deP2 (2722.24/2./sqrt(L)-2872.35+1.5*1334.96*sqrt(L)-2.*230.768*L)
#define deP3 (-2808.87/2./sqrt(L)+3082.31-1.5*1481.70*sqrt(L)+2.*263.780*L)


#define PA ((P1+P2+6.)/4.)
#define PB ((P1-P2+P3+5.)/7.)
#define PC ((2.*P1-P3+2.)/3.)


#define W(z) (0.75/DIA/DIA/DIA*(DIA*DIA-(z)*(z)))   //硬球权重因子
#define W2(z) (0.75/DIA/DIA/DIA/(L)/(L)/(L)*(DIA*DIA*(L)*(L)-(z)*(z)))//方井权重因子

#define A (M*(1+(M-1)*0.45696/(M*1.)-(M-1)*(M-2)*0.74745/(M*M*1.)))
#define B (M*(1+(M-1)*2.10386/(M*1.)+(M-1)*(M-2)*3.49695/(M*M*1.)))
#define C (M*(1+(M-1)*1.75503/(M*1.)+(M-1)*(M-2)*4.83207/(M*M*1.)))

#define BA(yita)  ((((3.+A-B+3.*C)*(yita)-(1.+A+B-C))/(2.*(1.-(yita)))+(1.+A+B-C)/(2*(1.-(yita))*(1.-(yita)))+(C-1.)*log(1.-(yita)))/M)
#define DEBA(yita) ((PI/6.*((1.-C)/(1.-(yita))+(1.-B+2.*C)/(1.-(yita))/(1.-(yita))+(1.+A+B-C)/(1.-(yita))/(1.-(yita))/(1.-(yita))))/M)

#define METHOD  0  //计算方法,0表示单链模拟,1表示GL、GR方法

double rou[N],newrou[N],rouav[N],rouav2[N],su[M];   
double lamda[N],lamda2[N],gl[M][N],gr[M][N];
double famda[M][N],fvext[M][N],roum[M][N];
double avgdens,correct;   //平均密度
double dd;  //误差


double monoba(double yita)
{
        double khs,a1,a2,i1,i2;
        khs=(1.-yita)*(1.-yita)*(1.-yita)*(1.-yita)/(1.+4.*yita+4.*yita*yita-4.*yita*yita*yita+yita*yita*yita*yita);
        /////////////
        i1=(P1*yita+P2)/2./yita/(1.-yita);
        i1+=-P2/2./yita/(1.-yita)/(1.-yita);
        i1+=P3*log(1.-yita)+1.;
        /////////////////////
        i2=P1/2./(1.-yita);
        i2+=(P1*yita+P2)/2./(1.-yita)/(1.-yita);
        i2+=-P2/(1.-yita)/(1.-yita)/(1.-yita);
        i2+=P3*log(1.-yita);
        i2+=-yita*P3/(1.-yita)+1.;
        //i2=1/3*(yita*yita*yita-1)*i2;
        /////////////////////
        a1=-4.*(L*L*L-1.)/T*yita*i1;
        a2=-2.*(L*L*L-1.)/T/T*yita*khs*i2;
        return (a1+a2);
}


double demonoba(double yita)     //方阱单体项的导数
{
        double i2,khs;
        double da1dy,da2dy,dkhsdy,di2dy,dyitai2dy;
        khs=(1.-yita)*(1.-yita)*(1.-yita)*(1.-yita)/(1.+4.*yita+4.*yita*yita-4.*yita*yita*yita+yita*yita*yita*yita);
        /////////////
        /////////////////////
        i2=P1/2./(1.-yita);
        i2+=(P1*yita+P2)/2./(1.-yita)/(1.-yita);
        i2+=-P2/(1.-yita)/(1.-yita)/(1.-yita);
        i2+=P3*log(1.-yita);
        i2+=-yita*P3/(1.-yita)+1.;
        /////////////////////
        dkhsdy=-4.*(1.-yita)*(1.-yita)*(1.-yita)/(1+4.*yita+4.*yita*yita-4.*yita*yita*yita+yita*yita*yita*yita)-(1.-yita)*(1.-yita)*(1.-yita)*(1.-yita)*(4.+8.*yita-12.*yita*yita+4.*yita*yita*yita)/(1+4.*yita+4.*yita*yita-4.*yita*yita*yita+yita*yita*yita*yita)/(1.+4.*yita+4.*yita*yita-4.*yita*yita*yita+yita*yita*yita*yita);
        di2dy=(P1-P3)/(1.-yita)/(1.-yita)+((1.-yita)*(P1*yita+P2)-3.*P2)/(1.-yita)/(1.-yita)/(1.-yita)/(1.-yita)-P3/(1.-yita);
        dyitai2dy=i2+yita*di2dy;
        da1dy=-4.*(L*L*L-1.)/T*i2;
        da2dy=-2.*(L*L*L-1.)/T/T*(dkhsdy*yita*i2+khs*dyitai2dy);
        return ((da1dy+da2dy)*PI/6.);
}






double chainba(double yita)
{
        double ghs,i1dl,i1,i2,a1dl,a1dy,lny1,lny2;
        ghs=(1.-1./2.*yita)/(1.-yita)/(1.-yita)/(1.-yita);
        /////////////
        i1=(P1*yita+P2)/2./yita/(1.-yita);
        i1+=-P2/2./yita/(1.-yita)/(1.-yita);
        i1+=P3*log(1.-yita)+1.;
                /////////////////////       
        i1dl=(deP1*yita+deP2)/2./yita/(1.-yita);
        i1dl+=-deP2/2./yita/(1.-yita)/(1.-yita);
        i1dl+=deP3*log(1.-yita);
        /////////////////////
        i2=P1/2./(1.-yita);
        i2+=(P1*yita+P2)/2./(1.-yita)/(1.-yita);
        i2+=-P2/(1.-yita)/(1.-yita)/(1.-yita);
        i2+=P3*log(1.-yita);
        i2+=-yita*P3/(1.-yita)+1.;
        ////////////////////////////////
        a1dy=-4.*(L*L*L-1.)/T*i2;
        a1dl=-4.*(L*L*L-1.)/T*yita*i1dl-4.*3.*L*L/T*yita*i1;
        /////////////////////

lny1=log((ghs+1./4*(a1dy-L/3./yita*a1dl))/ghs);
//////////////////////////////////////

        lny2=(M-1.)/M/T*((PA*yita+PB)/2./(1.-yita)-PB/2./(1.-yita)/(1.-yita)+PC*log(1.-yita));

        return (-(M-1.)*lny1-(M-2.)*lny2);
}



double dechainba(double yita)
{
        return (chainba(yita+0.0001)-chainba(yita))/0.0001*PI/6.;
}

///////////////////////////////////////////////////////////////////////////
double ba(double yita)   
{
        return (monoba(yita)+chainba(yita)/M);
}


double deba(double yita)   
{
        return (demonoba(yita)+dechainba(yita)/M);
}

int min(int i,int j)
{
        if(i>j)return j;
        else return i;
}

int max(int i,int j)
{
        if(i>j)return i;
        else return j;
}

double mind(double i,double j)
{
        if(i         else return j;
}

double maxd(double i,double j)
{
        if(i>j)return i;
        else return j;
}

double juedui(double x)
{
        if(x<0)return -x;
        return x;
}

double bvext(int z)
{
        if(z=N-DIA)return 1.E+100;
        return 0;
        //return 0;
}
double bfix(int z)
{
        if(z=N-DIA)return 1.E+100;
        if(z<(DIA+LL))return -BV;//方井壁
        //return -15*(exp(-LAM*(z-DIA)*1./DIA)+exp(-LAM*(N-DIA-z)*1./DIA));//指数壁
        //if(z<(DIA+LL*DIA)) return BV*z/(LL*DIA)-(LL+1)*BV/LL;//三行一起用 表示三角壁
        //if(z>=(N-DIA-LL*DIA)) return BV*(N-z)/(LL*DIA)-(LL+1)*BV/LL;
        return 0;
}
void firstrou()     //初始化密度分布
{
        int i;
        double sum;
        for(i=0,sum=0.;i         {
                if(bvext(i)>1.E+90)rou[i]=0.;
                else rou[i]=YITA*6./PI;
                sum+=rou[i];
        }
        avgdens=sum/(N-2.*DIA);
        return;
}

void calrouav()     //计算粗粒化密度
{
        int i,j,j1,j2;
        double sum;

        for(i=0;i         {
                sum=0.;
             j1=max(DIA,i-DIA);
                j2=min(N-1-DIA,i+DIA);
                sum+=W(i-j1)*rou[j1]/2.;
                for(j=j1+1;j                 {
                        sum+=W(i-j)*rou[j];
                }
                sum+=W(i-j2)*rou[j2]/2.;
               
                rouav[i]=sum;//
        }
        //////////////以下为修正项///////////////////
        //for(i=DIA,sum=0.;i         //correct=avgdens*(N-2.*DIA)/sum/2.;
        //for(i=DIA,sum=0.;i     /////////////////////////////////////////////
        for(i=0;i         {
                sum=0.;
                        j1=max(DIA,i-int(L*DIA));
                j2=min(N-1-DIA,i+int(L*DIA));

                sum+=W2(i-j1)*rou[j1]/2.;
                for(j=j1+1;j                 {
                        sum+=W2(i-j)*rou[j];
                }
                sum+=W2(i-j2)*rou[j2]/2.;
               
                rouav2[i]=sum;//
        }
        ////////////以下为修正项////////////////////
        //for(i=DIA,sum=0.;i         //correct2=avgdens*(N-2.*DIA)/sum/2.;
        //for(i=DIA,sum=0.;i         /////////////////////////////////////////////
        return;
}

void callamda()     //计算lamda
{
        int i,j,k,j1,j2;
        double sum;

        for(i=0;i         {
                sum=0.;
              j1=max(DIA,i-DIA);
                j2=min(N-1-DIA,i+DIA);
        sum+=rou[j1]*W(j1-i)*DEBA(rouav[j1]*PI/6.)/2.;
                for(j=j1+1;j                 sum+=rou[j2]*W(j2-i)*DEBA(rouav[j2]*PI/6.)/2.;
                //sum*=correct;//
                sum+=BA(rouav[i]*PI/6.);
                lamda[i]=sum;
        }
        for(i=0;i         {
                sum=0.;
                        j1=max(DIA,i-int(L*DIA));
                j2=min(N-1-DIA,i+int(L*DIA));
        sum+=rou[j1]*W2(j1-i)*deba(rouav2[j1]*PI/6.)/2.;
                for(j=j1+1;j                 sum+=rou[j2]*W2(j2-i)*deba(rouav2[j2]*PI/6.)/2.;
                sum+=ba(rouav2[i]*PI/6.);
                lamda2[i]=sum;//cout<         }
        if(METHOD==1)
        {
                for(i=0;i                 {  lamda[i]+=lamda2[i]+bvext(i);
                     for(k=0;k                          {fvext[k][i]=0.;
                        if(k==fix)fvext[k][i]=bfix(i);
                         famda[k][i]=lamda[i]+fvext[k][i];
                         }
                }
                for(i=0;i                 {
                        gl[0][i]=1.;
                        gr[M-1][i]=1.;
                }
                for(i=0;i                 {
           j1=max(DIA,i-DIA);
                   j2=min(N-1-DIA,i+DIA);
                   for(k=1;k                    {
                           gl[k][i]=exp(-famda[k-1][j1])*gl[k-1][j1]/2.;
                           gr[M-k-1][i]=exp(-famda[M-k][j1])*gr[M-k][j1]/2.;
                           for(j=j1+1;j                            {
                                   gl[k][i]+=exp(-famda[k-1][j])*gl[k-1][j];
                               gr[M-k-1][i]+=exp(-famda[M-k][j])*gr[M-k][j];
                           }
                           gl[k][i]+=exp(-famda[k-1][j2])*gl[k-1][j2]/2.;
                           gr[M-k-1][i]+=exp(-famda[M-k][j2])*gr[M-k][j2]/2.;
                           gl[k][i]=gl[k][i]/(2*DIA);
                           gr[M-k-1][i]=gr[M-k-1][i]/(2*DIA);
                   }
                }
        }
        if(METHOD==0)
        {
                for(i=0;i                 {  lamda[i]+=lamda2[i]+bvext(i);
                     for(k=0;k                          {fvext[k][i]=0.;
                        if(k==fix)fvext[k][i]=bfix(i);
                         famda[k][i]=lamda[i]+fvext[k][i];
                         }
                }

        }
        return;
}

void calrou()       //计算密度
{
        int i,z;
        if(METHOD==1)
        {
                for(z=0;z                 {
                        for(i=0;i                         {
                                roum[i][z]=exp(-famda[i][z])*gl[i][z]*gr[i][z];
                        }
                }
        }
                if(METHOD==0)
        {
                for(z=0;z                 {
                        for(i=0;i                         {
                                roum[i][z]=exp(-famda[i][z]);
                        }
                }
        }
        return;
}

int calnewrou()     //得到新的密度分布
{
        int i,k;
        double sum;
    for(k=0;k         { su[k]=0;
                for(i=0;i                 {       
                        su[k]+=roum[k][i];
                }
                su[k]=su[k]/(N-2.*DIA);
        }
        for(i=0;i         {
                for(k=0;k                 {
                        roum[k][i]=roum[k][i]*avgdens/su[k]/M;
                }
        }
        sum=0.;
        for(i=0;i         {sum=0;
            for(k=0;k                 {
            sum+=roum[k][i];
                }
                newrou[i]=sum;
        }

        dd=0.;
        for(i=0;i         {
                newrou[i]=(K*rou[i]+newrou[i])/(K+1.);
                dd=maxd(dd,juedui(newrou[i]-rou[i]));
                rou[i]=newrou[i];
        }
        if(dd         return 0;
}

void out()         //输出
{
        int i;
        ofstream Op("output.dat",ios::out);               
        for(i=DIA;i         {
                Op<         }
    cout<<"complite"<         return;       
}

int main(int argc, char* argv[])
{
        int i,condition;
        firstrou();
        for(i=0;i         {
                calrouav();
                callamda();
                calrou();
                condition=calnewrou();
                if(condition==1)break;
                if(i%100==0)cout<         }
        out();
        cout<         cout<         return 0;
}

回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

好好学习,天天向上。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

★ ★ ★
lei0736(金币+3):谢谢 2010-09-08 19:20:48
引用回帖:
Originally posted by zyj8119 at 2010-09-08 17:58:47:
[code]// hardspherechain.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "math.h"
#include "iostream.h"
#include &quo ...

其实,MC吸附也可以与链流体密度泛函的结果相互比对,再与实验的比对,这三者分别为模拟,理论,实验。在没有模拟前,只有理论和实验。
好好学习,天天向上。
2楼2010-09-08 18:00:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

★ ★ ★
lei0736(金币+3):谢谢 2010-09-08 19:20:59
MOF或者分子筛的结构可以划分为无数的小的格子,使用状态方程,通过迭代,求出每个格子的最终吸附数量,然后加和,就是总的吸附数量。而模拟却只是考虑LJ势能函数和电荷,不必使用状态方程迭代而已,使用的是MC方法。
好好学习,天天向上。
3楼2010-09-08 18:02:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

★ ★
lei0736(金币+2):谢谢 2010-09-08 19:21:09
对MOF或者分子筛吸附的流体密度泛函感兴趣,可以参考 胡英的《近代化工热力学》,以及姜建文的理论文章(非模拟)
好好学习,天天向上。
4楼2010-09-08 18:02:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)


lei0736(金币+1):谢谢 2010-09-08 19:21:19
CO2也是一种链流体,不过挺简单的。
好好学习,天天向上。
5楼2010-09-08 18:05:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

★ ★ ★ ★ ★ ★
zh1987hs(金币+3):谢谢专家的资源,希望能够再接再厉 2010-09-10 23:09:11
zh1987hs(金币+3):谢谢专家的资源,希望能够再接再厉 2010-09-10 23:10:14
引用回帖:
Originally posted by zyj8119 at 2010-09-08 18:05:34:
CO2也是一种链流体,不过挺简单的。

http://d.namipan.com/d/ad63c9a09 ... a72998111dac15b0000:这个是双链铆接,上面的程序是方阱纯链铆接。
好好学习,天天向上。
6楼2010-09-10 16:51:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)

★ ★
zh1987hs(金币+1):谢谢专家的解释 2010-09-10 23:09:39
zh1987hs(金币+1):谢谢专家的解释 2010-09-10 23:10:04
引用回帖:
Originally posted by zyj8119 at 2010-09-08 17:58:47:
[code]// hardspherechain.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "math.h"
#include "iostream.h"
#include &quo ...

其实做这个的也很少,我看到前面有个人要硬球的代码,如果能帮助到需要的人,我觉得就很好了,这些代码都是不同状态方程的近似解,要想搞懂,必须对近代化工热力学很熟悉的。。
好好学习,天天向上。
7楼2010-09-10 18:13:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zyj8119

木虫 (著名写手)


zh1987hs(金币+1):谢谢 2010-09-10 23:09:52
引用回帖:
Originally posted by zyj8119 at 2010-09-08 17:58:47:
[code]// hardspherechain.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "math.h"
#include "iostream.h"
#include &quo ...

我觉得能够看过代码的人,都可以七嘴八舌的说几句,说错了没有关系,只有这样大家的水平才能上升。
好好学习,天天向上。
8楼2010-09-10 18:16:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zyj8119 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见