File wellmet/simplex.py changed (mode: 100644) (index 8a4ebdf..3cda360) |
... |
... |
class _Triangulation: |
399 |
399 |
return np.logical_xor(has_failure, all_failure) |
return np.logical_xor(has_failure, all_failure) |
400 |
400 |
|
|
401 |
401 |
|
|
|
402 |
|
def get_mixed_normals(sx): |
|
403 |
|
simplices = sx.tri.simplices[sx.is_mixed(sx.tri.simplices)] |
|
404 |
|
nvar = sx.sample_box.nvar |
|
405 |
|
failsi = sx.sample_box.failsi |
|
406 |
|
|
|
407 |
|
X = np.empty((sx.sample_box.nsim, nvar + 1)) |
|
408 |
|
X[:, :-1] = getattr(sx.sample_box, sx.tri_space) |
|
409 |
|
X[:, -1] = failsi |
|
410 |
|
|
|
411 |
|
# X = np.empty((nvar + 1, sx.sample_box.nsim)) |
|
412 |
|
# X[:-1] = getattr(sx.sample_box, sx.tri_space).T |
|
413 |
|
# X[-1] = failsi |
|
414 |
|
|
|
415 |
|
|
|
416 |
|
vectors = X[simplices[:, 1:]] - X[simplices[:, :1]] |
|
417 |
|
basises, __ = np.linalg.qr(vectors.transpose(0, 2, 1), mode='complete') |
|
418 |
|
|
|
419 |
|
normals = basises[:, :, -1] |
|
420 |
|
|
|
421 |
|
#č ujistit se, že normály směrovany nahoru, |
|
422 |
|
#č tj. směrem k bezpečným vzorkám |
|
423 |
|
normals = normals * (1 - 2 * (normals[:,-1:] < 0)) |
|
424 |
|
|
|
425 |
|
return normals, simplices |
|
426 |
|
|
|
427 |
|
|
|
428 |
|
def get_gradients(sx): |
|
429 |
|
normals, simplices = sx.get_mixed_normals() |
|
430 |
|
|
|
431 |
|
gradients = normals[:, :-1] |
|
432 |
|
|
|
433 |
|
lengths = np.sum(np.square(gradients), axis=1) |
|
434 |
|
lengths = np.sqrt(lengths, out=lengths) #lengths of each radius-vector |
|
435 |
|
|
|
436 |
|
# scale all radii-vectors to unit length |
|
437 |
|
# use [:,None] to get an transposed 2D array |
|
438 |
|
np.divide(gradients, lengths[:,None], out=gradients) |
|
439 |
|
|
|
440 |
|
return gradients, simplices |
|
441 |
|
|
|
442 |
|
|
402 |
443 |
def get_failure_moments(sx): |
def get_failure_moments(sx): |
403 |
444 |
simplices = sx.tri.simplices |
simplices = sx.tri.simplices |
404 |
445 |
|
|
|
... |
... |
class FullCubatureIntegration(_Triangulation): |
1358 |
1399 |
#č odhady jsou ve slovníku, posíláme jen to, co tam není |
#č odhady jsou ve slovníku, posíláme jen to, co tam není |
1359 |
1400 |
sx.on_failure_added(simplex, indices, vertices_model, nodes, vol) |
sx.on_failure_added(simplex, indices, vertices_model, nodes, vol) |
1360 |
1401 |
|
|
|
1402 |
|
def get_sensitivities(sx): |
|
1403 |
|
gradients, simplices = sx.get_gradients() |
|
1404 |
|
|
|
1405 |
|
p_mix = 0 |
|
1406 |
|
global_gradient = np.zeros(sx.sample_box.nvar) |
|
1407 |
|
sensitivities = np.zeros(sx.sample_box.nvar) |
|
1408 |
|
|
|
1409 |
|
for gradient, simplex in zip(gradients, simplices): |
|
1410 |
|
# p_mixed, pfv, pfw, pf |
|
1411 |
|
p_mixed, pfv, pfw, pf = sx.mixed_simplices[tuple(simplex)] |
|
1412 |
|
p_mix += p_mixed |
|
1413 |
|
global_gradient += gradient * p_mixed |
|
1414 |
|
sensitivities += gradient**2 * p_mixed |
|
1415 |
|
|
|
1416 |
|
length = np.sqrt(np.inner(global_gradient, global_gradient)) |
|
1417 |
|
global_gradient = global_gradient / length |
|
1418 |
|
|
|
1419 |
|
sensitivities = sensitivities / p_mix |
|
1420 |
|
|
|
1421 |
|
return p_mix, global_gradient, sensitivities |
|
1422 |
|
|
1361 |
1423 |
|
|
1362 |
1424 |
def get_failure_moments(sx): |
def get_failure_moments(sx): |
1363 |
1425 |
simplices = sx.tri.simplices[sx.is_mixed()] |
simplices = sx.tri.simplices[sx.is_mixed()] |