Fortran Coder

查看: 57|回复: 1
打印 上一主题 下一主题

[求助] 计算过程中数值不稳定性 有偿

[复制链接]

4

帖子

3

主题

0

精华

新人

F 币
27 元
贡献
11 点
跳转到指定楼层
楼主
发表于 9 小时前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
计算图灵斑样貌过程中,使用如下代码进行多次迭代,发现在控制相同输入、参数情况下,有时会得到不同的结果,已经排查不是并行导致问题,希望老师们帮忙看看
subroutine myosin_reaction_diffusion2(Nc,nb_cell,num_nb,Dam,Dcr,am_a,cr_r,ka_on,ka_off,kr_off,delta,am_conc,cr_conc)
    implicit none
    integer, intent(in) :: Nc,nb_cell(20,Nc),num_nb(Nc)
    double precision, intent(in) :: Dam,Dcr,am_a,cr_r,ka_on,ka_off,kr_off,delta
    double precision, intent(inout) :: am_conc(Nc), cr_conc(Nc)

    integer :: i,j,i1
    double precision :: temp1_am,temp2_am,temp3_am,temp1_cr,temp2_cr
    double precision :: am_conc_old(Nc), cr_conc_old(Nc),delta01

    am_conc_old = am_conc; cr_conc_old = cr_conc; delta01 = delta * 0.5d0
!$omp parallel private(i,j,i1,temp1_am,temp2_am,temp3_am,temp1_cr,temp2_cr)
!$omp do  
    do i = 1,Nc
        ! temp1_am = 0.d0; temp1_cr = 0.d0
        ! do j = 1,num_nb(i)
        !     i1 = nb_cell(j,i)

        !     temp1_am = temp1_am + ( am_conc_old(i1) - am_conc_old(i) )
        !     temp1_cr = temp1_cr + ( cr_conc_old(i1) - cr_conc_old(i) )
        ! end do
        ! temp1_am = Dam * temp1_am; temp1_cr = Dcr * temp1_cr
        temp1_am = Dam * sum(am_conc_old(nb_cell(1:num_nb(i),i)) - am_conc_old(i))
        temp1_cr = Dcr * sum(cr_conc_old(nb_cell(1:num_nb(i),i)) - cr_conc_old(i))

        temp2_am = ka_on * (am_conc_old(i)**2) * cr_conc_old(i)
        temp2_cr = -kr_off * (am_conc_old(i)**2) * cr_conc_old(i)

        temp3_am = -ka_off * am_conc_old(i)

        am_conc(i) = am_conc_old(i) + (temp1_am + temp2_am + temp3_am + am_a) * delta01

        cr_conc(i) = cr_conc_old(i) + (temp1_cr + temp2_cr + cr_r) * delta01
    end do
!$omp end do
!$omp end parallel

end subroutine


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

132

帖子

11

主题

0

精华

大师

F 币
625 元
贡献
377 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

沙发
发表于 6 小时前 | 只看该作者
1. please check (num_nb(i)>=1 .AND. num_nb(i)<=20)

   do i = 1, Nc                                                      
     IF( num_nb(i)<1 .OR. num_nb(i)>20 ) WRITE(*,*) num_nb(i)

2. "在控制相同输入、参数情况下,有时会得到不同的结果" ---> (???) "数值不稳定"
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-19 21:50

Powered by Tencent X3.4

© 2013-2025 Tencent

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