标签: fortran90

Fortran 90中使用高斯消元法的4个方程组中的浮点误差

该程序返回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)

fortran fortran90

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

将函数传递给子例程时,虚拟过程'f'中的接口不匹配

我正在尝试编写一个有两个参数的子程序(用于最小化):

  • 一个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 fortran90

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

针对多行fortran openmp指令的Vim语法高亮显示

我正在使用现代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)

我需要在语法文件中使用某种正则表达式规则才能正确匹配单行和续行.有人可以帮忙吗?

vim openmp fortran90 vim-syntax-highlighting

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

Fortran 90和MPI错误

我正在编写一个非常小的程序来理解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当我执行它时, …

mpi fortran90 mpich

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

Fortran 90数据语句不会覆盖数据

我试图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 04 3 2 1.但是,我得到的是0 0 0 00 0 0 0.它意味着DATA语句不会覆盖值a,是吗?

arrays fortran fortran90

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

使用Fortran语句函数

我读了一下语句函数,例如:

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 fortran90

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

Fortran函数错误与包含范围单元中的名称冲突

我是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 fortran90

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

正宽度误差?

我正在使用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 fortran90

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

在Fortran中查找两个数组的交集

我正在尝试在Fortran中生成两个1-D数组的交叉.

目的是使用此交集作为掩码,maxloc以便我可以将最多的几个元素从一个数组拉到另一个数组(类似于在最大堆中重复删除根的行为).

目前我只是在将索引中maxloc的值插入第二个数组后,将找到的索引处的值设置为零,但我希望Fortran有一个聪明的与掩码相关的方法.(在最大检索过程中保留原始数组也很好)

arrays fortran fortran90 set-intersection fortran95

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

将Go-to语句从FORTRAN 77转换为Fortran 90

我正在处理一段旧的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)

有人可以建议这种方法是否正确吗?在我的结果中,我没有得到我期望的结果。因此,我的逻辑可能存在问题。

fortran if-statement fortran77 fortran90 do-loops

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