有限元剛度矩陣的一維變頻寬儲存用C 實現(三)

2021-08-28 09:12:26 字數 1386 閱讀 7388

在有限元剛度矩陣的一維變頻寬儲存用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

根據[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中的下標

else //當前元素在當前行的最大半頻寬之內,是帶內元素

return pgk[pdiag[irow]-ibuf]; //返回總剛矩陣中當前元素值,退出函式

} else //元素處於矩陣上三角部分,取出元素並返回其值

else

return pgk[pdiag[icol]-ibuf]; //上三角的icol列就是下三角的icol行

}}

有限元剛度矩陣的一維變頻寬儲存用C 實現(一)

有限元計算中的剛度矩陣是稀疏 對稱矩陣,經過各個自由度的合理排序可以使得其中的非零元素集中在主對角線附近,形成帶狀矩陣。這樣的稀疏帶狀矩陣在儲存時一般有 二維等頻寬 和 一維變頻寬 儲存兩種方式。其中,一維變頻寬 儲存可以節省大量的記憶體空間,提高計算速度,但現在網上大多數 一維變頻寬 儲存的資料都...

有限元分析的一些基本考慮

有限元分析的一些基本考慮 單元形狀對於計算精度的影響 宋博士的部落格 筆者發現,在分析複雜問題時,我們所可能出現的錯誤,竟然是一些很根本的錯誤,這些根本錯誤是由於對有限元的基本理論理解不清晰而造成的。鑑於這個原因,筆者決定對一些基本問題 例如單元形狀問題,單元大小問題,應力集中問題等 展開調查,從而...

有限元法分析工程實際問題的一般過程

1有限元法分析工程實際問題的一般過程 應用有限元分析工程實際問題的一般過程如圖1所示。次過程可以分為三個階段,即前處理 分析和後處理。有限元分析的第一階段是把現實生活中的結構工程問題轉化為可供計算機分析的有限元模型。有限元模型的合理性 正確性將直接影響計算分析結果與工程實際之間的距離。這一過程稱為有...