如何在Abaqus物料子例程中运行ML?

时间:2019-11-21 10:21:14

标签: python machine-learning fortran abaqus

我正在使用Abaqus进行FEA仿真,其中包括用Fortran 77编写的用于定义材料模型的材料用户子程序(umat)。目前,我需要使用仿真中的数据(在运行时)来训练机器学习算法(尚未选择SVR或随机森林回归)。自然,大多数ML模块都在python中,而不是在Fortran中,因此到目前为止,我已经尝试了以下方法:

在UMAT中,我通过命令行调用python脚本,将数据写入csv文件中并用于训练,将输出读回到UMAT中,然后继续模拟。

它在玩具模型中起作用,尽管事实证明,在模拟过程中继续调用命令行效率非常低,并且对于实际模型而言这是不可行的。

我能想到的唯一替代方法是在Fortran中,在子例程本身中编写ML算法,问题是这样做并不简单,例如SVR需要使用拉格朗日乘法器解决优化问题,如果Fortran非常复杂且非常耗时,则可以实现。

1 个答案:

答案 0 :(得分:0)

我宁愿检查void i_convolution(unsigned int **in, unsigned int ***out, int y_max, int x_max, int kernel_size) { int kernel_sum = 0; for(int i = 0; i < kernel_size; i++) { for(int j = 0; j < kernel_size; j++) { kernel_sum += kernel[i * kernel_size + j]; } } printf("kernel sum = %d\n", kernel_sum); for (int i = 1; i < y_max - 1; i++) { for (int j = 1; j < x_max - 1; j++) { int r = 0; int g = 0; int b = 0; for (int y_conv = -1; y_conv <= 1; y_conv++) { for (int x_conv = -1; x_conv <= 1; x_conv++) { int y_index = i + y_conv; int x_index = j + x_conv; unsigned char rval = (unsigned char)(in[y_index][x_index] & 0xff); unsigned char gval = (unsigned char)((in[y_index][x_index] & 0xff00) >> 8); unsigned char bval = (unsigned char)((in[y_index][x_index] & 0xff0000) >> 16); int kernel_val = kernel[(y_conv + 1)*kernel_size + (x_conv + 1)]; r += (int)(rval * kernel_val); g += (int)(gval * kernel_val); b += (int)(bval * kernel_val); } } r /= kernel_sum;//median filtration g /= kernel_sum;//median filtration b /= kernel_sum;//median filtration // b = abs(b); if (r > 255) r = 255; else if(r < 0) r = 0; if (g > 255) g = 255; else if(g < 0) g = 0; if (b > 255) b = 255; else if(b < 0) b = 0; unsigned int val; val = 0; val |= b & 0xff; val <<= 8; val |= g & 0xff; val <<= 8; val |= r & 0xff; (*out)[i][j] = val; } } } 是否可以与Abaqus的标准过程一起使用。使用系统子例程,可以run shell scripts被正在使用的OS知道。