该程序返回a "floating point error: overflow"具有以下温度值:
170 225 275 330 390 445 500 555 610 670 725 775 830 1100 1390 1670
这是非常明显的,因为需要提升到功率16然后添加的巨大值.
该矩阵表示需要使用高斯消元解决的4个方程的系统,其中剩余的代码准备就绪.
Real Mat(4,4),Temp(10), Temp2(10),Sum
Do i=1,16
Write(*,*)"enter Temperature value T",i
Read (*,*) Temp(i)
End do
Do i=1,16
Do j=1,16
sum=0
Do k=1,16
if(i.GT.1)then
l=(4*(i-1))+j
elseif(i.eq.1)then
l=i+j-1
endif
Temp2(k)=Temp(k)**l
sum=sum+Temp2(k)
End do
Mat(i,j)=Sum
End do
End Do
Do I=1,4
Write(*,*) (mat(I,J), j=1,4)
End do
!this just forces the program to stay in the exe wind
Read(*,*) sum
End
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个有两个参数的子程序(用于最小化):
x任意长度的数组f获取该长度数组并返回标量的函数示例模块:
module foo
contains
subroutine solve(x, f)
real, dimension(:), intent(inout) :: x
interface
real pure function f(y)
import x
real, dimension(size(x)), intent(in) :: y
end function
end interface
print *, x
print *, f(x)
end subroutine
end module
Run Code Online (Sandbox Code Playgroud)
和测试程序:
use foo
real, dimension(2) :: x = [1.0, 2.0]
call solve(x, g)
contains
real pure function g(y)
real, dimension(2), intent(in) :: y
g = sum(y)
end function
end
Run Code Online (Sandbox Code Playgroud)
gfortran失败了:
call solve(x, g)
1
Error: Interface …Run Code Online (Sandbox Code Playgroud) 我正在使用现代fortran进行并行编程.我正在使用vim,我真的很讨厌fortran.vim语法文件似乎不处理像!$ omp或!dir $这样的编译器指令.这些只是在vim中呈现为注释,因此它们不会脱颖而出.在c/c ++中,这些编译器指令是使用#pragma完成的,所以一切都像预处理器代码而不是注释代码一样突出.所以我想用我的fortran语法进行类似的处理.这是我想要着色的多行指令的示例:
!$omp parallel do reduction(+: sum0) reduction(+: sum1) &
private( nn, S1, S2, Y1, Y2, rvec0, rvec1, iThreadNum)
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是一个位于$ HOME/.vim/after/syntax中的新fortran.vim文件.我已经让它在一行的开头识别出'!$ omp',并为该行着色并正确地为多线条着色.我的语法文件包含:
syn region fortranDirective start=/!$omp.*/ end=/[^\&]$/
hi def link fortranDirective PreProc
Run Code Online (Sandbox Code Playgroud)
我的问题是它现在无法处理只有一行的简单情况.即:
!$omp parallel do blah blah
call foobar <-- this is coloured the same as the line above
Run Code Online (Sandbox Code Playgroud)
我需要在语法文件中使用某种正则表达式规则才能正确匹配单行和续行.有人可以帮忙吗?
我正在编写一个非常小的程序来理解MPI(MPICH实现)和Fortran 90.不幸的是,当使用"-np 2"执行代码时,代码运行不正常.
这是代码:
PROGRAM main
USE MPI
IMPLICIT none
INTEGER :: ierr, npe, mynpe
INTEGER :: istatus(MPI_STATUS_SIZE)
REAL :: aa
CALL MPI_INIT(ierr)
CALL MPI_Comm_size(MPI_COMM_WORLD, npe, ierr)
CALL MPI_Comm_rank(MPI_COMM_WORLD, mynpe, ierr)
IF (mynpe == 0) THEN
READ(*,*) aa
CALL MPI_Send(aa, 1, MPI_REAL, 1, 99, MPI_COMM_WORLD, ierr)
ELSE IF (mynpe == 1) THEN
CALL MPI_Recv(aa, 1, MPI_REAL, 0, 99, MPI_COMM_WORLD, istatus, ierr)
WRITE(*,*) "Ho ricevuto il numero ", aa
END IF
CALL MPI_FINALIZE(ierr)
END PROGRAM
Run Code Online (Sandbox Code Playgroud)
我正在编译它,mpif90 mpi_2.f90 -o output当我执行它时, …
我试图DATA在Fortran 90中使用语句初始化一个数组.代码如下:
PROGRAM dt_state
IMPLICIT NONE
INTEGER :: a(4), b(2:2), c(10)
DATA a/4*0/
WRITE (6,*) a(:)
DATA a/4,3,2,1/
WRITE (6,*) a(:)
END PROGRAM dt_state
Run Code Online (Sandbox Code Playgroud)
我预计屏幕上的结果将是0 0 0 0和4 3 2 1.但是,我得到的是0 0 0 0和0 0 0 0.它意味着DATA语句不会覆盖值a,是吗?
我读了一下语句函数,例如:
C(F) = 5.0*(F - 32.0)/9.0
Run Code Online (Sandbox Code Playgroud)
这不是:
C = 5.0*(F - 32.0)/9.0
Run Code Online (Sandbox Code Playgroud)
即没有功能部分,或者我可能缺少某些东西?
如果它们不相同,我什么时候需要使用语句功能?
我是Fortran的新手.这个简单的代码有什么问题?
program combinatorial
Implicit none
integer :: m, n, Fact
integer :: Com
Write (*,*) 'inter 2 number for m and n'
Read (*,*) m,n
Com = Fact (m)/(Fact(n)*Fact(m-n))
Contains
integer Function Fact(t)
Implicit none
Integer, intent(IN) :: t
integer :: i, Ans
Ans = 1
Do i=1, t
Ans=Ans * i
End do
Fact = Ans
End Function Fact
End program combinatorial
Run Code Online (Sandbox Code Playgroud)
我遇到的错误是:
combinatorial.f90(10): error #6626: The name of the internal procedure conflicts with a name in the encompassing …Run Code Online (Sandbox Code Playgroud) 我正在使用FORTRAN 90通过构建二进制表达式树来计算表达式.我已经为post_order_traversal创建了一个子例程,并希望格式化一个write语句来输出结果而不会前进到下一行.这是我到目前为止:
Print*, 'The Postfix Expression:'
Write(101,*) tempPOinter%exp
101 Format (1x, A3, Advance='no')
1
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时,我收到一条错误,上面写着"格式说明符D在(1)处需要正宽度.如果有人知道这意味着什么或如何修复它,我将非常感谢您的帮助!谢谢.
我正在尝试在Fortran中生成两个1-D数组的交叉.
目的是使用此交集作为掩码,maxloc以便我可以将最多的几个元素从一个数组拉到另一个数组(类似于在最大堆中重复删除根的行为).
目前我只是在将索引中maxloc的值插入第二个数组后,将找到的索引处的值设置为零,但我希望Fortran有一个聪明的与掩码相关的方法.(在最大检索过程中保留原始数组也很好)
我正在处理一段旧的F77代码,并尝试将其转换为等效的F90代码。我在下面遇到了这些问题,有人可以建议我的转换正确吗?
Fortran 77代码:
Subroutine area(x,y,z,d)
do 15 j=1,10
if (a.gt.b) go to 20
15 CONTINUE
20 Statement 1
Statement 2
Statement 3
end subroutine
Run Code Online (Sandbox Code Playgroud)
我试图将其转换为F90,如下所示:
Subroutine area(x,y,z,d)
dloop: do j=1,10
if (a>b) then
statement 1
statement 2
statement 3
else
write(*,*) 'Exiting dloop'
exit dloop
end if
end do dloop
end subroutine
Run Code Online (Sandbox Code Playgroud)
有人可以建议这种方法是否正确吗?在我的结果中,我没有得到我期望的结果。因此,我的逻辑可能存在问题。