填周六的坑,CHEMKIN是一个燃烧经常使用的Fortran代码包。笔者当前的代码为C++的MPI并行代码,为了在代码中使用CHEMKIN的模块,需要进行C++和Fortran的混编。

基础的混编测试可以查看前一篇
https://blog.csdn.net/qq_40583925/article/details/123024724

调试花了几天的时间,这里先讲需要注意的点,然后直接贴代码~

编译选项的使用

前面已经遇到过C++代码混编和C代码混编不同的问题,解决方案便是使用extern "C"功能,指示编译器将一小块代码按照C语言的方式链接。这个功能的详细介绍有几个讲得比较好的链接推荐

https://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html

https://baike.baidu.com/item/extern%20%22C%22/15267013?fr=aladdin

https://blog.csdn.net/qq_24282081/article/details/87530239

但是使用过程中还有额外的问题需要注意,就是使用extern "C"的代码在调用C++中的库时,会出现这样的报错

原因可以参考这个博客
https://blog.csdn.net/kittaaron/article/details/8101391

实际上是我们指定了C语言的方式链接后,默认链接的库文件变成了libstdc++.so,而不是默认的libc.so,故需要特殊指明

同理,如果混编代码中想要调用fortran的函数,编译器也无法找到,也需要指定

故一定要添加选项

-lstdc++ -lgfortran

数组的使用

前几天的博客中均为单个变量的数据传递,但是实际使用过程中会使用到数组,因此也需要给定数组的传递。因为Fortran需要传址,直接用数组的地址即可。

#include <stdio.h>
#ifdef __cplusplus
extern "C"{
#endifvoid mcinit_(int *,int *,int *,int *,int *,double *);#ifdef __cplusplus
}
#endifextern int IData[60];
extern double FData[3000];void Init(){int LINKTP = 35;int LOUT = 6;int LENIMC = 60;int LENRMC = 3000;mcinit_(&LINKTP,&LOUT,&LENIMC,&LENRMC,IData,FData);
}

其中IDataFData即为数组。

代码实现

我们当前要调用的是TranLib.F这个CHEMKIN里面的函数库,他先将tran.bin这个二进制的Linking File读入,存入自己的浮点和整型数组中。然后供其中的各种函数使用。

即需要先使用MCINIT函数初始化,然后调用具体的函数例如MCAVIS即可。

我们给出一个Fortran代码调用的例子:

program TranlibTestimplicit double precision (A-H,O-Z), integer(I-N)character VERS*16,PREC*16logical KERRparameter (LINKTP=35)DIMENSION IData(60)DIMENSION FData(3000)DIMENSIOn X(10)open(LINKTP,form='unformatted',status='unknown',1            file='tran.bin')rewind LINKTPread(LINKTP,ERR=999) VERS,PREC,KERRread(LINKTP,ERR=999) LI,LR,NO,NKK,NLITEwrite(6,*) VERS,PREC,KERRwrite(6,*) LI,LR,NO,NKK,NLITEcall MCINIT(LINKTP,6,60,3000,IData,FData)c     给定一个初始组分do n = 1,10X(n) = 0.0d0end doX(1) = 1.0d0c     给定温度T = 300.0d0c     计算混合物的粘性      call MCAVIS(T,X,FData,vismix)
c     注意当前粘性单位为GM/CM*S GM为克的的缩写
c     1GM/CM*S = 0.1 kg/m*swrite(6,*) vismix*0.1d0999   CONTINUEend

本来这需要在fortran代码中打开文件tran.bin,然后将文件流编号LINKTP传入。这里直接对MCINIT.F进行简单的改写,让函数内部打开这个文件。

...
CDIMENSION IMCWRK(*), RMCWRK(*)CHARACTER*16 VERS, PRECLOGICAL IOK, ROK, KERRCOMMON /MCCONS/ VERS, PREC, KERR, LENI, LENR
CCOMMON /MCMCMC/ RU, PATMOS, SMALL, NKK, NO, NLITE, INLIN, IKTDIF,1                IPVT, NWT, NEPS, NSIG, NDIP, NPOL, NZROT, NLAM,2                NETA, NDIF, NTDIF, NXX, NVIS, NXI, NCP,3                NCROT, NCINT, NBIND, NEOK, NSGM,4                NAST, NBST, NCST, NXL, NR, NWRK, K3c     将打开文件的操作放在了这里open(LINKMC,form='unformatted',status='unknown',1            file='tran.bin')C
C
C         THE FOLLOWING NUMBER SMALL IS USED IN THE MIXTURE DIFFUSION
C        COEFFICIENT CALCULATION.  ITS USE ALLOWS A SMOOTH AND WELL
C        DEFINED DIFFUSION COEFFICIENT AS THE MIXTURE APPROACHES A
C        PURE SPECIES, EVEN THOUGH STRICTLY SPEAKING THERE DOES NOT
...

然后写好C++的代码,main.cpp调用Init.cppGetVis.cpp分别调用MCINIT初始化,以及调用MCAVIS计算粘性。而这两个函数又会调用另外几个CHMEKIN中的函数MCEPSG,MCLEN,MCEVAL。贴代码如下:

