mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-27 21:38:39 +08:00
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
from sputils import *
|
|
from utils import *
|
|
from sputils import *
|
|
from numpy import *
|
|
from getEdgeTangent import *
|
|
|
|
|
|
def volTetra(y, m, I, A, B, C, D):
|
|
|
|
a11 = array(y[A, 0]-y[B, 0]); a12 = array(y[A, 0]-y[C, 0]); a13 = array(y[A, 0]-y[D, 0])
|
|
a21 = array(y[A, 1]-y[B, 1]); a22 = array(y[A, 1]-y[C, 1]); a23 = array(y[A, 1]-y[D, 1])
|
|
a31 = array(y[A, 2]-y[B, 2]); a32 = array(y[A, 2]-y[C, 2]); a33 = array(y[A, 2]-y[D, 2])
|
|
|
|
return abs(a11*a22*a33 + a12*a23*a31 + a13*a21*a32 - a31*a22*a13 - a32*a23*a11 - a33*a21*a12)
|
|
|
|
|
|
def getCellVolume(X, Y, Z):
|
|
|
|
m = array(shape(X))-1
|
|
y = hstack3(mkvc(X), mkvc(Y), mkvc(Z))
|
|
|
|
i = int64(linspace(0, m[0]-1, m[0]))
|
|
j = int64(linspace(0, m[1]-1, m[1]))
|
|
k = int64(linspace(0, m[2]-1, m[2]))
|
|
|
|
ii, jj, kk = ndgrid(i, j, k)
|
|
ii = mkvc(ii)
|
|
jj = mkvc(jj)
|
|
kk = mkvc(kk)
|
|
|
|
I = int64(sub2ind(m, hstack3(ii, jj, kk)))
|
|
A = int64(sub2ind(m+1, hstack3(ii, jj, kk)))
|
|
B = int64(sub2ind(m+1, hstack3(ii, jj+1, kk)))
|
|
C = int64(sub2ind(m+1, hstack3(ii+1, jj+1, kk)))
|
|
D = int64(sub2ind(m+1, hstack3(ii+1, jj, kk)))
|
|
E = int64(sub2ind(m+1, hstack3(ii, jj, kk+1)))
|
|
F = int64(sub2ind(m+1, hstack3(ii, jj+1, kk+1)))
|
|
G = int64(sub2ind(m+1, hstack3(ii+1, jj+1, kk+1)))
|
|
H = int64(sub2ind(m+1, hstack3(ii+1, jj, kk+1)))
|
|
|
|
v1 = volTetra(y, m, I, A, B, D, E)
|
|
v2 = volTetra(y, m, I, B, E, F, G)
|
|
v3 = volTetra(y, m, I, B, D, E, G)
|
|
v4 = volTetra(y, m, I, B, C, D, G)
|
|
v5 = volTetra(y, m, I, D, E, G, H)
|
|
|
|
v = 1.0/6.0 * (v1 + v2 + v3 + v4 + v5)
|
|
return v.flatten()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
X, Y, Z = ndgrid(linspace(0, 2, 3), linspace(0, 2, 3), linspace(0, 2, 3))
|
|
Z[2, 2, 2] = 2.5; Z[0, 0, 0] = -0.5
|
|
X[2, 2, 2] = 2.5; X[0, 0, 0] = -0.5
|
|
|
|
v = getCellVolume(X, Y, Z)
|
|
print v
|