问题标签 [fortran90]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
797 浏览

arrays - Fortran90 Array 将空白值读取为 null

我正在读取外部文本文件(30 行,7 列)的数据帧,每一行都用“,”分隔。我的缺失值表示为“,”。当我将数据读入二维数组时,缺失值被替换为 0.00,但我在数据中也有 0.00 值。当我计算平均值时,计数(项目数(n))显示为计数 - (缺失值的数量)。如何动态选择缺失值。

谢谢斯里

数据

0 投票
3 回答
6123 浏览

arrays - 读取二维数组

我正在尝试从 Fortran 90 中的外部文件中读取二维数组(30.7)

数据有一些缺失值表示为空白。当我将数据读入 array(,*)(indices(i,j))时,它会分配0.00丢失的数据。如何克服这个问题?下面附上资料。

0 投票
1 回答
2944 浏览

multithreading - Fortran 基本函数与基本子例程

Fortan 允许基本子例程具有意图(输入)和意图(输出)参数,但基本函数只允许意图(输入)。

这是为什么?它只是一种风格约定,还是在调用函数和调用子例程方面存在一些一般性的不同?

换句话说,

——这些 FOO 的实现是否同样有效?

0 投票
3 回答
5108 浏览

binary - 将存储在 Fortran 90 二进制文件中的数据转换为人类可读的格式

根据您的经验,在 Fortran 90 中,将大型数组存储在输出文件中的最佳方式是什么?以前,我一直在尝试将大型数组写入 ASCII 文本文件。例如,我会做这样的事情(感谢页面底部的建议In Fortran 90, what is a good way to write a array to a text file, row-wise?):

这行得通,但正如 In Fortran 90 中最上面的回复所指出的那样,将数组写入文本文件的好方法是什么?,将大数组写入文本文件非常慢,并且创建的文件大小比所需的要大。那里的海报建议改为写入未格式化的 Fortran 二进制文件,使用如下内容:

正如这里的回复所承诺的,这似乎有效,并且确实更快并且文件大小更小。但是,如果我希望以后能够处理存储在 Fortran 二进制文件(例如上面的 output.dat)中的数据并分析其内容,我该怎么办?例如,如果我想在 Microsoft Excel 等程序中打开存储在二进制文件中的数组怎么办?

