特色技术
专业从事预应力结构体系的设计、施工一体化解决方案
CSI Safe有限元结构设计软件的前处理开发(2)
- 分类:程序技术
- 作者:
- 来源:
- 发布时间:2015-11-22 14:58
- 访问量:
【概要描述】接《CSISafe有限元结构设计软件的前处理开发(1)》,划分好板带以后就可以进行楼面结构的计算了,具体过程可以参阅软件手册。紧接着需要面对的是预应力筋布置的问题。在很多资料中,认为预应力筋布置不会影响板的承载力,即只要板中预应力筋、普通钢筋总量一样,板的最终承载力是不变的,所以结构设计工程师只需要按照(图1)两种方式(也有的文章推荐4种方式)布置预应力筋就可以达到很好的设计效果,这两种方式几乎是
CSI Safe有限元结构设计软件的前处理开发(2)
【概要描述】接《CSISafe有限元结构设计软件的前处理开发(1)》,划分好板带以后就可以进行楼面结构的计算了,具体过程可以参阅软件手册。紧接着需要面对的是预应力筋布置的问题。在很多资料中,认为预应力筋布置不会影响板的承载力,即只要板中预应力筋、普通钢筋总量一样,板的最终承载力是不变的,所以结构设计工程师只需要按照(图1)两种方式(也有的文章推荐4种方式)布置预应力筋就可以达到很好的设计效果,这两种方式几乎是
- 分类:程序技术
- 作者:
- 来源:
- 发布时间:2015-11-22 14:58
- 访问量:
接《CSISafe有限元结构设计软件的前处理开发(1)》,划分好板带以后就可以进行楼面结构的计算了,具体过程可以参阅软件手册。紧接着需要面对的是预应力筋布置的问题。在很多资料中,认为预应力筋布置不会影响板的承载力,即只要板中预应力筋、普通钢筋总量一样,板的最终承载力是不变的,所以结构设计工程师只需要按照(图1)两种方式(也有的文章推荐4种方式)布置预应力筋就可以达到很好的设计效果,这两种方式几乎是可以凭经验任意选择的。关于这个结论,本文认为值得商榷,因为基于板带的设计方法,可以很明确的看出随着预应力筋位置的不同、曲线的变化,板中预应力次弯矩是明显变化的,即板带的极限承载力与预应力筋的位置、数量、曲线是高度相关的。因此,江苏开来预应力工程有限公司认为应该高度重视板中预应力筋布置对内力的影响,而不应该凭经验去布置预应力筋,那样会得到一些不安全、易开裂的设计结果。为了设计一个合理、可靠的预应力混凝土板,应该建立一种基于板带的预应力设计方法,不仅简便快捷,而且物理意义十分明确。
通常,板的预应力设计是在得到一个预应力筋总量以后,让预应力施工单位根据经验去布置预应力筋,也就是通常所说的预应力二次深化设计。这样做其实是不合适的,如前所述,常规的几种预应力筋布置会带来不一样的预应力次内力效果,而这些效果是很多无设计能力的预应力公司无法准确计算的。所以在严格意义上,应该是在设计过程中就将预应力筋位置和曲线进行定位,预应力施工单位严格按此施工。因此,板的设计应该能精确地定位预应力筋,并根据这个预应力筋布置图进行板的内力计算和设计配筋。如下图所示是江苏开来预应力工程有限公司负责设计及施工的深圳招商地产双玺花园顶板及底板预应力筋布置图。
同样的问题出现了,大面积地下车库结构中,预应力筋的布置复杂而且种类繁多,因为有限元软件的前处理图形功能一般偏弱,所以在软件中逐条去布置预应力筋不仅速度缓慢而且精度上也不容易达到设计要求,虽然可以利用复制、粘贴功能简化一些操作,可实际操作下来都很麻烦,既累又烦。双玺花园的车库平面十分复杂,很多不规则的平面使得预应力筋布置复杂多样,实际施工中几乎每根预应力筋长度都不一样。软件中,不仅要输入长度,还要调整每根预应力筋的曲线坐标、张拉力、损失种类等等。据我们初步估计,如果用软件中提供的手工输入预应力筋的方法,两个熟练的safe结构设计师至少要15天才能完成。如此纷繁浩大的工作量是不可想象的,而且在这个过程中还难免会有错误产生。不失一般地,我们决定利用C++程序来处理这个问题。
程序开发的平台依然是最常见的Visual C++6.0。我们设计了9个C++类来模拟预应力筋的几何数据和物理力学特征,分别阐述如下。
1、CGenneral:用于描述预应力筋的两个端点的编号。
2、CSupportPoint类:用于描述支座性能
3、CTendonProperty类:用于描述预应力筋的颜色、材料、面积
4、CTendonLoad类:用于计算预应力等效荷载
5、CDescretizedPoint类:用于描述预应力筋的坐标
6、CVerticalPropfile类:用于计算预应力筋的曲线特征
7、CLossType:用于描述计算预应力损失的模式
8、CPropertyAssignment:用于描述预应力筋的根数、是否有粘结
9、CPrestress:预应力筋类
10、CPrestresses:预应力筋集合类
以上10个类代表了预应力筋的各个分类属性,最重要的是CPrestress类,它完整地描述了预应力筋的各种属性,将其余几个类用数组整合在一起,尤其是它的拷贝构造函数是整个程序的核心,建立了具体的预应力筋对象。以下为该拷贝构造函数的源代码。
CPrestress::CPrestress(int l_np,doublel_h_slab,double l_apxdown,double l_apxup,double l_apydown,double l_apyup,doublel_direction,double l_insert_x,double l_insert_y,double l_n_span,doublel_n_delta,const vector<double>&l_v_span,constvector<double>&l_v_delta)
{
np=l_np;
h_slab=l_h_slab;
apxdown=l_apxdown;
apxup=l_apxup;
apydown=l_apydown;
apyup=l_apyup;
direction=l_direction;
insert_x=l_insert_x;
insert_y=l_insert_y;
n_span=l_n_span;
n_delta=l_n_delta;
span=l_v_span;
delta=l_v_delta;
CGeneralm_General;
vector<CGeneral>v_General;
CKLPointm_Point_Coordinate;
vector<CKLPoint>v_Point_Coordinate;
CSupportPointm_SupportPoint;
vector<CSupportPoint>v_Support_Point;
CVerticalProfilem_VerticalProfile;
vector<CVerticalProfile>v_Vertical_Profile;
CPropertyAssignmentm_PropertyAssignment;
vector<CPropertyAssignment>v_Property_Assignment;
CLossTypem_LossType;
CTendonLoadm_TendonLoad;
vector<CTendonLoad>v_Tendon_load;
vector<CLossType>v_Loss_Type;
m_Point_Coordinate.PointNum=POINT_COUNT;
doublel_delta_xy=0;
for(int j=1;j<delta.size()+1;j++)
{
m_General.Tendon=TENDON_COUNT+j;
m_General.Point1=m_Point_Coordinate.PointNum+1;
m_General.Point2=m_Point_Coordinate.PointNum+2;
v_General.push_back(m_General);//以上形成General
l_delta_xy+=delta[j-1];
if(direction==0)
{
m_Point_Coordinate.x=insert_x;
m_Point_Coordinate.y=insert_y+l_delta_xy;
}
m_Point_Coordinate.z=0;
m_Point_Coordinate.PointNum++;
m_SupportPoint.x=m_Point_Coordinate.x;
m_SupportPoint.y=m_Point_Coordinate.y;
m_SupportPoint.Tendon=TENDON_COUNT+j;
v_Support_Point.push_back(m_SupportPoint);
v_Point_Coordinate.push_back(m_Point_Coordinate);
doublelength=0;
for(inti=0;i<span.size();i++)
{
length+=span[i];
}
if(direction==0)
{
m_Point_Coordinate.x+=length;
}
else
{
m_Point_Coordinate.y+=length;
}
m_Point_Coordinate.PointNum++;
v_Point_Coordinate.push_back(m_Point_Coordinate);
m_SupportPoint.x=m_Point_Coordinate.x;
m_SupportPoint.y=m_Point_Coordinate.y;
m_SupportPoint.Tendon=TENDON_COUNT+j;
v_Support_Point.push_back(m_SupportPoint);
if(direction==0)
{
m_Point_Coordinate.x=v_Point_Coordinate[0].x;
}
else
{
m_Point_Coordinate.y=v_Point_Coordinate[0].y;
}
if(span.size()==1)
{
m_VerticalProfile.Length=span[0];
if(direction==0)
{
m_VerticalProfile.ZC=apxdown-h_slab;
m_VerticalProfile.ZL=-apxup;
m_VerticalProfile.ZR=-apxup;
}
else
{
m_VerticalProfile.ZC=apydown-h_slab;
m_VerticalProfile.ZL=-apyup;
m_VerticalProfile.ZR=-apyup;
}
m_VerticalProfile.Tendon=TENDON_COUNT+j;
m_VerticalProfile.SpanLabel="\"RightCantilever\"";
v_Vertical_Profile.push_back(m_VerticalProfile);
}
else
{
cout<<"span.size="<<span.size()<<endl;
for(i=0;i<span.size();i++)
{
if(i!=span.size()-1)
{
m_Point_Coordinate.PointNum++;
if(direction==0)
{
m_Point_Coordinate.x+=span[i];
}
else
{
m_Point_Coordinate.y+=span[i];
}
v_Point_Coordinate.push_back(m_Point_Coordinate);
m_SupportPoint.x=m_Point_Coordinate.x;
m_SupportPoint.y=m_Point_Coordinate.y;
m_SupportPoint.Tendon=TENDON_COUNT+j;
v_Support_Point.push_back(m_SupportPoint);
}
m_VerticalProfile.Length=span[i];
if(direction==0)
{
m_VerticalProfile.ZC=apxdown-h_slab;
m_VerticalProfile.ZL=-apxup;
m_VerticalProfile.ZR=-apxup;
}
else
{
m_VerticalProfile.ZC=apydown-h_slab;
m_VerticalProfile.ZL=-apyup;
m_VerticalProfile.ZR=-apyup;
}
m_VerticalProfile.Tendon=TENDON_COUNT+j;
if(i==0)
{
m_VerticalProfile.SpanLabel="\"LeftCantilever\"";
}
elseif (i==span.size()-1)
{
m_VerticalProfile.SpanLabel="\"RightCantilever\"";
}
else
{
m_VerticalProfile.SpanLabel="\"Span1\"";
}
v_Vertical_Profile.push_back(m_VerticalProfile);
}//fori=3
}//ifspan.size==1
m_PropertyAssignment.Tendon=TENDON_COUNT+j;
m_PropertyAssignment.NumStrands=np;
m_PropertyAssignment.BondType="Bonded";
m_PropertyAssignment.TendonProp="Tendon2";
v_Property_Assignment.push_back(m_PropertyAssignment);
m_LossType.Tendon=TENDON_COUNT+j;
v_Loss_Type.push_back(m_LossType);
m_TendonLoad.Tendon=TENDON_COUNT+j;
v_Tendon_load.push_back(m_TendonLoad);
TendonLoads=v_Tendon_load;
LossTypes=v_Loss_Type;
PropertyAssignments=v_Property_Assignment;
VerticalProfiles=v_Vertical_Profile;
SupportPoints=v_Support_Point;
Generals=v_General;
PointCoordinates=v_Point_Coordinate;
}//j
POINT_COUNT=m_Point_Coordinate.PointNum;
TENDON_COUNT+=Generals.size();
}
以上170多行语句完成的功能是将预应力筋的点号、筋号自动生成并按序编好,省去了人工编号的麻烦,并按照区域自动生成预应力筋曲线、平面位置和张拉力、预应力损失、等效荷载等参数。
经过该前处理程序,我们只需要两个工程师用两天时间填写相应的数据文件,就可以直接在safe程序中布置好预应力筋,不仅速度迅捷,而且准确度有保证。以下是深圳招商地产双玺花园底板在safe软件中的预应力筋布置。
其中有预应力筋6600多根,几乎每根都不一样长。程序生成该图形整整用去10分钟左右时间。
扫二维码用手机看