برای دیدن فهرست باقی نوشتههای این مجموعه به قسمت اول (کلیات) بروید
توی قسمت اول در مورد اشیا کلی صحبت کردیم. و اینکه اطلاعات یک مدل رو چطور در قالب اشیا و وراثت در حافظه رایانه میتونیم ذخیره کنیم. مثلا یک المان تیر دو گره داره و از کلاس المان کلی مشتق شده. کلاسهایی که در مورد صحبت کردیم بیشتر حالت ذخیره سازی دارند. یعنی یک المان تیر یک مقطع و یک متریال داره که هر کدوم از اینها در قالب اعداد و ارقام قابل نمایش و ذخیره سازی هستن. مثلا مقطع تیر رو میشه با چند تا پارمتر مساحت مقطع، لنگر های سطح مقطع نمایش داد و در حافظه ذخیره کرد. اکثر این کلاسها قابل سریالیزه شدن یا اصطلاحا Serializable هستن. ولی توی این پست میخوایم در مورد کلاسهایی صحبت کنیم که مثل پست اول تقریبا پارامتر خاصی ندارند و در اصل کارهای محاسباتی رو برامون انجام میدن. یک برنامه ی المان محدود چون برنامهی محاسباتی هست، میتونه خیلی راحت چندین هزار خط کد داشته باشه و حالا شما فرض کنید اگر این کدها مرتب نباشن! معمولا یک کسی هست که باید از کدها مراقبت کنه. طبیعتا کدها که غذا نمیخورن یا نیاز به عوض کردن پوشک ندارن، منظور از مراقبت کد یعنی باگهای کد رو برطرف کنه :) خوب شما خودتون رو بزارید جای کسی که مسئول نگه داری از یک برنامه با چند ده هزار خط کد هست. اگر این کدها مرتب نباشن و کدنویسی بر اساس یک معماری مشخص جلو نرفته باشه تقریبا غیر عملی هست که کسی بتونه از کدها مراقبت کنه. پس توی این پست میخوایم در مورد اینکه چطور کدهای این برنامهی محاسباتی رو باید نظم بدیم صحبت میکنیم. کلاسهایی که توی این پست در موردش صحبت میشه بر خلاف پست اول معمولا Serializable نیستن و فقط موقعی که بهشون نیاز داریم یک نمونه (instance) ازش ایجاد میکنیم و بعد از حافظه پاک میشه چون خیلی موضعی و در زمان محدود بهشون نیاز پیدا میکنیم.
خوب ما بطور کلی مقدار خیلی زیادی محاسبات داریم. از محاسبات برای یافتن دترمینان یک ماتریس dense گرفته تا انتگرال گیری برای یافتن ماتریس سختی و جرم. مهمترین قسمتهاش اینها هستن:
محاسباتی مثل یافتن دترمینان، معکوس یا ضرب ماتریس.
معمولا ما برای یافتن ماتریس سختی انتگرال گیری میکنیم. بعنوان مثال یک تیر رو در نظر بگیرید که میخوایم ماتریس سختی اون رو حساب کنیم در دستگاه دو بعدی. اگر مدول الاستیسیته و ممان اینترسی مقطع تیر بصورت ثابت باشه خوب محاسبهی ماتریس سختی خیلی ساده هست و نیازی به انترگال گیری نداره و توی این لینک توضیح داده:
ولی اگر ما بخوایم کدمون جامع تر باشه و بتونیم ماتریس سختی تیرهای با مقاطع غیر یکنواخت (منظور از مقطع غیر یکنواخت یعنی خواص سطح مقطع تیر در طول آن متغیر هست - مثل یک تیر-ورقی که در سولهها استفاده میشه و ارتفاع جان تیر متغیر هست) اون وقت باید از انتگرال گیری استفاده کنیم، اونم به روش نقاط نمونهگیری کوادراتور گاوس! ( Gaussian Quadrature)
در صورتی که ما بارهایی داشته باشیم که بر روی المان وارد میشوند، مانند بارهای گسترده (مثل بارهایی که مهندسان سازه بعنوان بار مرده یا زنده میشناسند) ما حتما باید اونها رو تبدیل به بارهای معادل گره ای بکنیم. برای تیرها روش انتگرال دوبل با استفاده از فرمولاسیون تیر اویلر-برنولی برای این کار استفاده میشه. فرض کنید یک تیر داریم که تحت بار گستردهی یکنواخت هست. بارهای معادل گرهای در این تیر خیلی ساده محاسبه میشن یعنی فرمولش در کتابها و در اینترنت به وفور یافت میشن. کافیه با کلید واژهی Beam Fixed end moments در اینترنت جستجو کنید تا فرمولهای ساده رو ببینید.
ولی بازهم اگر ما بخوایم یگ گام جلوتر بریم و بخوایم نیروهای معادل گرهای رو برای المان تیر با مقطع غیر یکنواخت رو هم پیدا کنیم به ناچار بازهم درگیر انتگرال گیری خواهیم شد که حجم کدمون رو بالاتر میبره. بعلاوه ما حدود ۸ نوع المان داریم: تیر، خرپا، شافت پیچشی، المان مثلثی CST المان مثلثی DKT و المان هرمی
و چهار نوع هم باز داریم: بار گسترده یکنواخت، گسترده غیر یکنواخت، بار نقطه ای (که به بدنه ی عضو وارد میشه-دقت کنید این با بارهای نقطه ای که به گره ها وارد میشن فرق میکنه) و بار کرنش اعمال شده (مثل حالاتی که عضو دچار تغییر دما شده و طولش کم یا زیاد میشه). در مجموع تعداد زیادی حالت مختلف میشه که باید اینها رو از همدیگه جدا کنیم.
بعد از اینکه ما ماتریس سختی کلی رو سوار (assemble) کردیم، حالا باید سطرها و ستونهای مرتبط با درجات آزادی مقید رو حذف کنیم. تا اینجحای کار مشکلی نیست ولی مشکل وقتی به وجود میاد که عناصر MPC وارد قضیه میشن! این عناصر از لحاظ محاسباتی خیلی نامرد هستن و کلا بازی رو به هم میریزن. مثل اینکه شما داری با یک نفر شطرنج بازی میکنی و اون یهو با دمپایی میزاره وسط صفحهی شطرنج! این عناصر MPC اصولا در زمان سوار کردن ماتریس سختی کلی هیچ تاصیری ندارند و تاثیرشون دقیقا در مرحله ی بعد از سوار کردن هست. این عناصر نامیمون ابعاد ماتریس سختی ما رو تغییر میدن! بعنوان مثال فرض کنید یک المان MPC میتونه تغییر مکان دو گره رو به هم مقید کنه. یعنی عملا گرهی دوم درجهی آزادی ای نداره و مطیع گرهی اول خواهد بود پس سطرها و ستونهای مربوط به اون درحات آزادی ای که مقید میشن (حالا یا به زمین مقید میشن یا به درجات آزادی دیگه) باید از ماتریس سختی کلی حذف بشن که متاسفانه این مرحله اصلا راحت نیست و محاسبات خیلی زیادی داره.
در پستهای قبلی در مورد این صحبت کردیم. انواع مختلفی از حلگر (solver) داریم برای یک دستگاه المان محدو خطی. میشه به دو دسته تقسیمشون کرد: حلگرهای نوع مستقیم (Direct) و تکراری (itterative).
تفاوت اینها در سرعت و نحوه کارکردشون هست. یک مقدار اطلاعات کلی رو از اینجا میتونید پیدا کنید: لینک
اینها هم کدهای زیادی دارند و باید کدهاشون نگه داری بشه!
تا جایی که یادم هست قسمتهای عمده و مهم که بیشترین کدهای محاسباتی رو شامل میشن همین ها بودند. خوب حالا اینها رو باید در قالب کلاسها پیاده سازی کنیم!