Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. OpenFOAM libtorch tutorial step by step

OpenFOAM libtorch tutorial step by step

已定时 已固定 已锁定 已移动 OpenFOAM
77 帖子 16 发布者 56.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • xiezhuoyuX 离线
    xiezhuoyuX 离线
    xiezhuoyu
    在 中回复了 tiankai 最后由 编辑
    #23

    @tiankai

    1. 查看/修改OpenFOAM执行wmake时采用的Gcc版本,OpenFOAM/wmake/rules/General/Gcc/c++
      CC          = g++$(COMPILER_VERSION) -std=c++14
      
    2. pytorch官网下载libtorch
      2.3.0版本依赖C++17

      2.0.0版本依赖C++14

      1.10.0版本依赖C++14
    3. 修改/home/***/.bashrc,设置环境变量
      export LD_LIBRARY_PATH=/home/***/OpenFOAM/libtorch/lib:$LD_LIBRARY_PATH
      
    4. wmake你的库(比如李老师贴的代码)PINNFoam
    5. 最后调用PINNFoam
    T 1 条回复 最后回复
  • T 离线
    T 离线
    tiankai
    在 中回复了 xiezhuoyu 最后由 编辑
    #24

    @xiezhuoyu 多谢回复,我查看了g++版本,确实是14,而且我已经成功编译了libtorch库,但是在编译一维对流方程时报错了
    ad3bc093-a9bb-4060-bec1-0a6bf18cd42f-4452fe45f775a7560bc0bed9d877fa0.png
    提示指针变量有错误

    xiezhuoyuX 1 条回复 最后回复
  • xiezhuoyuX 离线
    xiezhuoyuX 离线
    xiezhuoyu
    在 中回复了 tiankai 最后由 编辑
    #25

    @tiankai 看不出来什么问题?问问李老师@李东岳 :papa:

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #26

    我已经成功编译了libtorch库

    @tiankai 我这个路子不需要编译libtorch。 你看楼上总结那个也不需要编译。我这面没有编译。就跟OpenFOAM安装一样。OpenFOAM可以直接下载装(apt install那种),也可以编译安装。你不要编译,你按照我1楼的方法用现成的,跟openfoam捆绑起来能跑起来。回头再研究编译libtorch

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    T 1 条回复 最后回复
  • T 离线
    T 离线
    tiankai
    在 中回复了 李东岳 最后由 编辑
    #27

    @李东岳 在 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报错了图中内容

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #28

    你测试我顶盖驱动流那个。net那个是我用来测试外挂库的。估计你没有挂net的库。net这个还要编译成库挂上去才行。

    或者你直接把net.H net.C全部复制到对流那个.C的main之前也行

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    T 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #29

    顶盖驱动流那个debug出问题了。因为数据点,比如左上角那个,同时被包含在了left边界以及top边界,但是这俩边界的边界条件不一样,导致loss下不去。debug一天。。。


    更新,妥了,搞出来了

    捕获 - 副本.JPG

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • T 离线
    T 离线
    tiankai
    在 中回复了 李东岳 最后由 编辑
    #30

    @李东岳 多谢李老师,已经解决。之前出错是因为错把net.H文件也添加到了main文件中,类Class NN 重复定义了。

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #31

    我植入了PINN+TVD格式。把震荡去掉了。下图圆点:原始PINN,实线:PINN+TVD

    微信图片_20240613125704.png

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #32

    耦合的ODE系统。这个不加监督点训练不了。加了监督点效果很好。:136:

    捕2获.JPG

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 迟 离线
    迟 离线
    迟铁
    写于 最后由 编辑
    #33

    大家记得在第5步之后source一下,不然会报找不到动态库的问题T T(貌似只有我忘记了)

    OpenFoam/ CFX/ ansys/ hypermesh/ python

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #34

    @迟铁 感谢,已更新。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • leaonL 离线
    leaonL 离线
    leaon
    在 中回复了 李东岳 最后由 编辑
    #35

    @李东岳 老师好,
    您这个代码的第二、三行,“argList.H”,“solver.H”涉及的这两个文件,

    • 是需要自己编写?

    • 还是去simpleFoam里面找这两个文件呢?

    CFD是个什么鬼?!

    李东岳李 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    在 中回复了 leaon 最后由 编辑
    #36

    @leaon openfoam自带的,openfoam-11

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    leaonL 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #37

    @迟铁 我试了一下,不需要加v,我估计你那面你自己搞啥东西搞错了。帖子我一会删除了,怕引起误导。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #38
    #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;
    }
    
    

    更新非常简单的一个可以用来识别流场是否存在间断的代码框架

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • leaonL 离线
    leaonL 离线
    leaon
    在 中回复了 李东岳 最后由 李东岳 编辑
    #39

    @李东岳 老师,好!
    还是有很多不明白的地方,多谢您的解答。

    • 为了在编译的时候能找到“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"的错误改如何解决**呀?请李老师指点一下。

    • 最后,我有一个疑问,您这个代码如何与求解器建立关系呢?它对所有的求解器都是通用的么?

    edd4cf9a-88a6-44fb-b855-b4b3d37469c7-image.png

    CFD是个什么鬼?!

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #40

    我在这发的代码你可以理解是伪代码(纯粹我个人做记录用的)。有基础的话改一改就可以了。如果基础不好,这个需要重新学openfoam然后再看。

    关于你的问题,我记得我的代码里面没有用fvc,你应该是包含了一些自己写的东西在里面,然后出现了这个报错。

    这个代码不需要做CFD求解。这是监督学习只需要提供特征与标签。特征与标签是CFD单独计算出来的,不在求解器层面去计算。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    leaonL 1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #41
        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中

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • leaonL 离线
    leaonL 离线
    leaon
    在 中回复了 李东岳 最后由 编辑
    #42

    @李东岳
    谢谢你,把solver.H 改成“fvCFD.H”就少了很多错误。不知道是不是与版本有关,这里用的是v2312版本。
    还剩余一个错误:scalarField P1internal = P[1].primitiveField();
    d5459c64-7696-44a5-8978-54b560e48231-image.png

    CFD是个什么鬼?!

    李东岳李 D 2 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]