小编Deb*_*asu的帖子

Fortran:`READ(*,*)`!=命令行参数.如何使用命令行参数?

GCC版本4.6

问题:要找到一种方法,将参数输入到可执行文件中,例如a.out,从命令行 - 更具体地说,输入一个双精度数字数组.

尝试:使用READ(*,*)标准中较旧的命令:程序test.f-

PROGRAM MAIN  
     REAL(8)    :: A,B  
     READ(*,*) A,B
     PRINT*, A+B, COMMAND_ARGUMENT_COUNT()
END PROGRAM MAIN
Run Code Online (Sandbox Code Playgroud)

执行 -

$ gfortran test.f
$ ./a.out 3.D0 1.D0
Run Code Online (Sandbox Code Playgroud)

这没用.经过一番反省,发现了

$./a.out
3.d0,1.d0
   4.0000000000000000                0
Run Code Online (Sandbox Code Playgroud)

确实有效,但第二行是输入提示,并且没有实现以单行完成此操作的目标.此外COMMAND_ARGUMENT_COUNT(),与PERL不同,显示输入提示中的数字实际上并不算作"命令行参数".

command-line fortran

12
推荐指数
1
解决办法
2万
查看次数

使用python-ctypes将fortran与python连接起来

经验:
fortran大约3个月
python - 中间:在此之前从未在python中使用过ctypes模块

我正在寻找一种方法来在python中使用fortran代码进行我的博士工作 - 随后使用matplotlib即时使用可视化计算进行可视化.

这个帖子有帮助(这告诉我可以使用ctypes模块在python中使用/调用fortran代码 - 并且鉴于fortran函数具有绑定到它们的备用名称 - 这在逻辑上对我有意义,尽管我不知道它是如何工作的细节,但我们不要选择我们的战斗明智的!).
然后这个SO帖子也处理从python调用fortran函数.

下一个合乎逻辑的步骤是查找python模块ctypes文档.这里讨论了如何在API级别使用python访问共享库.

我把所有的部分都做成了一个最小的工作示例,另一个答案已经完成了.但我想看看涉及真实浮点数的输出机制和数学运算.这是我做的测试用例.

test.f90

function prnt(s)
    character(80):: s
    logical :: prnt
    print*, s
    prnt = .true.
end function prnt

function sin_2(r)
    real:: r,sin_2
    sin_2 = sin(r)**2
end function sin_2
Run Code Online (Sandbox Code Playgroud)

制作共享对象

$gfortran -shared  -g -o test.so test.f90
Run Code Online (Sandbox Code Playgroud)

编辑:由于某种原因,我的工作计算机需要-fPIC选项进行编译

为了确保我的两个功能prnt,sin_2并在那里,我检查nm:

$ nm test.so | tail -3  
0000067f T prnt_
0000065c T sin_2_ …
Run Code Online (Sandbox Code Playgroud)

python fortran ctypes gfortran fortran90

8
推荐指数
2
解决办法
4791
查看次数

fortran:尝试制作最小的堆栈数据结构

关于 SO 上的堆栈的问题,终于!我的一生都让我走到了这一步。

所以我需要将我制作的一些相当大的自定义数据结构合并到一个堆栈中。我决定编写一个仅包含一个整数值的最小堆栈结构。这里是 -

MODULE STACK_MODULE
 IMPLICIT NONE

 TYPE ELEMENT_TYPE
  INTEGER(4) :: VAL
  TYPE(ELEMENT_TYPE), POINTER :: PREV
 END TYPE ELEMENT_TYPE

 TYPE STACK_TYPE
  INTEGER(4) :: SIZE=0
  TYPE(ELEMENT_TYPE), POINTER :: LASTIN
 END TYPE STACK_TYPE

 CONTAINS
  SUBROUTINE PUSH(VAL_,STACK)
   IMPLICIT NONE
   INTEGER(4), INTENT(IN) :: VAL_
   TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
   TYPE(ELEMENT_TYPE),TARGET       :: CURRENT
   ! INIT CURRENT
   CURRENT%VAL = VAL_
   CURRENT%PREV => STACK%LASTIN
   ! ADD CURRENT TO STACK
   STACK%LASTIN => CURRENT
   STACK%SIZE = STACK%SIZE+1
   RETURN
  END SUBROUTINE PUSH

  SUBROUTINE POP(STACK,VAL_)
   IMPLICIT NONE
   TYPE(STACK_TYPE), INTENT(INOUT) :: …
