标签: fortran90

在 Fortran 中读取行数未知的文件

英雄我使用的新代码。我已经尝试过这个,如果我先声明 n ,它就会起作用,这不是我想要的。我需要知道行总数 (n) 并在以后的模拟中使用该数字。但是,在变量声明中,我需要在读取数据之前缩小 xy(n) ,如果这样做,代码将不会运行。

数据文件是两列随机模拟的正常数据

让我们说这样的话

1  3
2  4
3   6
4  8
5   9
6  8
7   1
8  9
99  88
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码来确定 n 但它不起作用!

     program reading

implicit none
integer,allocatable :: a(:,:)
  integer :: pair(2)
  integer :: unit, n, io,k
!!!variable declaration 

 real, dimension(1:n)::x,y
 integer:: T, I1, I2, I3, i, j, dist
open(2, file = 'xyBVNData_R.txt', status = 'old', action = 'read')


n = 0 
DO
  READ(2,*,iostat=io)
  IF (io/=0) EXIT
  n = n + 1 …
Run Code Online (Sandbox Code Playgroud)

fortran fortran90

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

在不使用循环的情况下在 fortran 中用零填充数组

我有两个数组,我想比较它们的大小并将尾随零添加到较短的数组。

例如-对于数组-

y1=(/ 1,2,3 /)
y2=(/ 1,2,3,4,5 /)
Run Code Online (Sandbox Code Playgroud)

最后的结果应该是——

y1=(/ 1,2,3,0,0 /)
y2=(/ 1,2,3,4,5 /)
Run Code Online (Sandbox Code Playgroud)

我对 Fortran 很陌生,据我所知,到目前为止,可以这样做:-

integer, allocatable :: y1(:),y2(:)
integer :: l1,l2,i
.
.
.
! some code to generate y1 and y2 here
.
.
.
l1=size(y1)
l2=size(y2)

if (l1>l2) then
    do i=l2+1,l1
        y2(i)=0
    enddo
else if (l2>l1) then
    do i=l1+1,l2
        y1(i)=0
    enddo
endif
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来做到这一点,最好是不涉及循环的方法,因为我正在处理的实际问题可能有很大的向量

fortran gfortran fortran90 fortran95

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

为什么 Fortran 内在函数“传播”通常比显式迭代慢

我使用地球物理模型,常见的情况是需要将 2D 数据与 3D 数据相乘、相加等。下面是一个例子。

module benchmarks
  implicit none
  integer, parameter :: n=500
  integer :: k
  real :: d2(n,n)
  real :: d3(n,n,n)
  contains
  ! Iteration
  subroutine benchmark_a(res)
    real, intent(out) :: res(n,n,n)
    do k = 1, size(d3,3)
      res(:,:,k) = d2*d3(:,:,k)
    end do
  end subroutine
  ! Spread
  subroutine benchmark_b(res)
    real, intent(out) :: res(n,n,n)
    res = d3*spread(d2, 3, size(d3,3))
  end subroutine
end module

program main
  use benchmarks
  real :: t, tarray(2)
  real :: res(n,n,n)
  call random_number(d2)
  call random_number(d3)
  ! Iteration
  call dtime(tarray, t) …
Run Code Online (Sandbox Code Playgroud)

fortran gfortran fortran90

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

LAPACK 程序 (Fortran 90) 的数值精度不够?

我写了一个简单的Fortran代码,其执行的多项式插值n+1R^2。它使用两个LAPACK程序(我的代码中的所有内容都是双精度)求解线性方程组(我正在创建 Vandermonde 矩阵):
首先,它分解矩阵:http : //sites.science.oregonstate.edu/~landaur/ nacphy/lapack/routines/dgetrf.html
后来系统解决了:http : //sites.science.oregonstate.edu/~landaur/nacphy/lapack/routines/dgetrs.html

该程序适用于从多项式生成的几个测试数据案例:0,1,2,3,4。然而,当我从多项式中提供 11 个点时,P(x) = x^10它推断出完全错误的系数。

