/* * ACE/vis - Visualization of Flow and Transport * * Paul J. Turner and Antonio M. Baptista * * Copyright 1990-2003 Oregon Health and Science University * All Rights Reserved * */ /* * * Interpolate various models and gauss integration * */ #ifndef lint static char RCSid[] = "$Id: interp.c,v 1.3 2003/08/25 15:45:40 pturner Exp $"; #endif #include "defines.h" #include "globals.h" double get_depth_element(int gno, int ind, double x, double y); double eval_teanl(int flowno, int el, double t, double xp, double yp, int redo); int eval_teanl_flow(int flowno, int el, double t, double xp, double yp, double *uret, double *vret, int redo); int eval_teanl_flownode(int flowno, int nn, double t, double *uret, double *vret); double eval_teanl_node(int flowno, int node, double t); double eval_adcirc(int flowno, int el, int step, double t, double xp, double yp, int redo); int eval_adcirc_flow(int flowno, int el, int step, double t, double xp, double yp, double *uret, double *vret, int redo); double eval_ela(int concno, int el, int step, double t, double xp, double yp, int redo); double gaussi(int gridno, int nel, double *c, double *ht); double ufun(int ftype, int flowno, int ind, double x, double y, int step, double t); double vfun(int ftype, int flowno, int ind, double x, double y, int step, double t); double wfun(void); int belel2(void); int get_grid_number(void); double eval_model(int obj, int w1, int w2, int step, int ind, double t, double x, double y, int redo); double eval_triangle3(int gridno, int el, double xp, double yp, double *c, int redo); double eval_triangle6(int gridno, int el, double xp, double yp, double *c, int redo); double eval_quadrangle4(int gridno, int el, double r, double s, double *c, int redo); double eval_quadrangle8(int gridno, int el, double r, double s, double *c, int redo); double eval_teanl(int flowno, int el, double t, double xp, double yp, int redo) { int i; double e; static int n1, n2, n3; static double h1, h2, h3; double aum, ado, atr, bum, bdo, btr, cum, cdo, ctr, arei; double atmp, btmp; static double phn[MAXFREQ], an[MAXFREQ]; double *x, *y; double pcor = flowf[flowno].sign_of_phase; if (!redo) { x = grid[flowf[flowno].grid].xord; y = grid[flowf[flowno].grid].yord; n1 = grid[flowf[flowno].grid].icon[el].nl[0]; n2 = grid[flowf[flowno].grid].icon[el].nl[1]; n3 = grid[flowf[flowno].grid].icon[el].nl[2]; aum = x[n2] * y[n3] - x[n3] * y[n2]; bum = y[n2] - y[n3]; cum = x[n3] - x[n2]; ado = x[n3] * y[n1] - x[n1] * y[n3]; bdo = y[n3] - y[n1]; cdo = x[n1] - x[n3]; atr = x[n1] * y[n2] - x[n2] * y[n1]; btr = y[n1] - y[n2]; ctr = x[n2] - x[n1]; arei = 1.0 / (aum + ado + atr); h3 = (atr + btr * xp + ctr * yp) * arei; h2 = (ado + bdo * xp + cdo * yp) * arei; h1 = 1.0 - h2 - h3; for (i = 0; i < flowf[flowno].nfreq; i++) { atmp = h1 * flowf[flowno].elamp[i][n1] * cos(flowf[flowno].elphase[i][n1]) + h2 * flowf[flowno].elamp[i][n2] * cos(flowf[flowno].elphase[i][n2]) + h3 * flowf[flowno].elamp[i][n3] * cos(flowf[flowno].elphase[i][n3]); btmp = h1 * flowf[flowno].elamp[i][n1] * sin(flowf[flowno].elphase[i][n1]) + h2 * flowf[flowno].elamp[i][n2] * sin(flowf[flowno].elphase[i][n2]) + h3 * flowf[flowno].elamp[i][n3] * sin(flowf[flowno].elphase[i][n3]); phn[i] = atan2(btmp, atmp); an[i] = atmp / cos(phn[i]); } } e = 0.0; for (i = 0; i < flowf[flowno].nfreq; i++) { e += an[i] * cos(flowf[flowno].omega[i] * t - pcor * phn[i]); } return e; } int eval_teanl_flow(int flowno, int el, double t, double xp, double yp, double *uret, double *vret, int redo) { int i; double e; static int n1, n2, n3; static double h1, h2, h3; static double phnx[MAXFREQ], anx[MAXFREQ]; static double phny[MAXFREQ], any[MAXFREQ]; double aum, ado, atr, bum, bdo, btr, cum, cdo, ctr, arei; double atmpx, btmpx; double atmpy, btmpy; double *x, *y; double pcor = flowf[flowno].sign_of_phase; if (!redo) { x = grid[flowf[flowno].grid].xord; y = grid[flowf[flowno].grid].yord; n1 = grid[flowf[flowno].grid].icon[el].nl[0]; n2 = grid[flowf[flowno].grid].icon[el].nl[1]; n3 = grid[flowf[flowno].grid].icon[el].nl[2]; aum = x[n2] * y[n3] - x[n3] * y[n2]; bum = y[n2] - y[n3]; cum = x[n3] - x[n2]; ado = x[n3] * y[n1] - x[n1] * y[n3]; bdo = y[n3] - y[n1]; cdo = x[n1] - x[n3]; atr = x[n1] * y[n2] - x[n2] * y[n1]; btr = y[n1] - y[n2]; ctr = x[n2] - x[n1]; arei = 1.0 / (aum + ado + atr); h3 = (atr + btr * xp + ctr * yp) * arei; h2 = (ado + bdo * xp + cdo * yp) * arei; h1 = 1.0 - h2 - h3; for (i = 0; i < flowf[flowno].nfreq; i++) { atmpx = h1 * flowf[flowno].ampx[i][n1] * cos(flowf[flowno].phax[i][n1]) + h2 * flowf[flowno].ampx[i][n2] * cos(flowf[flowno].phax[i][n2]) + h3 * flowf[flowno].ampx[i][n3] * cos(flowf[flowno].phax[i][n3]); btmpx = h1 * flowf[flowno].ampx[i][n1] * sin(flowf[flowno].phax[i][n1]) + h2 * flowf[flowno].ampx[i][n2] * sin(flowf[flowno].phax[i][n2]) + h3 * flowf[flowno].ampx[i][n3] * sin(flowf[flowno].phax[i][n3]); phnx[i] = atan2(btmpx, atmpx); anx[i] = atmpx / cos(phnx[i]); atmpy = h1 * flowf[flowno].ampy[i][n1] * cos(flowf[flowno].phay[i][n1]) + h2 * flowf[flowno].ampy[i][n2] * cos(flowf[flowno].phay[i][n2]) + h3 * flowf[flowno].ampy[i][n3] * cos(flowf[flowno].phay[i][n3]); btmpy = h1 * flowf[flowno].ampy[i][n1] * sin(flowf[flowno].phay[i][n1]) + h2 * flowf[flowno].ampy[i][n2] * sin(flowf[flowno].phay[i][n2]) + h3 * flowf[flowno].ampy[i][n3] * sin(flowf[flowno].phay[i][n3]); phny[i] = atan2(btmpy, atmpy); any[i] = atmpy / cos(phny[i]); } } *uret = 0.0; *vret = 0.0; for (i = 0; i < flowf[flowno].nfreq; i++) { *uret += anx[i] * cos(flowf[flowno].omega[i] * t - pcor * phnx[i]); *vret += any[i] * cos(flowf[flowno].omega[i] * t - pcor * phny[i]); } return 1; } int eval_teanl_flownode(int flowno, int nn, double t, double *uret, double *vret) { int i; double e; double pcor = flowf[flowno].sign_of_phase; *uret = 0.0; *vret = 0.0; for (i = 0; i < flowf[flowno].nfreq; i++) { *uret += flowf[flowno].ampx[i][nn] * cos(flowf[flowno].omega[i] * t - pcor * flowf[flowno].phax[i][nn]); *vret += flowf[flowno].ampy[i][nn] * cos(flowf[flowno].omega[i] * t - pcor * flowf[flowno].phay[i][nn]); } return 1; } double eval_teanl_node(int flowno, int node, double t) { int i; double e = 0.0; double pcor = flowf[flowno].sign_of_phase; for (i = 0; i < flowf[flowno].nfreq; i++) { e += flowf[flowno].elamp[i][node] * cos(flowf[flowno].omega[i] * t - pcor * flowf[flowno].elphase[i][node]); } return e; } double eval_adcirc(int flowno, int el, int step, double t, double xp, double yp, int redo) { static double w[4]; int i, n; double x[4], y[4], sum; if (!redo) { for (i=0;i