Abaqus可视化密度

时间:2018-03-27 09:29:27

标签: python abaqus

我试图优化某种材料的孔隙度分布。我想想象一下结果。我可以使用' visualize->材料'来可视化不同的材料。但他给每种材料都是随机颜色。我希望最不密集的材料是蓝色,最密集的材料是红色。因此与压力情节相同。

有没有办法在Abaqus中执行此操作?

如果在GUI中没有简单的方法可以做到这一点,我想知道是否可以使用脚本编写?我试图改变一种颜色,导致以下代码:

session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap=session.viewports['Viewport: 1'].colorMappings['Material']
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
cmap.updateOverrides(overrides={'IMPLANT_MATERIAL0':(True, '#FF0000', 
    'Default', '#FF0000')})
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()

2 个答案:

答案 0 :(得分:1)

这可能不是完美的方法,但这有效。 限制:

- 您需要手动输入材料数量。

- 您的材料应根据密度排列(mat1,mat2-> density1

- 你应该把你的材料名称放在脚本中(在我的情况下是'Implant')

欢迎提出改进建议,这只是快速而又肮脏。

from math import floor

diminishing_factor = 10 #This factor diminishes the amount of colors to: 
amount of materials/diminishing factor. This is necessary
#because apparently abaqus can only handle a limited amount of colors (+-50)

def create_color_lst(amount_of_mat):

    color_lst=[]

    total_length = 256*4-1 #0 telt ook dus -1
    interval = floor(total_length/(amount_of_mat-1)) #*10 because we'll give 
    10 consequent materials the same color, because abaqus can't handle it
    for i in range(0,amount_of_mat):
        pos = int(floor(i/diminishing_factor))*diminishing_factor*interval
        if pos<256: #Green is rising
            col_pos=pos
            code = (0,col_pos,255)
        elif pos<512: #Blue is diminishing
            col_pos=pos-255
            code = (0,255,255-col_pos)
        elif pos<768:
            col_pos = pos - 511
            code = (col_pos,255,0)
        elif pos<1024:
            col_pos = pos - 767
            code = (255,255-col_pos,0)
        else:
            raise ValueError('Color position is too high: '+str(pos))
        hex_code='#%02x%02x%02x' % code
        color_lst.append(hex_code.upper())
    return color_lst

def update_colors(color_lst):
    session.viewports['Viewport: 1'].enableMultipleColors()
    session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
    cmap = session.viewports['Viewport: 1'].colorMappings['Material']
    for i in range(0,amount_of_mat):
        material = 'IMPLANT_MATERIAL'+str(i)
        cmap.updateOverrides(overrides={material:(True, color_lst[i],
            'Default', color_lst[i])})
        if i%10==0:
            print(i)
    session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
    session.viewports['Viewport: 1'].disableMultipleColors()


amount_of_mat=494 #We can't get this you should always check this! (you 
probably could but I'm to lazy to search it)


color_lst = create_color_lst(amount_of_mat) #Creates a list with strings 
that contain the color names

update_colors(color_lst) #Updates the display (it's possible that you still 
need to go to the display color dialog and press apply)

答案 1 :(得分:1)

如果您正在寻找压力情节可视化等内容,您必须编写自己的 #include <iostream> #include <fstream> using namespace std; int main() { ofstream filestore("customer.dat"); //store data in file string data1; //store text int data2; //store integers cout<<"enter data or press ctrl+z to quit \n"; while(cin>>data1>>data2){ filestore<<data1<<endl; filestore<<data2<<endl; } ifstream fileread("customer.dat");//read data from file string info1; int info2; while(fileread>>info1>>info2){ cout<<info1<<" "<<info2<<endl; } return 0; } 数据。通常更容易将数据直接输出到外部可视化工具,但在Abaqus中执行此操作是可能的(如果不是有点复杂的话)。

一般过程如下:

  1. 生成FieldOutput个对象;语法是FieldOutput,其中

    • FO = odbModel.steps.values()[-1].frames[-1].FieldOutput(name=data_name, description=data_description, type=SCALAR)是一个已打开的odbModel对象,
    • Odb或指定的步骤steps.values()[-1]是您要输出的步骤,
    • steps[...]是您要在此步骤中输出的最后一帧(或您选择的框架),
    • frames[-1]data_name是字符串(对于压力等高线图,data_description将等同于odb输出中的标签data_name
    • SSCALAR模块
    • 中的参数
  2. 获取abaqusConstants个对象及其相关元素rootAssembly.instanceelementSet,这些对象与sectionAssignment的{​​{1}}有明确的链接section它具有material属性。

  3. 使用density命令更新FieldOutput对象;语法是addData
    • addData(position=CENTROID, instance=instance, labels=labels, data=data)是来自CENTROID模块的参数(假设您只想在元素质心处具有元素密度;如果您真的想要,也可以将它们粘贴在积分点上)
    • abaqusConstants是与元素集关联的实例(或更常见的是使用此材料分配的instance
    • region是一个可迭代的(labelslist)整数,用于指定要为其写入数据的关联实例的元素标签
    • tupledata s的可迭代迭代项,用于指定数据。在您的情况下,单个密度值意味着float是一个长度为1的可迭代迭代,每个迭代包含一个密度值。 data的长度必须等于data的长度,因为labels的每个成员与data中相同位置的elementLabel完全对应。
  4. 下面的示例脚本(警告:强烈建议您备份labels,以防某些事情没有成功)

    .odb

    我不使用密度,但这里是一个模型的杨氏模量输出示例,其中两种材质分配给各种元素。

    enter image description here