获取一个列表的第i个排列组合
我需要一个fortran代码来计算给定列表{1,2,3,...,n}的ITH置换,而无需计算所有排列,即n!. 有人可以帮助我吗?预先感谢您. 解决方案 对于大数字,以下实现保留了溢出错误. ! Fattoriale RECURSIVE FUNCTION factorial(n) RESULT(n_factorial) IMPLICIT NONE REAL, INTENT(IN) :: n REAL :: n_factorial IF(n>0) THEN n_factorial=n*factorial(n-1) ELSE n_factorial=1 ENDIF ENDFUNCTION factorial ! ith-permutazione di una lista
0 2023-05-25
编程技术问答社区
在Fortran-90中把参数作为参数传递?
假设我有一个子例程: subroutine foo(x, Nx) implicit none integer, intent(IN) :: x integer, intent(IN) :: Nx select case(x) case (1) write(*,*) "Minimum value" case (Nx) write(*,*) "Maximum value" case default write(*,*) "Somewhere in-between" end select end subroutine foo 假设我的驾驶员看起来像这样: program main implicit none interface subroutine foo(x,Nx)
0 2023-05-19
编程技术问答社区
作为函数参数的数组内类型数组
我有以下程序 program foo type bar real, dimension(2) :: vector end type type(bar), dimension(3) :: bararray call doSomething(bararray%vector) end program subroutine doSomething(v) real, dimension(3,2), intent(inout) :: v ... end subroutine 现在这给了我汇编错误. Error: Two or more part references with nonzero rank must not be specified at (1) 如果我将呼叫更改为 call doSomething((/bararray%vector(1), bararray%vector(2)/)) 一切都很好.问题是这似乎有点麻烦,所以
2 2023-05-19
编程技术问答社区
继承其他数组的大小的简明符号?
在我的代码中,我有一个子例程,该子例程将第5级数组作为参数,并使用局部变量,该变量是共享前4个索引的第4等级数组. 我正在尝试找到一种更简洁的方式来表达 中的大小声明 subroutine mysub(momentum) complex, intent(in) :: momentum(:,:,:,:,:) complex :: prefactor( & & size(momentum,1), size(momentum,2), size(momentum,4) & & size(momentum,5) ) ... end subroutine mysub 大小声明的详细性会损害可读性,尤其是当可变名称甚至比这里更长时. 如果这是八度/matlab,我将通过写作prefactor预先分配 prefactor = zeros(size(momentum)([1 2 4 5])) Fortran 90是否支持类似简洁的东西?我知
4 2023-05-19
编程技术问答社区
关于OpenMP线程执行和threadprivate变量的问题
我使用了8个线程进行8个循环.我使用"打印"来查看并行代码的工作原理. 0线程会产生问题!我已经在附件图中显示了(请检查下面的附件链接)并行的工作方式.我已经使用了螺纹驱动器,但事实证明,线程0无法获得任何私有螺纹保护变量. 我也尝试了模块,并获得了相同的结果! 知道为什么代码以这种方式行事吗?感谢任何帮助或建议.谢谢! !$OMP PARALLEL DO do nb=m3+1, m3a, 2 60 icall=nb 65 iad=idint(a(icall)) if(iad.eq.0) goto 100 call ford(a(iad),servo) if(.not.dflag) goto 80 atemp=dble(nemc) nemc=iad a(icall)=a(iad+6) a(iad+6) = atemp dflag=.false. goto 65 80 icall=
8 2023-05-19
编程技术问答社区
无法实现MPI_Intercomm_create
我正在尝试在2个Inter Communicator之间的fortran中实现MPI_intercomm,一个是一个具有第一个2个进程,另一个具有其余部分. 我需要执行新创建的通讯器之间的recv操作. 代码: program hello include 'mpif.h' integer tag,ierr,rank,numtasks,color,new_comm,inter1,inter2 tag = 22 call MPI_Init(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD,numtasks,ierr) if (rank
6 2023-05-19
编程技术问答社区
对一个二维数组进行逐列划分,并使用allgather
我有一个Fortran MPI代码,其中在2D数组的每个元素上都调用计算密集型功能.我正在尝试将任务分开.例如,如果有30列和10个排名,则每个等级都会获得3列.以下代码可以进行此拆分,并使用Allgather收集结果.但是最终数组并没有所有等级的值. program allgather include 'mpif.h' !create a 2 x 30 myarray integer :: x=2,y=30 integer :: numprocs,myid integer :: i,j,k,myelements,mycolumns,jb,je integer*4,dimension(:),allocatable :: displacement,recvcnt real :: checksum real,dimension(:,:),allocatable :: myarr,combinedarr
0 2023-05-19
编程技术问答社区
在Fortran 90中使用MPI_Send/Recv来处理多维数组的块状物
我必须发送和接收(mpi)在fortran 90中的多维阵列. MPI_Send(x(2:5,6:8,1),12,MPI_Real,....) 不应该使用Gropp,Lusk和Skjellum的"使用MPI ..."一书.做这个的最好方式是什么?我是否必须创建一个临时数组并发送或使用MPI_Type_Create_Subarray或类似的东西? 解决方案 不使用MPI_SEND数组部分的原因是编译器必须使用一些 MPI实现的临时副本.这是由于以下事实:Fortran只能将数组部分正确地传递给具有显式接口的子例程,并且在所有其他情况下,通常都必须在调用子例程的堆栈中生成临时的"扁平"副本.不幸的是,在TR 29113扩展到F2008之前的Fortran中,没有办法声明采用可变类型参数和MPI实现的子例程,通常诉诸于语言黑客,例如MPI_Send完全在C中实现,并且依赖Fortran总是将数据传递为指针. 一些MPI库通过生成MPI_SEND>的大量过载: 来解决此问题
2 2023-05-19
编程技术问答社区
用于因变量的OpenMP
这是我第一次使用OpenMP,然后将其应用于Fortran.我碰巧在调整循环时遇到了一个问题,其中有一个需要从其上一个值进行更新的变量.我尝试使用PRIVATE子句,但结果远非由串行计算产生的结果(没有OpenMP). 我在是否有其他方法可以在诸如案例中以获取最大速度的方法? 使用ORDERED选项代码. !$OMP PARALLEL DO ORDERED PRIVATE(i,j) do i = ca,cb incre(i) = 0.0d0 value = 17.0d0*li(i) do j = cx,cy qx = hi(i) - hj(j) mij = dsqrt(qx) if( mij
0 2023-05-19
编程技术问答社区
在OpenCL与Fortran(CLFORTRAN)中把两个选项作为参数传递。
当我的主机程序使用C语言时,我可以将两个选项作为OPENCL函数的参数.例如,我可以通过两个 clCreateBuffer函数的标志: clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(main_data), main_data, &err) 但是,当我尝试在用fortran编写的主机程序中执行相同的操作: main_data=clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, & sizeof(main_data), C_NULL_PTR, err) 我有一个错误: & |CL_MEM_COPY_HOST_PTR, size_in_bytes,C_NULL_PTR,
2 2023-05-19
编程技术问答社区
OpenMP私有数组-分割故障: 11
当我尝试通过OpenMP在Fortran90中并行化程序时,我会收到一个分段错误错误. !$OMP PARALLEL DO NUM_THREADS(4) & !$OMP PRIVATE(numstrain, i) do irep = 1, nrep do i=1, 10 PRINT *, numstrain(i) end do end do !$OMP END PARALLEL DO 我发现,如果我评论"打印 *,numstrain(i)"或删除OpenMP标志,则其工作起作用而不会出错.我认为这是因为当我并行访问数字(i)时,内存访问冲突就会发生.我已经声明了我,并将数字为私人变量.有人可以给我一些知道为什么是这种情况吗?太感谢了. :) 更新: 我修改了上一个版本,此版本可以打印出正确的结果. integer, allocatable :: numstrain(
0 2023-05-19
编程技术问答社区
用FORTRAN覆盖一个文件
我正在使用写文件的Fortran 90程序.该文件的第一行应该指示其余文件中的行数.当满足特定标准并且无法事先确定时,该文件是由程序编写的.基本上,我只有在运行结束后才知道线的总数. 我想以以下方式进行: 1)打开文件,并用一些文字写第一行," hello " 2)根据需要在文件中写下行,并保留 counter 行. 3)运行结束并在关闭文件之前,将第一行字符串(" hello ")用 Counter . 问题是在步骤3中.我不知道如何替换第一行. 我能想到的另一个选项是写入2个文件.首先,在没有计数器的情况下写下文件.运行结束后,关闭文件并写另一个文件,这次我知道计数器的值. 我相信有一种方法可以进行第一种方法.有人可以帮我吗? 解决方案 回到顺序访问文件上是棘手的,因为行的长度可能会有所不同.而且,如果您更改一行的长度,则必须将所有内容移动到后面. 我建议在计算行数时将您的输出写入刮擦文件.然后,完成后,倒入刮擦文件,将行数写入输出
6 2023-05-15
编程技术问答社区
在Fortran中没有将标量参数提升到数组中去
为什么fortran会在表达式中将标量表达提升为阵列,而不是作为程序的参数?特别是,为什么标准机构做出了这个设计决定?这完全是由于歧义,该过程是否应该超载?在这种情况下,错误消息可以是一种替代方法吗? 例如,在下面的代码中,最后一个语句x = foo(7)产生gfortran错误:Error: Rank mismatch in argument 'a' at (1) (1 and 0). module m public :: foo contains function foo(a) result(b) integer, dimension(:) :: a integer, dimension(size(a)) :: b b = a+1 end function foo end module m program p use m integer, dimension(4) :: x integer, p
0 2023-05-15
编程技术问答社区
用Fortran重载函数
在Fortran 90中,我们可以通过接口超载功能.但是,根据这个网站,我们无法用相同的参数名称定义这些函数.对于GFORTRAN,这似乎不是一个问题,因为以下代码效果很好: interface check module procedure check_int, check_real end interface contains subroutine check_int(cur, dname, func_name, fname) integer, allocatable, intent(in) :: cur(:) character(*) :: dname, func_name, fname ... end subroutine subroutine check_real(cur, dname, func_name, fname) real, allocatable, intent(in) :: cur(:) character(*) :: dnam
0 2023-05-15
编程技术问答社区
解释一下Fortran的写入格式
我是Fortran90的初学者.现在,我正在尝试学习fortran代码,但我对写作格式的描述 尚不清楚 写( *,'(2x,i4,2x,g14.6,2x,14x,2x,g14.6)')0,unew_norm,错误 任何人都可以向我解释'(2x,i4,2x,g14.6,2x,14x,2x,g14.6)'东西的意思. 教我虚拟的东西真是太好了. 最佳 解决方案 来自此 nX表示n空格被添加到线上; iw表示整数(因此i)在宽度w宽度上打印; gw.p是浮点数号(即不是整数)的指定器,并且更复杂. g意味着我们将以标准的浮点格式(即100.123)或E格式(1.00123e+03)输出,以更紧凑. w意味着我们的数字必须适合宽度w,就像整数一样. p指示我们在输出中需要多少精度,或小数点之后的数字数量. 在您的情况下,格式指定器'(2x,i4,2x,g14.6,2x,14x,2x,g14.6)'表示2个空间,具有宽度4、2个空间的整数,宽度14和精度6、
0 2023-05-15
编程技术问答社区
Fortran:在文件中增加一列(即跳过不同数量的水平空间)。
我是福特兰(F90)的血腥初学者(F90),一些显然很容易的问题会引起严重的头痛...感谢您帮助我解决这个问题: 我的代码通过循环运行,处理数据并将其写入文件中.我想将这些数据写在同一文件的列中,直到循环完成为止. OPEN (unit=11,file=filename // '.csv') WRITE(11,'(i4,A1,f10.6)') NUM4 , tab, NUMfloat10_6 CLOSE(11) 此代码可用于保存单个数据集. " TAB"定义为char(9);文件名是由用户在脚本开头指定的. 在循环模式中,我想将另一个选项卡添加为" A1"和另一个NumFloar10_6(" F10.6").但是,我不能这样的事情: OPEN (unit=11,file=filename // '.csv') WRITE(11,'(Tk,i4,A1,f10.6)') NUM4 , tab, NUMfloat10_6 CLOSE(11) 用k定义为整数,随着
0 2023-05-15
编程技术问答社区
对于三位数的指数,Fortran将输出中的'E'删除。
我只是从Python来到Fortran90,老实说,到目前为止,最困难的部分一直习惯于编写输出的格式代码.我遇到了一个格式问题,我似乎无法谷歌或摆脱困境,我已经搜索了这个网站以寻求答案,但没有找到任何有用的东西. 我正在进行计算并将输出写入文件.我正在使用以下代码格式化计算结果 写(file,('13es11.2)')kappa 某些值很小,因此我最终有三位数的负值.所以应该像这样的东西, 10e-100 ,但是我将其放在输出文件中 10-100 这对我没有帮助,因为我还有另一个需要读取该文件并了解这些数字是指数的程序. 我感谢任何人的帮助. 解决方案 尝试ES11.2E3的格式规范.这允许指数的三个位置(始终). 对格式化的输入和输出有强烈的"固定柱宽度"的味道.没有指数字段宽度规范,"默认"宽度为两个.如果指数零件需要比这更多的位置,则E借入E的列至少可以允许输出继续而不会丢失信息.如果指数输出需要比默认值多两个,则您会看
2 2023-05-15
编程技术问答社区
用Fortran 90编写动态数组
我的数组具有动态维度(dimx,dim),我需要一种通过Write指令在文件中写入此类数组的方法,问题是到目前为止我还没有以自动方式产生此类文件,我的意思是直到现在,我必须手工更改Write指令中数组的维度,我需要一种根据尺寸dimx和dim更改维数的方式在途中: integer :: dimx, dim complex, allocatable :: matA(:,:), vectB(:) allocate(matA(dimx,dimx), vectB(dim)) write(1,'(**dimx** e16.6) matA write(2,'(**dim** e16.6) vecB 有办法做到这一点吗? 解决方案 I/O语句中格式指定符上的重复计数不一定是数据列表中数组的尺寸.几个不同的数据项与单个重复格式指定符相对应: 是完全合法的. write(unit,'(3f5.1)') x,y,z 或用于对应几种不同格式指定符的数组: r
2 2023-05-15
编程技术问答社区
如何摆脱Fortran打印输出中不需要的间隔?
这看起来像是一个琐碎的问题,但是我找不到通过谷歌搜索找到任何答案.我有一个小程序: Program Test_spacing_print Integer:: N Real:: A,B N=4; A=1.0; B=100.0 print*,'N =',N print*,'A =',A,' B =',B print '(2(A3,F8.2,1X))' ,'A =',A,' B =',B print 20, A,B 20 format('A =',F8.2,x,'B =',F8.2) End Program Test_spacing_print 给我输出: N = 4 A = 1.00000000 B = 100.000000 A = 1.00 B 100.00 A = 1.00 B = 100.00 我想摆脱我在=标志之后得到的不需要的空间,即我的所需输出应该看起
0 2023-05-15
编程技术问答社区
FORTRAN 90如何编写不同长度的超长输出行
我花了几个小时来搜寻互联网以解决此问题,找不到任何东西.我一直在尝试将无形式的输出写入CSV输出文件,其中有多个长度的长行和多个数据类型.我试图首先编写一个长标头,以指示下面写的变量,并由逗号隔开.然后,在下面的线上,我正在编写标题中指定的值.但是,通过顺序访问,长输出线被分成多个较短的线,这不是我所希望的.我尝试在开放语句中使用RECL来控制线长度,但这仅在输出后仍然添加了一堆垃圾文本和符号,但仍出现相同的问题.我还尝试使用直接访问,但线路的长度不相同,因此也行不通.我已经阅读了有关在Fortran2003中使用流I/O的信息,但是我正在使用Fortran90,因此也无法使用.我正在使用使用FTN95编译器的柏拉图IDE使用Fortran 90.我使用了一个类似于下面的示例程序,使用数组和一些虚拟文本,并且在下面包括了说明问题的输出.有人知道我如何每条写声明只能一行吗?任何帮助将不胜感激. module types integer, parameter :: dp=selec
0 2023-05-15
编程技术问答社区