আমি কীভাবে ডাইমেনশনালি অজোনস্টিক কোড লিখব?


19

আমি প্রায়শই নিজেকে প্রদত্ত ক্রিয়াকলাপ / অ্যালগরিদমের এক, দুটি এবং ত্রিমাত্রিক সংস্করণের জন্য খুব অনুরূপ কোড লিখতে দেখি। এই সমস্ত সংস্করণ বজায় রাখা ক্লান্তিকর হয়ে উঠতে পারে। সাধারণ কোড জেনারেশন মোটামুটি ভালভাবে কাজ করে, তবে মনে হয় আরও ভাল উপায় থাকতে হবে।

একবার কোনও অপারেশন লিখতে এবং উচ্চতর বা নিম্ন মাত্রায় সাধারণীকরণের তুলনামূলক সহজ উপায় আছে কি?

এর একটি সুনির্দিষ্ট উদাহরণ হ'ল ধরুন আমার বর্ণালি স্থানের একটি বেগের ক্ষেত্রের গ্রেডিয়েন্ট গণনা করতে হবে। তিন মাত্রায় ফোর্টরান লুপগুলি দেখতে এমন কিছু দেখবে:

do k = 1, n
  do j = 1, n
    do i = 1, n
      phi(i,j,k) = ddx(i)*u(i,j,k) + ddx(j)*v(i,j,k) + ddx(k)*w(i,j,k)
    end do
  end do
end do

ddxঅ্যারে যেখানে যথাযথভাবে সংজ্ঞায়িত করা হয়। (কেউ এটি ম্যাট্রিক্স গুণায়ও করতে পারে)) দ্বিমাত্রিক প্রবাহের কোডটি প্রায় হুবহু বাদে: তৃতীয় মাত্রা লুপ, সূচক এবং উপাদানগুলির সংখ্যা থেকে বাদ পড়ে of এটি প্রকাশ করার আরও ভাল উপায় আছে কি?

আরেকটি উদাহরণ হ'ল ধরুন আমার কাছে ত্রি-মাত্রিক গ্রিডে তরল বেগ নির্ধারণ করা হয়েছে বিন্দু অনুসারে defined গতিবেগকে একটি স্বেচ্ছাসেবী অবস্থানে (যেমন গ্রিড পয়েন্টের সাথে সঙ্গতিপূর্ণ নয়) বিচ্ছিন্ন করতে, তিনটি মাত্রার (অর্থাত্ মাত্রিক হ্রাস) একের পরিকল্পিত এক-মাত্রিক নেভিল অ্যালগরিদম ব্যবহার করতে পারেন । কোনও সাধারণ অ্যালগরিদমের এক-মাত্রিক বাস্তবায়ন দিয়ে মাত্রিক হ্রাস করার কি সহজ উপায় আছে?

উত্তর:


13

