在fortran 95中,如果您在声明中分配变量
integer :: var = 0
Run Code Online (Sandbox Code Playgroud)
它相当于
integer, save :: var = 0
Run Code Online (Sandbox Code Playgroud)
因此,变量在例行执行后保留(相当于staticC语言),并且在再次调用时不会重新初始化.这种(恕我直言,危险)行为背后的理由/技术问题是什么?
我是matlab的死硬用户,主要是因为这是我第一次学到的东西而且我没有遇到过切换差异很大的问题.我来自数值优化/线性代数,我已经在数百万个自由度中进行了优化和特征值计算.最近,我进入了随机性的境界,我最初的印象是我不得不改变.但是,在优化代码并小心地将种子初始化为随机数生成器之后,我能够在大致相同的时间内完成与同时代相同的蒙特卡罗任务.我的理解是基础级别'if'语句等在matlab中明显变慢.但是,如果在每个循环中有可以进行矢量化的重要计算,我' 我不相信C会更好.而且,无论如何,matlab似乎做得很好,因为我的上限不亚于任何其他专业(在很多情况下,似乎更多).我有一种感觉,我会从这里的亲C人那里得到很多回复,他们很久以前就已经把matlab写成了一些琐碎的玩具语言.我是一名专业研究人员,并认为matlab对于最高级别的计算密集型数学编程具有竞争力.我错了吗 ?我是否需要考虑更改为较低级别的语言,例如C/FORTRAN?为什么或者为什么不 ?有没有像我这样的人?非常感谢!干杯 我有一种感觉,我会从这里的亲C人那里得到很多回复,他们很久以前就已经把matlab写成了一些琐碎的玩具语言.我是一名专业研究人员,并认为matlab对于最高级别的计算密集型数学编程具有竞争力.我错了吗 ?我是否需要考虑更改为较低级别的语言,例如C/FORTRAN?为什么或者为什么不 ?有没有像我这样的人?非常感谢!干杯 我有一种感觉,我会从这里的亲C人那里得到很多回复,他们很久以前就已经把matlab写成了一些琐碎的玩具语言.我是一名专业研究人员,并认为matlab对于最高级别的计算密集型数学编程具有竞争力.我错了吗 ?我是否需要考虑更改为较低级别的语言,例如C/FORTRAN?为什么或者为什么不 ?有没有像我这样的人?非常感谢!干杯
以下代码返回分段错误,因为我尝试传递的可分配数组未被正确识别(大小返回1,应该是3).在这个页面(http://www.eng-tips.com/viewthread.cfm?qid=170599)中,一个类似的例子似乎表明它应该在F95中正常工作; 我的代码文件有.F90扩展名,但我尝试将其更改为F95,我正在使用gfortran进行编译.
我的猜测是问题应该是我将可分配数组传递给子程序的方式; 我究竟做错了什么?
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
PROGRAM test
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
IMPLICIT NONE
DOUBLE PRECISION,ALLOCATABLE :: Array(:,:)
INTEGER :: iii,jjj
ALLOCATE(Array(3,3))
DO iii=1,3
DO jjj=1,3
Array(iii,jjj)=iii+jjj
PRINT*,Array(iii,jjj)
ENDDO
ENDDO
CALL Subtest(Array)
END PROGRAM
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
SUBROUTINE Subtest(Array)
DOUBLE PRECISION,ALLOCATABLE,INTENT(IN) :: Array(:,:)
INTEGER :: iii,jjj
PRINT*,SIZE(Array,1),SIZE(Array,2)
DO iii=1,SIZE(Array,1)
DO jjj=1,SIZE(Array,2)
PRINT*,Array(iii,jjj)
ENDDO
ENDDO
END SUBROUTINE
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%!
Run Code Online (Sandbox Code Playgroud) 主程序:
program main
use omp_lib
use my_module
implicit none
integer, parameter :: nmax = 202000
real(8) :: e_in(nmax) = 0.D0
integer i
call omp_set_num_threads(2)
!$omp parallel default(firstprivate)
!$omp do
do i=1,2
print *, e_in(i)
print *, eTDSE(i)
end do
!$omp end do
!$omp end parallel
end program main
Run Code Online (Sandbox Code Playgroud)
模块:
module my_module
implicit none
integer, parameter, private :: ntmax = 202000
double complex :: eTDSE(ntmax) = (0.D0,0.D0)
!$omp threadprivate(eTDSE)
end module my_module
Run Code Online (Sandbox Code Playgroud)
编译使用:
ifort -openmp main.f90 my_module.f90
Run Code Online (Sandbox Code Playgroud)
它在执行时给出Segmentation故障.如果删除主程序中的一个打印命令,它运行正常.另外如果删除omp函数并在没有-openmp选项的情况下编译,它也运行正常.
我正在修改一些我没有写过的Fortran代码,而且我自己没有很多的经验.我刚刚发现了一些情况,其中一些格式错误的输入被默默地忽略,并且想要更改该代码以做更合适的事情.如果这是C,那么我会做类似的事情
fprintf(stderr, "There was an error of kind foo");
exit(EXIT_FAILURE);
Run Code Online (Sandbox Code Playgroud)
但在fortran中,我知道如何做的最好看起来像
write(*,*) 'There was an error of kind foo'
stop
Run Code Online (Sandbox Code Playgroud)
缺乏输出流(次要问题)和退出状态(主要问题)的选择.
如何终止具有非零退出状态的fortran程序?
如果这是依赖于编译器的,那么与gfortran一起使用的解决方案会很好.
我/* block comment */在C++中看到了块注释.我知道我可以使用!或进行行注释c,但在Fortran中是否有任何块注释选项?
您好,我有用于读取ASCII双精度数据的Fortran代码(问题底部的数据文件示例):
program ReadData
integer :: mx,my,mz
doubleprecision, allocatable, dimension(:,:,:) :: charge
! Open the file 'CHGCAR'
open(11,file='CHGCAR',status='old')
! Get the extent of the 3D system and allocate the 3D array
read(11,*)mx,my,mz
allocate(charge(mx,my,mz) )
! Bulk read the entire block of ASCII data for the system
read(11,*) charge
end program ReadData
Run Code Online (Sandbox Code Playgroud)
和"等效的"C++代码:
#include <fstream>
#include <vector>
using std::ifstream;
using std::vector;
using std::ios;
int main(){
int mx, my, mz;
// Open the file 'CHGCAR'
ifstream InFile('CHGCAR', ios::in);
// Get the extent …Run Code Online (Sandbox Code Playgroud) 我正在钻研Fortran,我遇到了pure关键字,指定了没有副作用的函数/子程序.
我有一本书,S Chapman的Fortran 90/95,它引入了pure关键字,但奇怪的是没有提供"良好的编码实践"用途.
我想知道如何在程序中使用这个关键字.只是环顾四周,对我来说很明显,大多数没有副作用的程序都没有必要包含pure关键字.
那么它最好用在哪里?只有在程序中才能完全保证没有副作用?或者也许在程序中,计划elemental稍后转换为程序?(elemental必须首先执行程序pure.)
stop和exitFortran有什么区别?
两者都可以使用一些错误信息立即终止程序.
有没有人知道在Fortran中以一定的毫秒数睡眠的方法?我不想使用非便携式系统调用,因此Fortran或C库固有的任何东西都是首选.