在 Fipy 中使用 Gmsh3D 导入网格时出现问题

如何解决在 Fipy 中使用 Gmsh3D 导入网格时出现问题

我正在尝试使用 gmsh3D 函数将先前使用 gmsh 生成的 3D 网格导入到 Fipy,如下所示:

mesh = gmsh3D(join(output,'case_1.msh'),communicator=serialComm)

我遇到与其他类似帖子相同的错误,但建议的解决方案似乎对我不起作用:

gmshException: gmsh hasn't produced any cells! Check your gmsh code.

gmsh output:
Info    : Running 'gmsh C:\Users\pcnou\AppData\Local\Temp\tmppouz68km.geo -3 -nopopup -format msh2 -o C:\Users\pcnou\AppData\Local\Temp\tmp5es89ie5.msh' [gmsh 4.6.0,1 node,max. 1 thread]
Info    : Started on Wed May 05 10:22:49 2021
Info    : Reading 'C:\Users\pcnou\AppData\Local\Temp\tmppouz68km.geo'...
Info    : Done reading 'C:\Users\pcnou\AppData\Local\Temp\tmppouz68km.geo'
Info    : Meshing 1D...
Info    : Done meshing 1D (Wall 0s,cpu 0s)
Info    : Meshing 2D...
Info    : Done meshing 2D (Wall 0s,cpu 0s)
Info    : Meshing 3D...
Info    : Done meshing 3D (Wall 0s,cpu 0s)
Info    : 0 nodes 0 elements
Info    : Writing 'C:\Users\pcnou\AppData\Local\Temp\tmp5es89ie5.msh'...
Info    : Done writing 'C:\Users\pcnou\AppData\Local\Temp\tmp5es89ie5.msh'
Info    : Stopped on Wed May 05 10:22:49 2021 (From start: Wall 0.00999999s,cpu 0.03125s)

我正在使用 Fipy 3.4.2.1、Python 3.7.9 和 gmsh 4.8.4 开发 Win10。

我尝试将 .msh 文件转换为 .msh2 文件,但随后出现以下错误

IndexError                                Traceback (most recent call last)
<ipython-input-47-38097a945970> in <module>
----> 1 mesh = gmsh3D(join(output,'case_1.msh2'),communicator=serialComm) # Doesn't work

~\Anaconda3\envs\Ansys\Lib\site-packages\fipy\meshes\gmshMesh.py in __init__(self,arg,communicator,overlap,background)
   1991          self.cellGlobalIDs,1992          self.gCellGlobalIDs,-> 1993          self._orderedCellVertexIDs_data) = self.mshFile.read()
   1994 
   1995         self.mshFile.close()

~\Anaconda3\envs\Ansys\Lib\site-packages\fipy\meshes\gmshMesh.py in read(self)
    815             parprint("Recovering coords.")
    816             parprint("numcells %d" % numCellsTotal)
--> 817             vertexCoords,vertIDtoIdx = self._vertexCoordsAndMap(cellsTogmshVerts)
    818 
    819             # translate gmsh IDs to `vertexCoord` indices

~\Anaconda3\envs\Ansys\Lib\site-packages\fipy\meshes\gmshMesh.py in _vertexCoordsAndMap(self,cellsTogmshVerts)
   1008         allVerts     = nx.unique(nx.array(allVerts,dtype=nx.INT_DTYPE)) # remove dups
   1009         allVerts     = nx.sort(allVerts)
-> 1010         maxVertIdx   = allVerts[-1] + 1 # add one to offset zero
   1011         vertGIDtoIdx = nx.ones(maxVertIdx,'l') * -1 # gmsh ID -> vertexCoords idx
   1012         vertexCoords = nx.empty((len(allVerts),self.coordDimensions))

IndexError: index -1 is out of bounds for axis 0 with size 0

当我使用 .geo 文件时也会发生同样的情况。是网格本身的问题还是我在 gmsh3D 上做错了什么?任何帮助将不胜感激。

我第一次尝试使用这个网格 link,这是我希望使用的网格,但我不确定网格本身没有任何问题。因此,我尝试使用以下 .msh 文件link 和相应的 .geo 文件link,但两者都不起作用。

谢谢。

解决方法

  • 这行输出

    Info    : Running 'gmsh C:\Users\pcnou\AppData\Local\Temp\tmppouz68km.geo -3 -nopopup -format msh2 -o C:\Users\pcnou\AppData\Local\Temp\tmp5es89ie5.msh' [Gmsh 4.6.0,1 node,max. 1 thread]
    

    表示 FiPy 将 join(output,'case_1.msh') 的结果解释为 GEO 脚本,或者更准确地说,它在该位置找不到文件,因此它假定该字符串必须是 GEO 脚本。因为它是一个文件路径而不是一个 GEO 脚本,所以事情从那里往南走。

    我不知道为什么 join(output,'case_1.msh') 不被视为现有文件的路径。 output 是绝对路径还是相对路径?我建议检查您从中启动脚本的工作目录。

  • case_1_amplazer_pos10001.geo 您提供的不是 Gmsh geometry script,因此 FiPy 和 Gmsh 都无法读取。

  • test.mshcase_1.msh 都是 4.1 版 MSH 文件。 FiPy 无法读取这些内容。

  • 您是如何转换为 MSH2 格式的?

    我用过

    gmsh -3 -format msh2 case_1.msh -o case_1.msh2
    

    并且 FiPy 成功导入了它。

    Mayavi Viewer of FiPy Gmsh3D loaded from test.msh2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?