我想hist(1:1000)在使用OpenMPI的不同处理器上调用相同的数组,这样当一个处理器修改时,hist这个修改在其余的处理器中更新.
我已经编写了一个代码并声明hist(1:1000)但问题是hist在每个处理器上独立更新,然后我做的是将数据发送到"主节点",以便根据从站的信息更新另一个直方图,但这是我不想要的.我想在每个处理器上更新相同的直方图.
是否可以使用OpenMPI执行此操作?
我有一个3D数组NUM(0:9,0:9,0:9),用作各种计数器,以跟踪特定坐标之间有多少个分子。无论如何,数组最终是我要制作直方图的数字列表。如果我将NUM写入文件,然后使用直方图程序将其打开并以一维数组的形式读取,那么一切都很好,但是我想在一个程序中完成所有操作,并且我想知道是否有一个取存储在NUM中的所有数字并将其制成一维数组的方法?
如果我不太清楚,我深表歉意,因为我是编程新手,但我仍在学习!
我在这里得到了一段代码,我似乎无法找到将这段代码转换为Fortran 95等效代码的有效方法.我已经尝试了好几件事,但我总是坚持用矩阵制作一维数组,反之亦然(重点是减少计算时间,如果我转换它们,我想不出另一种方法,而不是使用循环再次:/).
这是一段代码:
do i=1,dim
do j=1,dim
Snorm(i,j)=Sval(j)/Sval(i)
Bnorm(i,j)=Bval(j)/Bval(i)
Pnorm(i,j)=Pval(j)/Pval(i)
enddo
enddo
Run Code Online (Sandbox Code Playgroud)
你会如何在Fortran95代码中编写它?
R中矩阵计算的等价物如下:
Snorm <- t(Sval %*% t(1/Sval))
Bnorm <- t(Bval %*% t(1/Bval))
Pnorm <- t(Pval %*% t(1/Pval))
Run Code Online (Sandbox Code Playgroud)
Python中的等价物是这样的:
Snorm = (numpy.dot((Svalmat.T),(1/Svalmat))).T
Bnorm = (numpy.dot((Bvalmat.T),(1/Bvalmat))).T
Pnorm = (numpy.dot((Pvalmat.T),(1/Pvalmat))).T
with Svalmat etc the equivalent of Sval, but then columnmatrix
Run Code Online (Sandbox Code Playgroud)
有人有想法吗?
我在这部分代码中遇到浮点溢出错误。有哪位大佬能帮我看看是什么原因吗?
do j=1,ny-1
do i=1,nx-1
sum = 0.0d0
do k=0,1000
n=2.0d0*dfloat(k)+ 1.0d0
sum = sum + ((dsinh(n*pi*x(i))*dcos(n*pi*y(j)))/((n*n*pi*pi)*dsinh(2*n*pi)))
end do
ue(i,j)= (x(i)/(4.0d0))- 4.0d0*sum
end do
end do
Run Code Online (Sandbox Code Playgroud) 我正在学习Fortran的基础知识.我创建了一个初始化矩阵的简单子程序:
program test
integer, parameter :: n = 1024
real :: a(n, n)
call init(a)
write (*, *) a(1, 1)
end program
subroutine init(a)
real :: a(n, n)
a(:, :) = 3.0
end subroutine
Run Code Online (Sandbox Code Playgroud)
然后输出0.0而不是预期3.0.除此之外,valgrind说:
==7006== Conditional jump or move depends on uninitialised value(s)
==7006== at 0x400754: init_ (in /home/marcin/proj/mimuw/fortran/test)
==7006== by 0x4007A4: MAIN__ (in /home/marcin/proj/mimuw/fortran/test)
==7006== by 0x40083B: main (in /home/marcin/proj/mimuw/fortran/test)
Run Code Online (Sandbox Code Playgroud)
为什么?该n参数由编译器正确识别,应该是全局参数.
我用gfortran 6.3.1编译了程序
我想在 fortran90 中填充一个未知大小的数组。这是 MATLAB 中的等效代码:
for i=1:10
A[i] = i
end
Run Code Online (Sandbox Code Playgroud)
我知道我可以传递大小,但是如何在 fortran90 中执行此操作而不传递数组的大小。我读到我们可以使用指针,但我真的不知道如何处理指针
鉴于我在fortran编程中有一个变量声明为a = 50,b = 40变量c = a ^ 2的结果是什么?这个符号^代表模数吗?
我一直在尝试以下代码:
program hello
write(*,"(i9)") 10
end program hello
Run Code Online (Sandbox Code Playgroud)
并改变格式字符串,尝试使写入输出的字符串大小恰好满足表示整数所需的大小,但到目前为止我无法管理它。如何在 Fortran 中编写“适合”整数?
这个问题以前没有回答过.我正试图在Fortran中正确表示真实或任何数字.gfortran为我做的事情远没有.例如,当我声明变量REAL pi = 3.14159 fortran打印pi = 3.14159012而不是说3.14159000.见下文:
PROGRAM Test
IMPLICIT NONE
REAL:: pi = 3.14159
PRINT *, "PI = ",pi
END PROGRAM Test
Run Code Online (Sandbox Code Playgroud)
这打印:
PI = 3.14159012
Run Code Online (Sandbox Code Playgroud)
我可能已经预料到类似PI = 3.14159000的东西,因为REAL应该精确到至少8位小数.
如何在FORTRAN 90中编写一个程序来确定任何计算机中的机器epsilon?
type ErrorOrT[M[+_], A] = EitherT[M, Throwable, A]
type ErrorOr[A] = ErrorOrT[IO, A]
Run Code Online (Sandbox Code Playgroud)