我正在尝试使用 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) 我正在尝试编写一个脚本,该脚本将使用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似乎表明s1在copy()调用时找不到原始样条()的标签。我在这里想念什么吗?例如,gmsh.model.geo.synchronize()在尝试致电之前,我曾尝试致电copy(),但这没有任何效果。
最后,当我在Gmsh GUI中使用“ 模块”-“几何”-“基本实体”-“变换”-“缩放”使用dilate 变换时,检查对话框中的“ 在副本上应用缩放”选项,在上面的示例样条线上,我的确得到了曲线符合预期,包括三个点。假设我能够使用API完成相同的操作,然后如何参考缩放后的样条曲线所经过的三个新点,例如,如果我想在原始样条曲线的起点和缩放的样条曲线?
最后,我要完成的工作如下:通过点列表绘制样条线,创建该样条线的缩放副本,在起点和终点之间绘制线,并创建由两个样条线和线。是否有比我尝试做的更好的方法?
python numeric mesh numerical-methods finite-element-analysis
我遇到了一个问题,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)