/* See {MixedEnergy.h} */ #include #include #include #define _GNU_SOURCE #include #include REVEAL T == Public BRANDED OBJECT ekDc: REF r4_vec_t; /* (Work) Gradient of some ingredient */ OVERRIDES init = Init; defTop = DefTop; defVar = DefVar; eval = Eval; name = Name; } T Init(erg: T; *term: ARRAY OF Energy.T; *weight: ARRAY OF REAL) { ??? NT = (term.nel); { assert((weight.nel) == NT); erg->term = NEW(REF ARRAY OF Energy.T, NT); erg->weight = NEW(REF ARRAY OF REAL, NT); erg->termValue = double_vec_new(NT); erg->term^ = term; erg->weight^ = weight; return erg; } } /* END Init */ void SELF_DefTop(SELF_T *erg, ElemTableRec_t *top) /* defTop(), for each energy ingredient */ { ??? term = erg->term^; ??? NT = (term.nel); { erg->ekDc = r4_vec_new(top->node.nel); for (k = 0; k < NT; k++){ term[k].defTop(top);} } } /* END DefTop */ void SELF_DefVar(SELF_T *erg, *variable: ARRAY OF bool_t) /* defVar(), for each energy ingredient */ { ??? term = erg->term^; ??? NT = (term.nel); { for (k = 0; k < NT; k++){ term[k].defVar(variable);} } } /* END DefVar */ void Eval(erg: T; *c: Coords_t; double e; VAR bool_t grad; VAR eDc: Gradient;) /* eval(), for each energy ingredient */ { ??? term = erg->term^; ??? weight = erg->weight^; ??? termValue = erg->termValue^; ??? ekDc = erg->ekDc^; ??? NT = (term.nel); ??? NV = (c.nel); { assert((eDc.nel) == NV); e = 0.0; for (v = 0; v < NV; v++){ eDc[v] = (r4_t){0.0, ..}; } for (k = 0; k < NT; k++) { term[k].eval(c, termValue[k], grad, ekDc); e = e + ((double)weight[k]) * termValue[k]; if (grad) { for (v = 0; v < NV; v++) { eDc[v] = r4_Mix(1.0,eDc[v], ((double)weight[k]), ekDc[v]) } } } } } /* END Eval */ char * SELF_Name(SELF_T *erg)== wr = NEW(TextWr.T).init(); /* escritor de texto */ { ??? term = erg->term^; ??? weight = erg->weight^; ??? NT = (term.nel); { fprintf(wr, "Mixed("); for (i = 0; i < NT; i++) { if (i > 0){ fprintf(wr, ",\n"); } if (i == 0) { fprintf(wr, "["); } else { fprintf(wr, " ["); } fprintf(wr, Fmt.Int(i)); fprintf(wr, "] == "); fprintf(wr, Fmt.Real(weight[i], Fmt.Style.Fix, 2)); fprintf(wr, "·"); fprintf(wr, term[i].name()) } fprintf(wr, ")") } return TextWr.ToText(wr); } /* END Name */ { } MixedEnergy.