File wellmet/simplex.py changed (mode: 100644) (index 979004b..471a2db) |
... |
... |
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)] |
|
|
402 |
|
def get_averaged_mixed_normals(sx): |
|
403 |
|
simplices = sx.tri.simplices |
|
404 |
|
|
|
405 |
|
nvar = sx.sample_box.nvar |
|
406 |
|
failsi = sx.sample_box.failsi |
|
407 |
|
mask = np.empty(sx.tri.nsimplex + 1, dtype=bool) |
|
408 |
|
mask[-1] = False |
|
409 |
|
|
|
410 |
|
in_failure = failsi[simplices] |
|
411 |
|
has_failure = in_failure.any(axis=1) |
|
412 |
|
all_failure = in_failure.all(axis=1) |
|
413 |
|
np.logical_xor(has_failure, all_failure, out=mask[:-1]) |
|
414 |
|
|
|
415 |
|
|
|
416 |
|
mixed_simplices = simplices[mask[:-1]] |
|
417 |
|
|
|
418 |
|
|
|
419 |
|
|
|
420 |
|
X = np.empty((sx.sample_box.nsim, nvar + 1)) |
|
421 |
|
X[:, :-1] = getattr(sx.sample_box, sx.tri_space) |
|
422 |
|
X[:, -1] = failsi |
|
423 |
|
|
|
424 |
|
# X = np.empty((nvar + 1, sx.sample_box.nsim)) |
|
425 |
|
# X[:-1] = getattr(sx.sample_box, sx.tri_space).T |
|
426 |
|
# X[-1] = failsi |
|
427 |
|
|
|
428 |
|
|
|
429 |
|
vectors = X[mixed_simplices[:, 1:]] - X[mixed_simplices[:, :1]] |
|
430 |
|
basises, __ = np.linalg.qr(vectors.transpose(0, 2, 1), mode='complete') |
|
431 |
|
|
|
432 |
|
#č o jeden simplex víc aby index -1 odkazoval na nulovou normálu |
|
433 |
|
normals = np.zeros((sx.tri.nsimplex + 1, nvar + 1)) |
|
434 |
|
normals[mask] = basises[:, :, -1] |
|
435 |
|
|
|
436 |
|
#č ujistit se, že normály směrovany nahoru, |
|
437 |
|
#č tj. směrem k bezpečným vzorkám |
|
438 |
|
normals *= (1 - 2 * (normals[:,-1:] < 0)) |
|
439 |
|
|
|
440 |
|
neighbors = sx.tri.neighbors[mask[:-1]] |
|
441 |
|
|
|
442 |
|
mixed_normals = normals[mask] |
|
443 |
|
# n_mixed_simplices x nvar+1 (neighbors) x nvar+1 (coordinates) |
|
444 |
|
mixed_normals += np.sum(normals[neighbors], axis=1) |
|
445 |
|
|
|
446 |
|
return mixed_normals, mixed_simplices |
|
447 |
|
|
|
448 |
|
|
|
449 |
|
def get_pure_mixed_normals(sx): |
|
450 |
|
simplices = sx.tri.simplices |
|
451 |
|
|
|
452 |
|
mask = sx.is_mixed(simplices) |
|
453 |
|
simplices = simplices[mask] |
|
454 |
|
|
404 |
455 |
nvar = sx.sample_box.nvar |
nvar = sx.sample_box.nvar |
405 |
456 |
failsi = sx.sample_box.failsi |
failsi = sx.sample_box.failsi |
406 |
457 |
|
|
|
... |
... |
class _Triangulation: |
426 |
477 |
|
|
427 |
478 |
|
|
428 |
479 |
def get_gradients(sx): |
def get_gradients(sx): |
429 |
|
normals, simplices = sx.get_mixed_normals() |
|
|
480 |
|
normals, simplices = sx.get_averaged_mixed_normals() |
430 |
481 |
|
|
431 |
482 |
gradients = normals[:, :-1] |
gradients = normals[:, :-1] |
432 |
483 |
|
|
|
... |
... |
class FullCubatureIntegration(_Triangulation): |
1399 |
1450 |
#č 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í |
1400 |
1451 |
sx.on_failure_added(simplex, indices, vertices_model, nodes, vol) |
sx.on_failure_added(simplex, indices, vertices_model, nodes, vol) |
1401 |
1452 |
|
|
|
1453 |
|
|
1402 |
1454 |
def get_sensitivities(sx): |
def get_sensitivities(sx): |
1403 |
1455 |
gradients, simplices = sx.get_gradients() |
gradients, simplices = sx.get_gradients() |
1404 |
1456 |
|
|