在有限元刚度矩阵的一维变带宽存储用C++实现(二)中,我们已经把总体刚度矩阵[K]中下三角部分的带内元素顺利存入pGK数组中,现在我们来讨论如何从pGK数组中取出[K]内的任意元素。

从存储了总刚矩阵[K]中的带内元素的一维数组pGK中取出总刚矩阵[K]的元素,主要是建立总刚矩阵[K]中第i行第j列的元素与pGK[]数组中元素的对应关系。根据[K]为对称矩阵的前提,就可以根据pGK[]中的总刚矩阵下三角部分,推断总刚矩阵的上三角部分的元素。

(1)建立总刚矩阵[K]中第GKi行第GKj列与pGK数组中元素的对应关系。

1)对于[K]中的下三角部分,GKi> GKj。此时按行取出[K]中元素。

第GKi行主对角元到当前元素的距离为:iBuf=GKi-GKj;

对于[K]中的带内元素,已存入pGK数组中,

此时[K]中第GKi行第GKj列的元素在pGK数组中的下标为:(pDiag存储的是[K]矩阵主对角元在pGK数组中的下标)

pDiag[GKi]-iBuf=pDiag[GKi]-(GKi-GKj),原理如下图所示:

对于[K]中的带外元素,值是0

2)对于[K]中的上三角部分,GKi<GKj。

根据[K]的对称性,上三角的GKi行GKj列元素,其值和下三角的GKj行GKi列的元素一致,且GKj行GKi列的元素一定位于下三角区。故从pGK数组中取出[K]的GKj行GKi列元素即可。

(2)程序流程图如下:

(3)C++程序如下:

double GetElementInGK(int nRow,int iRow,int iCol,int *pDiag,double *pGK) //将总刚矩阵中当前元素的行号、列号输入,返回总刚度矩阵当前元素值,无论是在上三角或是下三角部分的元素都可以返回,
//nRow为总刚矩阵总行数;iRow为总刚矩阵中当前行的行号;iCol为总刚矩阵中当前列的列号;
//pGK为总刚矩阵中的下三角部分一维变带宽存储的一维数组
//一维变带宽存储的辅助数组pDiag中存储的是总刚矩阵中对角元在一维变带宽数组pGK中的下标
{int iBuf;int nHalfBand; //当前行的最大半带宽double dBuf;if(iRow>nRow||iCol>nRow) //当前行或当前列越界{cout<<"行或列越界!"<<endl;dBuf=0.0;return dBuf; //返回0.0,退出函数}if(iRow>=iCol) //元素处于矩阵下三角部分,取出元素并返回其值{if(iRow==0) //当前行为总刚矩阵第0行nHalfBand=1; //第0行的下三角部分只有主对角一个元素,半带宽为1elsenHalfBand=pDiag[iRow]-pDiag[iRow-1]; //第iRow行的最大半带宽iBuf=iRow-iCol; //当前行主对角元到当前元素的距离if(nHalfBand<=iBuf) //说明当前元素在当前行的最大半带宽之外,是0元素!{dBuf=0.0;return dBuf; //返回0.0,退出函数}else    //当前元素在当前行的最大半带宽之内,是带内元素return pGK[pDiag[iRow]-iBuf];  //返回总刚矩阵中当前元素值,退出函数}else  //元素处于矩阵上三角部分,取出元素并返回其值{//将其对称到下三角部分,计算当前行的最大半带宽nHalfBand=pDiag[iCol]-pDiag[iCol-1]; //由于刚度矩阵的对称性,上三角的第i列就是下三角的第i行iBuf=iCol-iRow; //上三角的iRow行iCol列就是下三角的iCol行iRow列if(nHalfBand<=iBuf) //说明当前元素在当前行的最大半带宽之外,是0元素!{dBuf=0.0;return dBuf;}elsereturn pGK[pDiag[iCol]-iBuf]; //上三角的iCol列就是下三角的iCol行}
}

