محاكاة التآكل السطحي للجسيمات


ملاحظة: يمكن العثور على كود المصدر الكامل للمشروع ، بالإضافة إلى توضيحات حول استخدامه وقراءته ، على Github [ هنا ].

أخذت استراحة من أطروحة الماجستير للعمل على ما كنت أقوم بتأجيله لفترة طويلة: تحسين التضاريس لمشروع الإقليم الخاص بي . طريقة بسيطة لتطبيقه هي التآكل الهيدروليكي ، ولهذا السبب قمت بإنشائه!

بالنسبة إلى أحجية برمجية ليوم واحد ، عملت بشكل جيد جدًا ، ولم تكن معقدة كما توقعت. يتم إنشاء النتائج بسرعة ولها معنى مادي وتبدو مذهلة.

في هذه المقالة ، سأتحدث عن تنفيذ C ++ البسيط لنظام تآكل هيدروليكي شبكة مربعة قائم على الجسيمات. سأشرح كل المبررات الفيزيائية الكامنة وراء التنفيذ ، وأتحدث عن الرياضيات. الكود بسيط للغاية (حوالي 20 سطرًا فقط لرياضيات التآكل) وسريع التنفيذ ، لذا أوصي به لأي شخص يريد زيادة واقعية تضاريسه.

يتم عرض النتائج باستخدام نسخة مجردة من محرك Mybrew OpenGl الخاص بي ، والتي قمت بتعديلها لتقديم مصفوفة ثنائية الأبعاد من النقاط كخريطة ارتفاع. من السهل جدًا فهم إصدار المحرك المجرد إلى أسفل إذا كنت مهتمًا بتعلم OpenGL في C ++.

التنفيذ


مستوحاة من العديد من مصادر التآكل الهيدروليكي ، قررت أنه من المنطقي أكثر استخدام الجسيمات.

التآكل القائم على الجسيمات بسيط للغاية:

  • نقوم بإنشاء جسيم عند نقطة عشوائية على السطح.
  • تتحرك / تنزلق على طول السطح باستخدام الميكانيكا الكلاسيكية القياسية (سنتحدث عنها أدناه)
  • نقوم بنقل المادة / الرواسب بين السطح والجسيمات (هذا موضح أدناه)
  • نقوم بتبخر جزء من الجسيم
  • إذا كان الجسيم خارج الخريطة أو صغيرًا جدًا ، فعليك تدميره
  • كرر العملية مع العدد المطلوب من الجسيمات.

ملاحظة: تم شرح معلمات النظام في القسم المقابل. الأهم هو عامل الخطوة الزمنية dt، الذي يقيس جميع المعلمات بشكل متناسب. هذا يسمح لنا بزيادة تردد المحاكاة (على حساب زيادة الضوضاء) دون تغيير المقياس النسبي للمعلمات. يمكن رؤية ذلك في الكود أدناه.

حبيبات


للقيام بذلك ، قمت بإنشاء بنية جسيمات بسيطة تحتوي على جميع الخصائص التي أحتاجها:

struct Particle{
  //Construct particle at position _pos
  Particle(glm::vec2 _pos){ pos = _pos; }

  glm::vec2 pos;
  glm::vec2 speed = glm::vec2(0.0); //Initialize to 0

  float volume = 1.0;   //Total particle volume
  float sediment = 0.0; //Fraction of volume that is sediment!
};

ملاحظة: في حال لم تكن على دراية بمكتبة GLM: أستخدمه لإجراء عمليات المتجه.

يكون للجسيم موضع وسرعة يحددان كيفية تحركه. بالإضافة إلى ذلك ، يحتوي على حجم وجزء يحدد مقدار الحجم من الصخور الرسوبية.

الحركة: الميكانيكا الكلاسيكية


يتم محاكاة حركة الجسيمات على السطح باستخدام الميكانيكا الكلاسيكية . باختصار ، يتم تغيير الموضع x للجسيم بواسطة السرعة v ، التي يتغيرها التسارع a .



ملاحظة: تشير الأحرف الغامقة إلى أن القيمة متجه.

نحن نعلم أيضًا أن القوة تساوي تسارع الكتلة الزمنية:


يمر الجسيم بتسارع هبوطي ناتج عن الجاذبية ، ولكنه موجود على السطح ، مما يجعل التسارع الهابط مستحيلاً. لذلك ، بدلاً من ذلك ، يخضع الجسيم إلى قوة F موجهة على طول السطح وتتناسب مع الوضع الطبيعي على السطح.

