Visual walkthrough — FEM for structures — assembling global stiffness
3.6.19 · D2· Physics › Spacecraft Structures & Systems Engineering › FEM for structures — assembling global stiffness
Ye page parent note ka central result rebuild karta hai — wo equation jo hai
— bilkul zero se, sirf pictures ki madad se. Hum assume karte hain ki tujhe bas itna pata hai: "ek spring tab pushback karta hai jab use stretch karo." Baaki sab kuch hum khud banayenge. Is page ke end tak tu dekh payega ki hum overlapping numbers ko simply add kyun karte hain, aur wo addition exactly wahi physics kyun demand karti hai.
Prerequisites jinhe hum use karte hain, par zaroorat padne pe re-picture karenge: Element Stiffness Matrices, Coordinate Transformations in FEM, aur (bilkul end mein) Boundary Conditions in FEM.
Step 1 — Ek akela spring kya "kehta hai" (element stiffness, ek picture se)
KYA. Sabse chhhoti possible object se shuru karte hain: do dots ke beech ek bar. Dots ko node aur node kehte hain. Har dot bar ke saath slide kar sakta hai; uski slide amount ek number hoti hai — ek degree of freedom (DOF). Toh is ek bar ke paas sirf do numbers hain: aur .
KYUN. Bahut saare springs assemble karne se pehle, hume bilkul clearly samajhna hoga ki ek spring kya contribute karta hai. FEM mein sab kuch "ek element, poori tarah samjho, phir repeat karo" hai.
PICTURE.

