我有一个C语言的函数。我想从Fortran调用这个函数。此函数包含指针传递的2个结构。如何在Fortran中执行此操作
例:
在C中:
我如何从Fortran中调用它?这里,a是输入结构,b是输出结构。我能够用Fortran填充结构,但它们在传递后无法维护任何数据
如何在Fortran中调用fun(*a,*b)?答案取决于您使用的Fortran版本。例如,在gnu中,您可以使用函数获取地址。如果您使用的是最新版本的Fortran,那么应该支持结构或记录,允许您直接调用C。
如果您使用的是Fort
我有一个程序,它循环一个变量,并在每一步计算一个值:
program cpout
implicit none
!declarations
integer, parameter :: dp = selected_real_kind(15)
! kind value for double precision
real(dp), parameter :: Ru = 8.314472_dp
real(dp) :: cp
我正在尝试用Fortran读取一个文件cs251_1.dat,然后尝试使用cs251_1.dat中的数据创建一个新文件。文件cs251_1.dat是由另一个Fortran程序编写的,该文件中的数据是两个空格,后跟一个三位数,后跟两个空格,一行上总共有四个数字。但是,我得到了以下错误
C:\Users\Cornelius\Documents\~Source5.f:3:
open(5, File = 'C:cs251_1.dat')
1
C:\Users\Cornelius\Documen
此程序在MacOSX Lion和ifort(ifort)12.1.0 20111011上因非法指令:4而崩溃
program foo
real, pointer :: a(:,:), b(:,:)
allocate(a(5400, 5400))
allocate(b(5400, 3600))
a=1.0
b(:, 1:3600) = a(:, 1:3600)
print *, a
print *, b
我有一个包含整数记录的输入文本文件,如:
1
在Fortran代码中读取为:
read(iunit,'(i4)') int_var
这在Gfortran上运行良好,但使用PGI Fortran编译器编译的同一代码需要4个字符宽的字段(实际记录只有1个字符),并抛出错误。现在我知道格式指定了宽度,根据Fortran标准,这可能是正确的行为,也可能不是正确的行为,但我的问题是-PGI是否有一个编译器选项可以让它在这方面表现得像Gfortran?
我使用的这个第三方代码有很多(数百或数千)这样的读
好的,这里有个新问题
我正试图在Ubuntu上使用gfortran编译一个netCDF示例程序,我一定在做一些非常愚蠢的事情;我没有太多编译Fortran的经验
首先,我安装了软件包,其中包括如下文件
/usr/lib/libnetcdf.a
/usr/lib/libnetcdff.a
/usr/include/netcdf.mod
因此,我尝试使用(各种命令,如)编译代码
我得到以下输出
/tmp/ccE6g7sr.o: In function `check.1847':
simple_xy
关注代码的并行部分,下面给出的选项中哪一个是首选的?有更好的解决办法吗?我试图对do\u something
备选方案1:使用关键技术
resultado%uno = 0.d0
!$OMP PARALLEL DO shared(large) private(i_omp) schedule(static,1)
do i_omp=1, nthreads
call do_something(large, resultadoOmp(i_omp))
!$OMP CRITIC
标签: Fortran
fortran-iso-c-bindingmetis
两个多星期以来,我一直在努力从我的fortran代码中调用一个用C编写的库。不幸的是,没有你的帮助,这似乎不是一个愉快的结局。我找到了一些关于和的帖子。我更喜欢后者,因为我可以监视变量进行调试。我附上了三个代码。
一,。c函数我想用2。fortran接口模块3。fortran程序
(1) c函数
int METIS_PartMeshNodal(idx_t *ne, idx_t *nn, idx_t *eptr, idx_t *eind,
idx_t *vwgt, idx_t *vs
如何定义第一列为整数变量,第二列为字符串变量的数组
例如:
数组mELF理想情况下在第一列和第三列中包含数字,在第三列中包含字符串。我让它只处理整数,但现在我想混合不同类型的变量。可能吗
INTEGER, save :: mELF(11000, 11000, 11000)
DATA mELF/11000*11000*11000*0/
不,在FORTRAN77或该语言的任何最新版本中,不可能混合数组的元素类型。在一个数组中,所有元素必须是同一类型(和种类)
在现代Fortran、ie 9
我正在用FFTW来处理正弦的简单导数。乍一看似乎还可以,但与精确解相比,有一个相当大的误差(5e-6)。。。
我确实看到,在使用c2r之后,复杂的输入都是乱七八糟的,但在我看来,相同的复杂输入是我问题的原因。。。我做错了什么?我没有使用任何指针,并试图让一切尽可能简单;我还是不知道怎么了。
感谢您的帮助!谢谢
program main
! C binding
use, intrinsic :: iso_c_binding
implicit none
double precision, para
我从一篇论文中复制了一个FORTRAN IV程序,所以它大概在编写时起作用。我用gfortran编译了它。运行时,它在集成子例程中暂停。我尝试过减少残留量,但没有效果。我请求帮助是因为假定gfortran代码中没有错误可能不喜欢古老的66/IV代码,更新它超出了我的能力
程序被第9行卡住了,所以我想知道是DO循环造成的。注意,第1行和第6行对我来说是不寻常的,因为“1”已添加到末尾:例如=1,N,1
我认为没有必要显示在第5行调用的FUNC子例程,但如果必要,我很乐意提供它
如果您需要更详细的信
我有一个非常旧的程序,我想在我的64位计算机上运行。有很多折旧的报表。在调试过程中,我发现很多变量变为NaN或无穷大。。。因此,我将变量的长度从4字节改为8字节(即从实数改为实数*8),但现在两台计算机上的计算和结果相差很大。有人能解释一下,如果我使用更长的类型,这是否真的很重要,为什么在32位计算机上一切正常,但在64位计算机上,我得到无穷大和NaN值
另外,我使用gfortran编译器和-fbackslash-ffix-line-length-0-std=legacy-g-O0-fno-in
我开始使用MPI-IO,并尝试编写一个非常简单的示例,说明我想用它做的事情;然而,尽管这是一个简单的代码,并且我从这里和那里阅读的示例中获得了一些灵感,但我还是发现了一个我不理解的分段错误
这段代码的逻辑非常简单:每个线程将处理一个本地数组,它是我要编写的globlal数组的一部分。我使用MPI\u type\u create\u subarray来创建子数组类型。然后我打开文件,设置一个视图并尝试写入数据。我在MPI\u文件\u Write\u All期间遇到分段错误
代码如下:
progra
例如,此代码:
program sandbox
implicit none
real, dimension(2, 2) :: p
p = reshape((/ 1, 3, 2, 4 /), shape(p))
print *, spread(P, 2, 2)
end program sandbox
返回此数组:
1 1 2 2
3 3 4 4
但我正试图让它归还这个“
使用spread,这可能吗?实际上,它需要推广,因为我可能会生成如下矩阵
1 2 1 2
标签: Fortran
gfortranintel-fortranderived-types
Fortran内部函数transfer可用于将派生类型转换为实数或整数数组。在依赖基元类型(整数、实数等)数组进行持久化的遗留系统中工作时,这可能非常有用
下面的代码至少在ifort和gfortran上运行,并将简单的派生类型示例转换为整数数组(使用解决方案更新)):
在我的电脑上,这是输出(此结果至少取决于平台):
我的问题是,我“猜测”了一个30个元素的整数数组足够大,可以存储这个数据结构。是否有一种方法可以确定数组需要多大才能存储整个数据结构?如果您有一个符合Fortran 2008的编译
我使用的代码运行一个循环并积累一些平均值。在某个特定的时刻,我想发送这个平均值,并在所有奴隶身上接收它。这应该只做一次。乍一看,我认为这应该很容易做到。因此,我使用了一个内部变量(循环计数)来执行以下操作
! on the master
if( i == 55 )
do mt = 1, tasks
call MPI_SEND(A,size,MPI_DOUBLE_PRECISION,mt,5,MPI_COMM_WORLD,status,ierror)
end do
! on the slave
我用Fortran 90编写了以下子程序:
subroutine foo(bar)
use spam ! dimension n is defined in the module spam
implicit none
real*8 bar(n)
....
end subroutine foo
由于数组维度n是在模块spam中定义的,因此我在编译C包装函数(由f2py生成)的过程中遇到了错误,如
因为C包装函数没有任何对spam或n的引用
解决这个问题的办法应该是什么
我目
我是Fortran 90和堆栈溢出的新手,我有一个简单的问题(我想)。
我有一个名为Eq1的文件,其中包含以下Fortran数学表达式:
x**2
目标是从文件中输入此表达式,并在fortran内部的函数中使用它。我试过以下方法
REAL FUNCTION f(x)
IMPLICIT NONE
REAL (kind =8), INTENT(IN) :: x
open(1,file = 'Eq1',status='old')
read(1,*) f
我使用的是派生类型(双复数)和赋值运算符(=)的重载,因此可以将real*8赋值给bicomplex。bicplx模块的MWE如下所示:
MODULE bicplx
type bicomplex
COMPLEX*16 :: a
COMPLEX*16 :: b
end type
interface assignment(=)
module procedure dble_assign_bicplx
end interface
contains
su
如何在linux中为Sublime text 3安装Minimal Fortran?
我也在windows中为sublime尝试了这段代码,效果很好,但在linux中不起作用
import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = subli
在我的程序中,我想创建一个容器类型,其中包含某个派生类型的数组。我想为容器添加类型绑定过程,该过程调用数组所有组件上的过程。由于数组的大小不同,我尝试使用自动重新分配功能。我遇到了可分配字符的问题
下面是一个小片段,显示了设置:
module realloc_test
我不熟悉用Fortran编程。如果能在这个问题上得到任何帮助,我将不胜感激。我需要将do循环中的一个值从循环发生的子程序转移到主程序中。。大概是这样的:
program wet
implicit none
real(8) sulstar, u1, u2, theta1, theta2, q1, q2, tol
real(8) sblstar, surstar, sbrstar
open(3,file="theta1.txt",status="unknown")
tol=1
call r
我有以下代码:
program main
character (len=15) :: abc = "te st tex t"
print *, trim(abc)
end program main
哪些产出:
te st tex t
我希望所有的空格都能被删除,但事实并非如此。如何删除字符串中的所有空白> Primm只删除边缘,而不是中间(这是几乎所有语言/库中常见的行为)。如果要删除字符串中的所有空格,则必须创建自己的函数来执行此操作,遍历字符
标签: Fortran
preprocessorreal-datatype
我试图理解用fortran编写的部分代码。该代码包含以下部分:
REAL(KIND=8), DIMENSION(x,y), INTENT(INOUT) :: AR
_REAL_, DIMENSION(x,y), INTENT(INOUT) :: BR
从中,我了解到\u REAL\u是一个用于精度控制的预处理器
\u REAL\u在这段代码中实际做了什么
AR值是否可以分配给BR?它们之间是否存在类型不兼容问题
我试图使用C函数将AR的值赋值给BR,extern“C”voi
如何在Code::Blocks中使用gfortran中的IMSL库?
在建立它们之后,我的程序出现了问题。
建造后的信息是:
对“linrg_2;”的未定义引用
我的代码是:
Program Fitovanje_krive
Implicit none
integer::i,j,k,n
Integer,parameter::iBrTac=24
Integer,allocatable::vreme(:),potrosnja(:)
Real,allocatable::X(:,:),Y(:,:),
我已经看到并使用了个人代码中使用的Fortran名称列表文件的文件扩展名.in。我还看到了Fortran语言文档中使用.DAT扩展名的几个实例。现在我正在开发一个商业代码,它将生成并使用自己的名称列表文件,我想知道Fortran名称列表文件名是否有约定。如果是,什么?不,对于包含Fortran名称列表的文件,没有公认的广泛使用的命名约定。你可以自由选择自己的——明智地利用你的自由
我更进一步,名字列表本身在Fortran ville中似乎既没有广泛使用,也没有很好的建立。没有这样的标准。即使是广
我知道可以使用ifort命令从CMD在IVF中编译。但是,该命令仅编译,在编译完成后不运行可执行文件。.exe需要手动按顺序运行
ifort驱动程序中是否有自动编译和运行.exe的选项
提前感谢。我不知道有任何编译器选项可以运行代码。但是(如上所述),您可以使用各种脚本方法来实现您的目标。在我看来,最简单的方法是在编译调用之后用&&调用可执行文件。例如:
> ifort hello.f && ./a.out
> Hello world!
如果编译器命令返回成功,则
我试图用拉帕克的zheevd来对复厄米矩阵进行对角化。我已经写了一个小例子,它不会产生任何编译或运行时错误,但给出了错误的特征值结果。。。代码如下:
program test
implicit none
INTEGER, PARAMETER :: N=4
INTEGER, PARAMETER :: LDA = N
INTEGER, PARAMETER :: LWMAX = 1000
INTEGER :: INFO, LWORK, LIWORK, LRWORK,i,
我写了这个,但当我尝试构建*.exe时,我会说:
Compiling Fortran...
C:\Users\LORD\Desktop\TText1.f90
C:\Users\LORD\Desktop\TText1.f90(197): error FOR3309: undefined label 124
Error executing fl32.exe.
这是该项目的源代码:
program one
real::x(6),f(6),deltaf1(6),deltaf2(6
我想检查计算机计算一个函数需要多少时间。为此,我想比较调用我的函数前后cpu_time子例程给出的值。令我惊讶的是,前后的值是相同的,就好像执行该函数花费了零时间一样。为了检查它,我创建了一段简单的代码
call cpu_time(time)
write(*,*) time
do i=1,10000
!simple math equation here
end do
call cpu_time(time)
write(*,*) time
运行程序后,循环前后打印的值完全相同。我的猜测是,系统
上下文:我打算对某个Fortran子例程进行一些测试,看看它有什么问题。这是一个数值模拟,结果与理论不符。我使用write语句进行一些简单的调试
问题:在我的主例程中打开一个文件时,我似乎无法向屏幕写入任何内容(因此我无法检查哪些内容被错误地传递到某个子例程链等)。当我在打开文件之前这样做时,它写得很好,但不是在文件内部(打开和关闭文件之后)
以下是我指的代码:
WRITE(*,*) 'BLA !<---------------------------------------
WRITE(
标签: Fortran
fortran90gfortranfortran95
我在调用子程序时遇到一些问题。首先,是否允许我在IF语句中调用子例程
IF (...) THEN
...
ELSE
CALL sub1(...)
END IF
第二个问题。Sub1在其自身中调用sub2。然后sub2有一个来自主程序的输入,比如说x
MODULE mod1
...
CONTAINS
SUBROUTINE sub1(w)
IMPLICIT NONE
INTENT(OUT) :: w
REAL :: x, z
CALL sub2
我是Fortran新手,不懂这句话:
write(*,'(a35)', advance='no')
在:
我已经编译了这段代码,它可以工作了。但是我还是不明白。advance='no'意味着write语句在完成编写后不会前进到下一条记录(下一行)
看
以及其他相关的问题和答案。您到底混淆了哪一行?您从整个程序中提供了许多行代码。write(*,“(a35)”,advance='no')@Durga您的编辑破坏了代码,因此不应获得批准。如果您不知道自己在做什么,请不要更改Fortran代码中
A是一个N乘N的矩阵。I是N-2乘以N-2的单位矩阵。B是另一个N×N矩阵,定义为
B=[I 0 0;
0 0 0;
0 0 0]
。x是一个包含N个元素的数组。我怎样才能解出下列形式的特征值
A x=cB x,其中c是特征值,
通过使用特征值解算器?您可以查看该库,它为广义矩阵的特征值问题提供了解决方案。根据您的数据类型和矩阵类型,您需要使用不同的子例程。
看看这方面。还可以查看用作矩阵类型的术语
最后,前一段时间我写了一篇文章,给出了一些Lapack功能
当我使用gfortran test.f95运行此程序时,它显示一个错误
At line 10 of file test.f95 (unit = 15, file = 'open.dat')
Fortran runtime error: End of file
有人能告诉我这里怎么了吗
implicit none
integer:: a,b,c,ios
open(unit=15,file="open.dat",status='unknown', action='readwrite',iost
标签: Fortran
gfortranflushcarriage-return
我一直想知道是否可以用Fortran回车并刷新write语句。在Python/C++中,您可以'/r'然后刷新流
如何在Fortran中执行此操作?默认情况下,在write语句末尾插入回车符,或显式使用高级说明符:
write(unit , '(A)') 'Hello World'
write(unit , '(A)' , ADVANCE = 'YES') 'Hello World'
write(unit , '(A)' , ADVANCE = 'YES') '-'
上述三种说法的结果是:
H
我知道在Fortran 90中,大于的符号(例如)已从.gt.更改为。对于其他逻辑表达式,如和。和或。,也是这样吗?这些符号是否也有对应的符号表达?不,没有这样的符号,我也没有注意到任何人在阅读你的问题之前对这些符号有任何兴趣或需要。因此,没有,Fortran 90中没有,Fortran 2018中也没有,也没有未来Fortran AFAIK的计划。对于I fort,有==和/=但许多人会以“非标准”作为反驳
我经常使用它们。注意,令牌.gt.没有更改。引入了另一个表格。==和/=是标准的。这些
我很惊讶,您不能像这样将数组成员作为do循环的控制变量:
program test
integer, dimension(2) :: i
do i(1) = 1, 3
do i(2) = 1, 3
! anything here
write(*, *) i
end do
end do
end program
program test
integer, dimension(2) :: i
associa
我想知道是否有一种优雅的方法可以避免在选择类型构造中重复应用于不同类型的代码块。例如,考虑:
select type (var)
type is (t1_t)
codeA (many lines of code)
type is (t2_t)
codeA (same lines)
...
type is (tn_t)
codeB
class default
codeC
end select
与select-case构造不同,
我正在写一个fortran代码,它的工作精度很高。在这里,我试图使用ISO_FORTRAN_ENV来实现这一点。我发现如果我减去两个小数字,我得到的答案将是零。但如果我加上它们就好了
这是我的节目:
program test
USE ISO_FORTRAN_ENV, ONLY : REAL32
IMPLICIT NONE
REAL(REAL32), PARAMETER :: RE_L=-1.7499576837060936950743114606, &
我想通过使用文件名格式化系统在循环中读取Fortran中的多个文件。问题是文件名中的数字彼此不直接跟随。文件名的示例有4e3_2048_380_40_3e9.ksz_cl.txt、4e3_2048_200_80_2e8.ksz_cl.txt。文件名中的第三、第四和第五个数字构成一个3x3网格。第一个数字从140到260,第二个数字从40到80,第三个数字从2e8到2e9
我已经在像这样的线程中搜索了答案,但它似乎没有回答我的问题。我下面的代码目前打印出4e3_2048_01.ksz_cl.txt
标签: Fortran
gfortranallocatable-arrayg95
当从使用g95编译器过渡到gfortran时,当我尝试编译以前的工作代码时,会出现以下错误
Error: Allocatable array ' ' at (1) must have a deferred shape
这发生在所有可分配数组的所有子例程中。下面是一个例子
SUBROUTINE TEST(name,ndimn,ntype,nelem,npoin,nface,inpoel,coord,face)
IMPLICIT NONE
integer:: i, j
在Fortran中,参数属性是在运行时还是编译时设置的?
我想知道是否可以在运行时传入数组的大小,并将其设置为参数
这能做到吗?如果是,怎么做?如果没有,原因是什么?参数的值在编译时设置
声明,如
integer, parameter :: number_of_widgets = numwidge
要求numwidge在编译时已知,实际上在声明的rhs上遇到它之前就已知。在编译时设置参数的值
声明,如
integer, parameter :: number_of_widgets = numw
我正在尝试使用FORTRAN 66读取以下指定格式的文件
1000
MS 1 - Join Grps Group Project 5 5
Four Programs Programming 15 9
Quiz 1 Quizzes 10 7
FORTRAN
我使用Fortran来估计主权风险的概率;因此,我编写了我的程序,并以以下形式调用mkl_vsl:
:
:
include 'mkl_vsl.fi'
:
:
USE MKL_VSL_TYPE
USE MKL_VSL
:
:
代码块GNU fortran编译器向我发送错误消息:
||=== Build: Debug in thesis (compiler: GNU Fortran Compiler) ===|
C:\___\___\____\___\___\mod_nonlinear_solve
我用MPI并行化了一个三嵌套循环。当我运行代码时,它失败了,并显示以下错误消息
srun: error: nid00217: tasks 0-31: Killed
srun: Terminating job step 20266620.0
srun: error: nid00218: tasks 32-63: Killed
srun: Force Terminated job step 20266620.0
这是我用来提交作业的脚本
#!/bin/bash
#SBATCH --partitio
我想用FORTRAN的内在函数和数组符号替换下面的do循环
do i=2, n
do j=2, n
a=b(j)-b(j-1)
c(i,j)=a*c(i-1,j)+d(i,j)
end do
end do
然而,由于c(i,j)依赖于c(i-1,j),以下试验均无效。因为它们不更新c(i,j)
这是我能得到的最好的了。但它仍然有一个do循环
do i=2, n
c(i,2:n)=c(i-1,2:n)*(b(2:n)-b(1:n-1))+d(i,2:n)
以下是测试代码:
program testcase
implicit none
integer :: ios, lu
type derived
integer :: a
end type derived
type (derived) :: d
namelist /test/ d
lu = 3
open (lu, file = 'test.dat', status='old', iostat=ios)
r
我想在OpenSUSE Leap 15.0上运行一个程序,我必须先用Fortran90编译器mpif90编译它。很遗憾,我找不到相应发行版的mpif90。有办法安装吗?从软件包存储库中,安装一个MPI实现,例如Open MPI。我自己不使用OpenSUSE,所以我不知道软件包的名称,但我相信如果使用软件包管理器的搜索功能,您会找到它。这将安装编译器包装器,如mpicc、mpifort、mpif90等
编辑:编译器包装可能在-dev或-devel包中。在Ubuntu18.04上,openmpi编译
我有一个用户类型,它包含两个或多个不同大小的数组
type state
real(real64) :: pos(3), ori(4), vee(3), omg(3)
end type
我已经定义了(*)和(+)操作符,以便能够做代数
interface operator (+)
procedure st_add
end interface
interface operator (*)
procedure st_scale1, st_scale2
end inte
1 2 3 4 5 6 ...
下一页 最后一页 共 55 页