لذلك ، يمكننا القول أن التسارع a يتناسب مع المتجه الطبيعي للسطح n مقسومًا على كتلة الجسيم.


حيث k هو ثابت التناسب ، و m هي كتلة الجسيمات. إذا كانت الكتلة تساوي الحجم مضروبًا في الكثافة ، فإننا نحصل على النظام الكامل لحركة الجسيمات باستخدام الميكانيكا الكلاسيكية:

//... particle "drop" was spawned above at random position

glm::ivec2 ipos = drop.pos; //Floored Droplet Initial Position
glm::vec3 n = surfaceNormal(ipos.x, ipos.y);  //Surface Normal

//Accelerate particle using classical mechanics
drop.speed += dt*glm::vec2(n.x, n.z)/(drop.volume*density);
drop.pos   += dt*drop.speed;
drop.speed *= (1.0-dt*friction);  //Friction Factor

//...

ملاحظة: يتم تقليل السرعة بعد حركة الجسيمات بواسطة ناقل الاحتكاك. لاحظ أنه تم تضمين عامل الخطوة الزمنية هنا. الجسيمات لها القصور الذاتي ، بما يتناسب مع كثافتها نظرًا لحقيقة أننا نحاكي حركتها باستخدام التسارع.

عملية تكوين الصخور الرسوبية: نقل الكتلة


تحدث عملية تكوين الصخور الرسوبية جسديًا عند انتقال الصخور الرسوبية من الأرض إلى الجسيم والعودة إلى نقطة الجسيم (" نقل الكتلة ").

في التكنولوجيا الكيميائية ، عادة ما يوصف نقل الكتلة (أي التغير في الكتلة / الرواسب بمرور الوقت) بين مرحلتين (في هذه الحالة ، سطح الأرض وهبوط) باستخدام معاملات نقل الكتلة .

يتناسب انتقال الكتلة مع الفرق بين التركيز c وتركيز التوازن c_eq:


حيث k هو ثابت التناسب (معامل انتقال الكتلة). غالبًا ما يُسمى هذا الاختلاف بين التوازن والتركيز الفعلي "القوة الدافعة".

إذا كان تركيز التوازن أعلى من التيار ، فإن الجسيم يمتص الصخور الرسوبية. إذا كان أقل ، ثم تفقدهم. إذا كانت متساوية ، فلن تحدث أي تغييرات.

يمكن تفسير معامل نقل الكتلة بطرق مختلفة:

  • كتواتر الانتقال بين المراحل (هنا هو "معدل الترسب")
  • المعدل الذي يميل به تركيز القطيرات إلى تركيز التوازن

يعتمد النظام بشكل كامل على تحديد تركيز التوازن. اعتمادًا على التعريف ، سيظهر النظام ديناميكيات مختلفة لترسب الصخور الرسوبية. في تنفيذي ، يكون تركيز التوازن أعلى إذا تحركنا للأسفل ، وإذا تحركنا بشكل أسرع ، كما أنه يتناسب مع حجم الجسيم:

//...

//Compute Equilibrium Sediment Content
float c_eq = drop.volume*glm::length(drop.speed)*(heightmap[ipos.x][ipos.y]-heightmap[(int)drop.pos.x][(int)drop.pos.y]);

if(c_eq < 0.0) c_eq = 0.0;

//Compute Capacity Difference ("Driving Force")
float cdiff = c_eq - drop.sediment;

//Perform the Mass Transfer!
drop.sediment += dt*depositionRate*cdiff;
heightmap[ipos.x][ipos.y] -= dt*drop.volume*depositionRate*cdiff;

//...

ملاحظة: يتم وصف التغير في التركيز داخل الجسيم بالكامل بواسطة معادلة نقل الكتلة. بالإضافة إلى ذلك ، يتم مضاعفة التغيير في خريطة الارتفاع في حجم الجسيمات ، لأننا نغيرها بشكل نسبي ليس إلى التركيز ، ولكن إلى الكتلة (يتم ضرب التركيز في الحجم).

الجوانب الأخرى


تتم تهيئة خريطة الارتفاع بواسطة ضوضاء بيرلين متعددة الطبقات مع بذرة عشوائية.

في نهاية كل خطوة زمنية ، يفقد الجسيم كتلة صغيرة وفقًا لمعدل التبخر:

//...

drop.volume *= (1.0-dt*evapRate);

//...

