20#ifndef _MDCORE_SOURCE_TF_FLUX_EVAL_H_
21#define _MDCORE_SOURCE_TF_FLUX_EVAL_H_
32 TF_ALWAYS_INLINE FPTYPE flux_fick(
Flux *flux,
int i, FPTYPE si, FPTYPE sj) {
33 return flux->coef[i] * (si - sj);
36 TF_ALWAYS_INLINE FPTYPE flux_secrete(
Flux *flux,
int i, FPTYPE si, FPTYPE sj) {
37 FPTYPE q = flux->coef[i] * (si - flux->target[i]);
38 FPTYPE scale = q > 0.f;
42 TF_ALWAYS_INLINE FPTYPE flux_uptake(
Flux *flux,
int i, FPTYPE si, FPTYPE sj) {
43 FPTYPE q = flux->coef[i] * (flux->target[i] - sj) * si;
44 FPTYPE scale = q > 0.f;
48 TF_ALWAYS_INLINE
void flux_eval_ex(
52 Flux *flux = &f->fluxes[0];
53 FPTYPE r = FPTYPE_SQRT(r2);
55 for(
int i = 0; i < flux->size; ++i) {
56 FPTYPE cutoff = flux->cutoff[i];
60 FPTYPE term = 1 - r / cutoff;
65 Particle *pi = part_i->
typeId == flux->type_ids[i].a ? part_i : part_j;
66 Particle *pj = part_j->
typeId == flux->type_ids[i].b ? part_j : part_i;
68 assert(pi->typeId == flux->type_ids[i].a);
69 assert(pj->typeId == flux->type_ids[i].b);
72 FPTYPE *si = pi->state_vector->fvec;
73 FPTYPE *sj = pj->state_vector->fvec;
75 FPTYPE *qi = pi->state_vector->q;
76 FPTYPE *qj = pj->state_vector->q;
78 int32_t *ii = flux->indices_a;
79 int32_t *ij = flux->indices_b;
81 FPTYPE ssi = si[ii[i]];
82 FPTYPE ssj = sj[ij[i]];
85 switch(flux->kinds[i]) {
87 q *= flux_fick(flux, i, ssi, ssj);
90 q *= flux_secrete(flux, i, ssi, ssj);
93 q *= flux_uptake(flux, i, ssi, ssj);
99 FPTYPE half_decay = flux->decay_coef[i] / 2.f;
100 qi[ii[i]] = qi[ii[i]] - q - half_decay * ssi;
101 qj[ij[i]] = qj[ij[i]] + q - half_decay * ssj;
106 int index =
_Engine.max_type * a->typeId + b->typeId;
Include Python header, disable linking to pythonX_d.lib on Windows in debug mode.
Definition tfAngleConfig.h:26
A flux is defined between a pair of types, and acts on the state vector between a pair of instances.
Definition tfFlux.h:88
Definition tfParticle.h:101
int16_t typeId
Definition tfParticle.h:185