int getGeoDataTria( double *p1, double *p2, double *p3, double *Ix, double *Iy, double *Ixy, double *A, double *pcg) /* p3 */ /* Tri_2 /|\ Tri_1 */ /* p1_p2 */ /* (p4) */ { int i; static double vx[]={1.,0.,0.}; double p4[3], v12[3], v13[3], v23[3], v14[3], v43[3], vnorm[3], vbuf[3], vbuf2[3]; double p_puf[3][3], vb; /* pktnr,xyz */ double l12, l13, l23, b1, b2, b_ges, h, A1, A2; double Ix1_p4, Iy1_p4, Ixy1_p4; double Ix2_p4, Iy2_p4, Ixy2_p4; double Ix_p4, Iy_p4, Ixy_p4; double spx_p4, spy_p4, sp1x_p4, sp2x_p4; double Ix_sp, Iy_sp, Ixy_sp; double alfa_z, a, b, c; /* v12 muss den groeste Laenge haben, sonst umsortieren und checken ob es ein dreieck ist v12xv13 != 0. */ v_result(p1, p2, v12); l12=v_betrag(v12); v_result(p1, p3, v13); v_prod(v12,v13,vbuf); if((int)(1.e20*v_betrag(vbuf))==0) return(0); l13=v_betrag(v13); v_result(p2, p3, v23); l23=v_betrag(v23); vb=l12; if (l13 > vb) { vb=l13; for (i=0; i<3; i++) p_puf[0][i]= p3[i]; for (i=0; i<3; i++) p_puf[1][i]= p1[i]; for (i=0; i<3; i++) p_puf[2][i]= p2[i]; for (i=0; i<3; i++) p1[i]=p_puf[0][i]; for (i=0; i<3; i++) p2[i]=p_puf[1][i]; for (i=0; i<3; i++) p3[i]=p_puf[2][i]; } if (l23 > vb) { vb=l23; for (i=0; i<3; i++) p_puf[0][i]= p2[i]; for (i=0; i<3; i++) p_puf[1][i]= p3[i]; for (i=0; i<3; i++) p_puf[2][i]= p1[i]; for (i=0; i<3; i++) p1[i]=p_puf[0][i]; for (i=0; i<3; i++) p2[i]=p_puf[1][i]; for (i=0; i<3; i++) p3[i]=p_puf[2][i]; } /* berechnung der Geometiegroessen (2D-Elementsys.) aus 3D Punktkoordinaten*/ v_result(p1, p3, v13); v_result(p1, p2, v12); b_ges=v_betrag(v12); b2=v_sprod( v13, v12); b2=b2/b_ges; b1=b_ges-b2; v_norm( v12, vnorm); v_scal( &b2, vnorm, v14); v_add( p1, v14, p4); v_result(p4, p3, v43); h=v_betrag(v43); A1= b1*h/2.; *A= b_ges*h/2.; A2= *A-A1; /* Schwerpunkte (sp) bezogen auf p4 IM LOKALEN SYSTEM */ sp1x_p4= b1/3.; sp2x_p4= -b2/3.; spx_p4 = (A1*sp1x_p4 + A2*sp2x_p4) / *A; spy_p4 = h/3.; /* Traegheitsmomente bezogen auf p4 IM LOKALEN SYSTEM */ Ix1_p4= b1*h*h*h/12.; Iy1_p4= h*b1*b1*b1/12.; Ixy1_p4= b1*b1*h*h/24.; Ix2_p4= b2*h*h*h/12.; Iy2_p4= h*b2*b2*b2/12.; Ixy2_p4= b2*b2*h*h/24.; Ix_p4= Ix1_p4 + Ix2_p4; Iy_p4= Iy1_p4 + Iy2_p4; Ixy_p4= Ixy1_p4 - Ixy2_p4; /* printf ("\nA:%lf b1:%lf b2:%lf h:%lf \n", *A, b1, b2, h); printf ("Tri1_P4 Ix:%lf Iy:%lf Ixy:%lf \n", Ix1_p4, Iy1_p4, Ixy1_p4); printf ("Tri2_P4 Ix:%lf Iy:%lf Ixy:%lf \n", Ix2_p4, Iy2_p4, Ixy2_p4); printf ("Tri _P4 Ix:%lf Iy:%lf Ixy:%lf \n", Ix_p4, Iy_p4, Ixy_p4); */ /* Traegheitsmomente bezogen auf Schwp. (nach Steiner) */ Ix_sp = Ix_p4 - spy_p4*spy_p4 * *A; Iy_sp = Iy_p4 - spx_p4*spx_p4 * *A; Ixy_sp = Ixy_p4 - spx_p4*spy_p4 * *A; /* printf ("\nA:%lf b1:%lf b2:%lf h:%lf \n", *A, b1, b2, h); printf ("sp_p4 spx:%lf spy:%lf \n", spx_p4, spy_p4); printf ("Tri _sp Ix:%lf Iy:%lf Ixy:%lf \n", Ix_sp, Iy_sp, Ixy_sp); */ /* umrechnen aufs Gloabale System (2D Elementsystem -> 3D Globalsystem) */ v_norm( v12, vnorm); v_scal( &spx_p4, vnorm, vbuf); v_add( p4, vbuf, vbuf2); v_norm( v43, vnorm); v_scal( &spy_p4, vnorm, vbuf); v_add( vbuf2, vbuf, pcg); /* ACHTUNG: z. Z. wird nur in der xy-ebene gedreht! */ v12[2] = 0.; alfa_z= acos( v_sprod(v12,vx) / v_betrag(v12) / v_betrag(vx) ) * (-1.); a = (Ix_sp+Iy_sp)/2.; b = (Ix_sp-Iy_sp)/2. * cos(2.*alfa_z); c = Ixy_sp * sin(2.*alfa_z); *Ix= a+b-c; *Iy= a-b+c; *Ixy= a * sin(2.*alfa_z) + Ixy_sp * cos(2.*alfa_z); /* Traegheitsmomente bezogen auf Globalsystem (nach Steiner) */ *Ix= *Ix + pcg[1]*pcg[1] * *A; *Iy= *Iy + pcg[0]*pcg[0] * *A; *Ixy= *Ixy + pcg[0]*pcg[1] * *A; return(1); }
int splitElementsToTets(Summen *anz, Nodes *node, Elements *elem, Tetraeder **ptet) { int i,j,k,e,t=0; //int hextet[]= {0,2,5,7, 0,5,2,1, 2,7,0,3, 0,7,5,4, 2,5,7,6 }; // inside out int hextet[]= {7,2,5,0, 1,5,2,0, 3,7,0,2, 4,7,5,0, 6,5,7,2 }; /* 8 *4 */ int tet10tet[]={4,1,5,8, 5,2,6,9, 6,0,4,7, 7,8,9,3, 4,5,6,7, 4,5,7,8, 6,7,5,9, 8,9,5,7 }; int hex20tet[]={8,16,18,4, 8,18,10,3, 4,8,3,18, 4,12,3,8, 12,11,3,8, 12,0,11,8, 4,3,15,18, 4,15,19,18, 19,15,7,18, 10,18,16,6, 10,16,8,1, 6,10,1,16, 6,14,1,10, 14,9,1,10, 14,2,9,10, 6,1,13,16, 6,13,17,16, 17,13,5,16 }; int petet[]= {0,1,2,4, 5,3,0,4, 0,4,2,5 }; /* 15 *4 */ int pe15tet[]= { 6,1,7,10, 13,4,12,10, 13,12,6,10, 6,7,13,10, 9,8,6,0, 7,8,11,2, 14,13,11,5, 9,12,14,3, 9,13,14,12, 9,13,11,14, 7,6,9,8, 9,13,7,11, 13,12,9,7, 12,6,9,7, 9,8,11,2 }; /* 44 incl. midside nodes */ /* int hex20tet[]={22,24,20,23, 20,25,22,23, 20,24,22,21, 22,25,20,21, 24,20,23,11, 24,23,22,11, 20,24,21,9, 24,22,21,9, 23,20,25,19, 23,25,22,19, 21,25,20,17, 21,22,25,17, 23,12,0,20, 23,3,15,22, 1,13,21,20, 21,14,2,22, 4,12,23,20, 7,23,15,22, 13,5,21,20, 14,21,6,22, 0,11,23,20, 11,3,23,22, 1,9,21,20, 2,9,21,22, 19,4,23,20, 19,23,7,22, 17,5,21,20, 6,21,17,22, 0,24,11,20, 11,24,3,22, 24,1,9,20, 24,9,2,22, 25,19,4,20, 25,7,19,22, 17,5,25,20, 17,25,6,22, 8,20,24,0, 24,10,22,3, 20,8,24,1, 22,24,10,2, 16,20,25,4, 18,25,22,7, 16,20,25,5, 18,25,22,6 }; */ /* 8*4*4=64 incl midside and midvolume nodes */ /* int hex20hex[]={0,8,24,11, 12,20,26,23, 11,24,10,3, 23,26,22,15, 8,1,9,24, 20,13,21,26, 24,9,2,10, 26,21,14,22, 12,20,26,23, 4,16,25,19, 23,26,22,15, 19,25,18,7, 20,13,21,26, 16,5,17,25, 26,21,14,22, 25,176,18 }; */ Tetraeder *tet=NULL; double v12[3], v13[3], v14[3], vn[3]; for (e=0; e<anz->e; e++) { switch(elem[e].type) { case 1: if ( (tet = (Tetraeder *)realloc((Tetraeder *)tet, (t+5) * sizeof(Tetraeder))) == NULL ) printf(" ERROR: realloc in elemToTet()\n\n") ; for (j=0; j<5; j++) { for (k=0; k<3; k++) tet[t].cg[k]=0.; for (k=0; k<4; k++) { tet[t].n[k] = elem[e].nod[hextet[4*j+k]]; /* simple cg = sum of coordinates */ tet[t].cg[0]+= node[tet[t].n[k]].nx; tet[t].cg[1]+= node[tet[t].n[k]].ny; tet[t].cg[2]+= node[tet[t].n[k]].nz; } for (k=0; k<3; k++) tet[t].cg[k]/=4.; t++; } break; case 2: if ( (tet = (Tetraeder *)realloc((Tetraeder *)tet, (t+3) * sizeof(Tetraeder))) == NULL ) printf(" ERROR: realloc in elemToTet()\n\n") ; for (j=0; j<3; j++) { for (k=0; k<3; k++) tet[t].cg[k]=0.; for (k=0; k<4; k++) { tet[t].n[k] = elem[e].nod[petet[4*j+k]]; /* simple cg = sum of coordinates */ tet[t].cg[0]+= node[tet[t].n[k]].nx; tet[t].cg[1]+= node[tet[t].n[k]].ny; tet[t].cg[2]+= node[tet[t].n[k]].nz; } for (k=0; k<3; k++) tet[t].cg[k]/=4.; t++; } break; case 3: if ( (tet = (Tetraeder *)realloc((Tetraeder *)tet, (t+1) * sizeof(Tetraeder))) == NULL ) printf(" ERROR: realloc in elemToTet()\n\n") ; for (k=0; k<3; k++) tet[t].cg[k]=0.; for (k=0; k<4; k++) { tet[t].n[k] = elem[e].nod[k]; /* simple cg = sum of coordinates */ tet[t].cg[0]+= node[tet[t].n[k]].nx; tet[t].cg[1]+= node[tet[t].n[k]].ny; tet[t].cg[2]+= node[tet[t].n[k]].nz; } for (k=0; k<3; k++) tet[t].cg[k]/=4.; t++; break; case 4: if ( (tet = (Tetraeder *)realloc((Tetraeder *)tet, (t+18) * sizeof(Tetraeder))) == NULL ) printf(" ERROR: realloc in elemToTet()\n\n") ; for (j=0; j<18; j++) { for (k=0; k<3; k++) tet[t].cg[k]=0.; for (k=0; k<4; k++) { tet[t].n[k] = elem[e].nod[hex20tet[4*j+k]]; tet[t].cg[0]+= node[tet[t].n[k]].nx; tet[t].cg[1]+= node[tet[t].n[k]].ny; tet[t].cg[2]+= node[tet[t].n[k]].nz; } for (k=0; k<3; k++) tet[t].cg[k]/=4.; t++; } break; case 5: if ( (tet = (Tetraeder *)realloc((Tetraeder *)tet, (t+15) * sizeof(Tetraeder))) == NULL ) printf(" ERROR: realloc in elemToTet()\n\n") ; for (j=0; j<15; j++) { for (k=0; k<3; k++) tet[t].cg[k]=0.; for (k=0; k<4; k++) { tet[t].n[k] = elem[e].nod[pe15tet[4*j+k]]; tet[t].cg[0]+= node[tet[t].n[k]].nx; tet[t].cg[1]+= node[tet[t].n[k]].ny; tet[t].cg[2]+= node[tet[t].n[k]].nz; } for (k=0; k<3; k++) tet[t].cg[k]/=4.; t++; } break; case 6: if ( (tet = (Tetraeder *)realloc((Tetraeder *)tet, (t+8) * sizeof(Tetraeder))) == NULL ) printf(" ERROR: realloc in elemToTet()\n\n") ; for (j=0; j<8; j++) { for (k=0; k<3; k++) tet[t].cg[k]=0.; for (k=0; k<4; k++) { tet[t].n[k] = elem[e].nod[tet10tet[4*j+k]]; /* simple cg = sum of coordinates */ tet[t].cg[0]+= node[tet[t].n[k]].nx; tet[t].cg[1]+= node[tet[t].n[k]].ny; tet[t].cg[2]+= node[tet[t].n[k]].nz; } for (k=0; k<3; k++) tet[t].cg[k]/=4.; t++; } break; printf(" ERROR: Elem type:%d not supported\n", elem[e].type); } } /* volu = 1/6 * a x b * c */ for (i=0; i<t; i++) { v_result( &node[tet[i].n[0]].nx, &node[tet[i].n[1]].nx, v12); v_result( &node[tet[i].n[0]].nx, &node[tet[i].n[2]].nx, v13); v_result( &node[tet[i].n[0]].nx, &node[tet[i].n[3]].nx, v14); v_prod(v12,v13,vn); tet[i].v=v_sprod(vn,v14)/6.; if(tet[i].v<0.) { tet[i].v=-tet[i].v; k=tet[i].n[1]; tet[i].n[1]=tet[i].n[2]; tet[i].n[2]=k; } //printf("%d vol:%e vprod:%e %e %e sprod:%e\n", i, tet[i].v, vn[0],vn[1],vn[2], v_sprod(vn,v14) ); } *ptet=tet; return(t); }
ITG elemChecker(ITG sum_e, Nodes *node, Elements *elem) { ITG i, j; double v12[3], v13[3], v15[3], v15n[3], vn[3]; double bv15, bvn, bv15n, bgrenz; ITG epuf[27]; ITG e_korr=0; for (i=0; i<sum_e; i++) { if( (elem[i].type == 1)||(elem[i].type == 4) ) /* HEXA */ { v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[1]].nx, v12); v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[3]].nx, v13); v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[4]].nx, v15); v_prod(v12,v13,vn); v_result(v15,vn,v15n); bvn=v_betrag(vn); bv15=v_betrag(v15); bgrenz=sqrt(bvn*bvn+bv15*bv15); bv15n=v_betrag(v15n); /* printf ("elemcheck:%" ITGFORMAT " vn x=%e y=%e z=%e\n",elem[i].nr,vn[0],vn[1],vn[2]); */ if (bv15n > bgrenz) { /* printf ("elem %" ITGFORMAT " wrong defined, v15n=%e vgrenz=%e\n", elem[i].nr,bv15n,bgrenz); */ for (j=0; j<8; j++) { epuf[j] = elem[i].nod[j]; } elem[i].nod[0] = epuf[4]; elem[i].nod[1] = epuf[5]; elem[i].nod[2] = epuf[6]; elem[i].nod[3] = epuf[7]; elem[i].nod[4] = epuf[0]; elem[i].nod[5] = epuf[1]; elem[i].nod[6] = epuf[2]; elem[i].nod[7] = epuf[3]; e_korr++; if (elem[i].type == 4) { for (j=0; j<4; j++) { epuf[j] = elem[i].nod[j+8]; epuf[j+4] = elem[i].nod[j+16]; } elem[i].nod[8] = epuf[4]; elem[i].nod[9] = epuf[5]; elem[i].nod[10] = epuf[6]; elem[i].nod[11] = epuf[7]; elem[i].nod[16] = epuf[0]; elem[i].nod[17] = epuf[1]; elem[i].nod[18] = epuf[2]; elem[i].nod[19] = epuf[3]; } } } else if( (elem[i].type == 2)||(elem[i].type == 5) ) /* PENTA */ { v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[1]].nx, v12); v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[2]].nx, v13); v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[3]].nx, v15); v_prod(v12,v13,vn); v_result(v15,vn,v15n); bvn=v_betrag(vn); bv15=v_betrag(v15); bgrenz=sqrt(bvn*bvn+bv15*bv15); bv15n=v_betrag(v15n); /* printf ("elemcheck:%" ITGFORMAT " vn x=%e y=%e z=%e\n",elem[i].nr,vn[0],vn[1],vn[2]); */ if (bv15n > bgrenz) { /* printf ("elem %" ITGFORMAT " wrong defined, v15n=%e vgrenz=%e\n", elem[i].nr,bv15n,bgrenz); */ for (j=0; j<6; j++) { epuf[j] = elem[i].nod[j]; } elem[i].nod[0] = epuf[3]; elem[i].nod[1] = epuf[4]; elem[i].nod[2] = epuf[5]; elem[i].nod[3] = epuf[0]; elem[i].nod[4] = epuf[1]; elem[i].nod[5] = epuf[2]; e_korr++; if (elem[i].type == 5) { for (j=0; j<3; j++) { epuf[j] = elem[i].nod[j+6]; epuf[j+3] = elem[i].nod[j+12]; } elem[i].nod[6] = epuf[3]; elem[i].nod[7] = epuf[4]; elem[i].nod[8] = epuf[5]; elem[i].nod[12] = epuf[0]; elem[i].nod[13] = epuf[1]; elem[i].nod[14] = epuf[2]; } } } else if( (elem[i].type == 3)||(elem[i].type == 6) ) /* TET */ { v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[1]].nx, v12); v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[2]].nx, v13); v_result( &node[elem[i].nod[0]].nx, &node[elem[i].nod[3]].nx, v15); v_prod(v12,v13,vn); v_result(v15,vn,v15n); bvn=v_betrag(vn); bv15=v_betrag(v15); bgrenz=sqrt(bvn*bvn+bv15*bv15); bv15n=v_betrag(v15n); /* printf ("elemcheck:%" ITGFORMAT " vn x=%e y=%e z=%e\n",elem[i].nr,vn[0],vn[1],vn[2]); */ if (bv15n > bgrenz) { /* printf ("elem %" ITGFORMAT " wrong defined, v15n=%e vgrenz=%e\n", elem[i].nr,bv15n,bgrenz); */ for (j=0; j<4; j++) epuf[j] = elem[i].nod[j]; elem[i].nod[0] = epuf[1]; elem[i].nod[1] = epuf[2]; elem[i].nod[2] = epuf[3]; elem[i].nod[3] = epuf[0]; e_korr++; if (elem[i].type == 6) { for (j=4; j<10; j++) epuf[j] = elem[i].nod[j]; elem[i].nod[4] = epuf[5]; elem[i].nod[5] = epuf[9]; elem[i].nod[6] = epuf[8]; elem[i].nod[7] = epuf[4]; elem[i].nod[8] = epuf[6]; elem[i].nod[9] = epuf[7]; } } } } return (e_korr); }