OpenFOAM libtorch tutorial step by step
-
@李东岳 在 OpenFOAM外挂libtorch 中说:
我已经成功编译了libtorch库
@tiankai 我这个路子不需要编译libtorch。 你看楼上总结那个也不需要编译。我这面没有编译。就跟OpenFOAM安装一样。OpenFOAM可以直接下载装(apt install那种),也可以编译安装。你不要编译,你按照我1楼的方法用现成的,跟openfoam捆绑起来能跑起来。回头再研究编译libtorch
不好意思李老师,是我没有表述清楚,我是将libtorch解压了,用wmake了torchFoam,添加了路径。输入torchFoam,输出了上文中一样的信息,这表明libtorch库挂载成功了。
所以我想要运行PiNNFoam的代码,需要创建一个制作make文件夹,然后将PiNNFoam(一维对流方程),net.h,net.H添加到PiNNFoam的文件夹下,然后使用wmake文件夹PiNNFoam,最后调用PiNNFoam即可吧。现在使用wmake执行PiNNFoam报错了图中内容
-
#include <torch/torch.h> using namespace std; class NN: public torch::nn::Module { public: torch::nn::Sequential net_; NN() { net_ = register_module ( "net", torch::nn::Sequential ( torch::nn::Linear(9, 10), torch::nn::ReLU(), torch::nn::Linear(10, 1) ) ); } torch::Tensor forward(torch::Tensor x) { return net_->forward(x); } }; int main() { torch::nn::MSELoss crit; NN model; auto input = torch::empty({6, 1, 9}); #include "data.H" torch::optim::Adam adam(model.parameters(), torch::optim::AdamOptions(0.001)); for (int epoch = 0; epoch < 5000; epoch++) { auto outputF = model.forward(input); auto target = torch::empty_like(outputF); #include "target.H" auto loss = crit(outputF, target); adam.zero_grad(); loss.backward(); adam.step(); if ((epoch + 1) % 100 == 0) { cout << "Loss: " << loss.item<float>() << endl; } } auto test = torch::empty({2, 1, 9}); // batch, channel, sequence length #include "test.H" auto output = model.forward(test); std::cout<< output << endl; return 0; }
更新非常简单的一个可以用来识别流场是否存在间断的代码框架
-
@李东岳 老师,好!
还是有很多不明白的地方,多谢您的解答。- 为了在编译的时候能找到“argList.H”,“solver.H”这两个文件,我查找了这个文件的位置,并在options文件里面指定了这两个文件的位置。 :
EXE_INC = \ ... -I$(LIB_SRC)/optimisation/adjointOptimisation/adjoint/lnInclude \ -I$(LIB_SRC)/OpenFOAM/lnInclude \ -I$(LIB_SRC)/OpenFOAM/include \ ... EXE_LIBS = \ ... -libadjointOptimisation \ -libOpenFOAM \ ...
-
此外,从icoFoam solver 里面粘贴了一个createFields.H文件,但继续编译的时候,又出现了新的错误。这个**“simplifiedMeshes”和"fvc"的错误改如何解决**呀?请李老师指点一下。
-
最后,我有一个疑问,您这个代码如何与求解器建立关系呢?它对所有的求解器都是通用的么?
-
Info<< "mesh size: " << mesh.C().size() << nl; int cellNum = mesh.C().size(); vectorField uCell = U.field(); auto a = torch::zeros({cellNum, 2}); for (int i = 0; i < cellNum; i++) { a[i][0] = uCell[i].x(); a[i][1] = uCell[i].y(); }; std::cout<< "a:" << a << std::endl;
上面的代码可以把OpenFOAM的U场存储到a中