使用循环评估函数 Fortran 90

2023-12-23

我陷入了需要计算函数值的过程f[x,y,z]在网格上。这里我写了我如何编写程序,仅在一维网格上进行评估。

我写了程序:

program CHISQUARE_MINIMIZATION_VELOCITY_PROFILES
use distribution
IMPLICIT none
integer, parameter :: kp=1001    ! Parameter which states the number of points on the grid.
integer, parameter :: ndata=13   ! Parameter which states the number of elements of the data file.
integer, parameter :: nconst=3   ! Fixed integer parameter.

integer i, j, n
real*8 rc0, rcf, V00, V0f, d00, d0f, rc, V0, d, z
real*8 rcr(kp), V0r(kp), d0r(kp), chisq(kp)

!Scaling radius range
rc0=0.0d-5      ! kpc
rcf=1.0d2       ! kpc
call linspace(rc0,rcf,kp,rcr)

!**************If I call like this, it works normal*****************
!CHISQUARED(1.3d0, 130.2d0, 0.12d0, 1.0d0, 1.0d0, 2.0d0, 0.0d0, 0.0d0, 1, !ndata, nconst)

!       **1.27000000000000       0.745818846396887**
!    Press any key to continue
!**************If I call like this, it works normal*****************

    !******* Here is where my problem is****************
    do j=1, kp
    rc=rcr(j)
    write(*,*) rc, CHISQUARED(rc, 130.2d0, 0.12d0, 1.0d0, 1.0d0, 2.0d0, 0.0d0, 0.0d0, 1, ndata, nconst)
    enddo
    !******* Here is where my problem is****************

    end program CHISQUARE_MINIMIZATION_VELOCITY_PROFILES

我使用计算 chi^2 分布的模块,该分布来自理论模型......


MODULE distribution
IMPLICIT NONE
CONTAINS

! I define here the chi^2 function****
real*8 function CHISQUARED(rc, V0, d, alpha, gamma, chi, a, b, n, ndata, nconst)

integer i, n, ndata, nconst
real*8 rc, V0, d
real*8 alpha, gamma, chi, a, b, s
real*8, DIMENSION(ndata,3) :: X
open(unit=1, file="data.txt")

s=0.0d0
do i=1, ndata
Read(1,*)  X(i,:)
    s=s+((X(i,2)-VELOCITYPROFILE(X(i,1), rc, V0, d, alpha, gamma, chi, a, b, n))/(X(i,3)))**2.0d0
end do

CHISQUARED=s/(ndata-nconst)

end function CHISQUARED


!****Here I define the model function
real*8 function VELOCITYPROFILE(r, rc, V0, d, alpha, gamma, chi, a, b, n)

integer i, n
real*8 r, rc, V0, d, alpha, gamma, chi, a, b, z

if (rc < 0.0d0 .OR. d < 0.0d0 .OR. a <0.0d0 .OR. b <0.0d0 .OR. alpha < 0.0d0 .OR. gamma <0.0d0 .OR. chi < 0.0d0 .OR. n<1 ) then
    VELOCITYPROFILE=0.0d0
    return
    else
z=0.0d0
do i=0,n
    z=z+((V0*((r/rc)**(1.5d0))*(1+a+r/rc)**(-gamma*(2*n+0.5d0)))/((a+(r/rc)**alpha)**(chi/2.0d0)))*(((b+r/rc)**gamma)/d)**i
end do

VELOCITYPROFILE=z
end if
end function VELOCITYPROFILE
END MODULE distribution

!*****************模块结束**************************** **

data.txt 文件的格式为

0.24    37.31   6.15
0.28    37.92   5.5
0.46    47.12   3.9
0.64    53.48   2.8
0.73    55.14   3.3
0.82    58.47   2.5
1.08    66.15   3.3
1.22    69.39   2.75
1.45    74.55   5.
1.71    77.94   2.93
1.87    81.66   2.5
2.2     86.81   3.02
2.28    90.08   2.1
2.69    94.38   3.92
2.7     95.36   1.8

为了获得函数的几个值CHISQUARED,我使用子程序linspace生成一维网格的划分

subroutine linspace(xi,xf,jmax,y)
integer jmax,j
real*8 xi,xf,y(jmax)
y=(/(xi+dble(j-1)*(xf-xi)/(dble(jmax)-1.0d0), j=1, jmax)/)
end subroutine linspace

发生的情况是,如果在主程序中,我调用该函数CHISQUARED像这样:

CHISQUARED(1.3d0, 130.2d0, 0.12d0, 1.0d0, 1.0d0, 2.0d0, 0.0d0, 0.0d0, 1, ndata, nconst)

   **1.27000000000000       0.745818846396887**
Press any key to continue

我得到一些有限值,比如,我不知道,0.7 或类似的值。 (我限制了数据文件,所以结果不会是写的,我只是以0.7为例)。但是,当我将它放入上面编写的程序中的循环中以获取一维网格上的值时,它给了我错误

  **0.000000000000000E+000 NaN**
forrtl: severe (24): end-of-file during read, unit 1, file C:\Users\Ernesto Lopez Fune\Desktop\Minimize\newone\chisquarerotationcurve\data.txt
Image              PC        Routine            Line        Source
chisquarerotation  0040B889  Unknown               Unknown  Unknown
Press any key to continue

