Ale*_*ray 4 floating-point fortran complex-numbers
我需要检查虚部是否非常小并将其设置为零,如果是为了消除一些浮点误差,当它应该为零时,会产生非常小的非零虚部.
我的代码如下:
kz2 = SQRT((n2*(2.0*PI*eta))**2 - kxarray(p)**2)
kz1 = SQRT((n1*(2.0*PI*eta))**2 - kxarray(p)**2)
if (aimag(kz2) < 0.0005) then
kz2 = (REAL(kz2),0.0)
end if
if (aimag(kz1) < 0.0005) then
kz1 = (REAL(kz1), 0.0)
end if
Run Code Online (Sandbox Code Playgroud)
不幸的是编译器只返回:
gaussian1.f90:122.18:
kz2 = (REAL(kz2),0.0)
1
Error: Expected a right parenthesis in expression at (1)
gaussian1.f90:126.18:
kz1 = (REAL(kz1), 0.0)
1
Error: Expected a right parenthesis in expression at (1)
Run Code Online (Sandbox Code Playgroud)
任何建议都将不胜感激 - 我是否正确地以正确的方式解决这个问题?
更新:我通过使用以下方法避免了这个问题:
if (aimag(kz2) < 0.0005) then
kz2 = real(kz2)
end if
if (aimag(kz1) < 0.0005) then
kz1 = real(kz1)
end if
Run Code Online (Sandbox Code Playgroud)
但是如果我想将虚部设置为非零量,我会怎么做?
我认为您正在寻找CMPLX
将实数或整数参数转换为复数的函数.所以你举例来说你应该可以这样做:
kz1 = cmplx(real(kz1), 0.)
Run Code Online (Sandbox Code Playgroud)
(1.0,1.0)
您尝试的样式括号表示法仅对常量值有效,而不是从变量中保存的值形成复数.
在Fortran 2008中,还有更多的可能性.您可以将实部和虚部作为派生类型组件访问,例如
a = c%re
b%im = 5
Run Code Online (Sandbox Code Playgroud)
因此,要z
在新编译器中将虚部设置为零,您可以尝试z%im = 0
.