首页/文章/ 详情

力学概念|结构设计中的刚柔搭配

7月前浏览5585

本文摘要(由AI生成):

本文探讨了杆件体系中刚与柔的概念,即抗弯刚度的大小。通过剪力分配原则,说明了刚度大的杆件能分配到的剪力更大。文章指出,在横梁刚度无穷大的情况下,抗弯刚度大的柱子能承担更多剪力,且约束越强,分配到的剪力也越大。对于超高层建筑,长细比大导致外表面区域正应力大,因此在框架核心筒体系中,外框架柱的尺寸应做得较大且均匀。实际工程中的巨柱和次柱布局也体现了刚柔搭配的重要性。刚柔搭配得当,能充分发挥材料性能,既美观实用又节约材料。

本文中的刚与柔是指杆件体系的抗弯刚度    。    大者,刚;    小者,柔。这里刚与柔不是绝对的,只是相比较而言。如图1中,BD刚度是AC刚度的2倍,那么根据剪力分配原则,支座剪力    是    的两倍。

▲ 图1

也就是说,横梁刚度为无穷大时,根据剪力分配原则,抗弯刚度    大的柱子能分配到的剪力就越大。进一步,如果    都相同,约束越强,则分配到的剪力越大,通俗一点,水平荷载更喜欢传递到强壮的支座上,如图2所示。

▲ 图2

如图3所示,当横梁的刚度无穷大的时候,若三根柱子的抗弯刚度    相同,其最大弯矩与支座剪力完全一样。如果两侧的柱子刚度比中间的大,那么两边的柱子分配到的剪力比中间的多。横梁的刚度不是无穷大时,中间柱子弯矩与剪力最大,但这不是本文的重点,因为结构设计都将楼板刚度视为无穷大。

▲ 图3

对于超高层建筑,其长细比很大。在受水平荷载时,类比悬臂梁弯曲,此时越靠近外表面的区域正应力越大,如图4所示。如果是框架核心筒体系,理论上外框架柱的尺寸要做得很大且应当是均匀的。考虑到剪力分配原则以及梁的弯曲,可将四个角的柱子做的很大,原因是    很大且约束很强,能分配到更多剪力,另一方面承受更多"弯曲正应力",从而充分利用材料性能,而其余柱子尺寸稍小(这些柱子所受的正应力较小)。这样既美观实用又节约材料。

▲ 图4

结构设计中刚柔搭配要得当,若配合不协调,刚者不能发挥作用。下面是一些工程实例。

▲ 平安金融中心的巨柱和次柱布局

▲ 广州东塔的巨柱和次柱布局

▲ 天津117的巨柱和次柱布局

▲ 合肥某项目

来源:数值分析与有限元编程
建筑理论材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-03
最近编辑:7月前
太白金星
本科 慢慢来
获赞 5粉丝 14文章 326课程 0
点赞
收藏
作者推荐

利用矩阵分块优化算法

