file: Hlib/src/Norms.c

/**************************************************************************/ // // // Author: T.Warburton // // Design: T.Warburton && S.Sherwin // // Date : 12/4/96 // // // // Copyright notice: This code shall not be replicated or used without // // the permission of the author. // // // /**************************************************************************/ #include <stdio.h> #include <stdarg.h> #include <string.h> #include <ctype.h> #include <math.h> #include <polylib.h> #include "veclib.h" #include "hotel.h" #include "nekstruct.h" /* Function name: Element::Error Function Purpose: Argument 1: char *string Purpose: Function Notes: */ void Tri::Error(char *string){ int qt,trip=0; double li=0.0,l2=0.0,h1=0.0,areat = 0.0,l2a,h1a,area,store; double *s,*utmp; Coord *X = (Coord *)calloc(1,sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) vector_def("x y",string); X->x = dvector(0,QGmax*QGmax-1); X->y = dvector(0,QGmax*QGmax-1); utmp = dvector(0,QGmax*QGmax-1); fprintf(stdout, "%c ",type); qt = qa*qb; s = h[0]; if(state == 't'){ Trans(this, J_to_Q); trip = 1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); li = ((store=Norm_li())>li)? store:li; //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_l2m(&l2a,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_h1m(&h1a,&area); //OVERLOAD CALL: Norm_h1m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) l2 += l2a; h1 += h1a; areat += area; if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", li,sqrt(l2/areat),sqrt(h1/areat)); free(X->x); free(X->y); free(utmp); free((char *)X); } void Quad::Error(char *string){ int qt,trip=0; double li=0.0,l2=0.0,h1=0.0,areat = 0.0,l2a,h1a,area,store; double *s,*utmp; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) vector_def("x y",string); X->x = dvector(0,QGmax*QGmax-1); X->y = dvector(0,QGmax*QGmax-1); utmp = dvector(0,QGmax*QGmax-1); fprintf(stdout, "%c ",type); qt = qa*qb; s = h[0]; if(state == 't'){ Trans(this, J_to_Q); trip = 1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); li = ((store=Norm_li())>li)? store:li; //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_l2m(&l2a,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_h1m(&h1a,&area); //OVERLOAD CALL: Norm_h1m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) l2 += l2a; h1 += h1a; areat += area; if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", li,sqrt(l2/areat),sqrt(h1/areat)); free(X->x); free(X->y); free(utmp); free((char *)X); } void Tet::Error(char *string){ int qt,trip=0; double li=0.0,l2=0.0,h1=0.0,areat = 0.0,l2a,h1a=0.,area,store; double *s,*utmp; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) vector_def("x y z",string); X->x = dvector(0,QGmax*QGmax*QGmax-1); X->y = dvector(0,QGmax*QGmax*QGmax-1); X->z = dvector(0,QGmax*QGmax*QGmax-1); utmp = dvector(0,QGmax*QGmax*QGmax-1); qt = qtot; s = h_3d[0][0]; if(state == 't'){ Trans(this,J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,X->z,s); dvsub(qt,s,1,utmp,1,s,1); li = ((store=Norm_li())>li)? store:li; //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_l2m(&l2a,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_h1m(&h1a,&area); //OVERLOAD CALL: Norm_h1m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) l2 += l2a; h1 += h1a; areat += area; if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", li,sqrt(l2/areat),sqrt(h1/areat)); free(X->x); free(X->y); free(X->z); free(utmp); free((char *)X); } void Pyr::Error(char *string){ int qt,trip=0; double li=0.0,l2=0.0,h1=0.0,areat = 0.0,l2a,h1a,area,store; double *s,*utmp; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) vector_def("x y z",string); X->x = dvector(0,QGmax*QGmax*QGmax-1); X->y = dvector(0,QGmax*QGmax*QGmax-1); X->z = dvector(0,QGmax*QGmax*QGmax-1); utmp = dvector(0,QGmax*QGmax*QGmax-1); qt = qtot; s = h_3d[0][0]; if(state == 't'){ Trans(this,J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,X->z,s); dvsub(qt,s,1,utmp,1,s,1); li = ((store=Norm_li())>li)? store:li; //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_l2m(&l2a,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_h1m(&h1a,&area); //OVERLOAD CALL: Norm_h1m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) l2 += l2a; h1 += h1a; areat += area; if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", li,sqrt(l2/areat),sqrt(h1/areat)); free(X->x); free(X->y); free(X->z); free(utmp); free((char *)X); } void Prism::Error(char *string){ int qt,trip=0; double li=0.0,l2=0.0,h1=0.0,areat = 0.0,l2a,h1a,area,store; double *s,*utmp; Coord *X = (Coord *)calloc(1,sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) vector_def("x y z",string); X->x = dvector(0,QGmax*QGmax*QGmax-1); X->y = dvector(0,QGmax*QGmax*QGmax-1); X->z = dvector(0,QGmax*QGmax*QGmax-1); utmp = dvector(0,QGmax*QGmax*QGmax-1); qt = qtot; s = h_3d[0][0]; if(state == 't'){ Trans(this,J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,X->z,s); dvsub(qt,s,1,utmp,1,s,1); li = ((store=Norm_li())>li)? store:li; //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_l2m(&l2a,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_h1m(&h1a,&area); //OVERLOAD CALL: Norm_h1m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) l2 += l2a; h1 += h1a; areat += area; if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", li,sqrt(l2/areat),sqrt(h1/areat)); free(X->x); free(X->y); free(X->z); free(utmp); free((char *)X); } void Hex::Error(char *string){ int qt,trip=0; double li=0.0,l2=0.0,h1=0.0,areat = 0.0,l2a,h1a,area,store; double *s,*utmp; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) vector_def("x y z",string); X->x = dvector(0,QGmax*QGmax*QGmax-1); X->y = dvector(0,QGmax*QGmax*QGmax-1); X->z = dvector(0,QGmax*QGmax*QGmax-1); utmp = dvector(0,QGmax*QGmax*QGmax-1); qt = qtot; s = h_3d[0][0]; if(state == 't'){ Trans(this,J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,X->z,s); dvsub(qt,s,1,utmp,1,s,1); li = ((store=Norm_li())>li)? store:li; //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_l2m(&l2a,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) Norm_h1m(&h1a,&area); //OVERLOAD CALL: Norm_h1m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) l2 += l2a; h1 += h1a; areat += area; if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", li,sqrt(l2/areat),sqrt(h1/areat)); free(X->x); free(X->y); free(X->z); free(utmp); free((char *)X); } void Element::Error(char *){ERR;} // compare with function //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?) /* Function name: Element::Verror Function Purpose: Argument 1: double *u Purpose: Argument 2: char *string Purpose: Function Notes: */ void Tri::Verror(double *u, char *string){ int qt; double *s,*utmp; Coord *X = (Coord *)calloc(1,sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,u,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", Norm_li(),Norm_l2(),Norm_h1()); //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element); Norm_l2: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element); Norm_h1: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(state == 'p') dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return; } void Quad::Verror(double *u, char *string){ int qt; double *s,*utmp; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,u,1,s,1); fprintf(stdout,"%12.6lg %12.6lg %12.6lg (Linf L2 H1)\n", Norm_li(),Norm_l2(),Norm_h1()); //OVERLOAD CALL: Norm_li: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element); Norm_l2: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element); Norm_h1: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(state == 'p') dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return; } void Tet::Verror(double *, char *){ return; } void Pyr::Verror(double *, char *){ return; } void Prism::Verror(double *, char *){ return; } void Hex::Verror(double *, char *){ return; } void Element::Verror(double *, char *){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?) /* Function name: Element::Norm_li Function Purpose: Function Notes: */ double Tri::Norm_li(){ const int qt = qa*qb; double *u=h[0]; return fabs(u[idamax(qt,u,1)]); } double Quad::Norm_li(){ const int qt = qa*qb; double *u=h[0]; return fabs(u[idamax(qt,u,1)]); } double Tet::Norm_li(){ double *u=h_3d[0][0]; return fabs(u[idamax(qtot,u,1)]); } double Pyr::Norm_li(){ double *u=h_3d[0][0]; return fabs(u[idamax(qtot,u,1)]); } double Prism::Norm_li(){ double *u=h_3d[0][0]; return fabs(u[idamax(qtot,u,1)]); } double Hex::Norm_li(){ double *u=h_3d[0][0]; return fabs(u[idamax(qtot,u,1)]); } double Element::Norm_li(){return 0.0;} /* Function name: Element::Norm_l2 Function Purpose: Function Notes: */ double Tri::Norm_l2(){ const int qbc = qb, qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), area,l2,*z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'b'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); if(curvX) dvmul(qt, geom->jac.p, 1, b, 1, b, 1); else dscal(qt, geom->jac.d, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 = ddot(qt, b, 1, u, 1); area = dsum(qt, b, 1); free(u); free(b); return sqrt(l2/area); } double Quad::Norm_l2(){ const int Qc = 1, qab = qa, qbc = qb, qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), area,l2,*z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(i = 0; i < Qc; ++i) for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+i*qab+j,qa,b+i*qab+j,qa); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 = ddot(qt, b, 1, u, 1); area = dsum(qt, b, 1); free(u); free(b); return sqrt(l2/area); } double Tet::Norm_l2(){ return -1.; } double Pyr::Norm_l2(){ return -1.; } double Prism::Norm_l2(){ return -1.; } double Hex::Norm_l2(){ return -1.; } double Element::Norm_l2(){return 0.0;} /* Function name: Element::Norm_l2m Function Purpose: Argument 1: double *l2 Purpose: Argument 2: double *area Purpose: Function Notes: */ void Tri::Norm_l2m(double *l2, double *area){ const int qt = qa*qb; double *H = h[0]; double *u =dvector(0,qt-1), *b =dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'b'); for(i = 0; i < qb; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); if(curvX) dvmul(qt, geom->jac.p, 1, b, 1, b, 1); else dscal(qt, geom->jac.d, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(b); return; } void Quad::Norm_l2m(double *l2, double *area){ const int qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); for(i = 0; i < qb; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(b); return; } void Tet::Norm_l2m(double *l2, double *area){ const int qab = qa*qb, qbc = qb*qc, qt = qa*qb*qc; double *H = h_3d[0][0],*wc; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'b'); getzw(qc,&z,&wc,'c'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(i = 0; i < qc; ++i) for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+i*qab+j,qa,b+i*qab+j,qa); for(i = 0; i < qab; ++i) dvmul(qc,wc,1,b+i,qab,b+i,qab); if(curvX) dvmul(qt, geom->jac.p, 1, b, 1, b, 1); else dsmul(qt, geom->jac.d, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(b); return; } void Pyr::Norm_l2m(double *l2, double *area){ const int qab = qa*qb, qbc = qb*qc, qt = qa*qb*qc; double *H = h_3d[0][0],*wc; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); getzw(qc,&z,&wc,'c'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(i = 0; i < qc; ++i) for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+i*qab+j,qa,b+i*qab+j,qa); for(i = 0; i < qab; ++i) dvmul(qc,wc,1,b+i,qab,b+i,qab); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(b); return; } void Prism::Norm_l2m(double *l2, double *area){ const int qab = qa*qb, qbc = qb*qc, qt = qa*qb*qc; double *H = h_3d[0][0],*wc; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); getzw(qc,&z,&wc,'b'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(i = 0; i < qc; ++i) for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+i*qab+j,qa,b+i*qab+j,qa); for(i = 0; i < qab; ++i) dvmul(qc,wc,1,b+i,qab,b+i,qab); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(b); return; } void Hex::Norm_l2m(double *l2, double *area){ const int qab = qa*qb, qbc = qb*qc, qt = qa*qb*qc; double *H = h_3d[0][0],*wc; double *u = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); getzw(qc,&z,&wc,'a'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(i = 0; i < qc; ++i) for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+i*qab+j,qa,b+i*qab+j,qa); for(i = 0; i < qab; ++i) dvmul(qc,wc,1,b+i,qab,b+i,qab); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); l2 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(b); return; } void Element::Norm_l2m(double *, double *){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?) /* Function name: Element::Norm_h1 Function Purpose: Function Notes: */ double Tri::Norm_h1(){ const int qbc = qb, qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *ux = dvector(0,qt-1), *uy = dvector(0,qt-1), *b = dvector(0,qt-1), area,h1,*z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'b'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); Grad_d(ux,uy,(double*)NULL,'a'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex) dvmul(qt,ux,1,ux,1,ux,1); dvmul(qt,uy,1,uy,1,uy,1); dvadd(qt,ux,1,uy,1,ux,1); if(curvX) dvmul(qt, geom->jac.p, 1, b, 1, b, 1); else dscal(qt, geom->jac.d, b, 1); dvmul(qt, H, 1, H, 1, u, 1); #ifdef ANORM daxpy(qt,1.0/(dparam("LAMBDA")*dparam("LAMBDA")),ux,1,u,1); #else dvadd(qt,ux, 1, u, 1, u, 1); #endif h1 = ddot(qt, b, 1, u, 1); area = dsum(qt, b, 1); free(u); free(ux); free(uy); free(b); return sqrt(h1/area); } double Quad::Norm_h1(){ const int qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *ux = dvector(0,qt-1), *uy = dvector(0,qt-1), *b = dvector(0,qt-1), area,h1,*z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); for(i = 0; i < qb; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); Grad_d(ux,uy,(double*)NULL,'a'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex) dvmul(qt,ux,1,ux,1,ux,1); dvmul(qt,uy,1,uy,1,uy,1); dvadd(qt,ux,1,uy,1,ux,1); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); #ifdef ANORM daxpy(qt,1.0/(dparam("LAMBDA")*dparam("LAMBDA")),ux,1,u,1); #else dvadd(qt,ux, 1, u, 1, u, 1); #endif h1 = ddot(qt, b, 1, u, 1); area = dsum(qt, b, 1); free(u); free(ux); free(uy); free(b); return sqrt(h1/area); } double Tet::Norm_h1(){ return -1.; } double Pyr::Norm_h1(){ return -1.; } double Prism::Norm_h1(){ return -1.; } double Hex::Norm_h1(){ return -1.; } double Element::Norm_h1(){return 0.0;} /* Function name: Element::Norm_h1m Function Purpose: Argument 1: double *h1 Purpose: Argument 2: double *area Purpose: Function Notes: */ void Tri::Norm_h1m(double *h1, double *area){ const int qbc = qb, qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *ux = dvector(0,qt-1), *uy = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'b'); for(i = 0; i < qbc; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); Grad_d(ux,uy,NULL,'a'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex) dvmul(qt,ux,1,ux,1,ux,1); dvmul(qt,uy,1,uy,1,uy,1); dvadd(qt,ux,1,uy,1,ux,1); if(curvX) dvmul(qt, geom->jac.p, 1, b, 1, b, 1); else dscal(qt, geom->jac.d, b, 1); dvmul(qt, H, 1, H, 1, u, 1); dvadd(qt,ux, 1, u, 1, u, 1); h1 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(ux); free(uy); free(b); return; } void Quad::Norm_h1m(double *h1, double *area){ const int qt = qa*qb; double *H = h[0]; double *u = dvector(0,qt-1), *ux = dvector(0,qt-1), *uy = dvector(0,qt-1), *b = dvector(0,qt-1), *z,*wa,*wb; register int i,j; getzw(qa,&z,&wa,'a'); getzw(qb,&z,&wb,'a'); for(i = 0; i < qb; ++i) dcopy(qa,wa,1,b+i*qa,1); for(j = 0; j < qa; ++j) dvmul(qb,wb,1,b+j,qa,b+j,qa); Grad_d(ux,uy,NULL,'a'); //OVERLOAD CALL: Grad_d: Element_List.c(Element_List), Gradient.c(Tri), Gradient.c(Quad), Gradient.c(Tet), Gradient.c(Pyr), Gradient.c(Prism), Gradient.c(Hex) dvmul(qt,ux,1,ux,1,ux,1); dvmul(qt,uy,1,uy,1,uy,1); dvadd(qt,ux,1,uy,1,ux,1); dvmul(qt, geom->jac.p, 1, b, 1, b, 1); dvmul(qt, H, 1, H, 1, u, 1); dvadd(qt,ux, 1, u, 1, u, 1); h1 [0] = ddot(qt, b, 1, u, 1); area[0] = dsum(qt, b, 1); free(u); free(ux); free(uy); free(b); return; } void Tet::Norm_h1m(double *, double *){ return ; } void Pyr::Norm_h1m(double *, double *){ return ; } void Prism::Norm_h1m(double *, double *){ return ; } void Hex::Norm_h1m(double *, double *){ return ; } void Element::Norm_h1m(double *, double *){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?) /* Function name: Element::L2_error_elmt Function Purpose: Argument 1: char *string Purpose: Function Notes: */ double Tri::L2_error_elmt(char *string){ int qt,trip=0; double *s,*utmp,l2; Coord *X = (Coord *)calloc(1,sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); if(state == 't'){Trans(this, J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); l2 = Norm_l2(); //OVERLOAD CALL: Norm_l2: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return l2; } double Quad::L2_error_elmt(char *string){ int qt,trip=0; double *s,*utmp,l2; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); if(state == 't'){Trans(this, J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); l2 = Norm_l2(); //OVERLOAD CALL: Norm_l2: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return l2; } double Tet::L2_error_elmt(char *){ return -1.; } double Pyr::L2_error_elmt(char *){ return -1.; } double Prism::L2_error_elmt(char *){ return -1.; } double Hex::L2_error_elmt(char *){ return -1.; } double Element::L2_error_elmt(char *){return 0.0;} /* Function name: Element::Int_error Function Purpose: Argument 1: char *string Purpose: Function Notes: */ double Tri::Int_error( char *string){ int qt,trip=0; double *s,*utmp,l2,area; Coord *X = (Coord *)calloc(1,sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); if(state == 't'){Trans(this, J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); Norm_l2m(&l2,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return l2; } double Quad::Int_error( char *string){ int qt,trip=0; double *s,*utmp,l2,area; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); if(state == 't'){Trans(this, J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); Norm_l2m(&l2,&area); //OVERLOAD CALL: Norm_l2m: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return l2; } double Tet::Int_error( char *){ return -1.; } double Pyr::Int_error( char *){ return -1.; } double Prism::Int_error( char *){ return -1.; } double Hex::Int_error( char *){ return -1.; } double Element::Int_error( char *){return 0.0;} /* Function name: Element::H1_error_elmt Function Purpose: Argument 1: char *string Purpose: Function Notes: */ double Tri::H1_error_elmt(char *string){ int qt,trip=0; double *s,*utmp,h1; Coord *X = (Coord *)calloc(1,sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); if(state == 't'){Trans(this, J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); h1 = Norm_h1(); //OVERLOAD CALL: Norm_h1: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return h1; } double Quad::H1_error_elmt(char *string){ int qt,trip=0; double *s,*utmp,h1; Coord *X = (Coord *)malloc(sizeof(Coord)); //OVERLOAD CALL: Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?); Coord: nekstruct.h(?), hotel.h(?) qt = qa*qb; s = h[0]; vector_def("x y",string); X->x = dvector(0,qt-1); X->y = dvector(0,qt-1); utmp = dvector(0,qt-1); if(state == 't'){Trans(this, J_to_Q); trip =1;} //OVERLOAD CALL: Trans: Element_List.c(Element_List), Transforms.c(Element), Transforms.c(Tri), Transforms.c(Quad), Transforms.c(Tet), Transforms.c(Pyr), Transforms.c(Prism), Transforms.c(Hex) dcopy(qt,s,1,utmp,1); coord(X); //OVERLOAD CALL: coord: Coords.c(Tet), Coords.c(Pyr), Coords.c(Prism), Coords.c(Hex), Coords.c(Element), Coords.c(Tri), Coords.c(Quad) vector_set(qt,X->x,X->y,s); dvsub(qt,s,1,utmp,1,s,1); h1 = Norm_h1(); //OVERLOAD CALL: Norm_h1: Norms.c(Tri), Norms.c(Quad), Norms.c(Tet), Norms.c(Pyr), Norms.c(Prism), Norms.c(Hex), Norms.c(Element) if(trip){ state = 't'; trip = 0;} else dcopy(qt,utmp,1,s,1); free(X->x); free(X->y); free(utmp); free((char *)X); return h1; } double Tet::H1_error_elmt(char *){ return -1.; } double Pyr::H1_error_elmt(char *){ return -1.; } double Prism::H1_error_elmt(char *){ return -1.; } double Hex::H1_error_elmt(char *){ return -1.; } double Element::H1_error_elmt(char *){return 0.0;}


Back to Source File Index


C++ to HTML Conversion by ctoohtml