我正在使用Abaqus进行FEA仿真,其中包括用Fortran 77编写的用于定义材料模型的材料用户子程序(umat)。目前,我需要使用仿真中的数据(在运行时)来训练机器学习算法(尚未选择SVR或随机森林回归)。自然,大多数ML模块都在python中,而不是在Fortran中,因此到目前为止,我已经尝试了以下方法:
在UMAT中,我通过命令行调用python脚本,将数据写入csv文件中并用于训练,将输出读回到UMAT中,然后继续模拟。
它在玩具模型中起作用,尽管事实证明,在模拟过程中继续调用命令行效率非常低,并且对于实际模型而言这是不可行的。
我能想到的唯一替代方法是在Fortran中,在子例程本身中编写ML算法,问题是这样做并不简单,例如SVR需要使用拉格朗日乘法器解决优化问题,如果Fortran非常复杂且非常耗时,则可以实现。
答案 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知道。