79
67
strcpy(errorMessage, "Divergence failed...");
82
static void divergence(int inNb, List_T *inList, int *outNb, List_T *outList,
83
int dim, int nbNod, int nbTime)
70
static List_T *incrementList(PViewDataList *data2, int numEdges)
73
case 0: data2->NbSP++; return data2->SP;
74
case 1: data2->NbSL++; return data2->SL;
75
case 3: data2->NbST++; return data2->ST;
76
case 4: data2->NbSQ++; return data2->SQ;
77
case 6: data2->NbSS++; return data2->SS;
78
case 12: data2->NbSH++; return data2->SH;
79
case 9: data2->NbSI++; return data2->SI;
80
case 8: data2->NbSY++; return data2->SY;
85
PView *GMSH_DivergencePlugin::execute(PView *v)
87
int iView = (int)DivergenceOptions_Number[0].def;
87
int nb = List_Nbr(inList) / inNb;
88
for(int i = 0; i < List_Nbr(inList); i += nb) {
89
double *x = (double *)List_Pointer_Fast(inList, i);
90
double *y = (double *)List_Pointer_Fast(inList, i + nbNod);
91
double *z = (double *)List_Pointer_Fast(inList, i + 2 * nbNod);
92
elementFactory factory;
93
element *element = factory.create(nbNod, dim, x, y, z);
95
for(int j = 0; j < 3 * nbNod; j++)
96
List_Add(outList, &x[j]);
97
for(int j = 0; j < nbTime; j++){
98
double *val = (double *)List_Pointer(inList, i + 3 * nbNod + nbNod * 3 * j);
99
for(int k = 0; k < nbNod; k++){
101
element->getNode(k, u, v, w);
102
double f = element->interpolateDiv(val, u, v, w, 3);
103
List_Add(outList, &f);
89
PView *v1 = getView(iView, v);
92
PViewData *data1 = v1->getData();
93
if(data1->hasMultipleMeshes()){
94
Msg(GERROR, "Divergence plugin cannot be run on multi-mesh views");
98
PView *v2 = new PView(true);
99
PViewDataList *data2 = getDataList(v2);
101
for(int ent = 0; ent < data1->getNumEntities(0); ent++){
102
for(int ele = 0; ele < data1->getNumElements(0, ent); ele++){
103
if(data1->skipElement(0, ent, ele)) continue;
104
int numComp = data1->getNumComponents(0, ent, ele);
105
if(numComp != 3) continue;
106
int numEdges = data1->getNumEdges(0, ent, ele);
107
List_T *out = incrementList(data2, numEdges);
109
int numNodes = data1->getNumNodes(0, ent, ele);
110
double x[8], y[8], z[8], val[8 * 3];
111
for(int nod = 0; nod < numNodes; nod++)
112
data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
113
int dim = data1->getDimension(0, ent, ele);
114
elementFactory factory;
115
element *element = factory.create(numNodes, dim, x, y, z);
116
if(!element) continue;
117
for(int nod = 0; nod < numNodes; nod++) List_Add(out, &x[nod]);
118
for(int nod = 0; nod < numNodes; nod++) List_Add(out, &y[nod]);
119
for(int nod = 0; nod < numNodes; nod++) List_Add(out, &z[nod]);
120
for(int step = 0; step < data1->getNumTimeSteps(); step++){
121
for(int nod = 0; nod < numNodes; nod++)
122
for(int comp = 0; comp < numComp; comp++)
123
data1->getValue(step, ent, ele, nod, comp, val[numComp * nod + comp]);
124
for(int nod = 0; nod < numNodes; nod++){
126
element->getNode(nod, u, v, w);
127
double f = element->interpolateDiv(val, u, v, w, 3);
111
Post_View *GMSH_DivergencePlugin::execute(Post_View * v)
113
int iView = (int)DivergenceOptions_Number[0].def;
116
iView = v ? v->Index : 0;
118
if(!List_Pointer_Test(CTX.post.list, iView)) {
119
Msg(GERROR, "View[%d] does not exist", iView);
123
Post_View *v1 = *(Post_View **)List_Pointer(CTX.post.list, iView);
124
Post_View *v2 = BeginView(1);
126
divergence(v1->NbVL, v1->VL, &v2->NbSL, v2->SL, 1, 2, v1->NbTimeStep);
127
divergence(v1->NbVT, v1->VT, &v2->NbST, v2->ST, 2, 3, v1->NbTimeStep);
128
divergence(v1->NbVQ, v1->VQ, &v2->NbSQ, v2->SQ, 2, 4, v1->NbTimeStep);
129
divergence(v1->NbVS, v1->VS, &v2->NbSS, v2->SS, 3, 4, v1->NbTimeStep);
130
divergence(v1->NbVH, v1->VH, &v2->NbSH, v2->SH, 3, 8, v1->NbTimeStep);
131
divergence(v1->NbVI, v1->VI, &v2->NbSI, v2->SI, 3, 6, v1->NbTimeStep);
132
divergence(v1->NbVY, v1->VY, &v2->NbSY, v2->SY, 3, 5, v1->NbTimeStep);
135
for(int i = 0; i < List_Nbr(v1->Time); i++)
136
List_Add(v2->Time, List_Pointer(v1->Time, i));
138
char name[1024], filename[1024];
139
sprintf(name, "%s_Divergence", v1->Name);
140
sprintf(filename, "%s_Divergence.pos", v1->Name);
141
EndView(v2, 1, filename, name);
135
for(int i = 0; i < data1->getNumTimeSteps(); i++){
136
double time = data1->getTime(i);
137
List_Add(data2->Time, &time);
139
data2->setName(data1->getName() + "_Divergence");
140
data2->setFileName(data1->getName() + "_Divergence.pos");