c语言引用save函数,如何在c代码中调用模块中包含的Fortran90函数?

我在我的C项目中包含了一个不属于我的fortran90程序.

在第一个stept我尝试通过他们的name_()调用该函数,并通过显示obj文件的符号(使用nm)得到错误“未定义的引用mp_mpi_cartesian_init_”我发现该函数被其模块调用为module_function_所以我添加模块名称和我得到相同的问题,但在fortran obj之间,如“Constants.f90 :(.text 0x36):未定义引用__powi4i4”

这是c代码:

#include

#include

using namespace std;

extern"C" {

void mod_save_wave_mp_read_it_psi_(int * it,complex* psi_E1E2 );

void mod_mpi_cartesian_mp_mpi_cartesian_init_( );

extern int mod_mpl_h_mp_iproc_ ;

}

int main(){

complex psi_local[512*24*512*24];

int it ;

mod_mpi_cartesian_mp_mpi_cartesian_init_();

cout << "proc :" << mod_mpl_h_mp_iproc_ << "avant lecture\n";

mod_save_wave_mp_read_it_psi_(&it,psi_local);

cout << "psi ="<< psi_local[0] << "poiur le proc "<

}

这是一个模块的例子:

MODULE mod_save_wave

USE mod_constants

USE mod_MPI_CARTESIAN

USE mod_time_mesure, ONLY : tempsEcoule

USE mod_input_data, ONLY : Nt_laserPsansLaser

USE mod_input_data, ONLY : n_phi, n_rho1_seg, n_rho2_seg

USE mod_input_data, ONLY : Nt_periode, save_periodique

!

IMPLICIT NONE !

REAL(kind=d_t) :: prog_start_time, time_max_second !

character(len=80) :: IntermedWaveDir

!================================================================

CONTAINS

SUBROUTINE begin_count_time()

IMPLICIT NONE

prog_start_time = tempsEcoule() !

END SUBROUTINE begin_count_time

SUBROUTINE READ_IT_PSI( it, psi_E1E2 )

IMPLICIT NONE

!

INTEGER :: it !

COMPLEX(kind=d_t), DIMENSION(n_phi,n_rho1_seg,n_phi,n_rho2_seg) :: psi_E1E2 !

!================================================================================

integer :: c

do c = 0, c_max-1

if( mod(iproc,c_max)==c ) then

!

OPEN( unit=11,file=concat(trim(IntermedWaveDir),concat(concat('BACK/wave_',str_iproc),'_2p2p2')),&

status='old', form='unformatted', MODE='READ' )

READ(11) it !

READ(11) psi_E1E2 !

CLOSE(11) !

print*,'iproc,readed it=',iproc, it

endif

CALL MPI_BARRIER(MPI_COMM_WORLD,infompi) !

!================================================================================

enddo

!================================================================================

END SUBROUTINE READ_IT_PSI

SUBROUTINE WRITE_IT_PSI( it, psi_E1E2 )

IMPLICIT NONE

!

INTEGER :: it !

COMPLEX(kind=d_t), DIMENSION(n_phi,n_rho1_seg,n_phi,n_rho2_seg) :: psi_E1E2 !

!================================================================================

integer :: c

do c = 0, c_max-1

if( mod(iproc,c_max)==c ) then

!

OPEN( unit=11,file=concat(trim(IntermedWaveDir),concat(concat('wave_',str_iproc),'_2p2p2')),&

form='unformatted') !

WRITE(11) it+1 !---- recommence a partir de la prochaine iterat!

write(11) psi_E1E2 !

CLOSE(11) !

endif

CALL MPI_BARRIER(MPI_COMM_WORLD,infompi) !

!================================================================================

enddo

END SUBROUTINE WRITE_IT_PSI

END MODULE mod_save_wave

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值