小编ale*_*der的帖子

使用Fortran重载函数

在Fortran 90中,我们可以通过接口重载功能.但是,根据此站点,我们无法使用相同的参数名称定义这些函数.使用gfortran,它似乎不是一个问题,因为以下代码运行良好:

interface check
  module procedure check_int, check_real
end interface

contains 

subroutine check_int(cur, dname, func_name, fname)
  integer, allocatable, intent(in) :: cur(:)
  character(*) :: dname, func_name, fname
  ...
end subroutine

subroutine check_real(cur, dname, func_name, fname)
  real, allocatable, intent(in) :: cur(:)
  character(*) :: dname, func_name, fname
  ...
end subroutine
Run Code Online (Sandbox Code Playgroud)

那么,这样做是不好的做法吗?

编辑:使用关键字调用函数不会改变任何内容.

fortran overloading fortran90

16
推荐指数
1
解决办法
8993
查看次数

Grep中的退出代码在Makefile中

我想在Makefile中检查grep搜索的结果.与此解决方案相反,我不希望使用shell命令.另外,当grep找不到字符串时,我不希望Makefile引发错误(退出代码为1被视为错误).

以下尝试忽略该错误并检查退出代码:

all:
    -grep term log* 
    echo $$?
    @case "$$?" in \
      0)\
    echo "found";; \
    *) \
    echo "not found";;\
    esac;
Run Code Online (Sandbox Code Playgroud)

不幸的是,退出代码始终为0.

grep makefile exit-code

9
推荐指数
1
解决办法
5569
查看次数

在Fortran 90中使用2d数组与派生类型数组

假设您需要一个数组列表,每个数组都具有相同的大小.使用2D数组在性能方面是否更好:

integer, allocatable :: data(:,:)
Run Code Online (Sandbox Code Playgroud)

或派生类型数组:

type test
    integer, allocatable :: content(:)
end type
type(test), allocatable :: data(:)
Run Code Online (Sandbox Code Playgroud)

当然,对于不同大小的阵列,我们没有选择.但是如何在两种情况下管理内存?还有,其中一个很好的代码实践?

fortran multidimensional-array fortran90 derived-types

6
推荐指数
2
解决办法
696
查看次数

使用错误类型的参数调用外部Fortran函数时会发生什么?

如果文件中没有独立函数(不在模块中),并且您使用单精度调用它,而它需要双精度数:

main.f90:

program main

  call test(1.0)
end program main
Run Code Online (Sandbox Code Playgroud)

test.f90:

subroutine test(a)
    double precision :: a
    print *, "a", a
end subroutine
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器如何从单精度到双精度"强制转换"? 使用浮点格式,我希望在转换过程中这些位保持不变,但要追加额外的零.那是:

1 = 0 01111111 00000000000000000000000 in single-precision
Run Code Online (Sandbox Code Playgroud)

我希望最终值为2 ^( - 7):

0 01111111000 0000000000000000000000000000000000000000000000000000 in double precision
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,使用gfortran 6.4.0,最终值为5.2635442471208903E-315.

floating-point fortran gfortran

5
推荐指数
1
解决办法
106
查看次数

使用TAP线束中的函数而不是测试文件

这是我目前使用TAP的测试工具:

use TAP::Harness;
my $harness = TAP::Harness->new();
$harness->runtests(['sequential.t']);
Run Code Online (Sandbox Code Playgroud)

我想避免使用测试文件并直接调用Perl函数.就像是 :

my %args = (
  exec => run_all_tests(),
);
$harness->runtests();
Run Code Online (Sandbox Code Playgroud)

testing perl tap

4
推荐指数
1
解决办法
433
查看次数

MPI使用派生数据类型发送错误(Fortran)

当我尝试发送带有"大"数组的MPI派生数据类型(每个10个浮点数的2个数组)时,我的程序会出现段错误.它通常使用较小的阵列运行.

以下是一个可重复的小例子.这个小程序段落与以下MPI实现:  IntelMPI,BullXMPI.它与OpenMPIPlatformMPI一起正常工作.这是一个带有示例回溯的日志:http://pastebin.com/FMBpCuj2

更改mpi_sendmpi_ssend于事无补.但是,mpi_send使用单个更大的2*100 000浮动阵列工作正常.在我看来,这指向派生数据类型的问题.

program struct 
include 'mpif.h' 

type Data
  integer :: id
  real, allocatable :: ratio(:)
  real, allocatable :: winds(:)
end type 

type (Data) :: test
integer :: datatype, oldtypes(3), blockcounts(3) 
integer :: offsets(3)
integer :: numtasks, rank, i,  ierr 
integer :: n, status(mpi_status_size)

call mpi_init(ierr) 
call mpi_comm_rank(mpi_comm_world, rank, ierr) 
call mpi_comm_size(mpi_comm_world, numtasks, ierr) 

if (numtasks /= 2) then
  write (*,*) "Needs …
Run Code Online (Sandbox Code Playgroud)

fortran mpi segmentation-fault

2
推荐指数
1
解决办法
1260
查看次数