(推荐)Abaqus中C++子程序开发入门

news/2024/10/9 11:51:26/

ABAQUS是支持C++子程序开发的,相比于传统的Fortran,C++作为高级语言的优势不言而喻,再搭配优秀的C++程序库,使得我们的编程效率大大提高,尤其是对于熟悉C++编程的开发者,不失为一种更好的选择。

1 软件配置

1.1 环境准备

我使用的开发软件搭配是Abaqus 2022 + Visual Studio 2019 + OneAPI 2022。虽然我们使用C++进行子程序开发,但是使用Intel的OneAPI中的Fortran模块是必须的,否则在编译链接C++源程序时,会发生如下错误:

LINK: fatal error LNK1104: cannot open file “LIBIFCOREMD.LIB”

“LIBIFCOREMD.LIB” 这个库是Intel的Fortran库,所以必须要使用到OneAPI中的Fortran模块。
要特别注意Visual StudioOneAPI版本搭配的问题,否则在安装OneAPI的时候会无报错闪退。我曾经尝试Visual Studio 2019 + OneAPI 2021,结果OneAPI安装时总是在continue后无情退出,当卸载VS后,就可以正常安装了,所以一定要注意相关软件版本的搭配,避开这些bug的折磨。

1.2 软件安装

软件的安装顺序需要保证VS2019的安装在OneAPI之前,因为其安装需要依赖VS2019。
(1)Abaqus 2022安装网上有很多教程,正常安装就行;
(2)VS2019安装社区版,组件只需要勾选C++桌面开发选项;
在这里插入图片描述

(3)OneAPI只需要安装HPCKit中的Fortran模块。(节省磁盘空间。。)
在这里插入图片描述

1.3 软件关联

找到abq2022.bat编辑打开。
在这里插入图片描述
添加如下语句:

call "C:\Program Files (x86)\Intel\oneAPI\compiler\2022.2.1\env\vars.bat" intel64 vs2019

1.4 关联测试

这里给出一段测试代码,将其放在Abaqus Command命令执行目录下,如果能正常编译,说明关联没有问题。

#include <cmath>
#include <aba_for_c.h>extern "C" void FOR_NAME(dload,DLOAD) (double & F,                  // VALUE TO BE RETURNED: Magnitude of the distributed loadconst int    & KSTEP,        // Step numberconst int    & KINC,         // Increment numberconst double(& TIME)[2],     // (1) step time; (2) total timeconst int    & NOEL,         // Element numberconst int    & NPT,          // Load integration point numberconst int    & LAYER,        // Layer numberconst int    & KSPT,         // Section point number within the current layerconst double(& COORDS)[3],   // Array containing the coordinates of the load integration pointconst int    & JLTYPE,       // Load type for which this call to DLOAD is madeconst char  (&SNAME)[80]     // Surface name
) {F = 100;
}

在这里插入图片描述
编译后生成目标文件。
在这里插入图片描述

1.5 计算库配置

为了后续发挥出C++编程的优势,我们配置好第三方科学计算库,方便直接调用。这里我使用Armadillo(C++ library for linear algebra & scientific computing)。
将下载好的Armadillo文件夹里/examples/lib_win64路径下的 libopenblas.lib复制C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64到路径下,而libopenblas.dll复制到C:\Windows\System32
当然还需要告诉VS2019 Armadillo的头文件的位置。直接将下载的Armadillo中include文件夹下的两个文件,复制到此路径C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include下,这样VS就可以找到相关头文件了。
在VS中测试下使用效果:

#include <armadillo>
#include <iostream>using namespace std;
using namespace arma;int main() {// construct a matrix according to given size and form of element initialisationmat A(2, 3, fill::zeros);// .n_rows and .n_cols are read onlycout << "A.n_rows: " << A.n_rows << endl;cout << "A.n_cols: " << A.n_cols << endl;system("pause");return 0;
}

在这里插入图片描述
为了后续能够使用Abaqus方式编译,我们需要将此文件C:\SIMULIA\EstProducts\2022\win_b64\SMA\site\win86_64.env中的link_sl变量末尾添加文件名:libopenblas.lib

2 子程序开发练习

2.1 开发基础

Abaqus的C++子程序开发在帮助文档中很少提及,但是文档在About User Subroutines and Utilities还是进行了简单介绍。只要C++代码外形按照格式开始编写,里面的内容就可以自由发挥啦。关于外形格式我们可以参照Fortran进行编写。
在这里插入图片描述

2.2 DLOAD

上面其实我们已经给出了Dload子程序的C++形式,我们可以将其与帮助文档给出的Fortran格式,做个对比,可以看到函数参数是一致的。所以对于任意Fortran格式的子程序,完全可以改写为C++格式。

      SUBROUTINE DLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,1 COORDS,JLTYP,SNAME)
CINCLUDE 'ABA_PARAM.INC'
CDIMENSION TIME(2), COORDS (3)CHARACTER*80 SNAMEuser coding to define FRETURNEND

下面我们通过上述子程序对一个平板表面施加一个压力F=100(Distribution选择User-defined),和直接在abaqus给定的压力做一个对比,验证子程序是否能够正确运行。
在这里插入图片描述
上述选项选择编译好的main-std.obj,提交分析。
在这里插入图片描述
Job-1是使用子程序计算的结果,Job-2是未使用子程序,二者结果比较在合理误差范围内。

后续将会尝试使用UEL子程序进行一个简单问题的求解,在此之前推荐阅读《有限元方法基础教程》的第十章——等参数公式描述。

点个赞呗👍


http://www.ppmy.cn/news/687791.html

相关文章

中国大学mooc南京航空航天大学民航运输概论章节作业及测试

【作业】第一章 民航运输管理概论 第一章单元作业 小提示:本节包含奇怪的同名章节内容 1、 问题:民航运输系统的各子系统都具有什么作用&#xff1f;并且通过怎样的相互作用来共同完成民航运输任务&#xff1f; 评分规则: 【 包括航空公司、机场和空管局以及民航管理局各子系…

民航业悄悄进行票价革命

自从今年各航空公司“大大方方”地将明折明扣机票摆上桌面以来&#xff0c;机票代理处刘先生身上的工作压力增加了数倍。“原来卖国内机票只有一类Y舱(普通经济舱&#xff0c;不打折的正常舱位)机票&#xff0c;要哪天出就哪天出&#xff0c;现在可复杂多了。”他随手举起一张某…

国际机票术语

1 、航段&#xff1a;一个城市到达另外一个城市的飞行线路&#xff08;包括经停&#xff09; Eg: 北京-新加坡 视为一个航段&#xff1b;北京-新加坡-曼谷-北京 是 3 个航段 2、航程&#xff1a;是指飞机在起飞后&#xff0c;中途不停、不加油所飞行的距离&#xff01;其中包括…

用JAVA程序实现航空里程累计

南航航空公司里程累计计算表 服务等级 订座舱位&#xff08;代号&#xff09; 舱位累积比例 头等舱 F,A 150% 公务舱 C,D 130% 经济舱 Y,T,K 100% 其他舱位 M,G 0 package choice.sample; import java.io.IOException; import java.util.Scanner; public class …

中航信E-Build基础API使用实例

转载请注明出处:http://lucien-zzy.iteye.com/admin/blogs/2007894 包含三个类一个配置文件: 1.静态时间格式类 2.接口测试类 3.配置文件加载类 4.配置文件 5.所需jar包 1.静态时间格式类 public class RequestStatic implements java.io.Serializable {private st…

收益管理简介

收益管理起源于民用航空业,是美国的航空公司在上个世纪80 年代为解决激烈的市场竞争问题而提出的一种新的管理方法。随着科学技术的发展,特别是信息技术的飞速发展,再加上行业管制的逐渐放开,收益管理的理论与方法得到了更加广泛的应用。至今,收益管理已在航空、酒店、旅游服务…

中国国航往返飞机票怎么改签

中国国航往返飞机票怎么改签 发布时间&#xff1a;2013-03-26 浏览次数&#xff1a;72 返回列表 免责声明&#xff1a; 以上供应信息为供应商在本站发布&#xff0c;该信息的真实性、准确性和合法性由商家负责&#xff0c;豫贸网对此不承担任何责任&#xff01;…

浅谈去哪儿算法,搜索结果打乱,_m_参数,headers,pre关键参数等

前言 本文仅供学习参考&#xff0c;如有侵权&#xff0c;请私信删除由于版权问题&#xff0c;本文所展示的代码并非完整代码&#xff0c;也不提供相关工具&#xff0c;关键参数只提供思路。 登录 登录的请求如下&#xff1a;https://user.qunar.com/mobile/doLogin.jsp 请求…