OpenFOAM外挂libtorch
-
如果Google搜索OpenFOAM+libtorch,第一个链接出来的是这个 https://ml-cfd.com/openfoam/pytorch/docker/2020/12/29/running-pytorch-models-in-openfoam.html 我当时也试了一下,发现他写这个比较复杂,并且还不是原生openfoam(用的cmake)。咱不能说Andre大神不流弊,Andre大神绝对流弊,目前OpenFOAM+libtorch领军人物了。但是这个链接写的就是很复杂。找别的教程,还跟python搞到了一起(其实不需要)。
下面是我这个几步就能把OpenFOAM挂上libtorch的步骤,主要在于把复杂的东西简单化,没有乱七八糟的多余步骤,分享给大家。
-
下载 libtorch https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.0.0%2Bcpu.zip 写别的版本也行,但是我当时下载的是这个,我测试没问题。
-
在OpenFOAM文件夹下解压缩(libtorch我放在了/home/dyfluid/OpenFOAM文件夹下):
unzip libtorch-cxx11-abi-shared-with-deps-2.0.0+cpu.zip
这一步要确保路径正确,否则会找不到库
-
下载这个torchFoam代码(一个非常小的测试代码),在任意文件夹解压缩
-
wmake
这个torchFoam -
打开.bashrc文件,增加下面一行
export LD_LIBRARY_PATH=/home/dyfluid/OpenFOAM/libtorch/lib:$LD_LIBRARY_PATH
-
执行
torchFoam
,输出:dyfluid@dyfluid-virtual-machine:~$ torchFoam 0.2870 0.5473 0.5788 0.5582 0.2020 0.7702 [ CPUFloatType{2,3} ]
起码在OpenFOAM环境下挂libtorch是成功了。后续所有复杂求解器都可以这么挂。注意我用的是g++9。
我还测试了一下,下面的代码都没问题(gpt写的)
#include <torch/torch.h> #include <iostream> // 定义一个简单的神经网络模型 struct Net : torch::nn::Module { Net() { // 输入层到隐藏层 fc1 = register_module("fc1", torch::nn::Linear(2, 5)); // 隐藏层到输出层 fc2 = register_module("fc2", torch::nn::Linear(5, 1)); } // 前向传播 torch::Tensor forward(torch::Tensor x) { x = torch::relu(fc1(x)); x = torch::sigmoid(fc2(x)); return x; } // 定义模型的层 torch::nn::Linear fc1{nullptr}, fc2{nullptr}; }; int main() { // 创建模型实例 Net model; // 定义损失函数 torch::nn::BCELoss criterion; // 定义优化器 torch::optim::SGD optimizer(model.parameters(), /*lr=*/0.01); // 创建一些训练数据 torch::Tensor inputs = torch::tensor({{0.1, 0.2}, {0.3, 0.4}, {0.5, 0.6}}); torch::Tensor targets = torch::tensor({{0.}, {1.}, {0.}}); // 开始训练 for (size_t epoch = 0; epoch < 1000; ++epoch) { // 前向传播 torch::Tensor outputs = model.forward(inputs); // 计算损失 torch::Tensor loss = criterion(outputs, targets); // 清零梯度 optimizer.zero_grad(); // 反向传播 loss.backward(); // 更新权重 optimizer.step(); // 打印损失 if (epoch % 100 == 0) { std::cout << "Epoch: " << epoch << ", Loss: " << loss.item<float>() << std::endl; } } // 打印最终的模型参数 std::cout << "Final model parameters: " << std::endl; for (const auto& pair : model.named_parameters()) { std::cout << pair.key() << ": " << pair.value() << std::endl; } return 0; }
#include <torch/torch.h> #include <iostream> #include <chrono> int main() { // 定义矩阵大小 const int N = 1000; const int M = 1000; const int K = 1000; // 创建两个随机矩阵 auto A = torch::randn({N, M}); auto B = torch::randn({M, K}); // 计时开始 auto start = std::chrono::steady_clock::now(); // 执行矩阵乘法操作 auto C = torch::mm(A, B); // 计时结束 auto end = std::chrono::steady_clock::now(); auto diff = end - start; // 计算时间差并输出结果 std::cout << "Matrix multiplication took " << std::chrono::duration <double, std::milli> (diff).count() << " ms" << std::endl; return 0; }
-
-