Обновите два массива в Фортране, как в этой функции C ++ - PullRequest
1 голос
/ 21 февраля 2012

У меня есть функция C ++, которая обновляет 2 массива, причем массивы передаются по ссылке:

double* CPPF(double array[],int size, double a1[], double a2[]){
    int m = size, n = size
    /* code that updates a1 and a2 arrays goes here */
    return 0;
}    

В моей основной функции у меня есть

var bigArray = new double[size*size];

for (int i = 0; i < dimension; i++){
   for (int j = 0; j <= i; j++)
       bigArray[i * size + j] = bigArray [j * size+ i] = Other[i,j];
}

double[] a1 = new double[size * size];
double[] a2 = new double[size];

double* RESULT = CPPF(bigArray, size, a1, a2);

// Use updated a1 and a2 

Как бы я определил функцию Фортрана, которая обновляет эти 2 массива? Я знаю, что это возможно, потому что вы не передаете аргументы по значениям, только по ссылке.

Я до сих пор пробовал что-то вроде:

REAL FUNCTION  FF(A, size, a1,a2)
   IMPLICIT  NONE
   INTEGER, INTENT(IN) :: size
   REAL :: A(:,:), a1(:),a2(:)
   !UPDATE a1 and a2 and finish   
END FUNCTION  FF

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Вот перевод, включающий в себя распределение:

module arrays_module
  implicit none
  ! Define a kind parameter for double precision real numbers.
  integer, parameter :: rk = selected_real_kind(16)

  subroutine CPPF(array, a1, a2)
    ! Use assumed shape arrays
    real(kind=rk) :: array(:)
    real(kind=rk) :: a1(:)
    real(kind=rk) :: a2(:)
    integer :: m, n

    ! Use the size of the arrays
    m = size(a2)
    n = size(a2)

    ! Do the setting of your arrays...
  end subroutine CPPF
end module arrays_module

program main
  use arrays_module
  implicit none

  integer :: dimension, n
  real(kind=rk) :: bigArray(:)
  real(kind=rk) :: a1(:), a2(:)
  real(kind=rk) :: Other(dimension, dimension)

  ! Allocating the arrays dynamically
  allocate(bigArray(n*n))
  allocate(a1(n*n))
  allocate(a2(n))

  do i=1,dimension
    do j=1,i
      bigArray((i-1)*n + j) = Other(i,j)
      bigArray((j-1)*n + i) = Other(i,j)
    end do
  end do

  call CPPF(array = bigArray, a1 = a1, a2 = a2)
  ! Use the updated arrays...
end program main

Вы также можете сделать так, чтобы CPPF выделил для вас новые массивы, если это желательно.

2 голосов
/ 21 февраля 2012

То, что вы делаете, выглядит почти нормально.Обратите внимание только на то, что Fortran's real является поплавком одинарной точности, аналогом типа C float.

Я не уверен, каково возвращаемое значение вашей функции.В Фортране вы обычно используете subroutine s, если ничего не возвращаете:

subroutine  FF(A, size1, a1,a2)
   IMPLICIT  NONE
   INTEGER, INTENT(IN) :: size1
   REAL*8, dimension(size1), intent(inout) :: A(size1,size1), a1(size1),a2(size1)

   A(1,1) = a1(1)*a2(1)

END subroutine FF


program blah
implicit none
 real*8 :: A(3,3), a1(3), a2(3)

 a1(1)=3.d0; a2(1)=2.d0;

 call ff(A,3,a1,a2)

 print*, A

end program blah
...