我是使用Fortran编写的程序的研究员。我具有非常基本的编码技能,因此需要一些帮助来使一些代码正确编译。
在显示代码之前,我将提供一些背景知识。我正在处理大量数据,这将需要64位编译和大于2 gb的内存。我在代码中注意到的第一件事是,许多变量被写为“实数”,但是在我的研究中,我发现“双精度”允许更大的变量,并且将是一个更灵活的选择,因此我更改了所有从“真实”变量到“双精度”变量。
fortran构建文件“ dist.f”的编译中还包含一个文件,称为“ geocoord.inc”。我发现变量已保存到一个公共块中,但是再一次,我需要一些可以容纳大量数据的东西。正如我一直相信的那样,模块将是一个更好的程序。在转换此包含文件以使其与模块程序正常工作时,我需要一些建议,我将在下面列出。
Dist.f:
c Convert latitude and longitude to kilometers relative
c to center of coordinates by short distance conversion.
subroutine dist(xlat, xlon, xkm, ykm)
implicit none
c Parameters:
double precision xlat, xlon ! (input)
double precision xkm, ykm ! (output)
c Local variables:
double precision lat1, lat2, lat3
double precision q
double precision xx
double precision yp
include "geocoord.inc"
c Set up short distance conversion by subr. SETORG
q=60*xlat-olat
yp=q+olat
lat1=datan(rlatc*dtan(RAD*yp/60.0))
lat2=datan(rlatc*dtan(RAD*OLAT/60.0))
LAT3=(LAT2+LAT1)/2.
xx=60*xlon-olon ! …Run Code Online (Sandbox Code Playgroud) fortran module double-precision fortran90 fortran-common-block
我对Fortran不熟悉.这是一个包含一些子程序的通用接口.gfortran 4.8抱怨说:
(1)中通用接口'sorti'中的模糊接口'sortic4'和'sortic'
INTERFACE SORTI
SUBROUTINE SORTIC( N, IND, TBLC )
INTEGER , INTENT(IN ) :: N
INTEGER , INTENT(INOUT) :: IND( N )
CHARACTER*(*), INTENT(IN ) :: TBLC( * )
END SUBROUTINE SORTIC
SUBROUTINE SORTIC4( N, IND, TBLC )
INTEGER , INTENT(IN ) :: N
INTEGER , INTENT(INOUT) :: IND( N )
CHARACTER*(*), INTENT(IN ) :: TBLC( * )
END SUBROUTINE SORTIC4
SUBROUTINE SORTIC8( N, IND, TBLC )
INTEGER(8) , INTENT(IN ) :: N
INTEGER(8) , INTENT(INOUT) :: IND( …Run Code Online (Sandbox Code Playgroud) 注意: 任何解决方案或解决此问题的方法都需要在MATLAB中进行,它是出现问题的代码.使fortran与MATLAB匹配是适得其反的,因为这两段代码都不会起作用......我理解差异是因为fortran编译器的方式和MATLAB所做的不同代替编译单个与双精度的解释漂浮,但我希望有人可以帮我提出解决方案来解决这个问题.
我正在调试一些我从Fortran转换成MATLAB的代码,并且遇到了令我难过的东西.在fortran和MATLAB中,我有以下几行
pcnt = 0.9999*(-0.5+z2)
Run Code Online (Sandbox Code Playgroud)
哪里z2 = 0.51482129528868548.我遇到的问题是2.4594e-10在MATLAB中计算的pcnt和在fortran中计算的pcnt 有所不同.我已经确认z2完全相同(即z2_matlab-z2_fortran=0),所以我很难过.real*8在Fortran和MATLAB中,z2和pcnt都是双精度(对于fortran),所以就我而言,它们应该具有完全相同的精度(因为它在同一台机器上运行).
通常情况下我不会关心这个小的差异,但是z2最终会得到一个大数字,然后用于计算一个索引,稍后差异最后是数组索引后差为2,在算法的后期导致巨大的错误(对于最多只有1e7的数字,大约为1e6).
有谁知道为什么会出现这个问题以及某种方法来解决它?我正在MATLAB R2011a上执行这项工作,并使用gfortran编译器在64位MacBook pro上使用I5(我认为的第三代)处理器编译fortran.
如果有人有任何建议请告诉我,因为如果我找不到解决方案,那么过去两周我执行的大约5000行代码的翻译将毫无价值.
此外,任何解决方案都必须是MATLAB代码,因为Fortran代码是当前可用的代码.
提前致谢,
安德鲁
我想学习的Fortran(不幸的是,我的研究小组的必需品) - 我给自己设定了包装的从数字食谱书的必要功能(伴随勒让德多项式)一进一出FORTRAN 03兼容模块的任务之一.原始程序(f77)以下列形式进行了一些错误处理:
if(m.lt.0.or.m.gt.1.or.abs(x).gt.1)pause 'bad arguments in plgndr'
Run Code Online (Sandbox Code Playgroud)
自从f77以来,暂停似乎已被弃用,因为使用此行会给出编译错误,因此我尝试了以下操作:
module sha_helper
implicit none
public :: plgndr, factorial!, ylm
contains
! numerical recipes Associated Legendre Polynomials rewritten for f03
function plgndr(l,m,x) result(res_plgndr)
integer, intent(in) :: l, m
real, intent(in) :: x
real :: res_plgndr, fact, pll, pmm, pmmp1, somx2
integer :: i,ll
if (m.lt.0.or.m.gt.l.or.abs(x).gt.1) then
write (*, *) "bad arguments to plgndr, aborting", m, x
res_plgndr=-10e6 !return a ridiculous value
else
pmm = 1.
if (m.gt.0) then
somx2 = sqrt((1.-x)*(1.+x)) …Run Code Online (Sandbox Code Playgroud) 我有一个旧的Fortran代码用于计算Lyapunov指数,我尝试将其转换为现代Fortran语法.
PROGRAM ODE
integer, PARAMETER :: N=3
integer, PARAMETER :: NN=12
EXTERNAL FCN
DIMENSION Y(NN),ZNORM(N),GSC(N),CUM(N),C(24),W(NN,9)
Y(1) = 10.0
Y(2) = 1.0
Y(3) = 0.0
! INITIAL CONDITIONS FOR LINEAR SYSTEM (ORTHONORMAL FRAME)
DO 10 I = N+1,NN
Y(I) = 0.0
10 CONTINUE
DO 20 I = 1,N
Y((N+1)*I) = 1.0
CUM(I) = 0.0
20 CONTINUE
! INTEGRATION TOLERANCE, # OF INTEGRATION STEPS,
! TIME PER STEP, AND I/O RATE
write (*,*) "TOL, NSTEP, STPSZE, IO ?"
read (*,*) TOL, NSTEP, …Run Code Online (Sandbox Code Playgroud) 我正在转换Fortran中的旧代码,我认为它是77.在以下方式中有几种IF的使用,我无法意识到它的作用:
IF(x1-x2) 12, 13, 14
12 WRITE(*,*) x1
.
.
.
13 y=...
.
.
14 DO x=x1,x2
IF(x-x2) 33, 34, 40
.
.
.
Run Code Online (Sandbox Code Playgroud)
代码符合并运行正常,并产生结果.有没有人遇到IF的这种用法?
我已经在这个网站上看到了几个关于这个问题的帖子.但是,我认为我的严格代码由于创建线程而产生的开销并且所有这些都不应该是一个大问题,现在开放的mp变得慢得多!我正在使用带有gfortran 4.6.3的四核机器作为我的编译器.以下是测试代码的示例.
Program test
use omp_lib
integer*8 i,j,k,l
!$omp parallel
!$omp do
do i = 1,20000
do j = 1, 1000
do k = 1, 1000
l = i
enddo
enddo
enddo
!$omp end do nowait
!$omp end parallel
End program test
Run Code Online (Sandbox Code Playgroud)
如果我在没有打开mp的情况下运行它,此代码大约需要80秒,但是,打开mp,大约需要150秒.我在其他严肃的代码中看到了同样的问题,在串行模式下运行时间约为5分钟左右.在这些代码中,我注意到从线程到线程没有依赖关系.那么为什么这些代码变慢而不是更快?
提前致谢.
我试图检查整数A的一维数组是否包含,在它的每一个大小(A)位置,整数集合S(也是一维数组)的任何元素,一般情况是尺寸(S)> 1.
简单明了的方法是执行以下嵌套循环:
DO i = 1, size(A)
DO j = 1, size(S)
IF(A(i) == S(j)) ** do something **
ENDDO
ENDDO
Run Code Online (Sandbox Code Playgroud)
问题是,对于大型阵列A和S,此过程效率非常低.是否有一个内在的FORTRAN子例程或函数可以更快地执行此操作?还是其他方法?
我试图做以下,但它不想编译:
DO i = 1, NNODES
IF(A(i) == ANY(S)) ** do something **
ENDDO
Run Code Online (Sandbox Code Playgroud)
出现的错误消息如下:" error #6362: The data types of the argument(s) are invalid."我正在使用VS2010和Intel Parallel Studio 2013.
我是Fortran的新手,我想用一个real*8名为的函数编写测试程序NeQuick,所以我编写了以下程序:
program test
implicit real*8 (a-h,o-z)
aNe=NeQuick(400.0D0,45.0D0,15.0D0,10,1.929D2,15.0D0)
write(6,'(A,E12.5,A)')
& ' NeQuick electron density =',aNE,' m^-3'
call sleep(10)
end program
Run Code Online (Sandbox Code Playgroud)
在编译它的最后,我在小程序的每一行中都有以下错误:1中的语句标签中的非数字字符或1处的-Unclassifiable语句
你们能解释一下我的节目有什么问题吗?
我有一段用Fortran和Matlab编写的代码.他们做了完全相同的计算,即
tanh-field并找到它的拉普拉斯算子该乘法的结果产生矩阵,其中(4,4)和(6,6)I减去.
这个问题非常关键,因为我测试这个数字是否小于零. 问题:有没有办法执行计算,以便在Matlab中获得与Fortran相同的精度?
我列出以下代码:
MATLAB
clear all
weights = [4./9, 1./9,1./9,1./9,1./9, 1./36,1./36,1./36,1./36];
dir_x = [ 0, 1, 0, -1, 0, 1, -1, -1, 1];
dir_y = [ 0, 0, 1, 0, -1, 1, 1, -1, -1];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CONSTANTS
length_y = 11; length_x = length_y;
y_center = 5; x_center = y_center;
densityHigh = 1.0;
densityLow = 0.1;
radius = 3.0;
c_width = 1.0;
average_density = 0.5*(densityHigh+densityLow);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for x=1:length_x
for y=1:length_y
for …Run Code Online (Sandbox Code Playgroud)