目前,我正在编写科学计算的代码。我想创建一个 MHD_Model 类,如下所示:
class MHD_Model{
private:
double position;
double boundary_condidtion;
double magnetic_field;
public:
// constructor, methods for setting the boundary condititon etc.
}
目前,
double magnetic_field;
是一个数字,但我需要将其设为位置的函数。我是这样想象的,首先我定义磁场,例如:
double Bfield(double x){
return x*x;
}
然后编写一个名为
double MHD_Model::load_magnetic_field()
的方法,它将接受函数 Bfield
作为输入。但是,我无法让它发挥作用,并且我开始怀疑这不是正确的方法。
我不是受过训练的程序员,而是物理学家。我需要学习 C++/其他快速编程语言,因为我现在开始攻读博士学位,并将处理计算量大的东西。
我尝试将函数
Bfield
编写为按引用传递、按值传递,在类中使用 const double position
,但没有编译。我理解这些错误(大多数错误类似于:二元运算符 / 不能用于类型 double 和 (double *) double)。主要问题是我不知道编写此类行为的“正确”方式,并且我不确定这是否允许我想象的程序的结构方式。
有人可以提出任何建议,或者向我指出这方面的资源吗?我知道最好的方法是学习 C++,但我时间不够。
顺便说一句,我的主管也不会编程,所以我无法向他推荐,他只使用 Wolfram Mathematica。
编辑:
我将到目前为止我所编写的程序包含在我想象中的工作方式中:
主.cpp
#include <bits/stdc++.h>
#include <cmath>
#include <vector>
#include <print>
#include "mhd.hpp"
using namespace std;
double b(double *x){
return 1./ &x;
}
int main(){
double q = 10.;
double x = .3;
MHDModel model;
model.set_equipartition(q);
model.set_position(x);
model.load_magnetic_field(&b);
return 0;
}
mhd.cpp
#include "mhd.hpp"
#include <iostream>
void MHDModel::set_equipartition(double q) {
equipartition = q;
std::cout << "Setting equipartition parameter to " << q << "...\n";
};
void MHDModel::set_position(double x){
jet_position=x;
};
void MHDModel::load_magnetic_field(double b){
jet_mag_field = b;
};
mhd.hpp
#ifndef MHD_HPP
#define MHD_HPP
#include <iostream>
class MHDModel{
private:
double jet_position;
double jet_mag_field;
double equipartition;
public:
MHDModel(double x = 0., double q = 1.){
jet_position = x;
equipartition = q;
std::cout << "Creating magnetohydrodynamic model..." << "\n";
};
void set_equipartition(double q);
void set_position(double x);
void load_magnetic_field(double b);
};
#endif // !MHD_HPP
虽然我知道它不应该起作用,但我不知道它会如何完成。研究起来有点困难,因为有关“将函数加载到类中”等的所有内容都与方法有关,但这里的情况并非如此(我认为?)。
是的,您可以使用 std::function 将函数注入到您的模型中,如下所示:
// #include <bits/stdc++.h> <== NEVER include this... it is not standard C++
#include <functional>
#include <iostream>
// do NOT use `using namespace std;`
double b(double x) // No need to pass double as a pointer
{
std::cout << "b called\n";
return 1.0 / x;
}
class Model
{
public:
Model(std::function<double(double)> fn) :
m_fn{ fn }
{
}
double calculate(double v)
{
return m_fn(v);
}
private:
std::function<double(double)> m_fn;
};
int main()
{
Model model{ b };
model.calculate(1.0);
}