在C++中混编调用CHEMKIN
填周六的坑,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);
}
其中IData
和FData
即为数组。
代码实现
我们当前要调用的是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.cpp
和GetVis.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相关推荐
- object-c 混编 调用C,C++接口
xcode 支持 object-c 混编,在object-c 中调用c,c++接口 第一步 定义c语言 接口(File.c) #include <stdio.h> void printsB ...
- php中数据类型、数组排序、循环语句、混编、操作本地文件流程、常用API、函数、魔术常量
php中数据类型: php中有7种数据类型,分别是: //1.String字符串,用引号包裹的字符,如:$str = 'hello word';//2.Integer整型,可以是正数或负数,有十进制. ...
- swift混编oc碰到的问题
在swift中混编苹果官方的Reachability OC文件. 因为swift工程的target是生成framework而非app,framework中调用oc与app中使用桥接文件还不一样,参考: ...
- swift 打包sdk_在封装SDK中Swift和OC混编之相互调用
oc和swift混编之相互调用.jpg 在非SDK中: 1.swift调用oc 步骤: 创建 工程名-Bridging-Header.h 放入oc的头文件,swift即可调用 在swift项目中或者在 ...
- c++与oc混编之c++中调用oc方法
项目中用到了C++与OC混编,正好有时间来总结一下. 基本思路: C++中是不能直接调用OC代码的,所以要通过一个中介--C,来让他们建立联系,从而实现在C++中调用OC代码. 1.新建C++文件 X ...
- 解决了java+matlab混编+web(jsp)调用Matlab,网页中显示Figure,详细实例
例子简介 网上java+matlab混编的挺多,大多数实例也都能实现出来,但是将matlab生成出来Figure显示在jsp页面中并配合WebFigure实现的例子却很少,所以我将自己的尝试结果详细的 ...
- c++ python opencv_ubuntu下C++与Python混编,opencv中mat类转换
C++ 与 Python 混编 因为赶项目进度,需要使用到深度学习的内容,不过现有的深度学习框架大多使用python代码,对于不会改写C++的朋友来说,需要耗费大量的时间去改写,因此,使用python ...
- Swift与OC混编过程中的配置
女主宣言 在使用Swift进行iOS开发的过程中,经常涉及到Swift与OC混编的情况,有时主工程是OC的需要另外编入Swift代码,而有时主工程是Swift的需要另外编入OC代码.这其中涉及到修改一 ...
- Xcode中C、C++、Object-C3种语言的混编
http://hi.baidu.com/onejw/item/f34390c997cdc226a1b50ae http://www.cocoachina.com/ask/questions/show/ ...
最新文章
- 简单介绍Vue之vue.$set()方法源码案例
- 在近期,美众议院为何密集提出了15项新兴技术法案?
- 再议Unity 3D
- codeforces1440 D. Graph Subset Problem
- 强化学习q学习求最值_通过Q学习更深入地学习强化学习
- IOPS和Throughput
- FFmpeg总结(十三)用ffmpeg基于nginx实现直播功能,不用第三方SDK,自研推流拉流
- python wx包_python的wxpython包
- VISIO画立体图——VISIO画图技巧
- 关于SQLserve安装中出现“启用windows功能NetFx3时出错“
- “互联网+”大学生创新创业大赛项目策划书
- 端口扫描 -- Masscan-Gui
- 如何筹办一场千人技术峰会?
- 虚函数表和虚函数表指针的汇编分析
- 【华为机试真题 Python实现】九宫格按键输入【2022 Q1 Q2 Q3 |200分】
- 【题解】LuoGu5423:[USACO19OPEN]Valleys P
- 红米5a android 版本,#MIUI#关于红米手机4高配版 Android版本适配的说明【miui9吧】_百度贴吧...
- ApacheCon Asia 2022 开启报名:Pulsar 技术议题重磅亮相
- 怎么删除计算机c盘应用,怎样删除电脑c盘中的垃圾
- 在进行IBEACON定位时所应考虑到的误差与建议
热门文章
- Android平板电脑2012年
- 购物车+购买样例 springmvc
- 问题 L: 梦回高中,再创辉煌
- 电脑出现Windows Xp后就黑屏,进不了系统的解决办法
- 计算机控制面板里没有家长控制,win7 家长控制不让上网的方法是什么_win7如何设置家长控制图文教程...
- 微软 appcenter_使用Visual Studio AppCenter使用Xcode和IPA托管构建自动化
- 硬核分享:想象中的人物画法
- 《趣学算法》目录及签名版
- Android企业微信分享到小程序
- itunes store切换账户_如何将iTunes App Store帐户切换到另一个国家 | MOS86