//main.cpp
#include <iostream>
using namespace std;int IData[60];
double FData[3000];double GetVis();
void Init();int main(){Init();cout<<"Init Finished"<<endl;double vis = GetVis();cout<<"Vis="<<vis<<endl;return 0;
}//Init.cpp
#include <stdio.h>
#ifdef __cplusplus
extern "C"{
#endifvoid mcinit_(int *,int *,int *,int *,int *,double *);#ifdef __cplusplus
}
#endifextern int IData[60];
extern double FData[3000];void Init(){int LINKTP = 35;int LOUT = 6;int LENIMC = 60;int LENRMC = 3000;mcinit_(&LINKTP,&LOUT,&LENIMC,&LENRMC,IData,FData);
}//GetVis.cpp
#include <stdio.h>
#ifdef __cplusplus
extern "C"{
#endifvoid mcavis_(double *,double *,double *,double *);#ifdef __cplusplus
}
#endifextern int IData[60];
extern double FData[3000];double GetVis(){double T;double X[10];double vismix;//给定一个组分for (int n=0;n<10;n++){X[n] = 0.0;}X[0] = 1.0;//给定温度T = 300.0;mcavis_(&T,X,FData,&vismix);return vismix;
}

最终编译运行得到结果如下:

成功!

在C++中混编调用CHEMKIN相关推荐

  1. object-c 混编 调用C,C++接口

    xcode 支持 object-c 混编,在object-c 中调用c,c++接口 第一步 定义c语言 接口(File.c) #include <stdio.h> void printsB ...

  2. php中数据类型、数组排序、循环语句、混编、操作本地文件流程、常用API、函数、魔术常量

    php中数据类型: php中有7种数据类型,分别是: //1.String字符串,用引号包裹的字符,如:$str = 'hello word';//2.Integer整型,可以是正数或负数,有十进制. ...

  3. swift混编oc碰到的问题

    在swift中混编苹果官方的Reachability OC文件. 因为swift工程的target是生成framework而非app,framework中调用oc与app中使用桥接文件还不一样,参考: ...

  4. swift 打包sdk_在封装SDK中Swift和OC混编之相互调用

    oc和swift混编之相互调用.jpg 在非SDK中: 1.swift调用oc 步骤: 创建 工程名-Bridging-Header.h 放入oc的头文件,swift即可调用 在swift项目中或者在 ...

  5. c++与oc混编之c++中调用oc方法

    项目中用到了C++与OC混编,正好有时间来总结一下. 基本思路: C++中是不能直接调用OC代码的,所以要通过一个中介--C,来让他们建立联系,从而实现在C++中调用OC代码. 1.新建C++文件 X ...

  6. 解决了java+matlab混编+web(jsp)调用Matlab,网页中显示Figure,详细实例

    例子简介 网上java+matlab混编的挺多,大多数实例也都能实现出来,但是将matlab生成出来Figure显示在jsp页面中并配合WebFigure实现的例子却很少,所以我将自己的尝试结果详细的 ...

  7. c++ python opencv_ubuntu下C++与Python混编,opencv中mat类转换

    C++ 与 Python 混编 因为赶项目进度,需要使用到深度学习的内容,不过现有的深度学习框架大多使用python代码,对于不会改写C++的朋友来说,需要耗费大量的时间去改写,因此,使用python ...

  8. Swift与OC混编过程中的配置

    女主宣言 在使用Swift进行iOS开发的过程中,经常涉及到Swift与OC混编的情况,有时主工程是OC的需要另外编入Swift代码,而有时主工程是Swift的需要另外编入OC代码.这其中涉及到修改一 ...

  9. Xcode中C、C++、Object-C3种语言的混编

    http://hi.baidu.com/onejw/item/f34390c997cdc226a1b50ae http://www.cocoachina.com/ask/questions/show/ ...

最新文章

  1. 简单介绍Vue之vue.$set()方法源码案例
  2. 在近期,美众议院为何密集提出了15项新兴技术法案?
  3. 再议Unity 3D
  4. codeforces1440 D. Graph Subset Problem
  5. 强化学习q学习求最值_通过Q学习更深入地学习强化学习
  6. IOPS和Throughput
  7. FFmpeg总结(十三)用ffmpeg基于nginx实现直播功能,不用第三方SDK,自研推流拉流
  8. python wx包_python的wxpython包
  9. VISIO画立体图——VISIO画图技巧
  10. 关于SQLserve安装中出现“启用windows功能NetFx3时出错“
  11. “互联网+”大学生创新创业大赛项目策划书
  12. 端口扫描 -- Masscan-Gui
  13. 如何筹办一场千人技术峰会?
  14. 虚函数表和虚函数表指针的汇编分析
  15. 【华为机试真题 Python实现】九宫格按键输入【2022 Q1 Q2 Q3 |200分】
  16. 【题解】LuoGu5423:[USACO19OPEN]Valleys P
  17. 红米5a android 版本,#MIUI#关于红米手机4高配版 Android版本适配的说明【miui9吧】_百度贴吧...
  18. ApacheCon Asia 2022 开启报名:Pulsar 技术议题重磅亮相
  19. 怎么删除计算机c盘应用,怎样删除电脑c盘中的垃圾
  20. 在进行IBEACON定位时所应考虑到的误差与建议

热门文章

  1. Android平板电脑2012年
  2. 购物车+购买样例 springmvc
  3. 问题 L: 梦回高中,再创辉煌
  4. 电脑出现Windows Xp后就黑屏,进不了系统的解决办法
  5. 计算机控制面板里没有家长控制,win7 家长控制不让上网的方法是什么_win7如何设置家长控制图文教程...
  6. 微软 appcenter_使用Visual Studio AppCenter使用Xcode和IPA托管构建自动化
  7. 硬核分享:想象中的人物画法
  8. 《趣学算法》目录及签名版
  9. Android企业微信分享到小程序
  10. itunes store切换账户_如何将iTunes App Store帐户切换到另一个国家 | MOS86