场输出的可视化是定性和定量评估数值模型结果的常见方法。在Abaqus以及大多数有限元软件包中,最流行的颜色映射是著名的“Jet”或“rainbow”,它从蓝色到红色之间还穿插了绿色和黄色调。尽管这种颜色调板已经成为一种默认标准,但它在大多数问题中并不能体现“视觉上”美观,可能会扭曲数据的可视化效果。在本文中,我想向您展示如何在Abaqus中使用自定义颜色映射,并借助Matplotlib来实现。
通常情况下,最合适的色图被称为感知均匀色图。此外,为了显示有序数据(如位移、应力等),它们还需要是连续的。因此,我们需要均匀的连续色图。

不同颜色映射的性能:a)冷暖,b)彩虹,c)灰度,d)地狱火,e)等亮度和f)蓝黄
1. 在Abaqus中自定义色图(手动)
我们可以在Abaqus/Viewer中手动设置自己的颜色映射,方法如下:
Contour Plot Options → Color & Style → Spectrum → Create Spectrum

在Abaqus/Viewer中创建自己的色图的步骤
通过这种方式,我们可以在Abaqus中创建自己的颜色映射,并将其应用于场输出变量(位移、应力、塑性变形、损伤等)的可视化。
然而,如果我们想使用准确的颜色映射,例如Matplotlib内置的viridis、cividis、inferno或其他感知均匀连续颜色映射,则手动创建颜色映射非常繁琐。
2. 在Abaqus中自定义颜色映射(脚本)
在Abaqus中创建颜色映射的更实用选项是使用一个定义它们的Python脚本。通过以下Python函数来创建颜色映射:
session.Spectrum(name, colors)
其中name是一个字符串(例如“MyCmap”),colors是一个以十六进制格式表示颜色的字符串列表(例如[“#ff0000”,“#00ff00”,“#0000ff”])。
运行以下脚本在Abaqus中创建一些令人惊叹的颜色映射。
from abaqusConstants import *# Perceptually uniform sequential colormapscolormaps = {'viridis': ['#440154', '#46317e', '#365c8d', '#277f8e', '#1fa287', '#49c26d', '#a0da39', '#fee724'],'plasma': ['#0c0787', '#5301a3', '#8b09a5', '#b93289', '#dc5c68', '#f48849', '#febd2a', '#f0f921'],'inferno': ['#000003', '#270b53', '#65156e', '#9f2a63', '#d54841', '#f67d15', '#fbc228', '#fdffa5'],'magma': ['#000003', '#221150', '#5f177f', '#982c80', '#d4436e', '#f9765c', '#ffbb81', '#fcfdbf'],'cividis': ['#00224e', '#213b6e', '#4c556c', '#6c6e72', '#8e8978', '#b2a570', '#d9c55c', '#fee837']}# Colormaps are Spectrum objects in Abaqus/CAEfor name, colors in colormaps.items():# Spectrum with the colors in ordersession.Spectrum(name=name, colors=colors)# Spectrum with the colors in reversed ordersession.Spectrum(name=name + 'R', colors=colors[::-1])
第1行:我们需要导入abaqusConstants以便访问session。
第4至8行:将colormaps定义为一个字典,名称作为键,颜色列表作为值。颜色以十六进制格式的字符串表示。
第11行:使用for循环遍历所有的colormaps。
第14行:在Abaqus中创建spectrum(colormap)。
第17行:在Abaqus中创建反转的spectrum。
现在,可以使用这些光谱之一(viridis、plasma、inferno、magma和cividis)及其反转版本(viridisR、plasmaR、infernoR、magmaR和cividisR)来可视化您的odbs中的数据。
3. 在Abaqus中自定义颜色映射(环境文件)
我们可以通过环境文件(environment file)使Abaqus在每次打开Abaqus/CAE时运行这些Python命令(用于创建颜色映射)。实现此目标的步骤如下:
a. 在您的Abaqus安装目录中找到custom_v6.env文件。在我的情况下(Abaqus 2020学生版),路径为:C:\SIMULIA\CAE\2020SE\win_b64\SMA\site
b. 该文件包含用于自定义Abaqus/CAE行为和默认选项的Python命令。在较旧的Abaqus版本中,要编辑的文件将是abaqus_v6.env。
c. 创建一个名为'onCaeStartUp'的函数,不带任何参数,并将上述行放在下面所示的位置(别忘了先导入abaqusConstants):
from abaqusConstants import *def onCaeStartup():# Perceptually uniform sequential colormapscolormaps = {'Viridis': ['#440154', '#46317e', '#365c8d', '#277f8e', '#1fa287', '#49c26d', '#a0da39', '#fee724'],'Plasma': ['#0c0787', '#5301a3', '#8b09a5', '#b93289', '#dc5c68', '#f48849', '#febd2a', '#f0f921'],'Inferno': ['#000003', '#270b53', '#65156e', '#9f2a63', '#d54841', '#f67d15', '#fbc228', '#fdffa5'],'Magma': ['#000003', '#221150', '#5f177f', '#982c80', '#d4436e', '#f9765c', '#ffbb81', '#fcfdbf'],'Cividis': ['#00224e', '#213b6e', '#4c556c', '#6c6e72', '#8e8978', '#b2a570', '#d9c55c', '#fee837']}# Colormaps are Spectrum objects in Abaqus/CAEfor name, colors in colormaps.items():# Spectrum with the colors in ordersession.Spectrum(name=name, colors=colors)# Spectrum with the colors in reversed ordersession.Spectrum(name=name + 'R', colors=colors[::-1])
第3行:onCaeStartup函数的定义。
第6至19行:将前一个脚本中的所有命令放入此函数中。
就像这样,每当我们启动Abaqus/CAE时,这些颜色映射将被创建,并且随时可用!
4. 进一步使用Matplotlib!
在上面的脚本中,颜色列表是硬编码的,然而我们可以通过访问Matplotlib colormaps来在运行时创建这些颜色列表。
通过这种方式,我们可以非常容易地包含额外的colormap,只需将它们的名称添加到名称列表中(例如spring、cool、Wistia...)。请参阅Matplotlib中完整的colormap名称列表。
# Import matplotlib (available from Abaqus 2020)import matplotlib.pyplot as pltimport matplotlibimport numpy as np# List of colormapsnames = ('viridis', 'plasma', 'inferno', 'magma', 'cividis', # perceptually uniform'summer', 'autumn', 'spring', 'cool', 'hot', 'Wistia') # other colormapsfor name in names:if name not in plt.colormaps(): # Skip colormap if not foundprint('Colormap not found: ' + name)continue# Get Matplotlib colormap by namecmap = plt.get_cmap(name)# Take 10 evenly spaced colors from the colormap# A colormap takes values from 0 to 1 an returns a color: (R, G, B, A)colors_rgba = map(cmap, np.linspace(0., 1., 10))# Convert RGBA colors into hexadecimal format: #rrggbbcolors_u = map(matplotlib.colors.to_hex, colors_rgba)# Convert unicode strings to regular stringscolors = map(str, colors_u)# Colormaps are Spectrum objects in Abaqus/CAEsession.Spectrum(name=name, colors=colors) # Colormapsession.Spectrum(name=name + 'R', colors=colors[::-1]) # Reversed colormap
第2行和第3行:我们需要导入matplotlib库(以及pyplot)。
第7行和第8行:定义一个包含从Matplotlib中读取的颜色映射名称的列表。
第12到14行:如果当前颜色映射在Matplotlib可用的颜色映射(plt.colormaps())中找不到,则跳过它。
第17行:根据名称获取颜色映射(plt.get_cmap(name))。
第21行:生成当前颜色映射的10个均匀间隔的颜色(colors_rgba)。这些颜色是具有红-绿-蓝-透明度值(R,G,B,A)的元组。
第24行:将RGBA格式中的颜色转换为十六进制格式字符串。
第27行:来自23行的字符串是Unicode编码,因此我们必须将它们转换为常规字符串。
在本文中,我们介绍了如何在Abaqus中创建自己的颜色映射,并将其用于场输出的可视化。我们可以在Abaqus/CAE中手动完成,也可以利用Python脚本加快此过程。
同时,我们还有机会简单了解使用Abaqus环境文件的可能性。在这种情况下,通过基于Matplotlib库创建自定义颜色映射来定制Abaqus界面。


