Matrix 构建块三对角矩阵

Matrix 构建块三对角矩阵,matrix,fortran,Matrix,Fortran,我试图用Fortran语言建立一个块三对角矩阵。现在我有了这段代码,它只处理放置在A_矩阵主对角线中的矩阵,在I中的每一步都有一个新矩阵 do i = gs+1, total_mesh_points start_line = (3*i)-2 start_colu = (3*i)-2 final_line = (3*i) final_colu = (3*i) do ii = 1, 3 do jj = 1, 3 A_matrix(

我试图用Fortran语言建立一个块三对角矩阵。现在我有了这段代码,它只处理放置在
A_矩阵
主对角线中的矩阵,在
I
中的每一步都有一个新矩阵

do i = gs+1, total_mesh_points 

    start_line = (3*i)-2
    start_colu = (3*i)-2
    final_line = (3*i)
    final_colu = (3*i)

    do ii = 1, 3
    do jj = 1, 3
        A_matrix(start_line:final_line,start_colu:final_colu) = &
            impflux(ii,jj)
    end do
    end do

end do
这里我的
A_矩阵(i,j)
是一个大矩阵,它将在主对角线上接收另一个三乘三矩阵(
impflux
)。请注意,对于
i
中的每个步骤,我将有一个新的
impflux
矩阵,该矩阵需要定位在
a_矩阵的主对角线中


我想不出比这更简单的解决办法了。人们通常如何在Fortran中构建块对角矩阵?

这里有一种构建块三对角矩阵的方法。我不确定,在一些著名的图书馆之外,是否有一种通常的方式。这是一个程序,我会让你把它变成一个函数

PROGRAM test

  USE iso_fortran_env

  IMPLICIT NONE

  INTEGER :: k    ! submatrix size
  INTEGER :: n    ! number of submatrices along main diagonal
  INTEGER :: ix   ! loop index

  ! the submatrices, a (lower diagonal) b (main diagonal) c (upper diagonal)
  REAL(real64), DIMENSION(:,:,:), ALLOCATABLE :: amx, bmx, cmx

  ! the block tridiagonal matrix
  REAL(real64), DIMENSION(:,:), ALLOCATABLE :: mat_a

  k = 3  ! set these values as you wish
  n = 4

  ALLOCATE(amx(n-1,k,k), bmx(n,k,k), cmx(n-1,k,k))
  ALLOCATE(mat_a(n*k,n*k))

  mat_a = 0.0

  ! populate these as you wish
  amx = 1.0
  bmx = 2.0
  cmx = 3.0

  ! first the lower diagonal
  DO ix = 1,k*(n-1),k
     mat_a(ix+k:ix+2*k-1,ix:ix+k-1) = amx(CEILING(REAL(ix)/REAL(k)),:,:)
  END DO

  ! now the main diagonal
  DO ix = 1,k*n,k
     mat_a(ix:ix+k-1,ix:ix+k-1) = bmx(CEILING(REAL(ix)/REAL(k)),:,:)
  END DO

  ! finally the upper diagonal
  DO ix = 1,k*(n-1),k
     mat_a(ix:ix+k-1,ix+k:ix+2*k-1) = cmx(CEILING(REAL(ix)/REAL(k)),:,:)
  END DO

END PROGRAM test
请注意,这里根本没有错误检查,我只做了一些测试

一个明显的替代方法是只在
mat_a
行上循环一次,在同一迭代中插入
amx
bmx
cmx
,但这需要对第一次和最后一次迭代进行特殊处理,并且可能看起来更复杂。至于性能,如果它对您运行一些测试很重要的话


还请注意,这会产生密集矩阵。如果矩阵变得非常大,那么只存储对角线元素的方法可能更有用。这就把我们带到了派生类型和对它们的操作上,这是一个完全不同的问题。

这段代码没有多大意义。在通过
ii
jj
索引的循环中,它重复更新
a_矩阵的相同元素,首先使用
impflux(1,1)
,然后使用
impflux(1,2)
,等等。如果您向我们展示一个您尝试创建的小示例,我可能会理解得更好。谢谢您的回复。我在处理偏微分方程的隐式方法。在这些方法中,我们必须为网格中的每个点创建三个矩阵(3x3)。代码的第一个循环通过网格中的所有点。代码的其余部分将负责A_矩阵内矩阵impflux(为网格中的每个点生成)的正确定位。最终的结果将是a_矩阵主对角线内的一组impflux矩阵。理想的情况是,如果我将矩阵a(I,j,nm)、b(I,j,nm)和c(I,j,nm)的三个向量传递给一个函数,它返回给我一个非常大的矩阵(c),其中包含这三个矩阵(a,b,c)形成三条主对角线。你没有试图创建一个三对角矩阵。您正在尝试创建一个。他们根本不是同一件事,希望你的回答能有高绩效。我来做你的节目!