小编D. *_*ies的帖子

具有 Ctypes 的独立 CDLL 库实例

我正在尝试使用 ctypes 并两次加载相同的编译 Fortran 库,这样我就有两个独立的实例,这样库包含的任何模块变量都不会存储在相同的内存位置。描述的一般解决方案(例如,此处:https : //mail.python.org/pipermail/python-list/2010-May/575368.html)是提供库的完整路径,而不仅仅是其名称。但是,我无法让它像这样工作。这是一个演示问题的最小工作示例:

测试.f90:

module test
    use iso_c_binding, only: c_int
    implicit none
    integer :: n
contains
    integer(c_int) function get() bind(c, name='get')
        get = n
    end function get

    subroutine set(new_n) bind(c, name='set')
        integer(c_int), intent(in) :: new_n
        n = new_n
    end subroutine set
end module test
Run Code Online (Sandbox Code Playgroud)

测试.py:

import os
from ctypes import cdll, c_int, byref

if __name__ == '__main__':
    lib1 = cdll.LoadLibrary(os.path.abspath('test.so'))
    lib2 = cdll.LoadLibrary(os.path.abspath('test.so'))

    lib1.set(byref(c_int(0)))
    lib2.set(byref(c_int(1)))

    print(lib1.get())
Run Code Online (Sandbox Code Playgroud)

Fortran 库是使用以下命令编译的:

gfortran -shared -fPIC -o test.so test.f90 …
Run Code Online (Sandbox Code Playgroud)

python fortran ctypes

5
推荐指数
1
解决办法
697
查看次数

有关Gmsh Python API的问题

我正在尝试编写一个脚本,该脚本将使用Gmsh Python API自动对几何进行网格划分以进行CFD分析。我遇到了一些问题:

首先,我希望能够编写用于调试目的的Gmsh脚本文件(.geo)。我查看了Gmsh API的源代码,发现该功能支持.geo_unrolled扩展名gmsh.write(),而不仅限于.geo。此扩展名最能解决问题,但是使用时,似乎没有将任何网格划分操作(例如将曲线标记为超限)或变换(例如膨胀)写入输出文件gmsh.write('test.geo_unrolled')。我认为这与_unrolled部分有关。但是,有什么方法可以从API中获取完整的Gmsh脚本?

其次,当我尝试复制样例的样例时:

p1 = gmsh.model.geo.addPoint(-1, 0.5, 0, 0.1)
p2 = gmsh.model.geo.addPoint(0, 1, 0, 0.1)
p3 = gmsh.model.geo.addPoint(1, 0.5, 0, 0.1)
s1 = gmsh.model.geo.addSpline([p1, p2, p3])
s2 = gmsh.model.geo.copy([s1])
Run Code Online (Sandbox Code Playgroud)

我懂了ValueError: ('gmshModelGeoCopy returned non-zero error code: ', 1)。错误代码1似乎表明s1copy()调用时找不到原始样条()的标签。我在这里想念什么吗?例如,gmsh.model.geo.synchronize()在尝试致电之前,我曾尝试致电copy(),但这没有任何效果。

最后,当我在Gmsh GUI中使用“ 模块”-“几何”-“基本实体”-“变换”-“缩放”使用dilate 变换时,检查对话框中的“ 在副本上应用缩放”选项,在上面的示例样条线上,我的确得到了曲线符合预期,包括三个点。假设我能够使用API​​完成相同的操作,然后如何参考缩放后的样条曲线所经过的三个新点,例如,如果我想在原始样条曲线的起点和缩放的样条曲线?

最后,我要完成的工作如下:通过点列表绘制样条线,创建该样条线的缩放副本,在起点和终点之间绘制线,并创建由两个样条线和线。是否有比我尝试做的更好的方法?

python numeric mesh numerical-methods finite-element-analysis

3
推荐指数
1
解决办法
436
查看次数

为什么第一个组件的输出不使用NonlinearBlockGS求解器直接在耦合组中传递给第二个输入?

我遇到了一个问题,Group其中包括OpenMDAO中子系统之间的反馈.我正在使用NonlinearBlockBS求解器.我希望Gauss-Seidel求解器能够顺序运行子系统,将早期块的输出传递给其他输入.但是,当我在OpenMDAO中实现它时,似乎不会发生这种情况.

我已经制作了一个示例脚本来演示此问题:

class A(ExplicitComponent):

    def setup(self):
        self.add_input('x', shape=1)
        self.add_input('b', shape=1)
        self.add_output('a', shape=1)

    def compute(self, inputs, outputs):
        outputs['a'] = inputs['x'] + 2 * inputs['b']
        print('A: x = {:1.0f}, b = {:1.0f}, a = {:1.0f}'.format(inputs['x'][0], inputs['b'][0], outputs['a'][0]))


class B(ExplicitComponent):

    def setup(self):
        self.add_input('x', shape=1)
        self.add_input('a', shape=1)
        self.add_output('b', shape=1)

    def compute(self, inputs, outputs):
        outputs['b'] = inputs['x'] - 0.5 * inputs['a']
        print('B: x = {:1.0f}, a = {:1.0}, b = {:1.0f}'.format(inputs['x'][0], inputs['a'][0], outputs['b'][0]))


if __name__ == '__main__':
    ivc = IndepVarComp()
    ivc.add_output('x', …
Run Code Online (Sandbox Code Playgroud)

python openmdao

1
推荐指数
1
解决办法
70
查看次数