Red bar dekho. Jab tu node ko daayein taraf amount se kheenchta hai aur node ko rok ke rakhta hai, bar se stretch hota hai. Ek bar ke liye Hooke's law kehta hai internal force hai
- — material kitna stiff hai (steel rubber se zyada resist karta hai).
- — cross-section area (mota bar patale bar se zyada resist karta hai).
- — length (lamba bar zyada aasaani se stretch hota hai, isliye ye divide karta hai).
- — wo single number "", is bar ka spring constant.
Ab har dot pe force likho. Newton kehta hai bar node ko ek taraf kheenchta hai aur node ko opposite direction mein:
F_i &= k(u_i - u_j) = k\,u_i - k\,u_j,\\ F_j &= k(u_j - u_i) = -k\,u_i + k\,u_j. \end{aligned}$$ Un do lines ko ek chhoti table mein stack karo: > [!formula] Element stiffness matrix (ek bar) > $$\begin{bmatrix} F_i \\ F_j \end{bmatrix} = \frac{EA}{L}\begin{bmatrix} 1 & -1 \\ -1 & 1 \end{bmatrix}\begin{bmatrix} u_i \\ u_j \end{bmatrix} \quad\Longrightarrow\quad \mathbf{k}^{(e)} = \frac{EA}{L}\begin{bmatrix} 1 & -1 \\ -1 & 1 \end{bmatrix}$$ > Entry $\mathbf{k}^{(e)}_{ab}$ ko aise padho: "DOF $a$ pe force tab aati hai jab main DOF $b$ ko ek unit push karta hun aur doosre ko rok ke rakhta hun." Diagonal pe $+1$ = "tujhe push karna tujh par pushback karta hai." Off-diagonal pe $-1$ = "tujhe push karna tere partner ko *kheenchta* hai." Wo $2\times2$ box ek element ki poori vocabulary hai. Assembly woh grammar hai jo boxes ko glue karne ke kaam aati hai. --- ## Step 2 — Do springs, ek shared dot: wo collision jo hume solve karni hai **KYA.** Do bars ek line mein rakhte hain: bar $(1)$ node 1–node 2 ko join karta hai, bar $(2)$ node 2–node 3 ko join karta hai. Node 2 **shared** hai. **KYUN.** Sharing hi poori baat hai. Agar elements kabhi dots share na karein toh huwmein disconnected pieces milte, structure nahi. Hume decide karna hai ki *shared dot* pe kya hota hai — aur wahi decision *hi* direct stiffness method hai. **PICTURE.** ![[deepdives/dd-physics-3.6.19-d2-s02.png]] Red dot node 2 hai. Wahan do physical facts milte hain: 1. **Compatibility** — sirf ek hi node 2 hai, isliye dono bars ko uski displacement $u_2$ pe agree karna hoga. Na gap, na overlap. (Dot do jagah nahi ho sakta.) 2. **Force balance** — node 2 pe lagi total force, *har* bar wahan jo kheenchta hai uska sum hoti hai. Fact 2 **add** word ka beej hai. Node 2 pe force hai: $$F_2 = \underbrace{F_2^{(1)}}_{\text{bar 1 se}} + \underbrace{F_2^{(2)}}_{\text{bar 2 se}}.$$ Har bar, node 2 pe ek force contribute karta hai jo *apne* stiffness box se banti hai. Kyunki node 2, bar 1 ka *doosra* DOF hai **aur** bar 2 ka *pehla* DOF bhi, dono boxes ek hi slot mein likhna chahte hain. Hum ek nahi chunte — hum unhe **sum** kar dete hain. Step 3 "same slot" ko precise banata hai. --- ## Step 3 — Address book: connectivity aur global table **KYA.** Ek khaali $3\times3$ table $\mathbf{K}$ banao, har global DOF (nodes 1, 2, 3) ke liye ek row/column. Har bar ko ek *address list* do jo bataye ki uski do local numbers kis global slot mein map hoti hain. **KYUN.** Bar ka apna box uske dots ko "local 1" aur "local 2" kehta hai. Table unhe "global 1, 2, 3" kehti hai. Hume ek translator chahiye — ==connectivity map== — taaki har bar jaane ki apne numbers kahan deposit karne hain. **PICTURE.** ![[deepdives/dd-physics-3.6.19-d2-s03.png]] Address lists: - Bar $(1)$: local $[1,2] \to$ global $[1,2]$. - Bar $(2)$: local $[1,2] \to$ global $[2,3]$ ← red **2** wahan hai jahan dono collide karte hain. > [!definition] Connectivity (topology) > Wo list jo har element ke local DOF numbers ko unke global positions se map karti hai. Bar $(2)$ ke liye: "mera local slot 1, global slot 2 hai, mera local slot 2, global slot 3 hai." Assembler ko bas yahi list chahiye hoti hai — wo coordinates dobara nahi padhta, sirf addresses follow karta hai. --- ## Step 4 — Scatter-add: har box ko table mein daalna **KYA.** Har element box lo aur uski charon entries ko global table mein Step 3 ke addresses pe *rakho*, jo pehle se wahan hai uspe **add** karte hue. **KYUN.** Add-ke-saath-rakhna hi $\sum_e \mathbf{L}^{(e)T}\mathbf{k}^{(e)}\mathbf{L}^{(e)}$ ka literal matlab hai — par badi sparse $\mathbf{L}$ se multiply kiye bina, saste mein. (Step 6 mein prove karenge ki dono equal hain.) **PICTURE.** ![[deepdives/dd-physics-3.6.19-d2-s04.png]] Arrows ko dekho kaise har entry apne slot tak jaati hai. **Bar (1) → slots (1,2):** $$\mathbf{K} \leftarrow \mathbf{K} + \frac{EA}{L}\begin{bmatrix} \mathbf{1} & \mathbf{-1} & 0 \\ \mathbf{-1} & \mathbf{1} & 0 \\ 0 & 0 & 0 \end{bmatrix}$$ Bold $2\times2$ block bar 1 ka box hai, top-left corner mein daala gaya hai. **Bar (2) → slots (2,3):** $$\mathbf{K} \leftarrow \mathbf{K} + \frac{EA}{L}\begin{bmatrix} 0 & 0 & 0 \\ 0 & \mathbf{1} & \mathbf{-1} \\ 0 & \mathbf{-1} & \mathbf{1} \end{bmatrix}$$ Bold block bar 2 ka box hai, bottom-right corner mein daala gaya — slot $(2,2)$ pe **overlap** kar raha hai. Slot $(2,2)$ pe dono boxes ne $1$ likha. Hum add karte hain: $1+1 = 2$. **Yahi shared node hai, ek number mein.** Assembled result: > [!formula] Assembled global stiffness (do bars series mein) > $$\mathbf{K} = \frac{EA}{L}\begin{bmatrix} 1 & -1 & 0 \\ -1 & \mathbf{2} & -1 \\ 0 & -1 & 1 \end{bmatrix}$$ > Beech mein red-hearted $\mathbf{2}$ do springs ke node 2 share karne ka visible fingerprint hai — Step 2 ka force-balance sum, concrete roop mein. ``` Initialize K = zeros(N, N) for each element e: k_e = element_stiffness(e) dofs = connectivity(e) # e.g. [2, 3] for bar 2 for a in range(len(dofs)): for b in range(len(dofs)): K[dofs[a], dofs[b]] += k_e[a, b] # scatter-ADD ``` --- ## Step 5 — Off-axis bars: scatter karne se *pehle* transform kyun karte hain **KYA.** 2D mein ek bar rarely global $x$-axis ke saath aligned hota hai. Uska natural box (Step 1) *apni* axis $\xi$ ke along rehta hai. Scatter karne se pehle hume box ko global $x$–$y$ language mein **rotate** karna hoga. **KYUN.** Address book (Step 3) global $x,y$ DOFs mein bolta hai. Ek tilted bar ka box $\xi$ (bar ke along) aur $\eta$ (bar ke across) mein bolta hai. Mismatched languages scatter karna matlab apples mein oranges add karna hoga. Poori machinery ke liye [[Coordinate Transformations in FEM]] dekho; yahan picture hai. **PICTURE.** ![[deepdives/dd-physics-3.6.19-d2-s05.png]] Angle $\theta$ pe tila hua bar ke direction cosines $c=\cos\theta$, $s=\sin\theta$ hote hain — red arrow ki $x$ aur $y$ pe chhaya. - $c$ — "bar ke along" ka kitna hissa global $x$ ki taraf point karta hai. - $s$ — "bar ke along" ka kitna hissa global $y$ ki taraf point karta hai. Rotation har node ke $(u_x,u_y)$ ko ek along-bar slide $u_\xi = c\,u_x + s\,u_y$ mein gather karta hai. Local box ko is rotation $\mathbf{T}$ se sandwich karne par **global-frame element box** milta hai: $$\mathbf{k}^{(e)}_{\text{global}} = \mathbf{T}^{T}\,\mathbf{k}_{\text{local}}\,\mathbf{T} = \frac{EA}{L}\begin{bmatrix} c^2 & cs & -c^2 & -cs \\ cs & s^2 & -cs & -s^2 \\ -c^2 & -cs & c^2 & cs \\ -cs & -s^2 & cs & s^2 \end{bmatrix}.$$ - $c^2, s^2$ — $x$ ke along, $y$ ke along felt stiffness. - $cs$ — *coupling*: $x$ mein push karne se $y$ mein bhi force aati hai kyunki bar diagonal hai. > [!mistake] Woh order jo sab kuch tod deta hai > **Pehle scatter, phir transform** galat hai — tum $\xi$-frame numbers ko $x,y$ slots mein deposit kar doge. Hamesha: **global frame mein transform karo → phir scatter-add karo.** Degenerate checks: horizontal bar ke liye $\theta=0 \Rightarrow c=1,s=0$, aur box wapas Step 1 wale $\begin{bmatrix}1&-1\\-1&1\end{bmatrix}$ mein sirf $x$-rows mein collapse ho jaata hai, $y$-rows sab zero (ek bar sideways stiffness nahi carry karta). Vertical bar ke liye $\theta=90^\circ \Rightarrow c=0,s=1$, aur stiffness bilkul $y$-rows mein rehti hai. Dono extremes seedha formula se nikal aate hain. ✓ --- ## Step 6 — "Overlaps ko add karo" *hi* $\sum \mathbf{L}^{(e)T}\mathbf{k}^{(e)}\mathbf{L}^{(e)}$ kyun hai **KYA.** Prove karo ki cheap scatter-add (Step 4) parent note ke boxed formula ke equal hai. **KYUN.** Taaki picture aur algebra ek hi cheez hon, do alag nahi. **PICTURE.** ==Boolean localization matrix== $\mathbf{L}^{(e)}$ define karo: $0$s aur $1$s ka ek lamba patla table jo, jab global displacement vector $\mathbf{u}$ se multiply kiya jaaye, *sirf wahi DOFs bahar nikalti hai* jo is element se connected hain: $$\mathbf{u}^{(e)} = \mathbf{L}^{(e)}\,\mathbf{u}.$$ Bar $(2)$ ke liye jiske addresses 3-DOF world mein $[2,3]$ hain: $$\mathbf{L}^{(2)} = \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}, \qquad \mathbf{L}^{(2)}\begin{bmatrix}u_1\\u_2\\u_3\end{bmatrix} = \begin{bmatrix}u_2\\u_3\end{bmatrix}.$$ Har row mein ek single $1$ hai jo mark karta hai "ye local DOF = woh global DOF" — literally address book as a matrix. Ab poori structure ki strain energy, har element ki energy ka sum hai (energy additive hoti hai — koi double counting nahi, alag springs ke beech koi interaction terms nahi): $$U = \sum_e \tfrac12\,\mathbf{u}^{(e)T}\mathbf{k}^{(e)}\mathbf{u}^{(e)} = \sum_e \tfrac12\,(\mathbf{L}^{(e)}\mathbf{u})^T\mathbf{k}^{(e)}(\mathbf{L}^{(e)}\mathbf{u}) = \tfrac12\,\mathbf{u}^T\!\left(\sum_e \mathbf{L}^{(e)T}\mathbf{k}^{(e)}\mathbf{L}^{(e)}\right)\!\mathbf{u}.$$ Bracket hi $\mathbf{K}$ hai. Aur $\mathbf{L}^{(e)T}\mathbf{k}^{(e)}\mathbf{L}^{(e)}$ chhote box ki entries ko $1$s se marked global positions pe **scatter** karta hai — exactly Step 4 ke arrows. Transpose $\mathbf{L}^{(e)T}$ rows scatter karta hai; plain $\mathbf{L}^{(e)}$ columns scatter karta hai. Overlapping elements same slots mein land karte hain, aur outer $\sum$ unhe **add** karta hai. Picture = algebra. ∎ > [!recall]- Shared entry ko algebraically check karo > (2,2) slot compute karo: bar 1 apne local-2 row se contribute karta hai, bar 2 apne local-1 row se, dono global 2 pe land karte hain. $k^{(1)}_{22}+k^{(2)}_{11} = \tfrac{EA}{L}(1)+\tfrac{EA}{L}(1)=\tfrac{2EA}{L}$. Wahi $2$ jo Step 4 mein tha. ✓ --- ## Step 7 — Degenerate & edge cases jo actually milenge **KYA / KYUN / PICTURE — woh situations jo beginners ko surprise karti hain.** - **Poora free structure singular hota hai.** Kuch bhi pin karne se pehle, poore truss ko daayein dhakelo: har $u=$ same value, kuch stretch nahi, energy $=0$. Toh non-zero $\mathbf{u}$ ke liye $\mathbf{u}^T\mathbf{K}\mathbf{u}=0$ → $\mathbf{K}$ sirf *positive semi-definite* hai aur invert nahi ki ja sakti. Ye zero-energy motions **rigid-body modes** hain (translations + rotations). Hamare 1-DOF chain mein, vector $\mathbf{u}=(1,1,1)^T$ se $\mathbf{K}\mathbf{u}=\mathbf{0}$ milta hai — ek rigid translation, ek zero eigenvalue. - **Fix = boundary conditions.** Node 1 ko pin karna ($u_1=0$) row/column 1 delete kar deta hai. Reduced matrix apna zero eigenvalue kho deta hai aur *positive definite* ho jaata hai → invertible. Poori story [[Boundary Conditions in FEM]] mein. - **Sparsity, fullness nahi.** $K_{ij}\neq0$ sirf tab jab DOFs $i,j$ ek element share karein. Hamare chain mein, $K_{13}=0$ (nodes 1 aur 3 kabhi same bar mein nahi hote). Bade meshes >99\% zeros hote hain — sirf nonzeros store karo ([[Sparse Matrix Storage]]) aur aisa solver lo jo ise exploit kare ([[Direct vs Iterative Solvers]]). - **Symmetry bachi rehti hai.** Har $\mathbf{k}^{(e)}$ symmetric hai (Maxwell–Betti reciprocity: $j$ ke unit move se $i$ pe force equals $i$ ke unit move se $j$ pe force). Scatter-add symmetry preserve karta hai, isliye $\mathbf{K}=\mathbf{K}^T$. Chalo parent note ke solved chain se numerically loop close karte hain (fixed node 1, node 3 pe force $F$): $$\mathbf{K}_{\text{red}}=\frac{EA}{L}\begin{bmatrix}2 & -1\\ -1 & 1\end{bmatrix},\quad \mathbf{K}_{\text{red}}\begin{bmatrix}u_2\\u_3\end{bmatrix}=\begin{bmatrix}0\\F\end{bmatrix} \;\Rightarrow\; u_2=\frac{FL}{EA},\; u_3=\frac{2FL}{EA}.$$ Physical check: series mein do identical bars har ek $\frac{FL}{EA}$ stretch karte hain, total $\frac{2FL}{EA}=u_3$. ✓ --- ## Ek-picture summary Ek canvas pe har idea: chhote element boxes (har spring ki self-knowledge) → address arrows (connectivity) → badi table mein **overlaps pe add karte hue** daalo (red shared entry) → assembled sparse symmetric $\mathbf{K}$, jo invertible tab hi hoti hai jab boundary condition rigid-body freedom hata de. > [!recall]- Feynman retelling — ek 12-saal ke bachche ko batao > Socho ek bunch of springs hain, har ek ek stubborn chhota creature hai jo sirf do dots jaanta hai — apne dono ends. Ek creature se pucho "agar main tere right dot ko ek inch nudge karun, tu kitna push back karta hai, aur kisko?" Woh ek chhoti $2\times2$ (ya $4\times4$) push-numbers ki table se jawab deta hai. Ab ek bada khaali spreadsheet banao, har dot ki har slide direction ke liye ek row aur ek column. Har creature ko ek address list do: "tera left dot row 5 hai, tera right dot row 9 hai." Har creature apni chhoti table bade spreadsheet mein *apne* addresses pe copy karta hai. Jab do creatures ek dot share karte hain, dono same cell mein likhte hain — aur hum simply unke numbers **add** kar dete hain, kyunki shared dot pe pushes literally add up hote hain (woh sirf Newton hai: total force = forces ka sum). Agar bar tilted hai, pehle uski table rotate karo taaki woh spreadsheet ki north–south–east–west language mein bole, *phir* copy karo. Finished spreadsheet $\mathbf{K}$ hai. Woh mostly zeros hai (zyaadatar dots kabhi milte nahi), symmetric hai (main tujhe utna hi push karta hun jitna tu mujhe), aur pehle floppy hai — tu poori cheez ko sideways dhakael sakta hai free mein, isliye "usse divide" nahi kar sakte. Ek dot ko wall pe thok do (boundary condition) aur floppiness khatam ho jaati hai: ab $\mathbf{K}\mathbf{u}=\mathbf{F}$ solve karo aur jaano ki har dot kaise move karta hai. Woh copy-and-add hi global stiffness assemble karne ka poora raaz hai. > Ek line mein batao ::: Har spring apna chhota stiffness box ek bade shared table mein apne node addresses pe copy karta hai, jahan nodes overlap karte hain wahan sum karta hai, phir hum ek node pin karte hain taaki table solvable ho jaye. --- ### Connections Bana hai: [[Element Stiffness Matrices]] · [[Coordinate Transformations in FEM]] · [[Finite Element Method Overview]] par. Le jaata hai: [[Boundary Conditions in FEM]] · [[Sparse Matrix Storage]] · [[Direct vs Iterative Solvers]] · [[Mesh Refinement and Convergence]] ki taraf. Parent: [[FEM for structures — assembling global stiffness]].