Fortran 程序设计技巧_fortran控制浮点数位数-程序员宅基地

技术标签: java  Fortran语言程序设计方法与案例  数据库  开发语言  

Variable

implicit none

  • 在Fortran中,默认情况下,如果没有显式声明变量或使用该语句,则所有未声明的变量都被假定为类型为实数。
  • 错误代码示例
program exam

    var1 = [(i, i=1, 10)]
    var2 = 5.0

    write(*,*) "var1:",var1
    write(*,*) "var2:",var2

    write(*,*)"Press any key to exit"
    read(*,*)
end program exam
  • 相关报错:

kind

  • kind参数用于定义变量的精度或字节大小
  • 单精度浮点数(real(kind=4))。这种变量通常占用4个字节(32位)的存储空间
  • 双精度浮点数(real(kind=8))。这种变量通常占用8个字节(64位)的存储空间
  • 扩展精度浮点数(real(kind=16))。这种变量通常占用16个字节(128位)的存储空间
  • 八倍精度浮点数(real(kind=32))。
program exam
    implicit none 


    real(kind=4) var1
    real(kind=8) var2 
    real(kind=16) var3

    var1 = 1.12345678901234567890123456789012345678901234567890
    var2 = 1.12345678901234567890123456789012345678901234567890
    var3 = 1.12345678901234567890123456789012345678901234567890

    write(*,*) "var1:",var1
    write(*,*) "var2:",var2
    write(*,*) "var3:",var3


    write(*,*)"Press any key to exit"
    read(*,*)
end program exam

  •  都,不怎么准确。。。。。。。。。。。。。。
    • 要使用高精度计算包

character variable

program exam
    implicit none 

    CHARACTER(LEN=10) :: name
    CHARACTER(LEN=20, KIND=4) :: message
    CHARACTER(LEN=1) :: initial
    
    name = "River Chandler"
    initial = "Rose Lan"   

    write(*,*)"name",name 
    write(*,*)"message",message 
    write(*,*)"initial",initial 

    write(*,*)"Press any key to exit"
    read(*,*)
end program exam

  • fortran 中不能直接对字符串做替换操作,因为字符串类型是immutable

Built-in Function

cpu_time

  • 具有很好的程序计时功能
program string_operations
    implicit none 

    real :: start_time, end_time, elapsed_time
    integer :: i,j,k,l,m
    real(kind=8) :: array(1:1000000)

    array(1) = 1.0
    array(2) = 2.0
    call cpu_time(start_time)

    do j = 1,100
        do k = 1,100
            do l = 1,100
                do m = 1,100
                    do i = 3, 10
                        array(i) = array(i-1) * array(i-2)
                        array(i-2) = array(i) - array(i-1)
                        array(i-1) = array(i-2) - array(i)
                    end do
                end do     
            end do 
        end do 
    end do


    call cpu_time(end_time)
    elapsed_time = end_time - start_time

    write(*,*) 'program running for:', elapsed_time, 'seconds'
    write(*, *) "press any key to exit!"
    read(*, *)
end program string_operations

random_number

  • 生成一个0到1之间的随机实数
program operations
    implicit none 

    real :: random_value
    call random_number(random_value)
    write(*,*) "random number", random_value
    write(*, *) "press any key to exit!"
    read(*, *)
end program operations

  • 好吧,作为一个优秀的计算物理工作者,我们肯定发现了,我们需要一些随机数种子之类的高端操作

program operations
    implicit none 

    integer :: seed, i
    real :: random_num
    
    seed = 100
  
    call random_seed(seed)

    do i = 1, 10
        call random_number(random_num)
        write(*,*) random_num
    end do

    write(*, *) "press any key to exit!"
    read(*, *)
end program operations

Generative 

  • 生成式是一种十分合理且轻便的玩意,用处也很广泛
  • 生成式的设计
program generative_prom
    implicit none
    
    integer :: arr1(10)
    real ::    arr2(11)
    integer i 
    integer x 

    arr1 = [(i, i=1, 10)]
    arr2 = [(x/10.0,x=0,10,1)]

    write(*,*) "arr1:",arr1
    write(*,*) "arr2:",arr2

    write(*,*)"Press any key to exit"
    read(*,*)
