AcouSTO  version 2.0

◆ geom_fill()

geom_fill ( struct geometry geom)

Fills the geometry structure with points coordinates, topology and vectors, as produced by the respective builders according to the input data.

Parameters
[in,out]geom
249  {
250  DOUBLE pi;
251  int inodb,i,j;
252  int ielmb,ivelb;
253 
254  struct vector vtmp1,vtmp2;
255  struct vector a1c,a2c,a1xa2c;
256  DOUBLE sx,sy,sz;
257 
258  logger(LOG_DEBUG,"filling geometry arrays\n");
259  pi = 4.0 * atanl(1.0);
260 
261  // Translating and rotating nodes
262  sx = geom->scale.x != 0.0 ? geom->scale.x : 1.0;
263  sy = geom->scale.y != 0.0 ? geom->scale.y : 1.0;
264  sz = geom->scale.z != 0.0 ? geom->scale.z : 1.0;
265  logger(LOG_DEBUG,"X Scale factor: %f\n",sx);
266  logger(LOG_DEBUG,"Y Scale factor: %f\n",sy);
267  logger(LOG_DEBUG,"Z Scale factor: %f\n",sz);
268 
269  logger(LOG_DEBUG,"filling geometry arrays\n");
270 
271  for(inodb=0;inodb<geom->nnodb;inodb++){
272  geometry->nodes[inodb + _g_inodb].x *= sx;
273  geometry->nodes[inodb + _g_inodb].y *= sy;
274  geometry->nodes[inodb + _g_inodb].z *= sz;
275 
276  vec_rotate(&geometry->nodes[inodb + _g_inodb], geom->rotation.x*pi/180.0, geom->rotation.y*pi/180.0, geom->rotation.z*pi/180.0);
277 
278  geometry->nodes[inodb + _g_inodb].x += geom->translation.x;
279  geometry->nodes[inodb + _g_inodb].y += geom->translation.y;
280  geometry->nodes[inodb + _g_inodb].z += geom->translation.z;
281  }
282 
283 
284  // topology
285  for(i=0;i<geom->nelmb;i++){
286  geometry->jphib[i + _g_ielmb] = i;
287  geometry->jpsib[i + _g_ielmb] = i;
288  geometry->mvrtb[i + _g_ielmb] = 4;
289  geometry->kcreb[i + _g_ielmb] = 1;
290  geometry->kelmb[i + _g_ielmb] = 0;
291  }
292 
293  /* building elements */
294  for(i=0;i<geom->nelmb;i++){
295  for(j=0;j<4;j++){
296  ielmb = i;
297  ivelb = j21(j,ielmb,4);
298  inodb = geometry->jnodb[ivelb + _g_ielmb];
299  vec_copy(&geometry->elements[i + _g_ielmb].x[j], geometry->nodes[inodb + _g_inodb]);
300  vec_mul(&vtmp1,geometry->nodes[inodb + _g_inodb],.25);
301  geometry->elements[i + _g_ielmb].idx[j]=inodb + _g_inodb;
302  }
303  }
304 
305 
306  /* Building Control points */
307  for(i=0;i<geom->ncntr;i++){
308  vec_zero(&geometry->cntr[i + _g_icntr]);
309  for(j=0;j<4;j++){
310  ielmb = i;
311  ivelb = j21(j,ielmb,4);
312  inodb = geometry->jnodb[ivelb + _g_ielmb];
313 
314  vec_mul(&vtmp1,geometry->nodes[inodb + _g_inodb],.25);
315  vec_sum(&geometry->cntr[i + _g_icntr], geometry->cntr[i + _g_icntr], vtmp1);
316  }
317  }
318 
319 
320  // normals
321  for(i=_g_ielmb;i<(geom->nelmb + _g_ielmb);i++){
322 
323  vec_diff(&vtmp1,geometry->elements[i].x[0],geometry->elements[i].x[2]);
324  vec_diff(&vtmp2,geometry->elements[i].x[1],geometry->elements[i].x[3]);
325 
326  a1c.x = .25*(+geometry->elements[i].x[0].x + geometry->elements[i].x[1].x - geometry->elements[i].x[2].x - geometry->elements[i].x[3].x);
327  a1c.y = .25*(+geometry->elements[i].x[0].y + geometry->elements[i].x[1].y - geometry->elements[i].x[2].y - geometry->elements[i].x[3].y);
328  a1c.z = .25*(+geometry->elements[i].x[0].z + geometry->elements[i].x[1].z - geometry->elements[i].x[2].z - geometry->elements[i].x[3].z);
329 
330  a2c.x = .25*(-geometry->elements[i].x[0].x + geometry->elements[i].x[1].x + geometry->elements[i].x[2].x - geometry->elements[i].x[3].x);
331  a2c.y = .25*(-geometry->elements[i].x[0].y + geometry->elements[i].x[1].y + geometry->elements[i].x[2].y - geometry->elements[i].x[3].y);
332  a2c.z = .25*(-geometry->elements[i].x[0].z + geometry->elements[i].x[1].z + geometry->elements[i].x[2].z - geometry->elements[i].x[3].z);
333 
334  vec_cross(&a1xa2c,a1c,a2c);
335 
336  vec_copy (&geometry->elements[i].n,a1xa2c);
337  geometry->elements[i].nmod = vec_mod(geometry->elements[i].n); /* storing modules */
338  vec_normalize(&geometry->elements[i].n);
339 
340  }
341 
342  geometry->ncntrc += geom->ncntr ;
343  for(i=_g_icntr;i<(geom->ncntr+_g_icntr);i++){
344  vec_copy(&geometry->cntrc[i],geometry->cntr[i]);
345  }
346  logger(LOG_DEBUG,"geometry arrays filled\n");
347 }
int ncntr
Definition: structs.h:175
void vec_normalize(struct vector *v)
Definition: math.c:130
void vec_rotate(struct vector *v, DOUBLE phi, DOUBLE theta, DOUBLE psi)
Definition: math.c:238
void vec_mul(struct vector *vdest, const struct vector v1, DOUBLE d)
Definition: math.c:184
void vec_copy(struct vector *vdest, const struct vector vsrc)
Definition: math.c:158
vector struct to hold triplets.
Definition: structs.h:29
DOUBLE vec_mod(struct vector v1)
Definition: math.c:121
struct vector translation
Definition: structs.h:181
void vec_zero(struct vector *v)
Definition: math.c:146
struct vector scale
Definition: structs.h:185
int nelmb
Definition: structs.h:179
DOUBLE z
Definition: structs.h:35
void vec_diff(struct vector *vdest, const struct vector v1, const struct vector v2)
Definition: math.c:52
struct vector rotation
Definition: structs.h:183
#define LOG_DEBUG
Definition: logger.h:27
int j21(int i1, int i2, int n1)
Definition: math.c:202
double DOUBLE
Definition: types.h:44
void vec_cross(struct vector *vdest, const struct vector v1, const struct vector v2)
Definition: math.c:92
void vec_sum(struct vector *vdest, const struct vector v1, const struct vector v2)
Definition: math.c:72
DOUBLE x
Definition: structs.h:31
int nnodb
Definition: structs.h:177
int _g_inodb
Definition: globals.h:68
int _g_ielmb
Definition: globals.h:70
Geometry info structure.
Definition: structs.h:161
int _g_icntr
Definition: globals.h:69
void logger(int level, char *msg,...)
Definition: logger.c:56
DOUBLE y
Definition: structs.h:33