计算化学公社

标题: FORTRAN动态判断数组精度并进行运算求助 [打印本页]

作者
Author:
didi_dudu    时间: 2019-10-15 16:12
标题: FORTRAN动态判断数组精度并进行运算求助
请教各位大佬,fortran可不可以在计算过程中动态判断精度?
比如
subroutine(matrix,prec)
integer, intent(in):: prec
real(kind=prec),intent(in) ::matrix(*)
do i = 1, 100
     matrix(i) = matrix(i)*matrix(i)
enddo
end
---------
这样写之后编译会报错,说我的prec没有指定数值。
然而我输入的矩阵可能是双精度也可能是单精度。fortran怎样实现这种运算呢?

作者
Author:
St_Maxwell    时间: 2019-10-15 21:43
使用重载(看彭国伦书module那章):
  1. module m
  2.   implicit none

  3.   interface sub
  4.     module procedure :: sub_sp
  5.     module procedure :: sub_dp
  6.   end interface

  7.   contains
  8.   subroutine sub_sp(array)
  9.   ! single precision
  10.     real, dimension(:) :: array
  11.     integer :: i
  12.     do i = 1, size(array)
  13.       array(i) = array(i) + i * 2.0
  14.     end do
  15.   end subroutine

  16.   subroutine sub_dp(array)
  17.   ! double precision
  18.     real(kind=8), dimension(:) :: array
  19.     integer :: i
  20.     do i = 1, size(array)
  21.       array(i) = array(i) + i * 2.0D0
  22.     end do
  23.   end subroutine
  24. end module

  25. program main
  26.   use m
  27.   implicit none
  28.   integer :: i
  29.   real, dimension(5) :: a = [(i,i=1,5)]
  30.   real(kind=8), dimension(5) :: b = [(i,i=1,5)]

  31.   call sub(a)
  32.   call sub(b)
  33.   write(*,*) a
  34.   write(*,*) b

  35. end program
复制代码

运行结果:
  1.    3.00000000       6.00000000       9.00000000       12.0000000       15.0000000
  2.    3.0000000000000000        6.0000000000000000        9.0000000000000000        12.000000000000000        15.000000000000000
复制代码






欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3