4

« **on:** February 06, 2012, 07:10:52 PM »
The following UDF allows you to compute mass weighted average of temperature based on any surface. You just have to provide surface ID.

#include "udf.h"

#include "surf.h"

#include "cxsurf.h"

#include "cxiface.h"

#define SID 9 /*Surface ID to be modified*/

void

facet_area_3D( Surface *s, int i, double area[] )

{

double v[MAX_FACE_NODES][3];

int k, m;

area[0]=area[1]=area[2]=0.0;

for (k=0; k < s->facets*; k++)*

{

v[k][0]=Get_Surface_Point_Coord(&( s->points[s->facets[i+k+1]]),X_DIM);

v[k][1]=Get_Surface_Point_Coord(&( s->points[s->facets[i+k+1]]),Y_DIM);

v[k][2]=Get_Surface_Point_Coord(&(s->points[s->facets[i+k+1]]),Z_DIM);

}

for (k=0; k < s->facets*; k++)*

{

m = (k+1)%(s->facets*);*

area[0]+= 0.5*((v[m][1] + v[k][1]) * (v[m][2] - v[k][2]));

area[1]+= 0.5*((v[m][2] + v[k][2]) * (v[m][0] - v[k][0]));

area[2]+= 0.5*((v[m][0] + v[k][0]) * (v[m][1] - v[k][1]));

}

}

DEFINE_ON_DEMAND(integrals)

{

Surface *s;

cell_t c ;

Thread *t;

real mass_integral=0;

real total_mass=0;

double area[ND_ND],vel[ND_ND];

real avg_surf_temp;

int i,k;

/* s is the surface having data of surface id SID

s->np no of points.

s->nf no of faces.

s->points points to array of np points.

s->ip pointer to interpolation vector of np points.

s->facets facet list of the surface. length of array is nfl.

s->cells pointer to cells of each facet.

s->nfl facet list length.

*/

s = SurfaceList+SID;

for (i=0, k=0; k<s->nf; i+=s->facets*+1, k++)*

if (s->facets* >= 3)*

{

facet_area_3D(s, i, area);

/* Cell in which the facet lies */

c = RP_CELL(s->cells+k);

t = RP_THREAD(s->cells+k);

NV_D(vel,=,C_U(c,t),C_V(c,t),C_W(c,t)) ;

mass_integral += C_R(c,t)*C_T(c,t)*fabs(NV_DOT(area,vel));

total_mass += C_R(c,t)*fabs( NV_DOT(area,vel));

}

avg_surf_temp=mass_integral/total_mass;

Message("Mass weighted average of Temperature at Surface ID=%d is %f",SID,avg_surf_temp);

}

#include "udf.h"

#include "surf.h"

#include "cxsurf.h"

#include "cxiface.h"

#define SID 9 /*Surface ID to be modified*/

void

facet_area_3D( Surface *s, int i, double area[] )

{

double v[MAX_FACE_NODES][3];

int k, m;

area[0]=area[1]=area[2]=0.0;

for (k=0; k < s->facets*; k++)*

{

v[k][0]=Get_Surface_Point_Coord(&( s->points[s->facets[i+k+1]]),X_DIM);

v[k][1]=Get_Surface_Point_Coord(&( s->points[s->facets[i+k+1]]),Y_DIM);

v[k][2]=Get_Surface_Point_Coord(&(s->points[s->facets[i+k+1]]),Z_DIM);

}

for (k=0; k < s->facets*; k++)*

{

m = (k+1)%(s->facets*);*

area[0]+= 0.5*((v[m][1] + v[k][1]) * (v[m][2] - v[k][2]));

area[1]+= 0.5*((v[m][2] + v[k][2]) * (v[m][0] - v[k][0]));

area[2]+= 0.5*((v[m][0] + v[k][0]) * (v[m][1] - v[k][1]));

}

}

DEFINE_ON_DEMAND(integrals)

{

Surface *s;

cell_t c ;

Thread *t;

real mass_integral=0;

real total_mass=0;

double area[ND_ND],vel[ND_ND];

real avg_surf_temp;

int i,k;

/* s is the surface having data of surface id SID

s->np no of points.

s->nf no of faces.

s->points points to array of np points.

s->ip pointer to interpolation vector of np points.

s->facets facet list of the surface. length of array is nfl.

s->cells pointer to cells of each facet.

s->nfl facet list length.

*/

s = SurfaceList+SID;

for (i=0, k=0; k<s->nf; i+=s->facets*+1, k++)*

if (s->facets* >= 3)*

{

facet_area_3D(s, i, area);

/* Cell in which the facet lies */

c = RP_CELL(s->cells+k);

t = RP_THREAD(s->cells+k);

NV_D(vel,=,C_U(c,t),C_V(c,t),C_W(c,t)) ;

mass_integral += C_R(c,t)*C_T(c,t)*fabs(NV_DOT(area,vel));

total_mass += C_R(c,t)*fabs( NV_DOT(area,vel));

}

avg_surf_temp=mass_integral/total_mass;

Message("Mass weighted average of Temperature at Surface ID=%d is %f",SID,avg_surf_temp);

}