P
proc p_Solve1D {InputVar OutputVar} {
upvar $InputVar Input $OutputVar Output
set Lines [split $Input \n]
set Blocks [split $Lines *]
foreach Block $Blocks {
switch -glob $Block {
*NODE* {
set NodeNum [expr [llength $Block]-1]
#mỗi node có 1 bậc tự do nên số dof = số node, ta sẽ tạo sẵn một ma trận K, các thành phần của K sẽ được cập nhật sau
set K [mkMatrix $NodeNum $NodeNum]
set F [mkMatrix $NodeNum 1]; #vector lực F là ma trận chỉ có 1 cột
# ta cần lưu tọa độ node vào một mảng, để sau đó tính độ dài mỗi phần tử rod
foreach Line [lrange $Block 1 end] {
scan $Line \%d,\%f NodeId X
set Xcoord($NodeId) $X
}
foreach Block $Blocks {
switch -glob $Block {
*ROD* {
foreach Line [lrange $Block 1 end] {
scan $Line \%d,\%d,\%d,\%f,\%f EID N1 N2 E A
set L [expr abs($Xcoord($N1)-$Xcoord($N2))]
set Ke11 [expr $A*$E/$L]
setelem K $N1 $N1 [expr [getelem $K $N1 $N1]+$Ke11]
setelem K $N1 $N2 [expr [getelem $K $N1 $N2]-$Ke11]
setelem K $N2 $N1 [expr [getelem $K $N2 $N1]-$Ke11]
setelem K $N2 $N2 [expr [getelem $K $N2 $N2]+$Ke11]