end program generative_prom

Interface语句

  • 定义子程序或函数的接口规范
    • 简单的说,这是用来说明的,辅助代码阅读者的,防止
      • 编程的人忘了input 和 output该是什么样子
      • 调用程序的人不知道output 和 input 是什么样子
  • 举例
program main
    implicit none
    
    interface
        subroutine my_subroutine(a, b)
            integer, intent(in) :: a
            integer, intent(out) :: b
        end subroutine my_subroutine
    end interface
    
    integer :: x, y
    
    x = 10
    call my_subroutine(x, y)
    
    write(*,*) "Result:", y
    
    write(*, *) "Press any key to exit!"
    read(*, *)
    
end program main


subroutine my_subroutine(a, b)
    integer, intent(in) :: a
    integer, intent(out) :: b
    
    b = a + 1
end subroutine my_subroutine

  • 然而: 
    • 稍作改动
program main
    implicit none
    
    interface
        subroutine my_subroutine(a, b)
            integer, intent(in) :: a
            integer, intent(out) :: b
        end subroutine my_subroutine
    end interface
    
    integer :: x
    real :: y
    
    x = 10
    call my_subroutine(x, y)
    
    write(*,*) "Result:", y
    
    write(*, *) "Press any key to exit!"
    read(*, *)
    
end program main


subroutine my_subroutine(a, b)
    integer, intent(in) :: a
    integer, intent(out) :: b
    
    b = a + 1
end subroutine my_subroutine
  •  告诉你们在这里

  •  于是会有这样的报错

  • 其他语言中也可是实现类似的功能,但是很遗憾,我认为他们并没有fortran 方便快捷

module 应用

  • module 是一种用于组织子程序、变量和其他数据的结构。它可以被视为一个容器,用于封装与该模块相关的功能和数据

example

module MathFunctions
    implicit none

    private 
    public :: add_numbers 

    contains

    function add_numbers(a, b) result(sum)
        real :: a, b, sum
        sum = a + b
    end function add_numbers
    
end module MathFunctions

program MainProgram
    use MathFunctions
    implicit none

    real :: num1, num2, result

    num1 = 1.00001
    num2 = 1.00010
    result = add_numbers(num1, num2)

    write(*,*) 'Sum:', result
    
    write(*, *) "Press any key to exit!"
    read(*, *)
end program MainProgram

private and public

  • 类似于其他编程语言,存在私有与共有的问题
module Constants
    implicit none

    private
    integer,public :: publicVar = 20
    integer :: privateVar = 10

end module Constants


program TestModule
    use Constants
    implicit none
    write(*, *) "Public variable: ", publicVar

    write(*, *) "Press any key to exit!"
    read(*, *)
end program TestModule

  •  存在private时,默认全部私有,除非声明public
  • 当然你可以不让private存在

module Constants
    implicit none

    integer,public :: publicVar = 20
    integer :: privateVar = 10

end module Constants


program TestModule
    use Constants
    implicit none
    write(*, *) "Public variable: ", publicVar
    write(*, *) "Private variable: ", privateVar

    write(*, *) "Press any key to exit!"
    read(*, *)
end program TestModule
  • begin water

傅科摆的mma仿真

  • 运动方程
  • 傅科摆是科学史上一个著名的实验,能够证明地球的自转。
    • 借助理论力学知识容易列出傅科摆的动力学方程
l = 2; g = 9.8; \[Lambda] = 0.5; tmax = 10;
sol =
 NDSolve[{-10*Sin[\[Lambda]]*y'[t] + x''[t] == -g*x[t]/l, 
   10*Sin[\[Lambda]]*x'[t] + y''[t] == -g*y[t]/l, x[0] == 0, 
   y[0] == 0, x'[0] == 0, y'[0] == 0.5}, {x[t], y[t]}, {t, 0, tmax}]
  • 图像绘制
