Fortran中的time子程序比较

本文介绍了Fortran中用于获取时间的三个内置子程序:CPU_TIME、ITIME和DATE_AND_TIME。通过示例代码展示了它们的用法和返回值,其中CPU_TIME提供CPU运行时间,ITIME和DATE_AND_TIME则提供实际时间,后者在处理长时间计算时更为方便。在并行计算中,CPU_TIME可能不准确。文章还给出了itime的有效计算范围和system_clock在长时计算中的优势。
下面对Fortran中的几种调用时间的子程序(CPU_TIME,SYSTEM_CLOCK,DATA_AND_TIME,DATA_AND_TIME)进行对比研究。


CPU_TIME——Returns a REAL value representing the elapsed CPU time in seconds. (详细信息见 https://gcc.gnu.org/onlinedocs/gfortran/CPU_005fTIME.html)

语法: CALL CPU_TIME(TIME)。TIME的类型是实数型。


SYSTEM_CLOCK——(详细信息见 https://gcc.gnu.org/onlinedocs/gfortran/SYSTEM_005fCLOCK.html)

语法: CALL SYSTEM_CLOCK([COUNT, COUNT_RATE, COUNT_MAX])。COUNT,COUNT_RATE和COUNT_MAX是整数类型。当参数count的kind不同时,count的单位也会不一样。count是INTEGER(4)类型的话,返回的时间是毫秒,count的类型是INTEGER(8)类型,那么返回的时间是纳秒。所以在计算时间的时候为了得到时间的单位为秒,需要使用COUNT/COUNT_RATE。


DATA_AND_TIME————(详细信息见https://gcc.gnu.org/onlinedocs/gfortran/ITIME.html)


语法: DATE_AND_TIME(DATE, TIME, ZONE, VALUES)。DATA,TIME,ZONE是可选参数。在计算程序的运行时间上使用VALUES就足够了。 VALUES的类型是一维整型数组(8个元素)。

VAUES(1)得到的是年;VAUES(2)得到的是月;VAUES(3)得到的是月中的第几天;VAUES(4)得到的值的是分钟——Time difference with UTC in minutes;VAUES(5)得到的是一天中的几点(只包含小时不包括分钟,秒等等);VAUES(6)得到的是一小时中的多少分钟;VAUES(7)得到的是一分钟的多少秒;VAUES(8)得到的是一秒中的多少毫秒。




ITIME——详细信息见https://gcc.gnu.org/onlinedocs/gfortran/ITIME.html

语法: CALL ITIME(TIME)。TIME的类型是有3个元素的整型一维数组。TIME(1)得到的是一天中的小时(范围是1-24);TIME(2)得到的是一小时中的分钟(范围是1-60);TIME(3)得到的是一分钟的多少秒(范围是1-60)。


下面是调用了这四个时间函数的例子:


对上面的程序进行编译得到的结果如下:

 cpu_time is   5.32920074    s
 itime is           6 s
 SYSTEM_CLOCK time is   5.33099985     s
 date_and_time time is   5.33099985     s

小结:

1. cpu_time子程序得到的是cpu运行的时间。对于串行计算,cpu计算时间与真是时间差别并不是很大,但是对于并行计算并不推荐使用(https://stackoverflow.com/questions/6878246/fortran-intrinsic-timing-routines-which-is-better-cpu-time-or-system-clock)

2. itime,system_clock和data_and_time计算的都是真实时间,itime的最小计算单位是秒,最大计算单位是小时。也就是说itime有效的计算时间是24个小时,如果计算的时间超过24小时不建议使用itime;system_clock和data_and_time对于计算时间超过24小时的可以使用,但是使用data_and_time会更方便一些,可以直接使用VAALUES(3)直接得到天数,VALUES(5)得到小时。


希望和大家一起交流进步。

<think>好的,我现在需要帮助用户解决在PSCAD中使用Fortran调用子程序的问题。首先,我得回忆一下用户提供的引用内容,尤其是引用[2]和引用[3],因为这些可能直接相关。引用[2]提到,最好直接用Fortran编写函数并在PSCAD脚本中调用,如果需要用C语言的话需要注意编译器类型。但用户的问题是关于Fortran的,所以重点应该放在Fortran调用子程序的具体步骤。 接下来,我应该考虑PSCAD中Fortran子程序的基本结构。通常,PSCAD允许用户通过自定义元件嵌入Fortran代码。用户需要创建一个自定义元件,然后在脚本部分编写Fortran代码,包括子程序的定义和调用。引用[3]提到了新建项目和添加元件的方法,这可能与创建自定义元件有关。 然后,步骤可能包括:如何新建元件,如何在元件中添加Fortran脚本,如何定义子程序(SUBROUTINE),以及如何调用它。同时,需要注意编译器的配置,比如Gfortran或CVFortran,但根据引用[2],如果是Fortran的话可能不需要额外的转换步骤,直接调用即可。 另外,用户可能需要示例代码,比如如何在Fortran中定义一个子程序,然后在主程序中调用它。例如,定义一个计算加法的子程序,然后在主程序中使用CALL语句调用。同时,需要确保输入输出变量正确传递,参数类型匹配。 可能还需要提到如何将子程序与PSCAD的元件连接,比如通过输入输出端口,或者使用存储的变量。引用[4]中的模型建立可能涉及到变量传递,比如电压电流的互感器连接,这可能类比到子程序参数的传递。 还需要注意常见问题,比如编译器错误、链接错误等,引用[3]中的问题解决办法,如缺少编译器、库文件错误等,应该在步骤中提醒用户检查这些配置。 最后,生成相关问题,考虑用户可能的后续疑问,比如参数传递、调试方法、性能优化等。</think>在PSCAD中通过Fortran调用子程序可分为以下步骤: ### 一、Fortran子程序调用流程 1. **创建自定义元件** - 右键点击画布选择`Create Component`新建元件 - 在`Script`标签页选择`Fortran`语言类型[^3] 2. **编写子程序结构** ```fortran ! 子程序定义 SUBROUTINE MY_SUB(a, b, c) REAL a, b, c c = a + b ! 示例:加法计算 END ! 主程序调用 IF (TIME == 0.0) THEN ! 初始化时执行 CALL MY_SUB(IN1, IN2, OUT) END IF ``` 3. **参数传递说明** - 输入参数:通过`#STORAGE`声明存储单元 - 输出参数:使用`STORF(N) = value`赋值 - 示例声明: ```fortran #STORAGE REAL:3 STORF(1) = IN1 ! 输入1 STORF(2) = IN2 ! 输入2 CALL MY_SUB(STORF(1), STORF(2), STORF(3)) OUT = STORF(3) ! 输出结果 ``` ### 二、配置关键点 1. **编译器选择** - 在`Project Settings`中确认使用`GNU Fortran`或`Intel Fortran`编译器[^2] - 推荐Gfortran编译器避免兼容性问题 2. **文件关联** - 外部子程序文件需通过`File Reference`组件链接 - 设置路径时使用相对路径(不超过260字符限制) ### 三、调试技巧 - 使用`WRITE`语句输出调试信息: ```fortran OPEN(UNIT=10, FILE='debug.txt') WRITE(10,*) '计算结果:', OUT CLOSE(10) ``` - 通过`PSCAD Runtime Information`窗口查看编译错误 ### 四、应用示例 实现距离保护逻辑判断子程序: ```fortran SUBROUTINE PROTECTION_LOGIC(Vm, Im, Zset, TripSignal) REAL Vm, Im, Zset, Zm LOGICAL TripSignal Zm = Vm / Im TripSignal = (Zm < Zset) ! 阻抗低于定值触发动作[^4] END ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值