输入 ( x..., y...):

1.0
1.001
1.002
1.003
1.004
1.005
1.006
1.007
1.008
1.009
1.01
1.0
1.01004512021
1.02018096336
1.03040825707
1.04072773401
1.05114013204
1.06164619412
1.07224666847
1.08294230847
1.0937338728
1.10462212541
Run Code Online (Sandbox Code Playgroud)

输出 ( a_n,...,a_0):

-4.6992230177E+004
2.2042918738E+005
-3.2949938635E+005
5.0740528522E+004
2.4764893257E+005
-3.1846974845E+004
-1.7195378863E+005
-1.4751075818E+005
4.1766709741E+005
-2.6476448046E+005
5.6082872757E+004
Run Code Online (Sandbox Code Playgroud)

我遇到数值稳定性问题了吗?还是我做错了什么?


编辑:我附上了插值过程的代码(注意,我们实际上没有nn+1)。

module InterpolatorModule
contains
subroutine interpolate(n, x, y, …
Run Code Online (Sandbox Code Playgroud)

fortran numerical-methods lapack fortran90 polynomials

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

TINY(x) 内函数

我是一名大学讲师,本学期我将使用 Fortran 90/95 作为编程语言教授数值方法课程。课程一开始就从数字的表示开始,我想谈谈 REAL(4)、REAL(8) 和 REAL(16) 可以表示的数字的限制。我打算在 OnlineGDB 上使用以下代码(这样学生就不必在计算机上安装任何东西,这在远程学习时可能会很痛苦):

Program declare_reals

implicit none 

real(kind = 4)  :: a_huge, a_tiny ! single precision ; default if kind not specified

!real(4) :: a ! Equivalent to real(kind = 4) :: a

a_huge = huge(a_huge)
print*, "Max positive for real(4) : ", a_huge
a_tiny = tiny(a_tiny)
print*, "Min positive for real(4) : ", a_tiny 
print*, 

End Program declare_reals
Run Code Online (Sandbox Code Playgroud)

通过这段代码,我得到

 Max positive for real(4) :    3.40282347E+38                                                                                                                          
 Min positive for real(4) :    1.17549435E-38
Run Code Online (Sandbox Code Playgroud)

但是,如果我写 …

fortran fortran90

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

使用函数调用非法使用派生类型

我有一个简单的函数,它返回一个基于时间字符串的时间对象:

FUNCTION getTime(timeStr)RESULT(time)
IMPLICIT NONE
CHARACTER(LEN=19),INTENT(IN) :: timeStr
TYPE timeType
 INTEGER :: yyyy,mo,dd,hh,mm,ss
ENDTYPE timeType
TYPE(timeType) :: time
READ(UNIT=timeStr( 1: 4),'(I4)')time%yyyy
READ(UNIT=timeStr( 6: 7),'(I2)')time%mo
READ(UNIT=timeStr( 9:10),'(I2)')time%dd
READ(UNIT=timeStr(12:13),'(I2)')time%hh
READ(UNIT=timeStr(15:16),'(I2)')time%mm
READ(UNIT=timeStr(18:19),'(I2)')time%ss
ENDFUNCTION getTime
Run Code Online (Sandbox Code Playgroud)

我从父例程中将其称为:

umwmTime1=getTime(umwmStartTimeStr)
umwmTime2=getTime(umwmStopTimeStr)
Run Code Online (Sandbox Code Playgroud)

其中umwmTime 1和2声明为:

TYPE timeType
  INTEGER :: yyyy,mo,dd,hh,mm,ss
ENDTYPE timeType
TYPE(timeType) :: umwmTime1,umwmTime2
Run Code Online (Sandbox Code Playgroud)

我得到的编译错误消息是:

PGF90-S-0099-Illegal use of derived type (ESMF_interface_UMWM.F90: 282)
PGF90-S-0099-Illegal use of derived type (ESMF_interface_UMWM.F90: 283)
  0 inform,   0 warnings,   2 severes, 0 fatal for umwm_component_run
Run Code Online (Sandbox Code Playgroud)

第282行和第283行是父例程中的函数调用.

但是,如果我使用子程序(而不是函数)将umwmTime1和umwmTime2作为INTENT(OUT)参数,我没有遇到任何问题.我的功能有什么问题?

fortran fortran90

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

将程序输入保存到模块以供"全局"使用

我在Fortran 90中编写了一个程序,它从文本文件中读取数百个输入,并对它们执行许多不同的顺序操作.

我不想继续将这些数百个值传递给每个子程序(有很多!).有没有办法可以将我从此文件中读取的数据保存到任何子程序都可以访问的全局变量中?我想,不知何故,我可以将这些值保存到每个子程序可以调用的模块中,但我不确定如何这样做.

fortran fortran90 fortran95

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

fortran 90在指针赋值期间预期的边界规范

我是Fortran的新手.我正在Fortran 90中编写一个程序来获取数组的非零元素,并使用指针函数将它们放入一个新数组中,如下所示:

program prog
    implicit none
    integer, target :: a(5)
    integer :: i
    integer, pointer :: nz(:)


    a(1) = 1
    a(2) = 0
    a(3) = 0
    a(4) = 2
    a(5) = 3

    nz => non_zeros(a)
    do i=1, size(nz)
       write(*,*) nz(i)
    end do  

contains
function non_zeros(a)
    integer, target :: a(:) 
    integer, pointer:: non_zeros(:)
    integer :: n, i, j

    n = count(a .ne. 0)
    allocate(non_zeros(n))

    j = 0
    do i=1, m
        if (a(i) .ne. 0) then
            j = j + 1
            non_zeros(j) …
Run Code Online (Sandbox Code Playgroud)

pointers specifications fortran90 bounds

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

MPI_BCAST()仅应用于基础组的一小部分

我将8个处理器分为两组,每组包含四个处理器.我要求每个子组的根使用子程序"MPI_BCAST"与其下属进行一些通信.

我遇到了一个问题:为了表明子组的根,我应该使用子组根与MPI_COMM_WORLD通信器对应的原始等级,还是使用新通信器表示的新等级?

以下面的代码片段为例,我想要P:0将数据发送到它的下属P:1,P:2和P:3,同样地,我要求P:4将其数据发送到P: 5,P:6,P:7.为了达到这个目标,我想知道我是否应该将第36行中的第四个参数指定为1,或者将它们分别指定为0和4,条件是我指的是哪个子组的头?

谢谢.背风处

1  program main
2    include 'mpif.h'
3    integer :: ierr, irank, num_procs, base_group
4    integer :: nrow, ncol, irow, icol
5    integer :: dummy_group, dummy_comm, new_comm, new_rank
6    integer :: i, j, roster(4), data(4)
7    
8    call MPI_Init ( ierr )
9    call MPI_COMM_RANK( MPI_comm_world, irank, ierr )
10   call MPI_COMM_SIZE( MPI_comm_world, num_procs, ierr)
11   call MPI_COMM_GROUP( MPI_comm_world, base_group, ierr)
12   nrow = 4
13   ncol = 2
14   irow = mod( irank, nrow ) …
Run Code Online (Sandbox Code Playgroud)

parallel-processing fortran mpi fortran90

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

在Fortran中混合整数类型

我有一个代码,我在几个不同的集群上运行,它们都有不同的MPI和LAPACK组合.

这可能会导致问题.例如,我目前使用ifort的"-i8"选项,它可以正常使用LAPACK,但现在所有的MPI调用都被破坏了,因为它期望integer(4),而不是integer(8).

是否有一种优雅灵活的方式来根据本地MPI和LAPACK安装来调整整数类型?

硬编码每个特定呼叫的类型似乎只是非常麻烦和不灵活.

fortran fortran90

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