当我在上一篇文章中提到 matlab 时回复建议我将二进制文件作为十六进制文件打开,然后从中找出并提取记录。但是,我很担心我会进入深水区,因为我之前没有十六进制侦查方面的经验。当我在 matlab 板(此处: http: //www.mathworks.com/matlabcentral/answers/12639-advice-on-reading-an-unformatted-fortran-binary-file-into-matlab)上询问有关阅读 Fortran 文件的问题时进入matlab,那里的人建议使用Fortran流可能很容易。但是,Fortran 流(即,使用命令ACCESS="STREAM"中的OPEN指令)在时间和文件大小上是否可能与我在上面的第一个示例中创建的 ASCII 文本文件相似?

或者,您知道是否有任何其他软件可以自动将 Fortran 二进制文件读入某种人类可读的形式?(或者,你知道关于十六进制侦查或 Fortran 流的任何好的教程吗?)

非常感谢您的宝贵时间。

0 投票
2 回答
1747 浏览

vb.net - 如何将字符串从 Visual Basic 2010 传递到 Fortran DLL?

我可以毫无问题地来回传递所有这些整数、单数、双数和数组。但我不知道如何将 Visual Basic 2010 中的字符串传递给 Fortran DLL 中的字符变量。我不断收到PInvokeStackImbalance错误。我可以将 Visual Basic 字符串转换为包含每个字符的 ASCII 代码的整数数组,发送它,然后在 DLL 中转换回来,但这很可悲。必须有一个简单的方法来做到这一点。

我第一次尝试Dim txt(50) as Char在 VB2010 和 character*50 txtDVF F90 DLL 中使用,但没有成功。

然后我Dim txt as String在 Visual Basic 2010 中尝试并使字符串长度为 50 个字符(也尝试了 49 个),但这不起作用。

我希望那里的其他人想要将文件名等传递给他们的 DLL。

0 投票
1 回答
10505 浏览

fortran - 尝试从数组中提取向量时出现 Fortran 90 秩不匹配

在我的 Fortran 90 代码中,我创建了以下整数数组(称为数组):

我希望提取第一列,并将其保存在一个名为time的四元素向量中。我有以下代码:

但是,我收到以下错误消息(在 gfortran 中编译时):

为什么会这样?错误消息似乎表明该数组array(:,1)的排名为 2,而不是排名 1。有什么方法可以转换array(:,1)为排名为 1 的数组?我需要用RESHAPE某种方式挤压阵列吗?或者问题是通过使用array(:,1),我指定的是列向量而不是行向量?非常感谢您的宝贵时间。

0 投票
3 回答
15846 浏览

fortran - Smart way to pass arguments in Fortran 90

I am a Fortran novice. I am trying to write a subroutine that will take in four arguments from the main program, and then outputs to the main program an array that involves the four arguments that were originally passed in. What is a good/smart way to do this?

For example, in my test program below, I create four real variables (a, b, c, and d) in the main program. Then I pass these real variables to a subroutine called mysub. I would like mysub to be able to take in a, b, c, and d, use them to populate a 2-by-2 array called o, and then send o to the main program for displaying (and possible modification) there. So, I tried the following:

But, I get the following error:

I interpret this as, the compiler doesn't know what o is, because o is not in the list of arguments in the subroutine header: SUBROUTINE mysub(w,x,y,z). So I probably need to include o in that header. So, I next try the following (where I have denoted changes or additions using !...):

This seems to work fine, and I get the correct output:

But, my question is, is this a good way to do this? In this working example, I'm declaring the array o both in the subroutine and in the main program. This seems potentially confusing, because I think that this means that I need to take care that either the subroutine or the main program allocates o (but not both, I think, in order to avoid error messages). Is there a smarter way to do this--to send an array from a subroutine to the main program? Thank you for your time.

0 投票
2 回答
11422 浏览

fortran - FORTRAN 90 中同一行上的多个语句

我有一系列的作业,我用“;”放在同一个 ike 上。分开statemnts,但我得到这个错误:

1.0;lb(1,9) 1 错误:文件 LJ.F90:223 中 (1) 处的不可分类语句

如果每个语句都在自己的行上,当我让代码工作时,我不明白从哪里来。代码真的很简单...

我愚蠢地做错了什么......下面的代码都在一行上。

0 投票
2 回答
100 浏览

parallel-processing - 了解 Fortran 90 的并行使用

在上面的 Fortran 90 代码中,我想知道它是如何在同步、通信和算术方面执行的。

我的理解是:

沟通是需要不同的任务来相互沟通。例如,如果有一些变量与其他变量有依赖关系。但是上面的代码并没有表明有一些通信。因为它似乎没有依赖关系,对吗?

同步在某种程度上与通信有关,但它也涉及是否使用了一些障碍。但是在上面的代码中没有障碍。因此,唯一涉及的同步是是否存在任何数据依赖关系。

算术我对这一点一无所知,如果有人可以向我解释,我会很高兴。

0 投票
3 回答
2268 浏览

scope - Fortran 90 中子例程和函数中参数/变量的意图的含义

我有几个关于INTENTFortran 子程序中的变量的问题。例如,几周前,我发布了一个关于不同 Fortran 主题的问题(In Fortran 90, what is a good way to write an array to a text file, row-wise?),其中一个回复包含定义代码ticktock命令。我发现这些对我的代码运行时间很有用。我在下面粘贴ticktock在一个简单的示例中使用它们来计时DO循环:

这导致了我的第一个问题INTENT(下面我的第二个问题是关于明确指定 INTENT 的子例程或函数参数/变量):

  1. 为了启动计时器,我写了CALL tick(myclock),其中myclock是一个整数。子例程的标题是SUBROUTINE tick(t),因此它接受虚拟整数t作为参数。但是,在子程序内部,t给出了 INTENT(OUT): INTEGER, INTENT(OUT) :: t。怎么会这样?我幼稚的假设是 INTENT(OUT) 意味着这个变量的值可能会被修改,并将被导出到子程序之外——而不是读入。但显然t正在被读入子程序;我将整数传递给myclock子例程。因此,既然t被声明为 INTENT(OUT),那它怎么会t似乎也进来

  2. 我注意到在函数tock(t)中,整数变量nowclock_rate没有明确给出意图。那么,这些变量的作用域是什么?是否now只在函数clock_rate 可见?(有点像 INTENT(NONE) 或 INTENT(LOCAL),虽然没有这样的语法?)而且,虽然这是一个函数,但对子例程是否同样适用?有时,当我编写子例程时,我想声明这样的“临时”变量——这些变量只能在子例程中看到(例如,在分配最终输出之前的步骤中修改输入)。这就是缺乏特定意图的结果吗?

我查看了一个文本(Hahn 的 Fortran 90 文本),在其中,他对参数意图进行了以下简要描述:

论证意图。 可以使用 意图属性指定虚拟参数,即您是否打算将它们用作输入或输出,或两者兼而有之,例如

如果intent 为IN,则虚拟参数的值可能不会在子程序内更改。

如果意图是 OUT,则对应的实际参数必须是变量。一个电话如

CALL PLUNK(A, (B), C)

会产生编译器错误——(B) 是一个表达式,而不是一个变量。

如果意图是 INOUT,则相应的实际参数必须再次是变量。

如果虚拟参数没有意图,则实际参数可能是变量或表达式。

建议为所有虚拟参数指定一个意图。特别是,所有函数参数都应该有意图 IN。也可以在单独的语句中指定意图,例如 INTENT(INOUT) X、Y、Z。

上面的文字似乎甚至没有提到参数/变量范围;似乎主要是在讨论参数/变量是否可以在子例程或函数内部更改。这是真的吗?如果是这样,关于意图的范围,我可以假设什么?