|
[Fortran] 纯文本查看 复制代码 !Fortran的算法,Guass_Jordan法解线性方程
subroutine gauss_jordan(pa,pb,pc,n) Bind(C,Name="gauss_jordan")
use , intrinsic :: ISO_C_Binding
type(C_PTR) , value :: pa , pb , pc
integer , value :: n
real , pointer :: a(:,:),b(:),c(:)
call c_f_pointer( pa , a , [n,n])
call c_f_pointer( pb , b , [n])
call c_f_pointer( pc , c , [n])
print *,"a=",a
print *,"b=",b
print *,"c=",c
call up(a,b,n)
call up(a,b,n)
call low(a,b,n)
forall(i=1:n)c(i)=b(i)/a(i,i)
end subroutine gauss_jordan
subroutine up(a,b,n)
real a(n,n),b(n)
do i=1,n-1
do j=i+1,n
p=a(j,i)/a(i,i)
a(j,i:n)=a(j,i:n)-a(i,i:n)*p
b(j)=b(j)-b(i)*p
end do
end do
end subroutine up
subroutine low(a,b,n)
real a(n,n),b(n)
do i=n,2,-1
do j=i-1,1,-1
p=a(j,i)/a(i,i)
a(j,i:n)=a(j,i:n)-a(i,i:n)*p
b(j)=b(j)-b(i)*p
end do
end do
end subroutine low
C++调用fortran的DLL的例子
[C++] 纯文本查看 复制代码 extern "C" void gauss_jordan( float *a , float *b , float *c , int n );
const int N = 5;
int main(int argc, char *argv[]){
float *a , *b , *c;
a = new float[N*N];
b = new float[N];
c = new float[N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
a[i*N+j] = (i+1)*j;
}
b[i] = i*10-3;
c[i] = i*-30+23;
}
gauss_jordan( a , b , c , N );
delete[] a;
delete[] b;
delete[] c;
return 0;
}
问题已解决!当C++中需要传递二维数组作为形参进入fortran算法时,并且大小不确定,可以先在C++中将它视为一维数组,保证该数组在内存地址中的连续性!不要用指针数组!那样会导致地址不连续,传入fortran算法时会出错!
总结起来,由于fortran中是按列存储数组,而C++中是按行存储,而在传递数组时,只是传递数组的首地址,所以当需要传入二维、三维、多维数组给fortran时,完全可以用C++中的一维数组代替,即只需要保证在C++中的那个数组是连续的内存区域,而不要用指针数组!!!(转换成二维、三维时需要注意两种语言的存储规则)
感谢2338021群里的群主大大,问题已解决!!!
再次感谢2338021群里的群主大大,Fortran Coder群里大佬云集,欢迎各位加入!! |
评分
-
查看全部评分
|