fortran代码和c ++代码的不同结果

时间:2017-11-18 19:53:19

标签: c++ fortran

我不解释这两个用c ++编写的代码1和Fortran中的第二个代码有什么不同......我没有明白差异......

C ++:

# include <iosfwd>
# include <vector>
# include <cmath>
# include <iomanip>
# include <iostream>

std::vector<double> dot( int size, std::vector<double> x, 
                         std::vector<double> aa, std::vector<int> ja)
{     

      std::vector<double> y(x.size());

      for(auto i = 0; i < size ; i++ )
            y.at(i) = aa.at(i) * x.at(i);

      for(auto i=0 ; i < size ; i++ )
      {
         //for(auto k=ja.at(i) ; k< ja.at(i+1)-1 ; k++ )
         auto k = ja.at(i);

         do
         {
            y.at(i) += y.at(i) + aa.at(k) * x.at(ja.at(k)) ;
            k++;
         }
         while(k < ja.at(i+1)-1) ;

      }

}


int main()
{
    std::vector<double> x = {0.,1.3,4.2,0.8} ;

    std::vector<double> aa = {1.01,4.07,6.08,9.9,0.,2.34,3.12,1.06,2.2};
    std::vector<int>    ja = {6,7,7,8,10,3,1,1,3};

    std::vector<double> y = dot(x.size(), x , aa , ja);

    for(auto& i : x)
         std::cout << i << ' ' ;   
    std::cout << std::endl;  
}

Fortran代码,我知道c ++的索引为0,Fortran为1 但我想我已经考虑过了!顺便说一句,正确的是fortran代码如下:

MODULE MSR
 IMPLICIT NONE

CONTAINS
     subroutine amuxms (n, x, y, a,ja)
      real*8  x(*), y(*), a(*)
      integer n, ja(*)
      integer i, k
      do 10 i=1, n
        y(i) = a(i)*x(i)
 10     continue
      do 100 i = 1,n

         do 99 k=ja(i), ja(i+1)-1
            y(i) = y(i) + a(k) *x(ja(k))
 99      continue
 100  continue

      return

      end

END MODULE

PROGRAM MSRtest
USE MSR
IMPLICIT NONE
INTEGER :: i
REAL(KIND(0.D0)), DIMENSION(4) :: y, x= (/0.,1.3,4.2,0.8/)

REAL(KIND(0.D0)), DIMENSION(9) :: AA = (/ 1.01, 4.07, 6.08, 9.9, 0., 2.34, 3.12, 1.06, 2.2/) 
INTEGER , DIMENSION(9)         :: JA = (/6, 7, 7, 8, 10, 3, 1, 1, 3/)
CALL amuxms(4,x,y,aa,ja)

WRITE(6,FMT='(4F8.3)') (y(I), I=1,4)    

END PROGRAM

我已经解决了我犯了一个大错的错误!使用ja_作为索引..我忘了减1!

所以工作功能是:

# include <iosfwd>
# include <vector>
# include <cmath>
# include <iomanip>
# include <iostream>

std::vector<double> dot( int size, std::vector<double> x, 
                         std::vector<double> aa, std::vector<int> ja)
{     

      std::vector<double> y(x.size());

      for(auto i = 0; i < size ; i++ )
            y.at(i) = aa.at(i) * x.at(i);

      for(auto i=0 ; i < size ; i++ )
      {

         auto k = ja.at(i)-1;

         do
         {
            y.at(i) += aa.at(k) * x.at(ja.at(k)-1) ;
            k++;
         }
         while(k < ja.at(i+1)-1) ;

      }
      return y;
}

两个代码的差异在于使用ja_(index)作为其他向量的索引,而没有考虑到Fortran代码ja_(1)中的ja_的第一个值c ++第二个! @Vladimir F它现在清楚了吗?

1 个答案:

答案 0 :(得分:1)

我看到C ++代码有几个问题。

首先,dot函数不返回任何内容。它最后需要return y;语句。

另一个是在该函数的最内层循环中计算y.at(i)。它应该是y.at(i) = y.at(i) + aa...y.at(i) += aa...,而不是两者。

第三个问题是,在输出循环中,您使用了错误的数组(x而不是y)。

可能还有其他问题。在调试器中运行程序并比较它们的执行情况可以帮助发现它们。