تتكرر هذه العملية لآلاف الجسيمات التي تم إنشاؤها في أماكن عشوائية ومحاكاة منفصلة (في حالتي ، يتم إجراء الحسابات بشكل تسلسلي في وحدة المعالجة المركزية).

يتضمن التنفيذ الافتراضي مجموعة جيدة من المعلمات. بعد 200 ألف جسيم ، يبدو التآكل جيدًا جدًا.

النتائج


الكود النهائي لعملية التآكل هو ما يقرب من 20 سطرًا دون تعليق.

هنا مقارنة "قبل وبعد" لعشر عينات. تولد المحاكاة تلالًا جميلة جدًا على الارتفاعات ، وترسب الصخور الرسوبية على جوانب بعض التلال ، مما يؤدي إلى إنشاء هضاب جميلة.


مجموعة مختارة من عشر مقارنات قبل وبعد. يتلقى جهاز التظليل الذي كتبته لونين عند الإدخال. قمت أيضًا بتطبيق خرائط الظل ، الضباب المعتمد على المسافة وتظليل فونج.

فيما يلي عشر عينات أخرى (مختلفة) فقط مع النتائج:


عشرة نتائج عينة أخرى. تختلف عن السابقة ، حتى لو كانت بعض التشكيلات متشابهة.

باختيار البذور بشكل مختلف أثناء تهيئة الخريطة ، يمكنك إنشاء نتائج مختلفة مسيطر عليها.

وقت المحاكاة


يرتبط وقت المحاكاة مباشرة بعمر الجسيمات وعدد الجسيمات المحاكاة.

تؤثر العديد من العوامل على حياة الجسيمات ، ويمكن أن تختلف اختلافًا كبيرًا لكل جسيم ، لأنها يتم إنشاؤها في أماكن عشوائية:

  • الاحتكاك والجمود: سرعة الجسيمات
  • حجم الشبكة: احتمالية سقوط الجسيمات من الخريطة.
  • معدل التبخر: معدل انقراض الجسيمات

باستخدام المعلمات الافتراضية ، تتطلب محاكاة جسيم فردي 10-100 مللي ثانية ، مما ينتج عنه 10-20 ثانية لمحاكاة 200،000 جسيم.

يمكنك زيادة درجة التآكل وتقليل عمر الجسيمات عن طريق زيادة الخطوة الزمنية دون تغيير عدد الجسيمات المحاكاة. هذا يمكن أن يجعل المحاكاة أكثر "صاخبة" ، وإذا كانت الخطوة الزمنية كبيرة جدًا ، فهناك احتمال أن تفشل المحاكاة.

تتسبب المحاكاة نفسها في المحرك في تكاليف إضافية لإعادة إنشاء شبكة السطح للعرض.

يمكنك تحسين الشفرة عن طريق تقليل تكلفة إعادة إنشاء الشبكة أو عن طريق زيادة سرعة خطوة واحدة لجسيم فردي.

اعمل من أجل المستقبل


قريبا سأقوم بإدراج هذا الرمز في مشروع الإقليم الخاص بي كأساس لإنشاء خريطة ارتفاع في مولد الارتفاع.

لقد كتبت بالفعل إطارًا لمحاكاة مبسطة لديناميكيات السوائل في أنظمة المناخ ، لكنها ليست جاهزة للنشر بعد. يحصل هذا النظام على أنماط مناخية من خريطة الارتفاع. سيكون هذا هو موضوع المنشور المستقبلي حول أنظمة المناخ الإجرائي الدقيقة ماديًا!

باستخدام نظام مناخي محاكاة ، سيكون من الممكن في المستقبل أخذ جزيئات من التوزيع (على سبيل المثال ، في الأماكن التي تمطر فيها) بدلاً من توزيعها بالتساوي على الخريطة. سيتم دمجها بشكل مثالي مع الجيولوجيا ومناخ الإغاثة.

بالإضافة إلى ذلك ، بعد إضافة أنواع مختلفة من التكوينات الجيولوجية ، يمكن أن يكون للحجارة درجة مختلفة من الذوبان. سيؤثر هذا بشكل مباشر على معامل نقل الكتلة (معدل الترسيب) ، مما يخلق معدل تآكل مختلف.

هذا النظام غير قادر على محاكاة السوائل الحقيقية وتدفق الأنهار ، ولكن يمكن أن يتكيف مع مثل هذه المهام. سأفكر في الأمر وربما في المستقبل سأفرج عن استمرار للنشر.

All Articles