مطالعه

مطالعه

مطالعه
گره Study در درخت مدل شامل یک یا چند مرحله مطالعه است، دستورالعمل هایی که برای تنظیم حل کننده ها و حل متغیرهای وابسته استفاده می شود. تنظیمات گره های Study و Solver Configurations می تواند بسیار پیچیده باشد. ساده ترین موردی را در نظر بگیرید که برای آن فقط باید یک مطالعه ایجاد کنید، یک مرحله مطالعه اضافه کنید و آن را اجرا کنید.
با تکیه بر مثال بخش های قبلی در مورد انتقال حرارت ثابت، اجازه دهید یک مرحله مطالعه ثابت اضافه کنیم.
model.study().create(“std1”); // Study with tag std1
model.study(“std1”).create(“stat”, “Stationary”);
model.study(“std1”).run();
فراخوانی متد اجرا به طور خودکار یک دنباله حل کننده در ساختار داده model.sol ایجاد می کند و سپس حل کننده مربوطه را اجرا می کند. تنظیمات حل‌کننده به‌طور خودکار با ترکیبی از رابط‌های فیزیکی که انتخاب کرده‌اید، پیکربندی می‌شوند. همانطور که در ادامه این بخش نشان داده شده است، می توانید به صورت دستی این تنظیمات را تغییر دهید. ساختار داده model.sol تقریباً با محتوای گره Solver Configurations در زیر گره Study در درخت مدل مطابقت دارد.
تمام تنظیمات حل کننده سطح پایین در model.sol موجود است. ساختار model.study به عنوان یک دستورالعمل سطح بالا استفاده می شود که نشان می دهد چه تنظیماتی باید در model.sol ایجاد شود که یک دنباله حل کننده جدید ایجاد شود.
برای سازگاری با عقب، برخی از تنظیمات سطح پایین در model.sol به طور خودکار هنگام استفاده از Record Code ایجاد می‌شوند .
مثال زیر یک مورد مفصل‌تر از برنامه‌ریزی مطالعه را نشان می‌دهد که می‌تواند برای مثال انتقال حرارت ثابت که قبلا نشان داده شد، قابل استفاده باشد. دستورالعمل های زیر شباهت بیشتری به خروجی تولید شده با استفاده از گزینه Record Code دارد.
ابتدا نمونه هایی از گره مطالعه (با برچسب std1 ) و یک زیرگره مرحله مطالعه ثابت ایجاد کنید:
model.study().create(“std1”);
model.study(“std1”).create(“stat”, “Stationary”);
تنظیمات واقعی که نحوه اجرای مطالعه را تعیین می‌کنند، در مجموعه‌ای از عملیات در ساختار داده Solution ، با برچسب sol1 ، که به مطالعه مرتبط است، وجود دارد:
model.sol().create(“sol1”);
model.sol(“sol1”).study(“std1”);
کد زیر دنباله ای از عملیات موجود در sol1 را تعریف می کند .
ابتدا یک گره کامپایل معادلات را در زیر گره Solution ایجاد کنید تا مشخص کنید کدام مرحله مطالعه و مطالعه استفاده می شود:
model.sol(“sol1”).create(“st1”, “StudyStep”);
model.sol(“sol1”).feature(“st1”).set(“study”, “std1”);
model.sol(“sol1”).feature(“st1”).set(“studystep”, “stat”);
سپس، یک گره Dependent Variables ایجاد کنید ، که مقیاس بندی و مقادیر اولیه متغیرهای وابسته را کنترل می کند و نحوه مدیریت متغیرهایی را که برای موارد زیر حل نشده اند، تعیین می کند:
model.sol(“sol1”).create(“v1″، “Variables”);
حالا یک گره Stationary Solver ایجاد کنید. حل ثابت شامل دستورالعمل هایی است که برای حل سیستم معادلات و محاسبه مقادیر متغیرهای وابسته استفاده می شود.
model.sol(“sol1”).create(“s1″، “Stationary”);
برای انتخاب انواع حل کننده های خاص، گره های فرعی را به گره حل کننده ثابت اضافه کنید. در این مثال، از حل کننده تکراری استفاده کنید:
model.sol(“sol1”).feature(“s1”).create(“i1″، “Iterative”);
یک زیرگره پیش‌شرطی Multigrid اضافه کنید:
model.sol(“sol1”).feature(“s1”).feature(“i1”).create(“mg1″، “Multigrid”);
شما می توانید چندین ساختار داده Solution در یک گره مطالعه (مانند sol1 ، sol2 ، و غیره) داشته باشید که دنباله های مختلفی از عملیات را تعریف می کنند. فرآیند اطلاع رسانی به مطالعه ای که باید از کدام مطالعه استفاده شود، با «پیوست کردن» ساختار داده Solution sol1 با مطالعه std1 انجام می شود :
model.sol(“sol1”).attach(“std1”);
مرحله پیوست تعیین می‌کند که در هنگام انتخاب Compute در رابط کاربری دسکتاپ COMSOL، کدام دنباله ساختار داده راه حل باید اجرا شود .
در نهایت مطالعه را اجرا کنید که معادل اجرای ساختار داده Solution sol1 است :
model.sol(“sol1”).runAll();
ساختار گره مطالعه حاصل در شکل زیر نشان داده شده است. توجه داشته باشید که چندین گره اضافی به صورت خودکار اضافه می شوند. اینها گره های پیش فرض هستند و می توانید هر یک از این گره ها را با فراخوانی روش صریح ویرایش کنید. هنگام استفاده از Record Code می توانید هر یک از گره ها را ویرایش کنید تا روش ها و نحو مورد استفاده را مشاهده کنید.
تغییر تنظیمات حل کننده سطح پایین
برای نشان دادن اینکه چگونه می توان برخی از تنظیمات حل کننده سطح پایین را تغییر داد، موردی را در نظر بگیرید که در آن تنظیمات گره کاملاً جفت شده اصلاح شده است. این زیرگره نوع حلگر غیرخطی مورد استفاده را کنترل می کند.
بسته به اینکه زیرگره کاملاً جفت شده قبلاً ایجاد شده باشد یا نه، ممکن است به خط اول زیر نیازی نباشد (می‌توانست به طور خودکار با کدی مشابه آنچه در بالا نشان داده شده است تولید شود).
model.sol(“sol1”).feature(“s1”).create(“fc1”, “FullyCoupled”);
with(model.sol(“sol1”).feature(“s1”).feature(“fc1”));
  set(“dtech”, “auto”); //      The Nonlinear method (Newton solver)
  set(“initstep”, “0.01”); //   Initial damping factor
  set(“minstep”, “1.0E-6”); //  Minimum damping factor
  set(“rstep”, “10”); //        Restriction for step-sized update
  set(“useminsteprecovery”, “auto”); // Use recovery damping factor
  set(“minsteprecovery”, “0.75”); //    Recovery damping factor
  set(“ntermauto”, “tol”); //   Termination technique
  set(“maxiter”, “50”); //      Maximum number of iterations
  set(“ntolfact”, “1”); //      Tolerance factor
  set(“termonres”, “auto”); //  Termination criterion
  set(“reserrfact”, “1000”); // Residual factor
