Добавить массивы неравной длины в Фортране до общего индекса - PullRequest
0 голосов
/ 24 апреля 2020

Извините, если этот вопрос базовый c, но я научил себя фортрану, посмотрел этот код и перепробовал много вещей, которые начинаю путать. Я выполнил интерполяцию и записал вывод в массив, и я хотел бы добавить этот массив в другой массив, который существует в коде, но мое добавление дает совершенно странные результаты. На графике, который я прикрепил, я ожидаю, что дополнение (Всего cls) будет следовать красной пунктирной линии (то же самое дополнение, но сделано вне кода вручную), бит вместо этого следует за желтой линией.

            use trilinear
            use array_mod
            use variables

            implicit none
            integer (cosmosis_block) :: block
            integer (cosmosis_status) :: status

            integer, parameter :: input_set = 1
            real  :: cls(2:standard_lmax_ksz,1:4)
            real(8)  :: cls_double(2:standard_lmax_ksz,1:4), cls_phi(2:standard_lmax)
            real(8)  :: cls_final(2:standard_lmax_ksz,1)
            integer  :: ell(2:standard_lmax_ksz), l
            logical, parameter :: switch_polarization_convention = .false.  
            real(8), DIMENSION(1448) :: interpolated_array
            real(8) :: inner_coord(1448,3)
            real(8) :: lambda
            real(8) :: mass
            real(8), DIMENSION(1448,27) :: coord
            integer :: m, max_rows, n, lam, inner_row
            REAL(8)  :: interpolated_value(1:standard_lmax_ksz)
            real(8) :: interpolated_index

            integer :: zeta
            Logical :: first_time = .True.
            CHARACTER(len=100) :: FN
            type(CambParams) :: params
            character(len=3),dimension(3) :: mass_array
            N=3                                     
            mass_array(1) = '2e8'
            mass_array(2) = '2e9'
            mass_array(3) = '3e9'
            !!!

            status = 0

            call CAMB_GetCls(cls, standard_lmax_ksz, input_set, switch_polarization_convention)
            cls_double(:,1:4) = cls * 7.4311e12  !cmb output scale       

            if(first_time) then
            max_rows=1448
                    lam = 80
                    DO I=1,N
                            lam = lam + 60
                            zeta=20
                            do j=1,N
                                 zeta = zeta + 20
                                    do k=1,N
                                          WRITE(FN,10)lam,zeta(mass_array(k))!,k=1,N)
                                    WRITE(6,*)FN!filename
                                    OPEN(99,FILE=FN, action='read', status='old',position='rewind')
                                    do inner_row=1,max_rows
                                            read (99,*)(inner_coord(inner_row,l),l=1,3)
                                            coord(:,9*I+3*j+k-12)=inner_coord(:,3)
                                    end do
                                    CLOSE(99)       
                                    end do
                            end do
                    END DO
            10 FORMAT('4e3_2048_',(I3.0),'',(I2.2),'',(A3),'.ksz_cl.txt') !length of thisis decided by FN
            print *, first_time
            first_time = .False.
            endif
            interpolated_array = trilinear_mod(params%lambda_ksz, params%zeta_ksz, params%mmin_ksz, coord)

           open (unit=96, file='interpolated_array_new.txt')!, action='write')!, status='replace')            
            do n = 2, 17
                    interpolated_index = n
                    interpolated_value = 0
                    write(96,'(2f16.10)') interpolated_index, interpolated_value
            end do
            do m = 1,max_rows-1
                    write(96,'(2f16.10)') inner_coord(m,1), interpolated_array(m)
                    do n = 1,17
                            interpolated_index = inner_coord(m,1)+n
                            interpolated_value = interpolated_array(m)*(1-n/18.) + interpolated_array(m+1)*(n/18.)
                            write(96,'(2f16.10)') interpolated_index, interpolated_value
                    end do
            end do
            close(96)

            cls_final(:,1) = cls_double(:,1) + interpolated_value

plot of the aarrays

1 Ответ

0 голосов
/ 27 апреля 2020

Одна из проблем здесь заключается в том, что вы определили interpolated_value как массив REAL (8) :: interpolated_value (1: standard_lmax_ksz)

И использовали его в качестве средства масштабирования в нескольких местах (один из примеров) interpolated_value = 0

Если вы поместите IMPLICIT NONE перед вашими определениями, вы лучше поймете эти вещи.

Без дополнительных подробностей, таких как, по крайней мере, часть вашего входного файла, это все, что мы можем предложить .

...