সি ++ অনেকগুলি ধ্রুবক, বৈজ্ঞানিক কোডগুলিতে ভেরিয়েবলগুলি মোকাবেলার জন্য সেরা অনুশীলন


17

আমি প্রবাহে উপস্থিত জৈবিক পদার্থের সাথে তরল প্রবাহকে অনুকরণ করার জন্য একটি কোড বিকাশ করছি। এতে কিছু অতিরিক্ত জৈবিক মডেলের সাথে মিলিত স্ট্যান্ডার্ড নাভিয়ার-স্টোকস সমীকরণ জড়িত। অনেকগুলি পরামিতি / ধ্রুবক রয়েছে।

প্রধান গণনাগুলি হ্যান্ডেল করার জন্য আমার কাছে লিখিত ফাংশন রয়েছে, তবে আমার যে সমস্যা হচ্ছে তা হ'ল বিপুল সংখ্যক ধ্রুবক / পরামিতি যা এই কম্পিউটিশনগুলির উপর নির্ভর করে। কোনও ফাংশনে 10-20 টি আর্গুমেন্ট পাস করা জটিল বলে মনে হচ্ছে।

একটি বিকল্প হ'ল সমস্ত ধ্রুবককে বৈশ্বিক পরিবর্তনশীল করা, তবে আমি জানি এটি সি ++ তে অবহিত।

কোনও ফাংশনে বহু ইনপুট পরিচালনা করার মানক উপায় কী? আমি কি একটি স্ট্রাক্ট তৈরি করে এর পরিবর্তে পাস করব?

ধন্যবাদ


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

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

1
"একটি বিকল্প হ'ল সমস্ত ধ্রুবককে গ্লোবাল ভেরিয়েবল বানানো, তবে আমি জানি এটি সি ++ তে অবহিত" এটি কি?
মনিকার সাথে লাইটনেস রেস

1
তারা আসলেই কি সত্যিই ধ্রুবক? আপনি যদি নিজের মডেলটিকে অন্য কোনও ডোমেনে প্রয়োগ করতে চান তবে কী হবে? আমি তাদের একটু ক্লাসে রাখার পরামর্শ দেব। এটি কমপক্ষে আপনাকে ভবিষ্যতে কিছুটা নমনীয়তা দেয়
আন্দ্রে

@ আন্দ্রে তাদের বেশিরভাগই প্যারামিটার ফাইলের মাধ্যমে ব্যবহারকারী দ্বারা নিয়ন্ত্রিত, সে কারণেই আমি সম্মত হব যে শ্রেণি সমাধানটি সবচেয়ে ভাল।
EternusVia

উত্তর:


13

আপনার যদি ধ্রুবক থাকে যা রান করার আগে পরিবর্তন হয় না, তাদের একটি হেডার ফাইলে ঘোষণা করুন:

//constants.hpp
#ifndef PROJECT_NAME_constants_hpp
#define PROJECT_NAME_constants_hpp
namespace constants {
  constexpr double G        = 6.67408e-11;
  constexpr double M_EARTH  = 5.972e24;
  constexpr double GM_EARTH = G*M_EARTH; 
}
#endif

//main.cpp
using namespace constants;
auto f_earth = GM_EARTH*m/r/r;  //Good
auto f_earth = G*M_EARTH*m/r/r; //Also good: compiler probably does math here too

আপনি এটি করতে চাইছেন কারণ হ'ল এটি সংকলকটি রান-টাইমের আগে ধ্রুবক মান গণনা করতে দেয়, যা আপনার কাছে প্রচুর পরিমাণে থাকলে ভাল।

চারপাশের মানগুলি পাস করতে আপনি একটি সাধারণ ক্লাসও ব্যবহার করতে পারেন:

class Params {
 public:
  double a,b,c,d;
  Params(std::string config_file_name){
    //Load configuration here
  }
};

void Foo(const Params &params) {
  ...
}

int main(int argc, char **argv){
  Params params(argv[1]);
  Foo(params);
}

সমস্ত দুর্দান্ত উত্তর কিন্তু শ্রেণি-সমাধান আমার পরিস্থিতির জন্য সবচেয়ে ভাল কাজ করে।
EternusVia

8
আপনি যদি ভেরিয়েবলগুলি বিশ্বব্যাপী constexprতৈরি করেন তবে কমপক্ষে এগুলিকে একটি ঘিরে ফেলুন namespaceযাতে তারা অন্য কোনও বৈশ্বিক চিহ্নগুলিতে পদক্ষেপ না নেয়। ডাকা বিশ্বব্যাপী ভেরিয়েবল ব্যবহার Gকরা কেবল সমস্যার জন্য ডেকে আনা।
ওল্ফগ্যাং ব্যাঙ্গার্থ