endwith();
برای اطلاعات بیشتر در مورد معنای این تنظیمات و سایر تنظیمات حل‌کننده سطح پایین، به بخش حل‌کننده راهنمای مرجع برنامه‌نویسی مراجعه کنید.
برای تغییر تنظیمات حل کننده سطح پایین نیاز است که model.sol ابتدا ایجاد شده باشد. همیشه اولین باری که یک مطالعه را محاسبه می کنید ایجاد می شود، با این حال، می توانید تولید خودکار model.sol را به صورت زیر فعال کنید:
model.study().create(“std1”);
model.study(“std1”).create(“stat”, “Stationary”); model.study(“std1”).showAutoSequences(“sol”);
جایی که فراخوانی به showAutoSequences مربوط به گزینه Show Default Solver است که با کلیک راست بر روی گره Study در درخت مدل موجود است.
اگر نمی‌خواهید کنترل دستی تنظیمات در model.sol (توالی حل‌کننده) را در دست بگیرید و برای ایجاد تنظیمات حل‌کننده به واسط‌های فیزیکی تکیه کنید، می‌تواند استفاده شود. اگر برنامه شما از تنظیمات حل کننده تولید شده به صورت خودکار استفاده می کند، به روز رسانی و بهبود حل کننده ها در نسخه های بعدی به طور خودکار گنجانده می شود. متناوباً، مدل. sol به‌طور خودکار تولید می‌شود ، می‌تواند به عنوان نقطه شروعی برای ویرایش‌های خود در تنظیمات حل‌کننده سطح پایین مفید باشد.
بررسی وجود راه حل
هنگام ایجاد یک برنامه، اغلب مفید است که راه حلی وجود داشته باشد یا خیر. متد model.sol( ” sol1 ” ).isEmpty() یک بولی برمی گرداند و اگر ساختار حل sol1 خالی باشد درست است. برنامه ای را در نظر بگیرید که در آن حالت حل در یک رشته solutionState ذخیره می شود . کد زیر بسته به خروجی متد isEmpty وضعیت را تنظیم می کند:
if (model.sol(“sol1”).isEmpty()) {
  solutionState = “nosolution”;
}
else {
  solutionState = “solutionexists”;
}
روش دیگر ، solutionState را می توان به nosolution مقداردهی اولیه کرد و کد زیر برای نشان دادن تغییر وضعیت مربوط به مقادیر ورودی که تغییر کرده اند استفاده می شود:
if (solutionState.equals(“solutionexists”)) {
  solutionState = “inputchanged”;
}
تقریباً همه برنامه‌های کاربردی نمونه در کتابخانه‌های کاربردی از این تکنیک استفاده می‌کنند.