I'm currently searching for a way to calculate the Maximum Principal Stress gradient of nodes more efficiently. The solution can be numerical or analytical and the motivation behind is to solve an optimization problem through moving node approach.

---- What I have until now ----

I created a f function (using python and salome) that returns the maximum value of Maximum Principal Stress of all nodes given an input mesh, so I have this function (note: each time a call the function a FEA is performed in the background):

f(mesh) = max([sigma_3_node1, sigma_3_node2, sigma_3_node3, …, sigma_3_nodeN)

And mesh = [x1,y1,x2,y2,....,xN,yN], x and y node coordinates of a 2d mesh.

As you can notice, the f gradient will have 2xN size and using finite difference numerical approximation (i.e. d(f)/d(x) = f((x+h) + f(x))/h) ), 2x f evaluations will be required to calculate each therm.

So far, if my f function have 20 variables, my gradient will have 20 therms. And since each therm requires 2 f evaluations (i.e. 2 FEA analysis) I'll need 40 FEAs just to calculate ONE f gradient evaluation.

Is there another way to perform this gradient calculation? Maybe there's an analytical way to obtain this gradient from Mass/Damping/Stiffness matrices, but I'm not familiar....

---- Example using this method ----

As you noticed, the time to calculate just ONE gradient is very expensive...

My optimization problem needs the f gradient evaluation at least 400 times to reach the convergence.

In this way, using this method and a gradient with 20 variables I'll have to perform (400 gradients x 20 variables x 2 f evaluations) = 16.000 FEAs.

At the moment, each FEA run takes 4s. So in another words, this will take forever running in serial or parallel even with multiple cores...

Thank you for your time!

]]>