科学网

 找回密码
  注册

tag 标签: 混编

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

python和fortran90的混编
zhoufcumt 2012-11-4 20:27
一个python和fortran90混编的例子 fortran90程序pow.f90: SUBROUTINE pow(x,n,p) IMPLICIT NONE !f2py intent(in) x !f2py intent(in) n !f2py intent(out) p REAL(KIND=8) :: x,n,p p = x**n END SUBROUTINE pow 这三个 !f2py intent(in) x !f2py intent(in) n !f2py intent(out) p 必须要有! 接着终端: f2py -m pow -c pow.f90 然后test.py内容: #!/usr/bin/env python import pow as pw x = 3. n = 3.5 p = pw.pow(x,n) print p 接着终端输入./test.py即可,下面继续深入python和fortran混编。
个人分类: Python|8892 次阅读|0 个评论
[转载]python和fortran之间的参数传递
zhoufcumt 2012-10-31 22:36
转载自:http://ifelseif.i.sohu.com/blog/view/151864079.htm 这个页面已经说的很详细了http://cens.ioc.ee/projects/f2py2e/usersguide/index.html#three-ways-to-wrap-getting-started 不过我还是从中提炼出几个特别需要注意的地方,以备自己日后查考 1. 数据类型,numpy默认的数据类型为float64也就是双精度浮点数,所以fortran里的浮点数也必须是双精度的,需要声明为real*8,默认的real是单精度的,不会报错但是会造成内存溢出! subroutine foo(nrow,ncol,array) integer nrow,ncol real*8 array(nrow,ncol) blahblahblah end subroutine 2. 有三种交互编译方法,最简单的是直接编译 pythonc:\python26\scripts\f2py.py-c--fcompiler=gnu95--compiler=mingw32-lmsvcr71-mfoofoo.f90 让f2py自己去认输入输出,但这样一来输入输出就不好控制,尤其是当传递数组的时候,要控制fortran程序是否把结果回写到原数组,需要更精确的定义。f2py提供了更精细的方法,先生成signature文件,手工改动后再编译 python c:\python26\scripts\f2py.py foo.f90 -m foo --overwrite-signature -h foo.pyf python c:\python26\scripts\f2py.py -c --fcompiler=gnu95 --compiler=mingw32 -lmsvcr71 foo.pyf foo.f90 最后还有一种方法,就是直接把signature信息当作注释写在f90文件中,只需要编译一下就可以了。 3.加intent(out)之后会把python对应函数中的相应变量隐藏,也就是不需要输入了!例如fortran中的函数为 subrouting foo(a,n) 给n维数组a加了intent(out)之后,表示它只是输出,不接受输入数据 于是在python中调用时,只需要指定维数n就可以了 foo(n)
个人分类: Python|5071 次阅读|0 个评论
[转载]军队“冲击”了国家科技进步奖的规则
热度 1 GumpForrest 2012-8-13 03:58
http://xys5.dxiong.com/xys/ebooks/others/science/dajia13/sunyinghao.txt 二军大孙颖浩和三军大卞修武2012年国家科技进步一等奖说明了什么?   ——-军队“冲击”了国家科技进步奖的规则   作者:饶舜   作为一名医学工作者,除了对于国内易患关系恶化颇感无奈外,对于国内医 学界学术腐败尤感愤懑!笔者是今年国家科技进步奖二等奖申报的失败者,深深 体会到了国内成果评奖的黑暗、政府部门和获奖人勾结共同拉拢评委一起创造国 内学术“奇迹”的过程。目前,军队系统是导致国家科技进步奖近年来评选陷入 混乱的主要原因(新语丝曾经曝光过军队单位获得国家科技进步奖的不端行为)。 众所周知, 第四军医大学在过去的4年中连续获得5个国家科技进步奖一等奖就 是个大笑话 (通过检索,查了其结果,真的好笑)。   国内医学界同行都明了: 国家奖励办的官员已经被军队的攻关腐化了!科 学网上刊登过,今年新增的国家科技创新团队奖被军队系统单位全包了也是实证。   将今年两个军医大学国家科技进步一等奖项目(国家公示118和157号项目) 摆出来供大家消遣消遣:   1. 项目名称: 前列腺癌诊疗体系的创新及其关键技术的应用   完成人:孙颖浩,高 新,叶定伟,刘明耀,贺大林,牛远杰,尚芝群,李 磊,易正芳,高 旭,周 铁,庞 俊,张海梁,任善成,王辉清   完成单位:中国人民解放军第二军医大学第一附属医院,中山大学附属第三 医院,复旦大学附属肿瘤医院,华东师范大学,西安交通大学附属第一医院,天 津市泌尿外科研究所   2. 项目名称:肿瘤血管生成机制及其在抗血管生成治疗中的应用   完成人:卞修武,关新元,寿成超,江秉华,杨治华,林李家宓,   彭红卫,方伟岗,娄晋宁,孔祥复,平轶芳,刘凌志,姚小红,余时沧,蒋 雪峰   完成单位:中国人民解放军第三军医大学,香港大学,北京大学,南京医科 大学,中国医学科学院肿瘤医院,香港中文大学,成都恒基医药科技有限公司, 中日友好医院,中国科学院上海生命科学研究院   大家看看: 检索之后发现这两个项目的第一完成人根本没有什么像样的论文, 最最重要的,两个项目明显是拼凑而成,各单位根本没有什么实质性合作历史, 只是为了共同的获奖利益,在军队的大旗下进行了混编,加上国家奖励办的内鬼 协调,就成就了2012年国家科技进步一等奖项目 。这将是国家科技报奖历史上值 得历史学家好好考究的事件,将是国家现在大力提倡科技体制改革的腐败实例分 析。   军队医学界的攻关可怕啊,中国的医学界可悲啊!
个人分类: 憨眼看世界|16552 次阅读|1 个评论
2011年12月的IDL程序开发、ENVI二次开发和混编开发视频专辑
dongyanqing 2012-1-8 13:24
视频文件列表: IDL12-06-1初步认识IDL.wmv IDL12-06-2使用IDL编译器.wmv IDL12-06-3IDL语言基础(变量等).wmv IDL12-06-4IDL语言基础(数组、字符串等).wmv IDL12-06-5IDL语言基础(结构体、指针、参数传递等).wmv IDL12-06-6输入输出.wmv IDL12-06-7搭建程序界面.wmv IDL12-06-8程序界面事件响应.wmv IDL12-07-1直接图形法显示.wmv IDL12-07-2对象图形法显示.wmv IDL12-07-3对象图形法显示多边形对象.wmv IDL12-07-4界面程序中使用对象图形法.wmv IDL12-07-5界面程序中使用对象图形法事件响应-图像平移.wmv IDL12-07-6自定义对象类编写.wmv IDL12-07-7C#调用IDL之IDLDrawWidget.wmv IDL12-08-1C#调用IDL之对象输出助手.wmv IDL12-08-2ENVI功能扩展之波段运算.wmv IDL12-08-3ENVI二次开发函数调用基础.wmv IDL12-08-4ENVI面向对象特征提取演示.wmv IDL12-08-5ENVI面向对象特征提取之二次开发.wmv IDL12-08-6C#调用ENVI面向对象特征提前功能(COM_IDL_Connect).wmv IDL12-08-7功能函数生成sav.wmv IDL12-08-8工程构建生成sav及C#下调用sav.wmv 优酷链接: http://www.youku.com/playlist_show/id_16834149.html
个人分类: IDL技术|4209 次阅读|0 个评论
[转载]资源一号02C星传回成像数据、ENVI5.0&SARsacpe4.4、IDL与C#混编
dongyanqing 2011-12-31 10:04
[转载]资源一号02C星传回成像数据、ENVI5.0&SARsacpe4.4、IDL与C#混编
ENVI/IDL eNewsLetter2011年12月发布: 资源一号02C星传回首批成像数据-图像清晰,ENVI 5.0 Beta版本和ENVI SARscape 4.4正式发布,IDL与C#混合编程技术。 网址: http://www.esrichina-bj.cn/newsletter/envi/201112/index.html 祝大家元旦快乐!!
个人分类: 杂谈|2490 次阅读|0 个评论
IDL与C#混合编程技术
dongyanqing 2011-12-13 23:01
IDL与C#混合编程技术
1 前言 C# (C Sharp) 是微软公司在 2000 年 6 月发布的一种新的编程语言。 C# 与 Java 有很多的相似之处;包括了诸如单一继承、界面、与 Java 几乎同样的语法,和编译成中间代码再运行的过程。它又借鉴了 Delphi 的一个特点,与 COM( 组件对象模型 ) 是直接集成的,而且它是微软公司 .NET windows 网络框架的主角。 IDL 则一直是应用程序开发和科学家进行可视化与分析的首选语言,因为它功能强大,简单易学,很少的几行代码就能实现其他语言很难实现的功能,所以它是进行科学数据分析、可视化表达和跨平台应用开发的高效软件和理想工具。作为第四代语法简单、面向矩阵运算的计算机语言, IDL 拥有丰富的分析工具包。同时支持遥感图像处理软件 ENVI 的二次开发,使得利用 IDL 进行 ENVI 二次开发实现数据处理分析和可视化程序变的非常容易。 2 C# 调用 IDL 方式 C# 可以通过 COM 组件的方式直接调用 IDL 进行开发。 IDL 提供了 IDLDrawWidget 和 COM_IDL_CONNECT 两个组件,其中 IDLDrawWidget 组件是带 UI 的可视组件, COM_IDL_CONNECT 是不带 UI 的功能组件,在实际使用的时候可以根据应用需求选取。 以 IDLDrawWidget 组件为例,该组件包含了多种功能方法(见表 1 ),这些方法使得 C# 在调用的时候方便进行初始化、功能调用、参数传递和事件响应传递。 表 1 IDLDrawWidget 组件的方法 方法名称 功能描述 CopyNamedArray 拷贝 IDL 下数组到组件调用环境中的变量数组 CopyWindow 将 IDLDrawWidget 组件显示内容拷贝到 Windows 剪贴板中 CreateDrawWidget IDLDrawWidget 控件初始化界面 DoExit 退出 ActiveX 控件并释放 IDL 占用的资源 ExecuteStr 执行 IDL 命令,相当于 IDL 的命令行功能 GetNamedData 获取 IDL 中变量的值 InitIDL IDL 运行环境初始化( 1 :成功; 0 ,失败; -1 组件未被许可; -2 , IDL 未安装许可) InitIDLEx IDL 运行环境初始化(可传入参数) Print 组件中显示内容输出到默认打印机 RegisterForEvents 组件是否传递程序事件 ( 参考表 17.2) SetNamedArray 基于输入的变量名和内容在 IDL 下创建数组 SetNameData 基于输入的变量名和内容在 IDL 下创建变量 SetOutputWnd 组件显示内容输出到指定窗口 VariableExists 判断 IDL 下是否存在此变量 3 关键技术 以在 Visual Studio 2008 C# 下调用 IDLDrawWidget 组件为例,分析下调用该组件的关键技术。 (一) 组件初始化 与其他 ActiveX 组件一样,在 VisualStudio 的工具箱组件上单击鼠标右键,弹出菜单中选择 ,见图 1. 图 1 加载组件 弹出的选择工具箱项界面中点击 TAB 界面 ,列表中找到“ IDLDrawWidget Control3.0 ”并勾选(图 2 )。若列表中不存在该组件,点击 查找 IDL 安装目录下的子目录“ bin\bin.x86 ”中的“ idldrawx3.ocx ”文件。 图 2 COM 列表 组件初始化前需要设置组件的 IDL 安装目录,本机的 IDL 安装目录可以通过查找注册表选项的方式获取,获取 IDL8.0 安装路径的 C# 示例代码如下: // 读取注册表获取 IDL8.0 RegistryKey rsg = null; rsg = Registry.LocalMachine.OpenSubKey("SOFTWARE\\ITT\\IDL\\8.0", true); if (rsg.GetValue("InstallDir") != null) // 读取失败返回 null { // 初始化 IDL80 路径 axIDLDrawWidget1.IdlPath = Path.Combine(rsg.GetValue("InstallDir").ToString(), @"IDL80\bin\bin.x86\idl.dll"); } int n; // 初始化 n = axIDLDrawWidget1.InitIDL((int)this.Handle); if (n == 0) { MessageBox.Show("IDL 初始化失败 ", "IDL 初始化失败,无法继续! "); return; } (二) 功能调用 IDLDrawWidget 组件支持调用 IDL 的源码文件和 sav 文件。其中 ExecuteStr 方法相当于 IDL 的命令行,而 IDL 可以使用点命令(见表 2 )在命令行下进行源码的编译和功能调用。故,通过 ExecuteStr 方法可以轻松的调用 IDL 功能。 表 2 点命令( DotCommand ) 命 令 功 能 .COMPILE 编译代码; .CONTINUE 继续执行代码; .EDIT 在编辑器中打开代码以便编辑; .FULL_RESET_SESSION 编译器完全重置(包括 DLM 等); .GO 执行最近编译过的主函数; .OUT 执行当前程序直至返回; .RESET_SESSION 编译器重置,等同于点击工具栏的 “ 重置 ” ; .RETURN 程序返回; .RENEW 新建一个 pro ; .RUN 编译内存中的程序并执行主程序; .SKIP 跳过程序段; .STEP 执行 1 个或 n 个程序; .STEPOVER 执行 1 个程序段,如果程序段中调用了其他函数则调试进入函数; .TRACE 程序异常时继续运行。 使用点命令在命令行下进行源码编译和运行的示例代码: IDL ; 编译源码文件,注意源码文件路径是字符串,用 ’’ 或 ”” 。 IDL .compile 'C:\temp\firstIDL.pro' % Compiled module: MYFUN. % Compiled module: FIRSTIDL. % Compiled module: TEST. IDL ; 调用源码中的 pro 执行 IDL firstidl abc 9 (三) 数据传递 IDLDrawWidget 组件通过 SetNamedArray 、 SetNameData 等方法进行数据传递(表 1 ), C# 与 IDL 之间支持基本的数据类型变量和数组传递(表 3 )。 表 3 IDL 与 ActiveX 下的通用的变量类型 IDL 类型 ActiveX 类型 IDL_TYPE_BYTE UT_UI1 – unsigned char IDL_TYPE_BYTE VT_I1 - signed char IDL_TYP_INT VT_I2 - signed short IDL_TYP_LONG VT_I4 - signed long IDL_TYP_FLOAT VT_R4 - float IDL_TYP_DOUBLE VT_R8 - double 传递字符串变量和数组的示例代码如下: // 初始化定义变量 object objStr = "abc"; object objOri,objNow; // 定义变量 this.axIDLDrawWidget1.SetNamedData("var", objStr); // 编译 IDL 功能代码并传入单个变量 this.axIDLDrawWidget1.ExecuteStr(@".compile 'exchangevar.pro'"); this.axIDLDrawWidget1.ExecuteStr("exchangevar, var = var"); // 将 IDL 中修改过的变量获得并对话框显示 objStr = this.axIDLDrawWidget1.GetNamedData("var"); // 显示 IDL 程序中更改后的值 MessageBox.Show("C# 中的变量值为: "+objStr.ToString()); // 定义数组 int dataarr = new int { { 6, 4 }, { 12, 9 }, { 18, 5 } }; // 将数组内容 copy 到 IDL 下的变量 arr 中 this.axIDLDrawWidget1.SetNamedArray("arr", dataarr, true); // 编译 IDL 功能代码并传入数组 this.axIDLDrawWidget1.ExecuteStr(".compile 'exchangeArr.pro'"); this.axIDLDrawWidget1.ExecuteStr("exchangeArr,arr,oriArr= oriArr"); // 通过 CopyNameArray 方法直接复制获取 IDL 中的数组 objOri = this.axIDLDrawWidget1.CopyNamedArray("oriarr"); // 通过 CopyNameArray 方法直接复制获取 IDL 中的数组 objNow = this.axIDLDrawWidget1.CopyNamedArray("arr"); // 弹出第一个元素的值 MessageBox.Show("C# 中的数组值为: " + ((Array)objNow).GetValue(0, 0)); (四) 事件传递 IDLDrawWidget 组件可以在 C# 或 IDL 下响应键盘和鼠标事件。即通过 C# 主程序可以触发组件的事件并由 IDL 事件响应程序进行响应。组件的事件响应处理方式与组件的 RegisterForEvents 值有关,各个值的含义见表 4 。 表 4 RegisterForEvents 对应功能描述 值 功能描述 0 停止传递所有事件 1 传递鼠标移动事件 2 传递鼠标按键点击事件 4 传递视图滚动条事件 8 传递暴露事件 组件界面中添加鼠标滚轮事件的示例代码如下: public Form1() { InitializeComponent(); // 增加滚轮滚动事件 ((Control)this).MouseWheel += new MouseEventHandler(Form1_MouseWheel); } private void IDLDrawWidgetCreate() { // 指定事件由 C# 响应 axIDLDrawWidget1.RegisterForEvents(3); } // 鼠标滚轮事件 void Form1_MouseWheel(object sender, MouseEventArgs e) { // 转换当前鼠标点在组件上的位置 y = axIDLDrawWidget1.Height - (e.Y - axIDLDrawWidget1.Location.Y); // 调用 IDL 的鼠标时间代码 axIDLDrawWidget1.ExecuteStr("oImg.WheelEvents," + e.Delta.ToString() + ","+ (e.X - axIDLDrawWidget1.Location.X).ToString() + "," + y.ToString()); } IDL 中的响应该事件的代码如下: ; 鼠标滚轮时的事件 PRO ImgSHow::WheelEvents,wType,xPos,yPos COMPILE_OPT idl2 ; 获取组件原始大小 self.OWINDOW.GETPROPERTY, dimensions = winDims,graphics_tree = oView oView.GETPROPERTY, viewPlane_Rect = viewRect ; 判断是放大还是缩小 IF wType GT 0 THEN rate = 0.8 ELSE rate = 1.125 ; 计算放缩后的显示区域大小 oriDis = *viewRect /winDims viewRect +=(1-rate)*oriDis viewRect = viewRect *rate ; 更新显示区域并重新渲染绘制 oView.SETPROPERTY, viewPlane_Rect = viewRect self.OWINDOW.DRAW END 类似的方式可以添加鼠标拉框放大和缩小等功能,即通过 C# 与 IDLDrawWidget 组件构建了一个完整的图像显示与基本处理程序,通过鼠标可以对显示图像进行放大、缩小和平移操作,并通过 IDL 实现了基本的图像处理、投影变换和仿真模拟功能。部分效果图: 图 3 灵活的操控 图 4 图像显示与图像处理 图 5 投影变换功能 图 6 卫星仿真模拟 4 结束语 通过 IDLDrawWidget 等组件提供的方法, C# 可以方便灵活的集成 IDL 程序,轻松搭建可视化分析与处理系统的框架,快速集成 IDL 的可视化分析与处理功能。这样充分发挥各语言的优势,构建复杂的可视化应用与分析的系统将会变得非常方便。
个人分类: IDL技术|15255 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-17 10:31

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部