How to create mass weighted average function by UDF on a surface? (not on a zone or thread)


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[i]; 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[i]; k++)
{
m = (k+1)%(s->facets[i]);
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[i]+1, k++)
if (s->facets[i] >= 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[i]; 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[i]; k++)
{
m = (k+1)%(s->facets[i]);
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[i]+1, k++)
if (s->facets[i] >= 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);
}





Show Form
No comments yet. Be the first to add a comment!