NAN00 发表于 2025-4-19 12:46:09

计算过程中数值不稳定性 有偿

计算图灵斑样貌过程中,使用如下代码进行多次迭代,发现在控制相同输入、参数情况下,有时会得到不同的结果,已经排查不是并行导致问题,希望老师们帮忙看看
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


chiangtp 发表于 2025-4-19 15:34:49

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. "在控制相同输入、参数情况下,有时会得到不同的结果" ---> (???) "数值不稳定"
页: [1]
查看完整版本: 计算过程中数值不稳定性 有偿