আপনি দেখুন কীভাবে চুক্তি.আইআই ( http://www.dealii.org/ ) এটি করে - সেখানে, মাত্রিক স্বাধীনতা গ্রন্থাগারের একেবারে কেন্দ্রস্থলে রয়েছে এবং বেশিরভাগ ডেটা টাইপের টেম্পলেট যুক্তি হিসাবে মডেল করা হয়েছে। উদাহরণস্বরূপ, পদক্ষেপ -4 টিউটোরিয়াল প্রোগ্রামের মাত্রা-অজোনস্টিক ল্যাপ্লেস সলভারটি দেখুন:

http://www.dealii.org/developer/doxygen/deal.II/step_4.html

আরো দেখুন

https://github.com/dealii/dealii/wiki/Frequently-Asked-Questions#why-use-templates-for-the-space-dimension


আমি দৃ strongly়ভাবে একমত। ডিল.আইআই যা করছে তার চেয়ে ভাল পদ্ধতির আমি খুঁজে পাইনি। এই সমস্যাটি পেতে তারা খুব আকর্ষণীয় উপায়ে টেম্পলেটগুলি ব্যবহার করে।
এলডিলা

1
একটি ভাল সংস্থান, তবে আপনি সি ++ টেমপ্লেটগুলি গ্র্যাক না করলে বেশ ভয়ঙ্কর।
meawoppl

@ ওল্ফগ্যাং ব্যানগারথ: ডিল.আইআই টেমপ্লেটগুলি ব্যবহার করে পুনরাবৃত্তিকেও সংজ্ঞায়িত করে?
ম্যাথু এমমেট

@ ম্যাথিউএমেট: হ্যাঁ
ওল্ফগ্যাং ব্যাঙ্গার্থ

@ মায়োপ্পল: আসলে, না আমি নিয়মিতভাবে ডিলের উপর ক্লাস শিখিয়ে থাকি andআই, এবং শুরুতে কেবল শিক্ষার্থীদের বলি যে ক্লাসওয়েথ <<> যা কিছু বলে 2 ডি, ক্লাসওয়ে <3> 3 ডি-তে রয়েছে এবং ক্লাসও যে <ডি>> ডিমে-ডি-তে রয়েছে। আমি সপ্তাহের 3 এ কোথাও টেমপ্লেটগুলিতে পাঠ্য পাঠিয়েছি এবং সম্ভবত ছাত্ররা বুঝতে পারে না যে এটির আগে এটি কীভাবে কাজ করে, তারা যাইহোক এটি ব্যবহার করে সম্পূর্ণ কার্যকর হয় al
ওল্ফগ্যাং ব্যাঙ্গার্থ

12

প্রশ্নটি হাইলাইট করে যে বেশিরভাগ "সরল" প্রোগ্রামিং ভাষা (সি, ফোর্টরান, কমপক্ষে) আপনাকে পরিষ্কারভাবে এটি করার অনুমতি দেয় না। একটি অতিরিক্ত সীমাবদ্ধতা হ'ল আপনি চাঞ্চল্যকর সুবিধা এবং ভাল পারফরম্যান্স চান।

সুতরাং, মাত্রা-নির্দিষ্ট কোডটি লেখার পরিবর্তে , এমন একটি কোড লিখতে বিবেচনা করুন যা একটি মাত্রা-নির্দিষ্ট কোড তৈরি করে। এই জেনারেটরটি মাত্রা-স্বতন্ত্র, এমনকি যদি কম্পিউট কোডটি নাও থাকে। অন্য কথায়, আপনি আপনার স্বীকৃতি এবং গণনা প্রকাশ করা কোডের মধ্যে যুক্তির একটি স্তর যুক্ত করুন। সি ++ টেমপ্লেটগুলি একই জিনিসটির সমান: Uর্ধ্বমুখী, সেগুলি ঠিক ভাষাতেই তৈরি। নেতিবাচক, তারা লিখতে কিছুটা কষ্টকর। এটি কীভাবে কোড জেনারেটরকে ব্যবহারিকভাবে অনুধাবন করতে পারে তা প্রশ্নকে হ্রাস করে।

ওপেনসিএল আপনাকে রান টাইমে কোড জেনারেশনটি মোটামুটি পরিষ্কারভাবে করতে দেয়। এটি 'বাহ্যিক নিয়ন্ত্রণকারী প্রোগ্রাম' এবং 'অভ্যন্তরীণ লুপস / কার্নেলস' এর মধ্যে খুব পরিষ্কার বিভাজনের জন্যও তৈরি করে। বাহ্যিক, উত্পাদক প্রোগ্রামটি কম কর্মক্ষমতা-সীমাবদ্ধ, এবং তাই পাইথনের মতো স্বাচ্ছন্দ্যপূর্ণ ভাষায়ও রচনা করা যেতে পারে। পাইওপেনসিএল কীভাবে ব্যবহৃত হবে তার জন্য এটিই আমার আশা - পুনর্নবীকরণ করা নির্লজ্জ প্লাগের জন্য দুঃখিত।


আন্দ্রিয়াস! Scicomp স্বাগতম! সাইটে আপনাকে খুশী করলাম, আমার মনে হয় আপনার যদি কোনও প্রশ্ন থাকে তবে আপনি কীভাবে আমার সাথে যোগাযোগ করবেন তা জানেন।
অরন আহমদিয়া

2
সি ++ ম্যাজিকের পরিবর্তে এই সমস্যার সমাধান হিসাবে স্বয়ংক্রিয় কোড জেনারেশনের জন্য +10000।
জেফ

9

নিম্নলিখিত রুক্ষ মানসিক প্রোটোটাইপ দিয়ে এটি যে কোনও ভাষায় সম্পন্ন হতে পারে:

  1. প্রতিটি মাত্রার এক্সেটেন্টগুলির একটি তালিকা তৈরি করুন (ম্যাটল্যাবে আমার মনে হয় আকারের মতো কিছু)
  2. প্রতিটি মাত্রায় আপনার বর্তমান অবস্থানের একটি তালিকা তৈরি করুন।
  3. বাইরের লুপের উপর ভিত্তি করে আকারের পরিবর্তিত আকারগুলির উপর একটি লুপ সমেত প্রতিটি মাত্রায় একটি লুপ লিখুন।

সেখান থেকে, আপনার কোডটিকে এনডি-কমপ্লায়েন্ট রাখতে আপনার নির্দিষ্ট ভাষার সিনট্যাক্সের সাথে লড়াই করার প্রশ্ন।

একটি এন-ডাইমেনশনাল ফ্লুইড-ডায়নামিক্স সলভার লিখেছেন , আমি খুঁজে পেয়েছি যে কোনও ভাষার পক্ষে এটি কার্যকর যা কোনও ফাংশনের আর্গুমেন্ট হিসাবে বস্তুর মতো তালিকা আনপ্যাকিং সমর্থন করে। অর্থাৎ a = (1,2,3) f (a *) -> f (1,2,3)। অতিরিক্তভাবে উন্নত পুনরাবৃত্তকারী (যেমন নাম্পায় এনডেনিউরেট) কোডকে প্রস্থের ক্লিনারের একটি ক্রম তৈরি করে।


এটি করার জন্য পাইথন সিনট্যাক্সটি দেখতে সুন্দর এবং সংযোগযুক্ত। আমি অবাক হই যে ফোর্টরানের সাথে এটি করার কোনও দুর্দান্ত উপায় আছে ...
ম্যাথু এমমেট

1
ফোর্টরানে গতিশীল স্মৃতি সামাল দেওয়া কিছুটা বেদনাদায়ক। সম্ভবত ভাষা নিয়ে আমার বড় অভিযোগ।
meawoppl ২

5

n1×n2×n3nj=1


ডাইমেনশন-ইন্ডিপেন্ডেন্ট হওয়ার জন্য, আপনার কোডটি ম্যাক্সডিম +1 মাত্রার জন্য রচনা করা দরকার, যেখানে ম্যাক্সডিম সর্বোচ্চ ব্যবহারযোগ্য মাত্রার ব্যবহারকারী হতে পারে। ম্যাক্সডিম = 100 বলি। ফলাফল কোড কতটা কার্যকর?
জেফ

4

আপনি যদি ফোর্টরান গতি রাখতে চান তবে স্পষ্ট উত্তরগুলি হ'ল এমন ভাষা ব্যবহার করা উচিত যা জুলিয়া বা সি ++ এর মতো উপযুক্ত কোড উত্পন্ন করে। সি ++ টেমপ্লেট ইতিমধ্যে উল্লেখ করা হয়েছে, তাই আমি জুলিয়ার সরঞ্জামগুলি এখানে উল্লেখ করব। জুলিয়ার উত্পন্ন ফাংশন আপনাকে প্রকারের তথ্যের মাধ্যমে চাহিদার উপর ফাংশন তৈরি করতে এর রূপক ব্যবহার করতে দেয়। সুতরাং মূলত আপনি এখানে যা করতে পারেন তা হ'ল

@generated function f(x)
   N = ndims(x)
   quote
     # build the code for the function
   end
end

এবং তারপরে আপনি Nকোডটি কার্যকরভাবে তৈরি করতে কোডটি ব্যবহার করেছেন যা এটি Nমাত্রিক মাত্রার ভিত্তিতে কার্যকর করতে চান । তারপরে জুলিয়ার কার্টেসিয়ান গ্রন্থাগার বা আইনসম.জিল এক্সপ্রেশনগুলির মতো প্যাকেজগুলি Nমাত্রিক কার্যের জন্য সহজেই তৈরি করা যেতে পারে ।

জুলিয়া সম্পর্কে এখানে খুব সুন্দর যে এই ফাংশনটি আপনি ব্যবহার করেন এমন প্রতিটি নতুন মাত্রিক অ্যারের জন্য স্থিতিশীলভাবে সংকলিত এবং অনুকূলিত হয়েছে, সুতরাং এটি আপনাকে সি / ফোর্টরান গতি পেতে আপনার প্রয়োজনের চেয়ে বেশি সংকলন করবে না। শেষ পর্যন্ত এটি সি ++ টেমপ্লেটগুলি ব্যবহার করার মতো, তবে এটি আরও সহজ করার জন্য অনেকগুলি সরঞ্জাম সহ এটি একটি উচ্চ স্তরের ভাষা (এত সহজ যে এটি কোনও আন্ডারগ্রাডের জন্য একটি দুর্দান্ত হোমওয়ার্কের সমস্যা হবে)।

আর একটি ভাষা যা এর পক্ষে ভাল তা হ'ল কমন লিসপের মতো একটি লিস্প। জুলিয়ার মতো এটি ব্যবহার করা সহজ কারণ এটি আপনাকে অন্তর্নির্ধারণের সরঞ্জামগুলিতে প্রচুর অন্তর্নির্মিত সংকলিত এএসটি দেয় তবে জুলিয়ার বিপরীতে এটি স্বয়ংক্রিয়ভাবে এটি সংকলন করে না (বেশিরভাগ বিতরণে)।


1

আমি একই (ফোর্টরান) নৌকায় আছি আমার কাছে একবার আমার 1 ডি, 2 ডি, 3 ডি এবং 4 ডি (আমি প্রজেটিভ জ্যামিতি করি) উপাদানগুলি আমি প্রতিটি ধরণের জন্য একই অপারেটর তৈরি করি এবং তারপরে আমার যুক্তিটি উচ্চ স্তরের সমীকরণগুলি দিয়ে লিখি যা এটি স্পষ্ট করে তোলে যা চলছে। এটি প্রতিটি ধাপের আলাদা আলাদা লুপ এবং প্রচুর মেমরির অনুলিপি হিসাবে ভাবেন বলে এতো ধীর নয়। আমি সংকলক / প্রসেসরটিকে অপ্টিমাইজেশন করতে দিই।

উদাহরণ স্বরূপ

interface operator (.x.)
    module procedure cross_product_1x2
    module procedure cross_product_2x1
    module procedure cross_product_2x2
    module procedure cross_product_3x3
end interface 

subroutine cross_product_1x2(a,b,c)
    real(dp), intent(in) :: a(1), b(2)
    real(dp), intent(out) :: c(2)

    c = [ -a(1)*b(2), a(1)*b(1) ]
end subroutine

subroutine cross_product_2x1(a,b,c)
    real(dp), intent(in) :: a(2), b(1)
    real(dp), intent(out) :: c(2)

    c = [ a(2)*b(1), -a(1)*b(1) ]
end subroutine

subroutine cross_product_2x2(a,b,c)
    real(dp), intent(in) :: a(2), b(2)
    real(dp), intent(out) :: c(1)

    c = [ a(1)*b(2)-a(2)*b(1) ]
end subroutine

subroutine cross_product_3x3(a,b,c)
    real(dp), intent(in) :: a(3), b(3)
    real(dp), intent(out) :: c(3)

    c = [a(2)*b(3)-a(3)*b(2), a(3)*b(1)-a(1)*b(3), a(1)*b(2)-a(2)*b(1)]
end subroutine

মত সমীকরণ ব্যবহার করা

m = e .x. (r .x. g)  ! m = e×(r×g)

কোথায় eএবং rএবং gএমন কোনও মাত্রিকতা থাকতে পারে যা গাণিতিক বোধ তৈরি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.