谁能建议我在这种情况下该怎么做?如何克服这个障碍?


根据您的错误,您已到达文件末尾。 当您调用子例程一次时,这是可以的,但在循环中,您的文件会被多次读取。第一次迭代后,您的文件将被读取,直到 EOF 控制,但对于下一次迭代,程序无法再读取,因为它已经到达文件末尾。

您需要使用REWIND(1)之前的声明end function CHISQUARED。这样,光标将重新定位在文件的开头。另外,我认为最好OPEN您的文件位于主程序中,而不是位于函数或子程序中,以避免多次打开/关闭。

别忘了CLOSE当你处理完你的文件后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用循环评估函数 Fortran 90 的相关文章

  • 计算字符串向量中连续数字的函数

    我想创建一个函数 它接受至少 1 个元素的字符串对象并包含数字 2 到 5 并确定是否存在至少 N 长度的连续数字 其中 N 是实际数字值 如果是 则返回字符串 true 否则返回字符串 false 例如 Input 555123 Outp
  • 内联还有用吗? [复制]

    这个问题在这里已经有答案了 我相信 inline已经过时了 因为我读过here https isocpp org wiki faq inline functions 无论您如何将函数指定为inline 这是允许编译器忽略的请求 编译器可能会
  • 聚合函数在数据框中创建不需要的向量

    我在函数中创建数据帧时遇到了一个奇怪的问题 但是 在 data frame 之外使用相同的方法效果很好 这是基本函数 我用它来计算数据集的平均值 标准差和标准误差 aggregateX lt function formula dataset
  • JavaScript 函数默认参数[重复]

    这个问题在这里已经有答案了 const add a 1 b 1 c 1 gt a b c add 4 2 抛出未捕获的语法错误 意外的标记 如何调用该函数 使 b 默认为值 1 就拿undefined https developer moz
  • 为不带引号的函数获取字符串参数

    我有一个函数 用于从 URL 下载文件并将其写入磁盘 并施加特定的文件扩展名 目前 它看起来像这样 import requests import os def getpml url filename psc requests get url
  • Django中的自动递增值

    我在 django 中有一个表并尝试自动递增它的序列号 在自定义模板中 for 循环用于变量 自定义模板 for i in getodeskview tr td 1 td td i odesk id td td i hours td td
  • 是否可以在 UML 中可视化一堆函数

    我正在改进一个使用类和函数文件 只是包含各种函数的 php 文件 的内容管理系统 例如 我有一堂课叫Admin以及一个功能文件 其功能包括显示管理员概述 创建新管理员 编辑现有管理员 删除管理员 函数文件使用类并执行 mvc 概念的可视化部
  • Lua 上的 For 循环

    我的作业是如何执行 for 循环 我已经从数字上弄清楚了 但无法从名称上弄清楚 我想创建一个 for 循环来运行名称列表 以下是我到目前为止所拥有的 names John Joe Steve for names 1 3 do print n
  • 在循环中调用 setTimeout 未按预期工作

    下面的 JavaScript 应该 在我看来 以 0 5 秒的间隔播放一系列音符 但它会将它们全部作为一个同时的和弦来演奏 知道如何修复它吗 function playRecording if notes length gt 0 for v
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • 我可以将文件指针移动到格式化文件中的特定(字节)位置吗?

    我正在读取格式化的 ascii 文件 该文件本质上是 ascii 编码的 看起来像这样 fieldname 1 header info 1 header info 2 header info 3 aruieopaurjjk 0uio3789
  • TypeScript 接口函数属性:有什么区别?

    有人可以解释一下 为什么在这段代码中 对 Interface 类型常量的赋值有效 但对 Interface 类型常量的赋值会抛出错误 interface InterfaceA doSomething data object boolean
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • 为什么我不能在 Javascript 中滚动循环?

    我正在开发一个使用 dojo 的网页 并且上面有许多 在我的测试用例中为 6 但通常是可变的 项目小部件 我正在调用 dojo addOnLoad init 并且在 init 函数中我有以下几行 dojo connect dijit byI
  • 在 numpy/scipy 中查找 matlab 函数

    是否有一个等价的函数find A gt 9 1 来自 numpy scipy 的 matlab 我知道有nonzeronumpy 中的函数 但我需要的是第一个索引 以便我可以在另一个提取的列中使用第一个索引 Ex A 1 2 3 9 6 4
  • 如何对数字进行排序? [复制]

    这个问题在这里已经有答案了 下面是代码 Is the sortNumber对数字进行排序的函数 a 和 b 是什么意思以及为什么存在 为什么sortNumber in n sort sortNumber 没有指定任何参数a and b Ja
  • C++ 实现友元/内联函数

    我似乎找不到这个新手问题的答案 如果我有课 头文件 h Class X public friend bool operator const X const X inline size type rows const ETC 当我去实现X的
  • 为什么 count 比 $count 差

    我只是在查看不同问题的答案以了解更多信息 我看到一个answer https stackoverflow com a 4891402 429850这表明在 php 中编写这样的做法是不好的做法 for i 0 i
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co

随机推荐