前提・実現したいこと
fortranにおいて、別々に配列しているはずの二次元配列と三次元配列の数値がリンクしてしまいます。fortranには不慣れなため、なぜこうなってしまうのかわかりません。誰か教えてくださると幸いです。
発生している問題
subroutine gs_matにおいて、別々に配列しているはずの二次元配列'c'と三次元配列'a'の数値がなぜかリンクにしており、'c'の値のみ変更したくても'a'の値も変わってしまう
該当のソースコード
fortran
1module linertruss 2 implicit none 3contains 4 5 subroutine es_mat(n,a,S,E,length) 6 integer, intent(in) :: n 7 integer i,j,l 8 real(8), intent(in) :: S,E,length(n) 9 real(8), intent(out) :: a(2,2,n) 10 real(8) k 11 write(*,*) S,E 12 do l=1,n 13 write(*,*) S,E,length(l) 14 k=0.0d0 15 k=S*E/length(l)*10**3 16 write(*,*) k 17 do j=1,2 18 do i=1,2 19 if(i==j)then 20 a(i,j,l)=k 21 else 22 a(i,j,l)=-k 23 endif 24 enddo 25 enddo 26 enddo 27 endsubroutine es_mat 28 29 30 subroutine print_mat(a,n) 31 integer, intent(in) :: n 32 integer i,j,k 33 real(8), intent(in) :: a(2,2,n) 34 do k=1,n 35 do i=1,2 36 write(*,*) (a(i,j,k), j=1,2) 37 end do 38 end do 39 end subroutine print_mat 40 41 subroutine setvalue(n,S,E,length,el) 42 integer :: n,el(n+1),i 43 real(8) :: S,E,length(n) 44 n=2 45 do i=1,n+1 46 el(i)=0 47 enddo 48 el(1)=1 49 S=1.0d0 50 E=210.0d0 51 length(1)=210.0d0 52 length(2)=420.0d0 53 end subroutine setvalue 54 55 subroutine gs_mat(n,a,c,el) !このsubroutineで問題が起きています 56 integer n, el(n+1) 57 integer i,j 58 real(8),intent(in) :: a(2,2,n) 59 real(8),intent(out) :: c(n+1,n+1) 60 write(*,*) a(1,1,2) 61 c=0 62 write(*,*) a(1,1,2) 63 do i=1,n+1 64 write(*,*) (c(i,j), j=1,n+1) 65 enddo 66 write(*,*) n 67 ! do i=1,n+1 68 ! do j=1,n+1 69 ! c(i,j)=0.0d0 70 ! enddo 71 ! enddo 72 do i=1,n+1 73 write(*,*) (c(i,j), j=1,n+1) 74 enddo 75 write(*,*) a(1,1,2) 76 do i=1,n 77 c(i,i)=c(i,i)+a(1,1,i) 78 ! c(i,i+1)=c(i,i+1)+a(1,2,i) 79 ! c(i+1,i)=c(i+1,i)+a(2,1,i) 80 ! c(i+1,i+1)=c(i+1,i+1)+a(2,2,i) 81 enddo 82 do i=1,n+1 83 write(*,*) (c(i,j), j=1,n+1) 84 end do 85 do i=1,n+1 86 if(el(i)==1) c(i,i)=10000000.0d0 87 enddo 88 do i=1,n+1 89 write(*,*) (c(i,j), j=1,n+1) 90 end do 91 endsubroutine gs_mat 92 93end module linertruss 94 95program kadai1 96 use linertruss 97 implicit none 98 integer n,i,j 99 integer,allocatable :: el(:) 100 real(8) S, E 101 real(8), allocatable :: a(:,:,:), u(:), f(:), length(:) 102 real(8), allocatable :: c(:,:) 103 allocate (length(n)) 104 allocate (el(n+1)) 105 allocate (a(2,2,n)) 106 allocate (c(n+1,n+1)) 107 allocate (u(n+1)) 108 allocate (f(n+1)) 109 call setvalue(n,S,E,length,el) 110 write(*,*) el(1:n+1) 111 call es_mat(n,a,S,E,length) 112 call print_mat(a,n) 113 write(*,*) n,a(1,1,2) 114 call gs_mat(n,a,c,el) !このsubroutineにおいて、aの配列の値は変えず、cの配列の値のみ変えたいのにaの値も変わってしまいます 115end program kadai1 116
試したこと
初めての事例なため、何を試せばいいのかわかりません
補足情報
macos,Mojave10.14.6
MacbookAir Early2015において起きています
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/10 11:49