📄 四接点两单元的平面静力问题dlg.cpp
字号:
{
elp[q].setElem(0, &ndp[q], &ndp[q+1], &ndp[q+2]);
}
//生成整体刚度矩阵
for(int t = 0; t < eNum; t ++)
elp[t].setMtxk(*kp);
//读入节点等效荷载
double fx[6],fy[6];
fx[0]=m_fx1;
fx[1]=m_fx2;
fx[2]=m_fx3;
fx[3]=m_fx4;
fx[4]=m_fx5;
fx[5]=m_fx6;
fy[0]=m_fy1;
fy[1]=m_fy2;
fy[2]=m_fy3;
fy[3]=m_fy4;
fy[4]=m_fy5;
fy[5]=m_fy6;
for(int g=0;g<nNum;g++)
{ ndp[g].setLoad(fx[g],fy[g]);
}
//读取支撑条件,并对整体刚度矩阵做相应的改动
const double BigNum = 1000000000; //设置一个大系数
//读取x方向支撑条件
double u[6],v[6];
u[0]=m_u1;
u[1]=m_u2;
u[2]=m_u3;
u[3]=m_u4;
u[4]=m_u5;
u[5]=m_u6;
v[0]=m_v1;
v[1]=m_v2;
v[2]=m_v3;
v[3]=m_v4;
v[4]=m_v5;
v[5]=m_v6;
bool chek[6];
chek[0]=m_ch1;
chek[1]=m_ch2;
chek[2]=m_ch3;
chek[3]=m_ch4;
chek[4]=m_ch5;
chek[5]=m_ch6;
int s=0;
for(int k=0;k<nNum;k++)
{
if(chek[k]==true)
{
if(u[k]==0) //水平位移为0
{
ndp[k].setLoadX(0);
for(int i = 0; i < 2*nNum; i++)
{
if(i == 2*k)
(*kp)(i, 2*k) = 1;
else
{
(*kp)(i, 2*k) = 0;
(*kp)(2*k, i) = 0;
}
}
}
else //水平位移不为0
{
(*kp)(2*k, 2*k) *= BigNum;
ndp[k].setLoadX((*kp)(2*k, 2*k)*u[k]);
}
}
}
//读取y方向支撑条件
for(int c=0;c<nNum;c++)
{
if(chek[c]==true)
{
if(v[c]==0) //位移为0
{
ndp[c].setLoadX(0);
for(int i = 0; i < 2*nNum; i++)
{
if(i == 2*c+1)
(*kp)(i, 2*c+1) = 1;
else
{
(*kp)(i, 2*c+1) = 0;
(*kp)(2*c+1, i) = 0;
}
}
}
else //位移不为0
{
(*kp)(2*c+1, 2*c+1) *= BigNum;
ndp[c].setLoadX((*kp)(2*c+1, 2*c+1)*v[c]);
}
}
}
}
void CMyDlg::solveEq(Node*& ndp, Mtx<double>*& aa)
{
const int nNum = Elem::getNdTN();
const int eNum = Elem::getElTN();
const int tnNum = 2*nNum;
double* bb = new double[tnNum];
double* xx = new double[tnNum];
for(int i = 0; i < nNum; i++)
{
bb[2*i] = ndp[i].getLoadX();
bb[2*i +1] = ndp[i].getLoadY();
}
//for(int i = 0; i < tnNum; i++) //辅助调试
// cout << bb[i] << "\t";
//cout << endl;
for(int k = 0; k < tnNum -1; k++) //高斯消元法消元
{
double aet = fabs((*aa)(k, k)); //挑选主元素
int pc = k;
for(int j = k + 1; j < tnNum; j++)
{
if(fabs((*aa)(j, k)) > aet)
{
aet = fabs((*aa)(j, k));
pc = j;
}
}
if(pc != k) //交换行
{
double tmp;
for(int l = 0; l < tnNum; l++)
{
tmp = (*aa)(k, l);
(*aa)(k, l) = (*aa)(pc, l);
(*aa)(pc, l) = tmp;
}
tmp = bb[k];
bb[k] = bb[pc];
bb[pc] = tmp;
}
for(int m = k + 1; m < tnNum; m++)
{
(*aa)(m, k) /= (*aa)(k, k);
bb[m] -= (*aa)(m, k)*bb[k];
for(int o = k +1; o < tnNum; o++)
(*aa)(m, o) -= (*aa)(m, k)*(*aa)(k, o);
}
}
for(int t = tnNum - 1; t >= 0; t--) //回代求解
{
double tmp = 0;
for(int r = t + 1; r < tnNum; r++)
bb[t] -= (*aa)(t, r)*xx[r];
xx[t] = bb[t]/(*aa)(t, t);
}
for(int w = 0; w < nNum; w++)
{
ndp[w].setUx(xx[2*w]);
ndp[w].setVy(xx[2*w +1]);
}
}
void CMyDlg::stress(Elem*& clp) //求应力子程序
{
const int eNum = Elem::getElTN();
for(int i = 0; i < eNum; i++)
clp[i].setStress();
}
CString CMyDlg::output(Node*& ndp, Elem*& elp) //输出位移及应力子程序
{
CString s1,s2;
s1="";
s2="";
const int nNum = Elem::getNdTN();
const int eNum = Elem::getElTN();
for(int i = 0; i < nNum; i++)
{
CString ss1,ss2,ss3,ss4,su,sv,sf;
ss1.Format("%d",ndp[i].ndNum);
ss2.Format("%.1f",ndp[i].x);
ss3.Format("%.1f",ndp[i].y);
ss4="("+ss2+","+ss3+")";
su.Format("%e",ndp[i].u);
sv.Format("%e",ndp[i].v);
sf.Format("%e",ndp[i].getLoadY());
s1=s1+"||**节点号:"+ss1+"; 坐标:"+ss4+"; "+"U: "+su+"; V:"+sv+"; Fx:"+sf+"**||";
}
for(int e=0; e<eNum; e++)
{
CString ss,ss5,ss6,ss7,ss8,ss9,ss10,sno1,sno2,sno3;
ss.Format("%d",elp[e].elNum);
ss5.Format("%f",elp[e].area);
ss6.Format("%e",elp[e].sgmX);
ss7.Format("%e",elp[e].sgmY);
ss8.Format("%e",elp[e].tauXY);
sno1.Format("%d",elp[e].ndp[0]->getNum());
sno2.Format("%d",elp[e].ndp[1]->getNum());
sno3.Format("%d",elp[e].ndp[2]->getNum());
s2=s2+"||**单元号:"+ss+"; 单元面积:"+ss5+"; Sgmx:"+ss6+"; Sgmy:"+ss7+"; TauXY:"+ss8+"**||";
//s2=s2+"单元号:"+ss+"; 单元面积:"+ss5+"; 所包含的节点:"+sno1+","+sno2+","+sno3;
}
CString sss;
sss=s1+"。 \n\t"+s2+"。";
return sss;
}
void CMyDlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
kk=m_flag.GetCurSel();
}
void CMyDlg::OnSelchangeCombo2()
{
// TODO: Add your control notification handler code here
ek=m_enum.GetCurSel();
if(ek==1)
{
GetDlgItem(IDC_EDIT10)->EnableWindow(true);
GetDlgItem(IDC_EDIT17)->EnableWindow(true);
GetDlgItem(IDC_EDIT39)->EnableWindow(true);
GetDlgItem(IDC_EDIT40)->EnableWindow(true);
GetDlgItem(IDC_EDIT43)->EnableWindow(true);
GetDlgItem(IDC_EDIT44)->EnableWindow(true);
GetDlgItem(IDC_EDIT18)->EnableWindow(false);
GetDlgItem(IDC_EDIT38)->EnableWindow(false);
GetDlgItem(IDC_EDIT41)->EnableWindow(false);
GetDlgItem(IDC_EDIT42)->EnableWindow(false);
GetDlgItem(IDC_EDIT45)->EnableWindow(false);
GetDlgItem(IDC_EDIT46)->EnableWindow(false);
}
if(ek==2)
{
GetDlgItem(IDC_EDIT10)->EnableWindow(true);
GetDlgItem(IDC_EDIT17)->EnableWindow(true);
GetDlgItem(IDC_EDIT39)->EnableWindow(true);
GetDlgItem(IDC_EDIT40)->EnableWindow(true);
GetDlgItem(IDC_EDIT43)->EnableWindow(true);
GetDlgItem(IDC_EDIT44)->EnableWindow(true);
GetDlgItem(IDC_EDIT18)->EnableWindow(true);
GetDlgItem(IDC_EDIT38)->EnableWindow(true);
GetDlgItem(IDC_EDIT41)->EnableWindow(true);
GetDlgItem(IDC_EDIT42)->EnableWindow(true);
GetDlgItem(IDC_EDIT45)->EnableWindow(true);
GetDlgItem(IDC_EDIT46)->EnableWindow(true);}
}
void CMyDlg::OnCheck1()
{
// TODO: Add your control notification handler code here
UpdateData(true);
GetDlgItem(IDC_EDIT27)->EnableWindow(m_ch1);
GetDlgItem(IDC_EDIT31)->EnableWindow(m_ch1);
}
void CMyDlg::OnCheck2()
{
// TODO: Add your control notification handler code here
UpdateData(true);
GetDlgItem(IDC_EDIT28)->EnableWindow(m_ch2);
GetDlgItem(IDC_EDIT32)->EnableWindow(m_ch2);
}
void CMyDlg::OnCheck3()
{
// TODO: Add your control notification handler code here
UpdateData(true);
GetDlgItem(IDC_EDIT29)->EnableWindow(m_ch3);
GetDlgItem(IDC_EDIT33)->EnableWindow(m_ch3);
}
void CMyDlg::OnCheck4()
{
// TODO: Add your control notification handler code here
UpdateData(true);
GetDlgItem(IDC_EDIT30)->EnableWindow(m_ch4);
GetDlgItem(IDC_EDIT34)->EnableWindow(m_ch4);
}
void CMyDlg::OnCheck5()
{
// TODO: Add your control notification handler code here
UpdateData(true);
GetDlgItem(IDC_EDIT43)->EnableWindow(m_ch5);
GetDlgItem(IDC_EDIT44)->EnableWindow(m_ch5);
}
void CMyDlg::OnCheck6()
{
// TODO: Add your control notification handler code here
UpdateData(true);
GetDlgItem(IDC_EDIT45)->EnableWindow(m_ch6);
GetDlgItem(IDC_EDIT46)->EnableWindow(m_ch6);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -