0%

工作流程

钢筋的面积计算

1
2
采用钢筋,有实际配筋时,采用实际配筋.
没有采用计算配筋*超配系数(默认1.15,用户可输入)来确定计算所采用的钢筋.

双偏压柱的设计(采用PM算法)

1
2
3
4
5
6
7
8
9
10
iSliceNum = 19;//切片数
iDivisionNumber_90deg=6;//Pm相关生成时90的分割数(只适用于生成时)15度间隔。
//没有钢筋,采用下面初始化钢筋面积比值,找到合适的钢筋比.
pInData->arRebarRho.SetSize(13);
double dRat = 0.5 / 100.;
for (int i = 0; i < 13; i++)
{
dRat += (i < 5 ? 0.1 / 100. : 0.5 / 100.);
pInData->arRebarRho[i] = dRat;
}

钢筋的排布计算

1
根据截面的形状计算出每一根钢筋的排布

计算24个角度

1
2
3
4
for (i = 0; i < iHoldNumberToPmcvData; i++)
{
Get_PMCurve_Gen(i, PmcvData, CbPmData, P0PmData, dPhiPnmax, dAsThk);
}

计算PM(函数Get_PMCurve_Gen的实现)

1
2
3
4
5
6
7
8
9
10
11
12
//推测:Xn应该是开始计算的值,Xn0好像是最后极限值
double dXn = 0.0;
double dXn0 = 0.0;
//这两个值,分别采用Search Balanced Condition的方法计算出平衡条件的值.
dXb = Xn;
for (i = 0; i <= iDivNum; i++)
{
//计算每个角度的Xn
 dXn = Get_Xn(i, iDivNum, dXb);
 //算每个角度的Pn,Mn值
 Calc_PnMn_Gen_SliceMethod(Xn,...);
}

Xn的平衡和移动条件,最后停止取值:

1
2
3
4
5
6
7
8
if (dMn2 < dMn && dMn3 < dMn)	bStop = TRUE;	// Satisfy.
else if (dMn2 < dMn && dMn3 > dMn) dXnNext = dXn; // Move Compressive Region.
else if (dMn2 > dMn && dMn3 < dMn) dXnPrev = dXn; // Move Tensile Region.
else
{
if (dMn3 > dMn2) dXnNext = dXn; // Move Compressive Region.
else dXnPrev = dXn; // Move Tensile Region.
}

Xn0的平衡条件,最后停止取值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (dPn2*dPn3 < 0.0)	bStop = TRUE;	// Satisfy.
else if (dPn2 > 0.0 && dPn3 > 0.0)
dXn0Prev = dXn0; // Move Tensile Region (Include dPn2=dPn3=0).
else dXn0Next = dXn0; // Move Compressive Region.
if (fabs(dPn2 + dPn3) < cUMDRC_Zero)
{
dMn0_y = (dMn2_y + dMn3_y) / 2.0;
dMn0_z = (dMn2_z + dMn3_z) / 2.0;
}
else if (fabs(dPn2 - dPn3) < cUMDRC_Zero)
{
dMn0_y = (dMn2_y + dMn3_y) / 2.0;
dMn0_z = (dMn2_z + dMn3_z) / 2.0;
}
else
{
dMn0_y = (dMn2_y*dPn3 - dMn3_y * dPn2) / (dPn3 - dPn2);
dMn0_z = (dMn2_z*dPn3 - dMn3_z * dPn2) / (dPn3 - dPn2);
}
dXn0 = (dXn2 + dXn3) / 2.0;

Search Balanced Condition

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
采用二分法Bi-section Method寻找Xn的值,初始值
double dXnPrev = 0.0, dXnNext = 1.0;
double dXnTol = 1.0 - 7 * m_dTolM0;
while (!bStop)
{
 //这是第一点 1st Pmcv.
dXn = (dXnPrev + dXnNext) / 2.0;
 Calc_PnMn_Gen_SliceMethod(Xn,...);//通过以上计算出来Pn,Mn,然后开始计算平衡条件
 
//Calculate Only if Balanced Condition required.
 //第二点 2nd Pmcv for Xn Direction.
double dXn2 = dXn / dXnTol;
Calc_PnMn_Gen_SliceMethod(Xn2,...);

//第二点 3rd Pmcv for Xn Direction.
double dXn3 = dXn * dXnTol;
Calc_PnMn_Gen_SliceMethod(Xn3,...);

 //此为Xn的平衡条件.
 // Compare 1st' with 2nd' and 3rd'.
if (dMn2 < dMn && dMn3 < dMn) bStop = TRUE; // Satisfy.
else if (dMn2 < dMn && dMn3 > dMn) dXnNext = dXn; // Move Compressive Region.
else if (dMn2 > dMn && dMn3 < dMn) dXnPrev = dXn; // Move Tensile Region.
else
{
if (dMn3 > dMn2) dXnNext = dXn; // Move Compressive Region.
else dXnPrev = dXn; // Move Tensile Region.
}

 if(bStop)
{
//SHIN: dXn的值不一定是最大值,所以如果取3个平均值,Mn的值取平均值,就会有小于最大值的值,所以不取平均值
  //达到平衡条件后,注释说不取平均值,实际取的平均值...
dXn = (dXn + dXn2 + dXn3) / 3.0;
dPn = (dPn + dPn2 + dPn3) / 3.0;
  //算出来最后的Pn,Mn
  Calc_PnMn_Gen_SliceMethod(Xn,...)
 }

}
M
|--
| 3rd
| 1st
| 2nd
| |
+------+------ P
| __/
|--'

根据Xn使用切片方法计算PnMn

1
Calc_PnMn_Gen_SliceMethod