📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "mds.h"
#include "math.h"
#include "MainFrm.h"
#include "W1.h"
#include "dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_model, Onmodel)
ON_COMMAND(ID_init, Oninit)
ON_COMMAND(ID_simulation, Onsimulation)
ON_COMMAND(ID_outshow, Onoutshow)
ON_COMMAND(ID_continext, Oncontinext)
ON_COMMAND(ID_continsimu, Oncontinsimu)
ON_COMMAND(ID_twosidef, Ontwosidef)
ON_COMMAND(ID_rsimulation, Onrsimulation)
ON_COMMAND(ID_conrnext, Onconrnext)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::Onmodel()
{
dlg DLG;
DLG.DoModal();
tnx=2*DLG.lx+1;
tny=2*DLG.wy+1;
tnz=2*DLG.hz+1;
nloop=DLG.chi;
wlf=DLG.wf;
wlr=DLG.wr;
}
void CMainFrame::Oninit()
{
double x[10000],y[10000],z[10000];
int i,j,k;
sigma=0.361;
sumwlf=0.0;
fp2=fopen("lx.txt","w");
fprintf(fp2,"%d",(tnx-1)/2);
fclose(fp2);
fp2=fopen("wy.txt","w");
fprintf(fp2,"%d",(tny-1)/2);
fclose(fp2);
fp2=fopen("hz.txt","w");
fprintf(fp2,"%d",(tnz-1)/2);
fclose(fp2);
for(i=0;i<10000;i++)
{
for(k=0;k<4;k++)
{
r[i][k]=0.0;
v[i][k]=0.0;
f[i][k]=0.0;
}
}
fp1=fopen("inzb.txt","w");
for(i=1;i<=tnx;i++)
{
x[i]=(i-1)*sigma/2.0;
}
for(i=1;i<=tny;i++)
{
y[i]=(i-1)*sigma/2.0;
}
for(i=1;i<=tnz;i++)
{
z[i]=(i-1)*sigma/2.0;
}
node=0;
for(i=1;i<=tnz;i++)
{
if(i%2!=0)
{
for(j=1;j<=tny;j++)
{
if(j%2!=0)
{
for(k=1;k<=tnx;k++)
{
if(k%2!=0)
{
node=node+1;
r[node][3]=z[i];
r[node][2]=y[j];
r[node][1]=x[k];
}
}
}
if(j%2==0)
{
for(k=1;k<=tnx;k++)
{
if(k%2==0)
{
node=node+1;
r[node][3]=z[i];
r[node][2]=y[j];
r[node][1]=x[k];
}
}
}
}
}
if(i%2==0)
{
for(j=1;j<=tny;j++)
{
if(j%2!=0)
{
for(k=1;k<=tnx;k++)
{
if(k%2==0)
{
node=node+1;
r[node][3]=z[i];
r[node][2]=y[j];
r[node][1]=x[k];
}
}
}
if(j%2==0)
{
for(k=1;k<=tnx;k++)
{
if(k%2!=0)
{
node=node+1;
r[node][3]=z[i];
r[node][2]=y[j];
r[node][1]=x[k];
}
}
}
}
}
}
fprintf(fp1,"\n r");
for(i=1;i<=node;i++)
{
fprintf(fp1,"\n ");
for(j=1;j<=3;j++)
{
fprintf(fp1,"%f " ,r[i][j]);
}
}
fprintf(fp1,"\n v");
for(i=1;i<=node;i++)
{
fprintf(fp1,"\n ");
for(j=1;j<=3;j++)
{
fprintf(fp1,"%f " ,v[i][j]);
}
}
fclose(fp1);
fp2=fopen("nodejd.txt","w");
fprintf(fp2,"%d",node);
fclose(fp2);
/**/
j=(tnx+1)/2;
k=0;
for(i=0;i<10000;i++)
{
pain[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][1]==x[j])
{
k++;
pain[k]=i;
}
}
k1=k;
fp2=fopen("k1.txt","w");
fprintf(fp2,"%d",k1);
fclose(fp2);
fp2=fopen("pain.txt","w");
for(i=1;i<=k1;i++)
{
fprintf(fp2,"%d ",pain[i]);
}
fclose(fp2);
fp2=fopen("proutput.txt","w");
for(i=1;i<=k1;i++)
{
j=pain[i];
fprintf(fp2,"%le %le\n",r[j][2],r[j][3]);
}
fclose(fp2);
k=0;
for(i=0;i<10000;i++)
{
painxy[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][3]==z[tnz])
{
k++;
painxy[k]=i;
}
}
k2=k;
fp2=fopen("k2.txt","w");
fprintf(fp2,"%d",k2);
fclose(fp2);
fp2=fopen("painxy.txt","w");
for(i=1;i<=k2;i++)
{
fprintf(fp2,"%d ",painxy[i]);
}
fclose(fp2);
k=0;
for(i=0;i<10000;i++)
{
painxy2[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][3]==z[tnz-1])
{
k++;
painxy2[k]=i;
}
}
k4=k;
fp2=fopen("k4.txt","w");
fprintf(fp2,"%d",k4);
fclose(fp2);
fp2=fopen("painxy2.txt","w");
for(i=1;i<=k4;i++)
{
fprintf(fp2,"%d ",painxy2[i]);
}
fclose(fp2);
k=0;
for(i=0;i<10000;i++)
{
painxy3[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][3]==z[tnz-2])
{
k++;
painxy3[k]=i;
}
}
k5=k;
fp2=fopen("k5.txt","w");
fprintf(fp2,"%d",k5);
fclose(fp2);
fp2=fopen("painxy3.txt","w");
for(i=1;i<=k5;i++)
{
fprintf(fp2,"%d ",painxy3[i]);
}
fclose(fp2);
/**/
k=0;
for(i=0;i<10000;i++)
{
plane[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][3]==z[1])
{
k++;
plane[k]=i;
}
}
k3=k;
fp2=fopen("k3.txt","w");
fprintf(fp2,"%d",k3);
fclose(fp2);
fp2=fopen("plane.txt","w");
for(i=1;i<=k3;i++)
{
fprintf(fp2,"%d ",plane[i]);
}
fclose(fp2);
k=0;
for(i=0;i<10000;i++)
{
plane2[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][3]==z[2])
{
k++;
plane2[k]=i;
}
}
k6=k;
fp2=fopen("k6.txt","w");
fprintf(fp2,"%d",k6);
fclose(fp2);
fp2=fopen("plane2.txt","w");
for(i=1;i<=k6;i++)
{
fprintf(fp2,"%d ",plane2[i]);
}
fclose(fp2);
k=0;
for(i=0;i<10000;i++)
{
plane3[i]=0;
}
for(i=1;i<=node;i++)
{
if(r[i][3]==z[3])
{
k++;
plane3[k]=i;
}
}
k7=k;
fp2=fopen("k7.txt","w");
fprintf(fp2,"%d",k7);
fclose(fp2);
fp2=fopen("plane3.txt","w");
for(i=1;i<=k7;i++)
{
fprintf(fp2,"%d ",plane3[i]);
}
fclose(fp2);
/**/
}
void CMainFrame::Onsimulation()
{
int i,j;
ic=1;
list();
force();
while(ic<=nloop)
{
intev();
sintev();
ic=ic+1;
}
}
void CMainFrame::list()
{
double rr,rr1,rcd,d;
double dr[4];
int i,j,k,m;
fp7=fopen("list.txt","w");
rcd=3.8025;
d=sqrt(2)*sigma/2;
for(i=0;i<4;i++)
{
dr[i]=0.0;
}
for(i=0;i<10000;i++)
{
for(j=0;j<500;j++)
{
listjd[i][j]=0;
}
}
for(i=0;i<10000;i++)
{
max[i]=0;
}
for(i=1;i<=node;i++)
{
m=0.0;
fprintf(fp7,"\n");
for(j=1;j<=node;j++)
{
if(j!=i)
{
rr=0.0;
for(k=1;k<=3;k++)
{
dr[k]=r[i][k]-r[j][k];
rr=rr+dr[k]*dr[k];
}
rr1=rr/(d*d);
if(rcd-rr1>0)
{
m=m+1;
listjd[i][m]=j;
fprintf(fp7,"%d ",j);
max[i]=m;
}
}
}
fprintf(fp7,"%d",max[i]);
}
fclose(fp7);
}
void CMainFrame::force()
{ double rr,rr1,rrr1,p1,p2,p3,ff,df;
int i,j,k,m;
double dr[4],p[10000],A[3],C[3],rc[3],q[3];
double d,D;
d=sqrt(2)*sigma/2;
A[1]=8289.4599770489921; C[1]=10.7272912864108215;
A[2]=0.01832510350693439; C[2]=0.319759369823463370;
D=13.0792125162800630;
rc[1]=1.65;
rc[2]=1.95;
for(i=0;i<=3;i++)
{
dr[i]=0.0;
}
for(i=1;i<=node;i++)
{
p[i]=0;
for(j=1;j<=max[i];j++)
{
rr=0.0;
for(k=1;k<=3;k++)
{
dr[k]=r[i][k]-r[listjd[i][j]][k];
rr=rr+dr[k]*dr[k];
}
rr1=sqrt(rr);
rr1=rr1/d;
p[i]+=A[2]*(rc[2]-rr1)*(rc[2]-rr1)*exp(-C[2]*rr1);
}
}
for(i=0;i<10000;i++)
{
for(k=0;k<4;k++)
{
f[i][k]=0.0;
}
}
for(i=1;i<=node;i++)
{
for(j=1;j<=max[i];j++)
{
rr=0.0;
p1=0.0;
for(k=1;k<=3;k++)
{
dr[k]=r[i][k]-r[listjd[i][j]][k];
rr=rr+dr[k]*dr[k];
}
rrr1=sqrt(rr);
rr1=rrr1/d;
p1=D*(log(p[i])+log(p[listjd[i][j]])+2);
for(m=1;m<=2;m++)
{
q[m]=0;
if(rr1-rc[m]<0)
{
q[m]=A[m]*(2+C[m]*(rc[m]-rr1))*(rc[m]-rr1)*exp(-C[m]*rr1);
}
}
ff=p1*q[2]+q[1];
for(k=1;k<=3;k++)
{
f[i][k]+=ff*dr[k]/rrr1/d*0.16022;
}
}
}
if((ic==nloop)&&(wlf>0))
{
sumwlf=sumwlf+wlf;
fp2=fopen("sumwlf.txt","w");
fprintf(fp2,"%le",sumwlf);
fclose(fp2);
}
/* fp1=fopen("force.txt","w");
fprintf(fp1,"\n f");
for(i=1;i<=node;i++)
{
fprintf(fp1,"\n ");
for(j=1;j<=3;j++)
{
fprintf(fp1,"%f " ,f[i][j]);
}
}
fclose(fp1);
*/
}
void CMainFrame::intev()
{
double dt,temp[10000][4];
int i,j,k;
double dr[4],rr,rr1;
mass=1.0631e-25;
dt=2.5e-15;
for(i=0;i<10000;i++)
{
for(j=0;j<=3;j++)
{
temp[i][j]=0.0;
}
}
for(i=1;i<=node;i++)
{
for(j=1;j<=3;j++)
{
r[i][j]=r[i][j]+dt*v[i][j]+dt*dt*f[i][j]/(2.0*mass);
temp[i][j]=f[i][j];
}
}
if((ic==nloop)&&(wlr>0))
{
for(i=1;i<=k2;i++)
{
r[painxy[i]][3]=r[painxy[i]][3]+wlr;
}
fp3=fopen("rpainxy.txt","w");
for(i=1;i<=k2;i++)
{
for(j=1;j<=3;j++)
{
fprintf(fp3,"%le ",r[painxy[i]][j]);
}
fprintf(fp3,"\n");
}
fclose(fp3);
fp2=fopen("wlr.txt","w");
fprintf(fp2,"%le",wlr);
fclose(fp2);
}
fp3=fopen("位移.txt","w");
for(i=1;i<=node;i++)
{
for(j=1;j<=3;j++)
{
fprintf(fp3,"%le ",r[i][j]);
}
fprintf(fp3,"\n");
}
fclose(fp3);
fp3=fopen("outputz.txt","w");
for(i=1;i<=k3;i++)
{
for(j=1;j<=3;j++)
{
fprintf(fp3,"%le ",r[plane[i]][j]);
}
fprintf(fp3,"\n");
}
fclose(fp3);
fp3=fopen("outputz2.txt","w");
for(i=1;i<=k6;i++)
{
for(j=1;j<=3;j++)
{
fprintf(fp3,"%le ",r[plane[i]][j]);
}
fprintf(fp3,"\n");
}
fclose(fp3);
fp3=fopen("outputz3.txt","w");
for(i=1;i<=k7;i++)
{
for(j=1;j<=3;j++)
{
fprintf(fp3,"%le ",r[plane[i]][j]);
}
fprintf(fp3,"\n");
}
fclose(fp3);
if(ic%10==0)
{
list();
}
force();
for(i=1;i<=node;i++)
{
for(j=1;j<=3;j++)
{
v[i][j]=v[i][j]+dt*(f[i][j]+temp[i][j])/(2.0*mass);
}
}
fp3=fopen("速度.txt","w");
for(i=1;i<=node;i++)
{
for(j=1;j<=3;j++)
{
fprintf(fp3,"%le ",v[i][j]);
}
fprintf(fp3,"\n");
}
fclose(fp3);
fp2=fopen("output.txt","w");
for(i=1;i<=k1;i++)
{
j=pain[i];
fprintf(fp2,"%le %le\n",r[j][2],r[j][3]);
}
fclose(fp2);
}
void CMainFrame::sintev()
{
double sumv[10000],v1[10000];
double s,sumvc;
double t1,t2,t;
int i,j;
t=273;
kb=1.381e-5;
sumvc=0.0;
for(i=1;i<=node;i++)
{
sumv[i]=0.0;
for(j=1;j<=3;j++)
{
sumv[i]+=v[i][j]*v[i][j];
}
sumvc+=sumv[i];
}
fp4=fopen("prot.txt","w");
t1=(mass*sumvc)/(3*node*kb);
s=sqrt((3*node-4)*kb*t/(mass*sumvc));
fprintf(fp4,"%le ",t1);
fprintf(fp4,"\n%le ",s);
sumvc=0.0;
for(i=1;i<=node;i++)
{
sumv[i]=0.0;
for(j=1;j<=3;j++)
{
v[i][j]=v[i][j]*s;
sumv[i]+=v[i][j]*v[i][j];
}
sumvc+=sumv[i];
}
t2=(mass*sumvc)/(3*node*kb);
fprintf(fp4,"\n%le ",t2);
fclose(fp4);
/* fp3=fopen("afterv.txt","w");
for(i=1;i<=node;i++)
{
fprintf(fp3,"\n");
for(j=1;j<=3;j++)
{
fprintf(fp3," %le",v[i][j]);
}
}
fclose(fp3);
*/
}
void CMainFrame::Onoutshow()
{
W1 *pW1Wnd = new W1;
if (!pW1Wnd->Create(_T("Show1"),
WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
CRect (0, 0, 500, 430), this))
return;
}
void CMainFrame::Oncontinext()
{
int i,j,k;
sigma=0.361;
for(i=0;i<10000;i++)
{
for(k=0;k<4;k++)
{
r[i][k]=0.0;
v[i][k]=0.0;
f[i][k]=0.0;
}
}
fpp=fopen("nodejd.txt","r");
fscanf(fpp,"%d",&node);
fclose(fpp);
fpp=fopen("sumwlf.txt","r");
fscanf(fpp,"%le",&sumwlf);
fclose(fpp);
fpp=fopen("位移.txt","r");
for(i=1;i<=node;i++)
{
for(j=1;j<=3;j++)
{
fscanf(fpp,"%le",&r[i][j]);
}
fprintf(fpp,"\n");
}
fclose(fpp);
fpp=fopen("速度.txt","r");
for(i=1;i<=node;i++)
{
for(j=1;j<=3;j++)
{
fscanf(fpp,"%le",&v[i][j]);
}
fprintf(fpp,"\n");
}
fclose(fpp);
fpp=fopen("k1.txt","r");
fscanf(fpp,"%d",&k1);
fclose(fpp);
fpp=fopen("pain.txt","r");
for(i=1;i<=k1;i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -