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

news2024/9/26 5:19:43

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 load
        const int    & KSTEP,        // Step number
        const int    & KINC,         // Increment number
        const double(& TIME)[2],     // (1) step time; (2) total time
        const int    & NOEL,         // Element number
        const int    & NPT,          // Load integration point number
        const int    & LAYER,        // Layer number
        const int    & KSPT,         // Section point number within the current layer
        const double(& COORDS)[3],   // Array containing the coordinates of the load integration point
        const int    & JLTYPE,       // Load type for which this call to DLOAD is made
        const 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 initialisation
    mat A(2, 3, fill::zeros);

    // .n_rows and .n_cols are read only
    cout << "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)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION TIME(2), COORDS (3)
      CHARACTER*80 SNAME

      user coding to define F


      RETURN
      END

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

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

点个赞呗👍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20230702 正态分布的几个性质

正态分布以及高斯函数的定义 如果随机变量 X X X 的密度函数为 f μ , σ ( x ) 1 σ 2 π e − ( x − μ ) 2 2 σ 2 , x ∈ R , σ > 0 f_{\mu, \sigma}(x)\frac{1}{\sigma \sqrt{2 \pi}} e^{-\dfrac{(x-\mu)^2}{2 \sigma^2}}, \quad x \in \mathbb{R}, \sigma>0 …

the size of an array must be greater than zero

keil默认不支持数组定义的情况buf[0]

Pytorch深度强化学习1-2:详解K摇臂赌博机模型和ϵ-贪心算法

目录 0 专栏介绍1 K-摇臂赌博机2 ϵ \epsilon ϵ-贪心算法3 softmax算法4 Python实现与分析 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#xff0c;…

Java设计模式之行为型-观察者模式(UML类图+案例分析)

目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二 案例三 五、总结 一、基本概念 观察者先订阅被观察者对象&#xff0c;当被观察者的状态发生变化时&#xff0c;观察者可以及时收到消息&#xff0c;在这种模式当中&#xff0c;被观察者维护了…

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于麻雀算法优化深度置信网络(SSA-DB…

【Java】顺序表ArrayList

文章目录 一、顺序表二、ArrayList 的简介三、ArrayList 的使用3.1 构造方法3.2 常见操作3.3 遍历方法3.4 扩容机制 四、ArrayList 的模拟实现五、ArrayList 的使用案例5.1 扑克牌案例5.2 杨辉三角案例 六、ArrayList 存在的问题 一、顺序表 顺序表&#xff08;Sequential Lis…

JS中的字典和散列表

前言 除了集合&#xff0c;我们还可以用字典和散列表来存储唯一值。 集合学习请见&#xff1a; 自定义集合和ES6集合http://t.csdn.cn/RcznA 在集合中&#xff0c;我们关注的是每个值本身。并将它作为主要元素。 而字典和散列表都是以[键:值]的形式来存储数据。 不同的…

Linux中vim的预备代码(prepare-code)设置

1、进入以下目录&#xff1a; /home/yys/.vim/plugged/prepare-code/snippet注意&#xff1a;yys是我个人的账号名称&#xff0c;每个人的都不一样&#xff01; 2、修改相应的预备代码&#xff0c;比如snippet.c 修改完之后保存&#xff0c;之后再创建c文件则会自动初始化有…

Python如何免费获取付费文档的数据, 保存word文档

目录标题 前言开发环境:模块使用:代码实现步骤:代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 开发环境: python 3.8 pycharm 模块使用: requests --> pip install requests re json time base64 docx --> pip install python-docx 第三方模…

【C++初阶】string类常见题目详解(二) —— 把字符串转换成整数、反转字符串、反转字符串 II、反转字符串中的单词 III、字符串相乘

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;C初阶】s…

ElasticSearch学习02——Kibana安装

ElasticSearch学习02——Windows下Kibana安装 Kibana是界面化的查询数据的工具&#xff0c;下载时尽量下载与ElasicSearch一致的版本。 1、下载对应版本的Kibana ​ 有了ElasticSearch安装的经验&#xff0c;我们发现了ES和JDK有着版本对应的关系&#xff0c;Kibana和ES共同为…

【Linux基础命令】nmtui命令使用实战

前言 linux常用命令专栏已进入尾声&#xff0c;大约90个命令是日常工作中常用的&#xff0c;在拓展一些不常用的&#xff0c;也就100左右。 是不是总结下来后&#xff0c;就感觉要学的内容没有那么多了。 当然有些专属的基础命令不在本专栏内&#xff0c;比如LVM管理命令&am…

微信读书:从Paxos到Zookeeper:分布式一致性原理与实践(阅读摘录)

微信读书&#xff1a;从Paxos到Zookeeper&#xff1a;分布式一致性原理与实践&#xff08;阅读摘录&#xff09; 阅读地址 CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足一致性(C&#xff1a;Consistency)、可用性(A&#xff1a;Availability)和分区容错…

Andriod 开发 SearchView默认弹出软键盘

SearchView默认弹出软键盘&#xff0c;遮挡了主界面 这很明显是SearchView是默认自动获取了焦点&#xff0c;所以上网搜了一下如何清除焦点&#xff1a; SearchView searchView getActivity().findViewById(R.id.searchViewSearchbar); searchView.clearFocus(); 然而没用&…

零拷贝原理

在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上&#xff0c;那么它必 须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区&#xff0c;CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中&#xff0c; 接着在应用程序中…

Arrays类概述,Lambda表达式

数组操作工具类&#xff0c;专门用于操作数组元素 2&#xff1a;常用API Lambda概述 Lambda表达式是JDK开始后的一种新语法形式作用&#xff1a;简化匿名内部类的代码写法 格式&#xff1a; 注意&#xff1a;Lambda表达式只能简化函数式接口的匿名内部类的写法形式。 什么是…

JAVA-编程基础-07-面向对象思想

Lison <dreamlison163.com>, v1.0.0, 2023.03.26 JAVA-编程基础-07-面向对象思想 文章目录 JAVA-编程基础-07-面向对象思想一、三大特性封装继承多态 二、类图泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (A…

使用vim编辑器,进行保存时报错:E382: Cannot write, ‘buftype‘ option is set

目录 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option is set 1.2 产生原因 二、解决 2.1 解决办法 2.2 还原 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option i…

【UnityDOTS 二】Entity的理解

Entity的理解 Entity作为一种对CPU的Cache友好的编码方式&#xff0c;是DOTS中重要的编码流程与思想。需要程序员由OOP的思想转为DOD的思想&#xff0c;即&#xff1a;面向数据的编码方式。 Unity的ECS&#xff1a; Entity&#xff1a;只是一个代表&#xff0c;用于快速查找数…

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13310 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- leftTitle:左边标题 name&…