有限元刚度矩阵的一维变带宽存储用C++实现(三)相关推荐

  1. 有限元刚度矩阵的一维变带宽存储用C++实现(一)

    有限元计算中的刚度矩阵是稀疏.对称矩阵,经过各个自由度的合理排序可以使得其中的非零元素集中在主对角线附近,形成带状矩阵.这样的稀疏带状矩阵在存储时一般有"二维等带宽"和" ...

  2. 【C++】39. std::ofstream把程序中的中的变量值存储到文件中

    更详细的介绍请参考C++ ofstream和ifstream详细用法 在c++代码中,我们通常可以使用类似std::cout的方法打印变量值.如果想把这些变量值存储到文件中保存起来,可以使用std:: ...

  3. 有限元方法求解一维扩散方程(FEALPy)

    有限元方法求解一维扩散方程 文章目录 有限元方法求解一维扩散方程 有限元方法推导 差分格式的介入 数值算例 之前完成了 FEALPy 有限元求解 Poisson 方程 的数值算例, 通过 湘潭大学王唯 ...

  4. 带您探究云存储的奥秘,三分钟帮您快速了解OSS

    摘要: 快来,带您探究云存储的奥秘,三分钟帮您快速了解OSS. 阿里云对象存储服务,简称 OSS,是一种面向海量数据规模的分布式存储服务,具有稳定.可靠.安全.低成本的特点,能够提供十一个九的数据可靠 ...

  5. php+数组存放文件名_php将数组存储为文本文件的三种方法

    本篇文章主要介绍php将数组存储为文本文件的三种方法,感兴趣的朋友参考下,希望对大家有所帮助. (1)利用serialize 将数组序列化存储为文本文件,调用时候再使用unserialize 还原&l ...

  6. 基于FPGA的一维卷积神经网络CNN的实现(三)训练网络搭建及参数导出(附代码)

    训练网络搭建 环境:Pytorch,Pycham,Matlab. 说明:该网络反向传播是通过软件方式生成,FPGA内部不进行反向传播计算. 该节通过Python获取训练数据集,并通过Pytorch框架 ...

  7. Android数据存储和读取的三种方法

    Android数据存储和读取的三种方法 一.文件存储 二.Context存储 三.SharedPreferences存储 一.文件存储 1.利用文件进行数据的存储 public static bool ...

  8. DSP28335,三相逆变电路电压闭环程序,三相逆变数字电源程序

    DSP28335,三相逆变电路电压闭环程序,三相逆变数字电源程序. 包括源代码文件和PDF说明文件. 详细说明了代码含义,三相逆变电路电路电压闭环分析,电路设计步骤,软件设计流程,软件调试步骤等. I ...

  9. 数字示波器采样频率 带宽 存储深度的理解

    前沿:带宽.采样率.存储深度是DSO的三大关键指标 一.采样率 1.概念的提出 计算机只能处理离散的数字信号.模拟电压信号进入示波器后面临的首要问题就是连续信号的数字化(AD转化)问题. 采样(Sam ...

最新文章

  1. 得到弹出菜单QMenu的高度
  2. linux lddbus设备,Linux那些事儿之我是Sysfs(4)举例一lddbus | 技术部落
  3. 为RHEL5安装JDK和配置tomcat
  4. cf round #421 div2 D. Mister B and PR Shifts
  5. 【Caffe实践】 添加自己的网络层
  6. [-] Handler failed to bind to x.x.x.x:port排错
  7. 黑客开始利用云计算暴力破解密码
  8. 对数函数定义域和值域为r_对数函数
  9. 用CSS的float和clear创建三栏液态布局的方法(转载)
  10. jsp页面 如何通过el表达式获取request属性值
  11. 汽车上有哪些很难发现却非常实用的配置?
  12. Oracle数据库-建库、建表空间,建用户
  13. jquery 判断checkbox是否为空的三种方法
  14. 物流企业matlab效率,基于DEA原理的物流企业综合效率评价
  15. WPF 矢量字体图标
  16. 用python编写一个点餐程序_急急急!求大神帮忙做个Python在线点餐小软件
  17. 机械硬盘(HDD)与固态硬盘(SSD)
  18. 自动驾驶专题介绍 ———— 转向系统
  19. 使用 setoolkit 伪造站点窃取用户信息
  20. Gazebo机器人仿真

热门文章

  1. 项目经理必知的项目管理“铁三角”
  2. 一、win10环境下,appium和python3的安装和配置
  3. Android/iOS微信6.3.5同时发布更新 支持群视频聊天、群公告
  4. 互联网晚报 | 06月21日 星期二 | iPhone14或提高全系售价;腾讯控股出售新东方在线7460万股;​乐高8月涨价...
  5. 专科程序员“霸面”蚂蚁金服,4轮面试,竟拿下offer(Java方向)
  6. 通过域名或ip判断这个ip是哪个国家,非常好的接口
  7. 一个简单的房屋出租系统(C)
  8. angular单个页面加载多个ng-app
  9. 【C++】Heather银行对顾客排队等待的时间进行估测问题 《C++ Primer Plus》12.7 队列模拟 学习笔记
  10. 做人的基本原则(看完终身受益)