Run Code Online (Sandbox Code Playgroud)

stack fortran fortran90 fortran95 fortran2003

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

python中的json引用提取

Json 不仅可用作 API 的通信工具,还可用作将运行程序配置为初始化的标记。

在 json 模式中遇到了为了重用而使用引用的情况

由于 json 模式是有效的 json,我曾期望 python json 库能够扩展引用。

$ cat test.json
{ 
  "template":{
    "a":"a",
    "b":"b",
    "pi":3.14
  },
  "value": { "$ref":"#/template"}
}
python -c "from json import load; fp = open(\"test.json\",\"r\"); print(load(fp))"
{'template': {'a': 'a', 'b': 'b', 'pi': 3.14}, 'value': {'$ref': '#/template'}}
Run Code Online (Sandbox Code Playgroud)

在 python 中扩展引用的最简单方法是什么,因为 python dicts 不能指向它们自身的其他部分(我认为)?

python json

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

无法将 `scipy.interpolate.RectBivariateSpline` 与 `matplotlib.pyplot,plot_surface` 一起使用

我尝试构建一个最小的示例来重现我遇到的问题。请忽略随机生成的数据数组xy。我正在将非常有意义的数据输入到zSpline内部调用中plot_surface。您可以尝试将倒数第二行替换为 -surf=ax.plot_surface(xg,yg,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)我已将 ZSpline 替换为粗数据z。这向我表明我在语法上没有弄错。

我的代码是-

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from scipy.interpolate import RectBivariateSpline

size=21
dat = np.random.randn(size, 2)
x=dat[:,0]
y=dat[:,1]
z=np.random.randn(size//3,size//3)
i=np.tile([1,2,3],size//3)
bool_dat=(i==1)
x_new=x[bool_dat]
y_new=y[bool_dat]
xi=np.linspace(x_new.min(),x_new.max(),size//3)
yi=np.linspace(y_new.min(),y_new.max(),size//3)

#print z.shape,xi.shape,yi.shape

zSpline = RectBivariateSpline(xi,yi,z)

xg,yg = np.meshgrid(xi,yi)
print zSpline(xg,yg)
fig=plt.figure()
ax=fig.gca(projection='3d')
surf=ax.plot_surface(xg,yg,zSpline(xg,yg),rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0.1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我得到的错误是 -

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-a98e6c15985e> in <module>()
     22 
     23 xg,yg …
Run Code Online (Sandbox Code Playgroud)

python interpolation numpy scipy

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

运算符优先级与复数

这应该是不言自明的

>>> (1+2j).real  #Normal Usage
1.0
>>> (1+2j).imag  #Normal Usage
2.0
>>> 1+2j.real  #Normal Usage
1.0
>>> 1+2j.imag  #Flips Out
3.0
>>> 123+657j.real
123.0
>>> 123+657j.imag
780.0
Run Code Online (Sandbox Code Playgroud)

z.imag以某种方式累加了实部和虚部.
我发现这很有趣..这是一个错误还是这是一个故意的功能?

python cmath

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

jq in/1 的不一致行为

jq 文档中的以下示例按预期工作-

$ echo '[1,2]' | jq 'map(in([0,1]))'
[
  true,
  false
]
Run Code Online (Sandbox Code Playgroud)

但是将值转换为字符串失败了 -

$ echo '["1", "2"]' | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key
Run Code Online (Sandbox Code Playgroud)

为了确保这不是 shell 引用问题,我还尝试过——

$ echo "[\"1\", \"2\"]" | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key
Run Code Online (Sandbox Code Playgroud)

除此之外,以下代码段也失败了,这可能是由于将 0 强制转换为布尔值 false -

$ echo '[0,1]' | jq 'map(in([1,2]))'       
[
  true,
  true
]

Run Code Online (Sandbox Code Playgroud)

arrays jq

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