Source code for sfepy.physics.energy
import numpy as nm
import numpy.linalg as nla
from sfepy.fem.mappings import get_physical_qps
[docs]def eval_ion_ion_energy(centres, charges):
"""
Compute the ion-ion nergy.
"""
val = 0.0
for ir, rcentre in enumerate(centres):
for ic, ccentre in enumerate(centres):
if ir == ic: continue
val += charges[ir] * charges[ic] / nla.norm(rcentre - ccentre)
val *= 0.5
return val
[docs]def eval_non_local_interaction(problem, region_name, var_name,
integral_name, f1, f2, kernel_function,
pbar=None):
"""
Single element group only!
"""
var = problem.get_variables()[var_name]
region = problem.domain.regions[region_name]
integral = problem.integrals[integral_name]
qps = get_physical_qps(region, integral)
igs = qps.values.keys()
ig = igs[0]
qp = qps.values[ig]
n_el, n_qp = f1.shape[:2]
vg, _ = var.get_mapping(ig, region, integral, 'volume')
# Weighted jacobian.
det = vg.det
shape = (n_el * n_qp, 1, 1)
val1 = f1 * det
val2 = f2 * det
val1.shape = shape
val2.shape = shape
coef = nm.zeros(shape, dtype=val1.dtype)
if pbar is not None:
pbar.init(qp.shape[0])
pbar.update(0)
for ii, coor in enumerate(qp):
## tt = time.clock()
kernel = kernel_function(coor, qp)
kernel.shape = val2.shape
## print'aa', time.clock() - tt
## tt = time.clock()
coef[ii] = (kernel * val2).sum()
## print 'bb', time.clock() - tt
if pbar is not None:
pbar.update(ii)
val = (val1 * coef).sum()
if pbar is not None:
print
return val