Plot[x[t] /. sol // Evaluate, {t, 0, tmax}]
Plot[y[t] /. sol // Evaluate, {t, 0, tmax}]
ParametricPlot[{x[t], y[t]} /. sol // Evaluate, {t, 0, tmax}, 
 AxesLabel -> {"x", "y"}]

 

 

  • N体问题是天体力学中的基本模型。它是指N个质量、初始位置和初始速度都是任意的,可视为质点的天体,在相互之间万有引力的作用下的运动规律问题。一般N体问题所能得到的积分数小于运动方程的阶数,因此还远不能解决三体问题。

    1772年,拉格朗日在“平面限制性三体问题”条件下找到了5个特解,也就是著名的拉格朗日点。在该点上,小天体在两个大天体的引力作用下能基本保持静止。拉格朗日点在深空探测中具有很高的科研价值,主要体现在两个方面:科学观测的极佳位置和深空探测的中转站。而共线拉格朗日点存在着稳定流形与不稳定流形,使得航天器在其上运动时,可不需耗费任何能量地趋近或远离周期轨道,利用这一点,可以为设计行星间的转移轨道提供巨大的帮助。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Chandler_river/article/details/131619395

智能推荐

Python中什么是异常,Python中有哪些异常_python 异常-程序员宅基地

文章浏览阅读4.6k次。如前面所述,虽然Python代码通过了解释,但是在执行时仍有可能触发错误,而这类的错误就称为异常。大部分异常会导致程序无法继续执行。一旦程序运行后发现有异常,Python会直接显示异常的信息,通常包括:异常出现的地方、异常的类型和内容。如下:我们可以看到上述示例中的异常类型依次是:ZeroDivisionError, NameError 和 TypeError。_python 异常

linux删除第二列为空_shell去掉文件中空行(空白行)的方法详解-程序员宅基地

文章浏览阅读1.3k次。本文详细介绍了使用shell去除文件中的空行的方法,学习下sed、awk、shell文件检测的方法,有需要的朋友可以作个参考。本节内容:shell去掉文件中空行1,shell 去掉文件中的空行cat filename | sed -e '/^$/d' > filename2,保留最新的9个文件,其它的文件删除的命令语句ls -t | awk '{if(NR>9){print $0}}'..._去除linux行第二个字符是空格

Python基础——从csv文件中读取数据,提取数据的方法_python从csv提取特定数据-程序员宅基地

文章浏览阅读10w+次,点赞258次,收藏1.7k次。数据保存在csv文件中1.从csv文件中读取数据参数header=None的有无(1)没有header=None——直接将csv表中的第一行当作表头# 读取数据import pandas as pddata = pd.read_csv("data1.csv")print(data)打印结果为:(2)有header=None——自动添加第一行当作表头# 读取数据impor..._python从csv提取特定数据

适用于 iOS 的 10 个最佳数据恢复工具分享_奇客数据恢复ios版-程序员宅基地

文章浏览阅读1.1k次,点赞8次,收藏3次。在当今的数字时代,我们的移动设备占据了我们生活的很大一部分。从令人难忘的照片和视频到重要的文档和消息,我们的 iOS 设备存储了大量我们无法承受丢失的数据。然而,事故时有发生,无论是由于软件故障、无意删除,甚至是硬件损坏,丢失数据都可能令人痛苦。值得庆幸的是,许多数据恢复工具是专门为 iOS 设备设计的。这些工具是检索丢失或删除的文件的最佳选择。_奇客数据恢复ios版

51单片机c语言脉冲计数实验报告,单片机计数器实验报告.doc-程序员宅基地

文章浏览阅读2.2k次。单片机计数器实验报告单片机计数器实验报告计数器实验报告㈠ 实验目的学习单片机内部定时/计数器的使用和编程方法;进一步掌握中断处理程序的编程方法。㈡ 实验器材G6W仿真器一台MCS—51实验板一台PC机一台电源 一台信号发生器一台㈢ 实验内容及要求8051内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,使用8051的T1作定时器,50ms中断..._脉冲计数器实验报告

微信小程序swiper高度自适应,swiper的子元素高度不固定怎么做_微信小程序swiper高度不固定,允许上下滑动-程序员宅基地

文章浏览阅读1.3k次。微信小程序自动的swiper大家都知道默认高度是150px,如果需要去修改高度,我在网上看到的方式都是用js去动态算高度,今天给大家提供一种新的思路 使用 swiper+scroll-view css使用display:flex 父元素dingy flex:1废话不多说 直接上代码 :wxml:<!--pages/talentedPeople/talentS..._微信小程序swiper高度不固定,允许上下滑动

随便推点

JAVA实用工具类-GPS,高德,百度坐标相互转换_java-gps-util-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏11次。经过本人实际验证,此工具类的转换方法靠谱,所以拿出来给大家分享。验证方式有二:1,通过此工具类转换的坐标和调百度高德地图转换后的坐标,进行对比,误差在小数点后四到五位才出现。2,把用此工具类转换后的坐标,渲染到对应地图上,如:高德地图,百度地图。点几乎在路上。下面就把此工具类贡献出来。/** * 各地图API坐标系统比较与转换; * WGS84坐标系:即地球坐标系,国际上..._java-gps-util

Superset安装过程_superset 安装 from wtforms.ext.sqlalchemy.fields imp-程序员宅基地

文章浏览阅读318次。今天准备帮朋友试一下Superset,记录下安装过程准备工作:1、使用vitualenvwrapper创建一个新的虚拟环境2、在MySQL中新建一个数据库supersetdb安装过程:1、# Install superset 安装Superset,此过程会安装Flask等必要的包pip install apache-superset -i https://pypi.douban..._superset 安装 from wtforms.ext.sqlalchemy.fields import queryselectfield mod

暑期RHCSA 2022.07.19_sysmgrs-程序员宅基地

文章浏览阅读119次。1.linux中用户的类型 linux中用户组的类型 linux中存储用户信息的文件是哪个?且其中的字段是什么意思 linux中存储组信息的文件是哪个?且其中的字段是什么意思?2.创建下列用户、组和组成员资格:(1)创建名为 sysmgrs 的组(2)创建用户 natasha 同时指定sysmgrs作为natasha的附加组(3)创建用户 harry 同时指定 sysmgrs作为harry的附加组(4)创建用户 sarah 指定shell类型为/sbin/fals..._sysmgrs

国培计算机音乐教学设计作业,2017国培计划教学设计-程序员宅基地

文章浏览阅读277次。2017国培计划教学设计教学工作任重而道远,面对国培教学内容,希望与挑战并存。下面是学习啦小编为大家整理的2017国培计划教学设计,供大家阅读!2017国培计划教学设计篇1一、指导思想以“提高教学质量”为核心,以“新课程有效教学”为抓手,以校本研修提高教师专业素质为突破口,以远教资源应用为主渠道,以高效课堂为重点,深入开展教学研究,树立“以学生发展为本”的教育思想,不断更新教学观念,改变教师的教学..._音乐提交一份使用信息技术进行教育教学的教学设计,该设计中包括主题、教学对象及

php服务端处理IOS自动续费_php 苹果续费退款回调处理-程序员宅基地

文章浏览阅读1.1k次。公司做的app需要做IAP订阅支付,自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。首先讲一下我的业务逻辑:先上图下面详细讲一下,作为服务端具体要做些什么,并贴上对应的代码:第一步:通过客户端传过来的recept(票据)进行生成订单的操作【注意这里需要验证订单是否已存在】,订单生成返回客户端相关信息; public function pay() { $uid = $this->request->header('uid'); _php 苹果续费退款回调处理

广东印发知识产权人才“十四五”规划_优化知识产权人才激励制度-程序员宅基地

文章浏览阅读337次。近日,广东印发知识产权人才“十四五”规划,全面加强广东知识产权人才队伍建设,完善知识产权人才结构,拓宽知识产权人才培养渠道,健全知识产权人才评价激励和流动配置机制,优化知识产权人才工作环境,为广东高质量发展提供坚实的知识产权人才支撑。  《规划》紧抓“双区”建设和两个合作区建设重大历史机遇,牢固确立人才是第一资源理念,紧紧围绕建设知识产权强国先行示范省需求,健全知识产权人才评价激励和流动配置机制,优化知识产权人才工作环境,结合广东经济社会发展实际,着眼知识产权与科技创新、产业发展、商贸融合的发展趋势,将_优化知识产权人才激励制度