英雄我使用的新代码。我已经尝试过这个,如果我先声明 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) 我有两个数组,我想比较它们的大小并将尾随零添加到较短的数组。
例如-对于数组-
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)
我想知道是否有更好的方法来做到这一点,最好是不涉及循环的方法,因为我正在处理的实际问题可能有很大的向量
我使用地球物理模型,常见的情况是需要将 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代码,其执行的多项式插值n+1点R^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)
我遇到数值稳定性问题了吗?还是我做错了什么?
编辑:我附上了插值过程的代码(注意,我们实际上没有n点n+1)。
module InterpolatorModule
contains
subroutine interpolate(n, x, y, …Run Code Online (Sandbox Code Playgroud) 我是一名大学讲师,本学期我将使用 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)
但是,如果我写 …
我有一个简单的函数,它返回一个基于时间字符串的时间对象:
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 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) 我将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) 我有一个代码,我在几个不同的集群上运行,它们都有不同的MPI和LAPACK组合.
这可能会导致问题.例如,我目前使用ifort的"-i8"选项,它可以正常使用LAPACK,但现在所有的MPI调用都被破坏了,因为它期望integer(4),而不是integer(8).
是否有一种优雅灵活的方式来根据本地MPI和LAPACK安装来调整整数类型?
硬编码每个特定呼叫的类型似乎只是非常麻烦和不灵活.