开启辅助访问 切换到窄版
搜索

Fortran Coder

 找回密码
 极速注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

[复制链接]

fortran排错

[数值问题]
a1100200420 发表于 2017-5-3 23:14:14 查看55 回复2 阅读模式
求各位帮我看看,这问题卡我两三个小时了。下面是我的主程序
[Fortran] 纯文本查看 复制代码
program main !顶盖驱动boltzmann 程序
    implicit none
    real*8 dx,dy,Lx,Ly,dt,c,cs
    integer Nx,Ny
    real*8 Re,niu,U0,rho0
    real*8,allocatable:: rho(:,:)
    real*8,allocatable:: w(:),e(:,:),u(:,:,:)
    real*8 tau
    integer Q
    real*8,allocatable::Fn(:,:,:),Fn_1(:,:,:)
    integer i,j,k
    real*8 feq

    !初始化111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    dx=1.0 !格子的流向长度
    dy=1.0 !格子的垂向长度
    Nx=256 !流向格子数量
    Ny=256
    Lx=dx*Nx !流向长度
    Ly=dy*Ny
    dt=1.0 !时间步长
    c=dx/dt !格子速度
    cs=c/sqrt(3.0) !格子声速
    Re=1000.0 !雷诺数
    U0=0.1 !顶盖速度
    rho0=1.0 !初始密度
    niu=U0*Lx/Re !运动粘性系数
    tau=3.0*niu+0.5 !松弛时间
    Q=9 !速度离散数量
    allocate(rho(Nx,Ny)) !各节点的密度
    allocate(w(Q)) !权系数
    allocate(e(Q,2)) !离散速度
    allocate(u(Nx,Ny,2)) !各节点的速度
    allocate(Fn(Nx,Ny,2)) !迭代后的分布函数
    allocate(Fn_1(Nx,Ny,2)) !迭代前的分布函数
    rho(:,:)=rho0
    w(:)=(/4.0/9,1.0/9,1.0/9,1.0/9,1.0/9,1.0/36,1.0/36,1.0/36,1.0/36/)
    !write(*,*) w !正常情况下应当屏蔽
    e(:,1)=(/ 0,1,0,-1,0,1,-1,-1,1 /)
    e(:,2)=(/ 0,0,1,0,-1,1,1,-1,-1/)
    !write(*,*) e(9,:) !正常情况下应当屏蔽
    u(:,:,:)=0 !各节点速度
    u(:,Ny,1)=U0 
    rho(:,:)=0 !各阶段密度
    do i=1,Nx,1
        do j=1,Ny,1
            do k=1,Q,1
                call sub_equi(rho(i,j),w(k),e(k,:),u(i,j,:),cs,feq)
                Fn_1(i,j,k)=feq !分布函数初始化为平衡态
            enddo
        enddo

    enddo
    !111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    end

下面是子程序
[Fortran] 纯文本查看 复制代码
subroutine sub_equi(rho,w,e,u,cs,feq)
    !该程序用于求解Maxwell 分布函数
    !rho 密度
    !w 权系数
    !e 离散速度矢量
    !u 格子宏观速度矢量
    !cs 格子声速
    !feq Maxwell 分布函数

    implicit none
    real*8 rho,w,cs,feq,eu,uu
    real*8 e(2),u(2)
    integer i

    eu=e(1)*u(1)+e(2)*u(2) !向量e、u的点乘结果
    uu=u(1)**2+u(2)**2 !向量u、u的向量点乘

    feq=rho*w(1+eu/cs**2+(eu/cs**2)**2/2-uu/(2*cs**2))

    end

在主程序调用子程序的地方出错
错误        1 error #6637: When a dummy argument is a function, the corresponding actual argument must also be a function.   [W]
恳求各位解惑

回复

使用道具 举报

li913 发表于 2017-5-4 11:44:51
子程序中 w 是标量,不是数组或函数。
QQ截图20170504114122.png
1.png
a1100200420  楼主 发表于 2017-5-4 21:53:57
非常感谢,后面的问题我解决了,再次感谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则 长代码粘贴

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表