本文摘要(由AI生成):文章探讨了存储系统对程序执行时间的影响,特别强调了CPU cache在提高处理器性能中的关键作用。由于CPU与内存性能差距,CPU内部引入多级cache以减少访存暂停时间。通过软件优化技术,如改善时间局部性,可减少cache失效次数,提升访问效率。文章以数组处理为例,分析了按行或按列存储的局限,提出分块算法优化时间局部性。文章还讨论了cache容量对性能的影响,提出基于子矩阵计算的代码改写方法,通过引入块参数和函数内联进一步优化性能。总之,文章强调了CPU cache的重要性,并详细阐述了分块算法如何通过挖掘程序局部性来减少cache失效,提高程序执行效率,对数值计算库性能优化具有重要意义。存储系统对于程序执行时间有显著影响。处理器由于访存导致的暂停时间受到失效率和失效代价的影响。众所周知,为了弥补CPU与内存两者之间的性能差异,就在CPU内部引入了CPU cache,也称高速缓存。CPU cache通常分为大小不等的三级缓存,分别是L1 cache、L2 cache和L3 cache。如图1所示。▲ 图1 三级cache许多软件优化技术通过重用cache中的数据来大幅度提高处理器性能,通过改善程序的时间局部性来提升访问效率。换言之,不要频繁替换cache中的数据。处理数组时,如果能将数组元素按照访问顺序存放在存储器中,则能够获得性能上的好处。但是,假设同时处理多个数组,一些数组按行访问,一些数组按列访问。按行存储(称为行优先)或者按列存储(称为列优先)数组都不能解决问题,这是因为在程序的每个循环体中行访问和列访问同时会被使用到。因而,分块算法针对子矩阵(submatrice)或者数据块来进行操作,并不针对数组中完整的一行或一列进行操作。它的目标是,在替换之前对已在cache中的数据进行尽可能多的访问,这就是说,提高程序的时间局部性以减少cache失效。例如,在数值计算库Lapack的DGEMM中的内层循环中for (int j = 0; j < n; ++j) { double cij = C[i+j*n]; /* cij = C[i][j] */ for( int k = 0; k < n; k++ ) { cij += A[i+k*n] * B[k+j*n]; /* cij += A[i][k]*B[k][j] */ C[i+j*n] = cij; /* C[i][j] = cij */ }} 首先读入数组B的所有 个元素,重复地读入数组A中某一行中的 个元素,最后将结果写入C数组某一行中对应的 个元素。图2给出了对这三个数组的访问快照,深色阴影部分表示最近被访问过,浅色阴影部分表示较早被访问过,白色表示还未被访问。▲ 图2 三个数组 C、A和 B 的快照(N=6,i=1)。采用不同的阴影对各个数组元素的访问时机进行表示:白色表示尚未被访问过,浅色阴影表示较早被访问过,深色阴影表示最近被访问过。与图4 相比,数组 A和B的素被重复读入以计算数组 C的新元素。变量 i、j和 k 用来进行数组访问,对应行或者列的变化容量失效的次数明显与 和cache的容量有关。如果cache中可以存入三个 的矩阵,假设没有其他冲突,那么一切完美。例如将矩阵大小设为32x32,那么情况正好如此。每个矩阵有32x32=1024个元素,每个元素的大小为8字节,三个矩阵的大小就为24KiB,这可以很容易存入的容量为32KiB的cache中。如果cache能够存入一个 的矩阵和一行 个元素,至少数组A中的第 行数据和数组B可以一直保留在cache中。如果cache容量小了,则数组B和数组C都可能发生失效。最坏情况下, 个操作需要访问 个存储字。为保证需要访问的数组元素都尽可能在cache中,原始代码需要改写为基于子矩阵的计算方式。这样,我们需要调用图3中的DGEMM版本,该版本就是在大小为的矩阵上重复计算。 也被称为块参数。该函数增加了3个新参数 si、sj和sk用来描述数组A、B和C的子矩阵的起始点。函数doblock的两个内部循环以 为步长进行计算,并不是按照数组B和C的全长进行计算。gcc编译器通过函数内联(function inlining)消除了函数调用的所有开销。也就是说在程序中直接插入函数代码,以避免通常的参数传递和现场保存操作。▲ 图3 DGEMM的cache分块版本。假设数组C初始化为0。函数doblock 以普通的DGEMM为基础,增加了新参数来描述BLOCKSIZE大小的子矩阵的起始位置。图4给出使用分块思想对三个数组进行访问的示例。仅对于容量失效来说,需要访问的内存数据字总数为 。(相比未分块前)这个数据得到了改善,原因在于参数 。由此可见,分块思想挖掘出程序的时间局部性和空间局部性,比如数组A的访问得益于空间局部性,而数组B的访问得益于时间局部性。▲ 图4 数组C、A和B的访问(BLOCKSIZE =3)。注意,与图2 相比,访问的元素数量变少图5中给出了采用cache分块对未优化DGEMM性能的影响。矩阵规模最大时,未优化程序的性能折半。采用cache分块的版本,即使矩阵规模达到960x960=3232阵规模性能也仅仅降低了不到10%。▲ 图5 未优化DGEMM与 cache 分块 DGEMM的性能比较,矩阵维度从32x32增加至960x960来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