1
আপনি _ সহ প্রহরীকে কেন নেতৃত্ব দেন? _ দিয়ে শুরু হওয়া এমন কোনও কিছুই আপনার কখনই লেখা উচিত নয়, আপনি সংকলক ভারগুলির সাথে সংঘর্ষের ঝুঁকি নিয়ে যান। আপনার মতো কিছু করা উচিত ifndef PROJECT_NAME_FILE_NAME_EXTENSION। এছাড়াও, আপনি কেন ধ্রুবককে মূলধন করলেন তা নিশ্চিত নন, তবে আপনার অন্তর্ভুক্ত গার্ড ম্যাক্রোগুল্য নয়। আপনি সাধারণত সমস্ত ম্যাক্রোগুলিকে মূলধন করতে চান, বিশেষত কারণ সেগুলি স্যানিটারি নয়। ধ্রুবকদের জন্য মূলধনটি সাধারণভাবে বোঝায় নাGঠিক আছে কারণ এটির এসআই, তবে ভর_সত্তা আরও উপযুক্ত, এবং বিশ্বব্যাপী অর্থাত্‍ একটি নামস্থান সহ যোগ্য হওয়া উচিত constants::mass_earth
WHN

12

আপনার চিন্তার ট্রেনের সাথে সামঞ্জস্যপূর্ণ আরেকটি বিকল্প হ'ল সঠিকভাবে গ্রুপ কনস্ট্যান্টগুলির জন্য একটি নেমস্পেস (বা নেস্টেড নেমস্পেস) ব্যবহার করা। একটি উদাহরণ হতে পারে:

namespace constants {
   namespace earth {
      constexpr double G = 6.67408e-11;
      constexpr double Mass_Earth = 5.972e24;
      constexpr double GM = G*Mass_Earth;
   }// constant properties about Earth

   namespace fluid {
      constexpr double density = 0.999; // g/cm^3
      constexpr double dyn_viscosity = 1.6735; //mPa * s
   }// constants about fluid at 2C

   // ... 

} // end namespace for constants

উপরের কৌশলটি ব্যবহার করে আপনি কিছু পছন্দসই ফাইল এবং নেমস্পেসগুলিতে রেফারেন্স কনস্ট্যান্টগুলি স্থানীয়করণ করতে পারেন, একই জাতীয় কিছু সুবিধা পেয়ে বৈশ্বিক ভেরিয়েবলের তুলনায় এগুলিকে আরও নিয়ন্ত্রিত করে তোলেন। আপনি যখন ধ্রুবকগুলি ব্যবহার করেন, এটি করার মতোই সহজ:

constexpr double G_times_2 = 2.0*constants::earth::G;

যদি আপনি নেস্টেড নেমস্পেসের দীর্ঘ শৃঙ্খলা অপছন্দ করেন, তবে আপনি প্রয়োজনের সময় সর্বদা নেমস্পেসের নাম ব্যবহার করে সংক্ষিপ্ত করতে পারেন:

namespace const_earth = constants::earth;
constexpr double G_times_2 = 2.0*const_earth::G;

2
এটি এমন একটি পদ্ধতি যা ওপেনফোম অনুসরণ করে , ওপেনফোমের উত্স কোডের একটি এলোমেলো উদাহরণ দেখুন । ওপেনফোম হ'ল সি ++ কোড লাইব্রেরি সীমাবদ্ধ ভলিউম পদ্ধতি প্রয়োগ করে, যা তরল গতিতে ব্যাপকভাবে ব্যবহৃত হয়।
দোহ জো

1

আমি যা করি তার একটি উপায় হ'ল সিঙ্গলটন ব্যবহার করা।

আপনি যখন আপনার প্রোগ্রামটি শুরু করেন আপনি নিজের সিঙ্গলটনটি শুরু করেন এবং ধ্রুবক ডেটাটি পূরণ করেন (সম্ভবত আপনি যে কোনও প্রোপার্টি ফাইল থেকে রান করতে পারেন)। আপনি প্রতিটি ক্লাসে এটি পেতে পারেন যে আপনার মানগুলি প্রয়োজন এবং কেবল এটি ব্যবহার করুন।


সতর্কতা: আমার মাঝে মাঝে বহু-থ্রেড কোডে সিলেটলেটগুলি অ্যাক্সেসগুলি সিরিয়ালাইজ করে। সুতরাং আপনার প্রোফাইলিংয়ের অংশ হিসাবে আপনি এটি পরীক্ষা করতে চাইতে পারেন।
রিচার্ড

আমি অবশ্যই এগুলি একটি সিঙ্গেলনে রাখব না ... অনুশীলনে এই ধ্রুবকগুলি ভবিষ্যতে পরিবর্তিত হবে যখন (অন্যথায় নয়) আপনি যখন নিজের মডেলটিকে অন্য কোনও ডোমেনে প্রয়োগ করেন। তাদের একটি সিঙ্গলটন থাকার পরে বিভিন্ন পরামিতিগুলির সাথে পরীক্ষা করা খুব শক্ত হয়ে যায়।
আন্দ্রে

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

সিঙ্গলেটগুলি খুব কমই হয়, যদি কখনও হয় তবে একটি ভাল ধারণা। নির্ভরতা ইনজেকশন একটি অনেক পরিষ্কার এবং আরও নমনীয় সমাধান is যাইহোক, কেবল ধ্রুবক সহ, আমি বলব কেবল তাদের কোথাও একটি হেডারে ধ্রুবক রাখুন।
mascoj
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.