تدفق مجاني ومطابقة لانداو للظروف الأولية الهيدروديناميكية الداعمة.
freestream هو تنفيذ Python لتدفق ما قبل التوازن الحرة للتصادمات الثقيلة ، كما هو موضح في
ببساطة الجري
PIP تثبيت freestream
المتطلبات الوحيدة هي Numpy (1.8.0 أو أحدث) و Scipy (0.14.0 أو أحدث).
المشكلة المحتملة: قد يحدث UnicodeDecodeError إذا لم يتم تعيين لغة النظام على ترميز UTF-8 (بسبب الأحرف اليونانية في هذه القراءة ومستندات الكود). لحل هذا ، قم بتكوين اللغة أو ببساطة تعيين متغير بيئة LANG ، على سبيل المثال export LANG=en_US.UTF-8 .
يحتوي freestream على واجهة موجهة نحو الكائن من خلال فئة FreeStreamer ، والتي تأخذ ثلاث معلمات:
freestream . FreeStreamer ( initial , grid_max , time )أين
initial عبارة عن صفيف مربع يحتوي على الحالة الأولية ،grid_max هو الحد الأقصى لـ X و Y للشبكة في FM ، أي نصف عرض الشبكة (انظر المثال التالي) ،time هو الوقت المناسب لدفق مجاني في FM/C. يجب أن يحتوي الصفيف initial على شرط أولي ثنائي الأبعاد (تعزيز). ثم يتم تفسيره على أنه ملف تعريف كثافة للجزء غير الممتازات بدون تفاعل في الوقت τ = 0+.
تقوم المعلمة grid_max بتعيين الحافة الخارجية للشبكة ، وليس نقطة منتصف خلية الشبكة الخارجية ، على سبيل المثال
هذا هو نفس تعريف المعلمة Trento --grid-max .
من المهم جدًا أن يتم ضبط الشبكة القصوى بشكل صحيح لتجنب الانتشار الفائق.
لنفترض أن initial عبارة عن مجموعة حالة أولية N × N مع شبكة أقصى بحد أقصى 10.0 FM ونريد مجانًا لدفق 1.0 FM. نقوم أولاً بإنشاء كائن FreeStreamer :
import freestream
fs = freestream . FreeStreamer ( initial , 10.0 , 1.0 ) يمكننا الآن استخراج الكميات المختلفة اللازمة لتهيئة المائية من fs .
Tuv = fs . Tuv () Tuv عبارة عن صفيف N × N × 3 × 3 يحتوي على الموتر الكامل في كل نقطة شبكة. إذا كنا نريد فقط مكونًا معينًا من الموتر ، فيمكننا نقل المؤشرات إلى الوظيفة:
T00 = fs . Tuv ( 0 , 0 ) T00 عبارة عن صفيف N × N يحتوي على T 00 في كل نقطة شبكة. هذا أمر محض للراحة النحوية: fs.Tuv(0, 0) يعادل fs.Tuv()[:, :, 0, 0] .
e = fs . energy_density () # n x n
u = fs . flow_velocity () # n x n x 3يمكننا أيضًا استخراج المكونات الفردية لسرعة التدفق:
u1 = fs . flow_velocity ( 1 ) # n x n مرة أخرى ، هذا يعادل fs.flow_velocity()[:, :, 1] .
يعمل موتر ضغط القص π μν تمامًا مثل T μν :
pi = fs . shear_tensor () # n x n x 3 x 3
pi01 = fs . shear_tensor ( 0 , 1 ) # n x nيعتمد الضغط اللزج الأكبر π على معادلة الحالة P (E) . بشكل افتراضي ، يتم استخدام EOS P (E) المثالي = E /3:
bulk = fs . bulk_pressure ()في الواقع ، يكون الضغط بالجملة صفرًا مع EOS المثالي ، ولكن سيكون هناك قيم غير صفرية صغيرة بسبب الدقة العددية.
لاستخدام EOS آخر ، تمرير كائن قابل للاتصال إلى bulk_pressure() :
bulk = fs . bulk_pressure ( eos ) على سبيل المثال ، لنفترض أن لدينا جدول من الضغط وكثافة الطاقة التي نريد أن نستمرها. يمكننا استخدام scipy.interpolate لإنشاء خط لطف وتمريره إلى bulk_pressure() :
import scipy . interpolate as interp
eos_spline = interp . InterpolatedUnivariateSpline ( energy_density , pressure )
bulk = fs . bulk_pressure ( eos_spline )يجب أن يعمل الرمز في بضع ثوان ، اعتمادًا على حجم الشبكة. وقت الحساب يتناسب مع عدد خلايا الشبكة (أي N 2 ).
تأكد من أن الشبكة كبيرة بما يكفي لاستيعاب التوسع الشعاعي. الرمز لا يتحقق من الفائض.
تقوم FreeStreamer بإرجاع الإشارات إلى المصفوفات الداخلية ، لذلك لا تعدلها في مكانها - قم بإجراء نسخ!
يستخدم FreeStreamer خطًا مكعبًا ثنائي الأبعاد (Scipy.Interpolate.RectBivariatesPline) لبناء ملف تعريف شرط أولي مستمر من شبكة منفصلة. هذا دقيق للغاية شريطة أن يكون تباعد الشبكة صغيرًا بدرجة كافية. في بعض الأحيان ، يذهب الشريط السلبي قليلاً حول الحدود الحادة ؛ FreeStreamer إكراه هذه القيم السلبية على الصفر.
يحتوي test.py البرنامج النصي على اختبارات الوحدة ويولد تصورات للتفتيش النوعي. لتشغيل الاختبارات ، قم بتثبيت الأنف وتشغيله:
nosetests -v test.py
هناك اختباران للوحدة:
تفشل هذه الاختبارات أحيانًا نظرًا لوجود مكون عشوائي ويكون التسامح صارمًا إلى حد ما (يجب أن تتفق كل نقطة شبكة في حدود 0.1 ٪). عندما يفشل الاختبار ، سيقوم بطباعة قائمة بالنسب (لوحظ/متوقع). عادةً ما تحدث الفشل في خلية الشبكة الخارجية حيث يكون النظام مخففًا للغاية ، وحتى هناك ، لن يفوتك سوى 0.2 ٪.
لإنشاء تصورات ، قم بتنفيذ test.py كبرنامج نصي مع وسيطتين ، وحالة الاختبار لتصور وملف إخراج PDF. هناك ثلاث حالات اختبار:
gaussian1 ، وهو غاوسي متماثل ضيق يركز في الأصل.gaussian2 ، إزاحة غاوسية غير متماثلة أوسع من الأصل.random ، حالة أولية تم إنشاؤها عشوائيًا (هذا ليس واقعية بأي حال من الأحوال ، إنه فقط للتصور).على سبيل المثال:
Python test.py gaussian1 freestream.pdf
سيتم تشغيل حالة اختبار gaussian1 وحفظ النتائج في freestream.pdf . يحتوي PDF على تصورات للحالة الأولية وكل ما يحسبه FreeStreamer . في كل تصور ، تشير الألوان الحمراء إلى القيم الإيجابية ، والزرقاء يعني سلبيًا ، ويتم شرح القيمة المطلقة القصوى للمصفوفة في الجزء العلوي الأيسر.
يقوم animate.py النصي المضمّن بتوليد الرسوم المتحركة (مثل تلك الموجودة في الجزء العلوي من هذه الصفحة) من الشروط الأولية المحفوظة بتنسيق HDF5 (مثل أحداث ترينتو). يتطلب python3 مع matplotlib و h5py ، وبالطبع يجب تثبيت freestream . لتحريك حدث ترينتو ، قم أولاً بإنشاء بعض الأحداث بتنسيق HDF5 ثم قم بتشغيل البرنامج النصي:
Trento PB PB 10 -O Events.hdf ./animate.py events.hdf event_0 freestream.mp4
الوسيطة الأولى هي اسم ملف HDF5 ، والثاني هو مجموعة البيانات لتحريك ، والأخير هو اسم ملف الرسوم المتحركة. قم بتشغيل ./animate.py --help