我正在尝试为我的领域中的一些流行的Fortran代码进行python包分发.我希望它对setup.py文件使用最标准的方法.相关的qustion有助于学习如何包装Fortran扩展.
当使用这种方法,我混合时发现一些容易混淆的行为setuptools和numpy.distutils.将两者混合是不好的做法吗?截至2015年,似乎最好setuptools尽可能多地使用.
但是,我想以Fortran一种兼容的方式构建扩展numpy. 所以我想从中导入numpy.distutils以获取Extension和setup.
我使用以下基本方法:
from setuptools.command.develop import develop
from numpy.distutils.core import Extension, setup
ext_modules=[Extension("my_package.fortran_mod", sources=['src/fortran_mod.f'])]
class MyDevelop(develop):
def run(self):
my_script()
develop.run(self)
setup(
...
ext_modules=ext_modules,
cmdclass={'develop':MyDevelop})
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我有疑问.
setuptools和一般是好的做法numpy.distribute吗?setuptools先进口吗?numpy?也许甚至有一些讨论Fortran扩展?https://www.youtube.com/watch?v=R4yB-8tB0J0
http://www.fortran90.org/src/best-practices.html#interfacing-with-python
我已经看到这要求其他语言,但刚刚发现Fortran可以很好地处理数组,我想可能有一个简单的方法来做这个没有循环.
目前我正在搜索查看"最近邻居"的3D数组以查看它们是否包含字母"n",并且每当找到此值时,我希望它执行一些clusterLabel赋值(这与此问题无关) )
我想使用if(lastNeighArray.eq."n") then...<rest of code>
但由于显而易见的原因,它不喜欢根据值检查数组.它也不像我一样使用lastNeighArray(:),即使我希望它一次检查一个元素.where(lastNeighArray.eq."n")不起作用,因为我在where循环中有一个case语句,我得到错误WHERE statements and constructs must not be nested.
所以我有点卡住了.我真正想要的是类似when(lastNeighArray.eq."n")但不存在的东西.
我也看过了any,forall但他们似乎不是正确的选择.
在从基于Obj-C的框架派生的Swift类中(但可以很容易地是具有@objc属性的Swift类),我声明了两个存储的属性:
var optInt: Int?
var optString: String?
Run Code Online (Sandbox Code Playgroud)
只有optString通过生成的-Swift.h头部暴露给Obj-C.
串?可能很好,因为它是使用NSString对象暴露的,它可以是nil,因此桥接有一种方法来表示没有价值.
如果我删除?从optInt它暴露出一个NSInteger类型,所以我可以看到,对于非可选整数,它避免了对象和桥接值类型到值类型,但这是否真的意味着一个Int?不能曝光?
我似乎无法找到明确说明这种情况的任何文档.这里有一个不兼容的Swift功能的完整列表,它们没有出现:使用Objective-C中的Swift
这里的用例是经典情况,需要传递一个合法地为零的数字ID.在Swift之前的世界中,NSNumber和nil正是我实现这一点的方式,但是尝试将类迁移到Swift然后在Swift类中专门用于Obj-C类型,这是错误的.
我想我曾设想过Int?不像Int会在背景中作为NSNumber桥接,其潜在的零值为Swift中的可选项提供"无值"元素.
这里有什么我想念的吗?重申一下,可以通过桥接将Swift Optional Int(Int?)暴露给Objective-C吗?
一切都在标题中.我想知道是否有人知道快速和合理的内存需求随机混合300万行文件的所有行的方式.我想用简单的vim命令是不可能的,所以任何使用Python的简单脚本都是如此.我使用随机数生成器尝试使用python,但没有设法找到一个简单的方法.
我有使用OpenMP的以下C/C++代码:
int nProcessors=omp_get_max_threads();
if(argv[4]!=NULL){
printf("argv[4]: %s\n",argv[4]);
nProcessors=atoi(argv[4]);
printf("nProcessors: %d\n",nProcessors);
}
omp_set_num_threads(nProcessors);
printf("omp_get_num_threads(): %d\n",omp_get_num_threads());
exit(0);
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在尝试根据命令行传递的参数设置要使用的处理器数量.
但是,我得到以下输出:
argv[4]: 2 //OK
nProcessors: 2 //OK
omp_get_num_threads(): 1 //WTF?!
Run Code Online (Sandbox Code Playgroud)
为什么不omp_get_num_threads()回2?!!!
正如已经指出的那样,我omp_get_num_threads()在一个串行区域调用,因此函数返回1.
但是,我有以下并行代码:
#pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected)
for(i=0;i<fileLen-CHUNKSIZE;i++){
tid=omp_get_thread_num();
printf("%d\n",tid);
int nThreads=omp_get_num_threads();
printf("%d\n",nThreads);
...
Run Code Online (Sandbox Code Playgroud)
哪个输出:
0 //tid
1 //nThreads - this should be 2!
0
1
0
1
0
1
...
Run Code Online (Sandbox Code Playgroud) 我一直试图找到一种符合标准的方法来检查Fortran 90/95中的无限和NaN值,但事实证明它比我想象的要难.
ieee_arithmeticFortran中2003年与模块ieee_is_nan()和ieee_is_finite()内部函数.然而,所有编译器都不支持它(特别是版本4.9的gfortran).在像一开始定义无限大和NaN pinf = 1. / 0,并nan = 0. / 0似乎hackish的我,恕我直言,可以提出一些建筑问题-例如,如果某些编译器检查这在编译的时候人们就必须提供一个特殊的标志.
有没有办法在标准的Fortran 90/95中实现?
function isinf(x)
! Returns .true. if x is infinity, .false. otherwise
...
end function isinf
Run Code Online (Sandbox Code Playgroud)
和isnan()?
使用带use声明的模块或带声明的隔离文件有什么实际区别include?我的意思是,如果我有一个使用了很多在整个程序中的子程序:当或为什么我应该把它放在一个模块内部或者只是把它写在一个单独的文件,包括它在它需要程序的所有其他部分用过的?
另外,将所有子程序写入单独文件中的模块并include在模块内使用是不是一个好习惯?特别是如果在子程序的代码很长,这样才能保持代码组织得更好(这样子程序都装在国防部,但如果我有编辑一个我并不需要去虽然代码迷宫).
在C/C++中,我通常会将指针打印为数组name@dimension.Fortran的等价物是什么?
我试图理解Fortran 2003标准(或更高版本)中面向对象的概念.我对C++有一些了解,所以我认为这两种语言之间有一些共同点,可以帮助我更好地理解它们.
在C++中,多态性是通过类派生和成员函数覆盖来完成的.一个定义了一个"抽象"基类,几乎所有的虚函数都被定义了.不同的派生类包含它们的实际实现.所以其他函数只需要基于"抽象"类进行编程.然后它们适用于所有派生类.
我认为在Fortran中,OOP以类似的方式完成,但存在一些差异.在我看来,需要定义一个带有一些虚函数的基类型,就像C++一样.其他函数/子例程应遵循基类型中的成员函数定义.这是解决所有扩展类型的函数/子例程重用的方法.
我对如何编写这个想法没有更好的想法.这是我的第一次尝试:
type Basis
integer :: NBasis
contains
private
procedure :: DoNothing
generic, public :: Constructor => DoNothing
generic, public :: AllocateBasis => DoNothing
endtype Basis
type, extends(Basis) :: GridBasis
private
integer :: NGrid
contains
private
procedure :: ConstructorGrid1
procedure :: ConstructorGrid2
generic, public :: Constructor => ConstructorGrid1, ConstructorGrid2, ConstructorGrid3
procedure :: AllocateGridReal
procedure :: AllocateGridCplx
generic, public :: AllocateBasis => AllocateGridReal, AllocateGridCplx
endtype GridBasis
Run Code Online (Sandbox Code Playgroud)
首先,我如何在类型Basis中定义"AllocateBasis",使其像"虚函数"一样工作,所有扩展类型必须定义自己的"AllocateBasis"版本?
其次,如何在GridBasis类型中定义"AllocateBasis"?这里的定义包含它的真实实现.
第三,如何在GridBasis类型中使"AllocateBasis"成为重载函数?即存在真实版本和复杂版本,并且它们都被命名为"AllocateBasis",具有实际或复杂的输入可分配数组.
第四,NOPASS与PASS.据我所知,如果设置了PASS,那么就会有一个指向该对象的显式指针.但是当NOPASS设定时,就没有这样的东西了.那么PASS是简化澄清的吗?
我想有一个Fortran写语句格式化依赖于某些变量.例如,我可以写:
write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)
哪里nvari = 3.但是,如果在某些情况下,我实际上有4个变量(即nvari = 4).我想写这样的东西:
write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)
Run Code Online (Sandbox Code Playgroud)
现在,nvari可以是任何东西,输出将按我喜欢的方式工作.我怎样才能做出类似这样的工作?
fortran ×7
arrays ×2
fortran90 ×2
python ×2
c ×1
c++ ×1
f2py ×1
formatting ×1
fortran95 ×1
gdb ×1
if-statement ×1
include ×1
inheritance ×1
module ×1
numpy ×1
objective-c ×1
openmp ×1
overriding ×1
polymorphism ×1
random ×1
setuptools ×1
swift ×1
vim ×1
where ×1