//sol = G00(p,y1,y2,x1,x2,l);
*mxGetPr(plhs[0]) = F_par(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]),*mxGetPr(prhs[6]));
- *mxGetPr(plhs[1]) = FLO_plane(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]),*mxGetPr(prhs[6]));
+ *mxGetPr(plhs[1]) = F_parY1Y2_2(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]),*mxGetPr(prhs[6]));
// printf("%f",FLO_plane(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]),*mxGetPr(prhs[6])));
//sol = G00(p,y1,y2,x1,x2,l);
*mxGetPr(plhs[0]) = G00(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]));
- *mxGetPr(plhs[1]) = slpADLO(*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]));
+ *mxGetPr(plhs[1]) = doubleQuad(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]),*mxGetPr(prhs[4]),*mxGetPr(prhs[5]));
}
+/*\r
+ * voll Analytisch\r
+ * ohne Optimierungen\r
+ *\r
+ *\r
+ */\r
+\r
+\r
#include <iostream>\r
#include <cmath>\r
#include <cassert>\r
// y1[0], y0[1], y3[1], d[0], d[1], d[2]);\r
//printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
tmp\r
- = apply0Int(F_par, fabs(xa[rxa]), fabs(xb[rxb]),\r
+ = apply0Int4(F_par, fabs(xa[rxa]), fabs(xb[rxb]),\r
fabs(ya[rxa]), fabs(yb[rxb]), d[rxa],\r
d[rxb], d[rx]);\r
// printf("%d%d|%.2f\n",j,k,tmp);\r
// y1[0], y0[1], y3[1], d[0], d[1], d[2]);\r
//printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
tmp\r
- = apply0Int(F_par, fabs(xa[rxa]), fabs(xb[rxb]),\r
+ = apply0Int4(F_par, fabs(xa[rxa]), fabs(xb[rxb]),\r
fabs(yb[rxa]), fabs(ya[rxb]), d[rxa],\r
d[rxb], d[rx]);\r
// printf("%d%d|%.2f\n",j,k,tmp);\r
\r
if (rxa == rya) {\r
tmp\r
- = apply0Int(F_ort, fabs(xb[rxb]), fabs(xa[rxa]),\r
+ = apply0Int4(F_ort, fabs(xb[rxb]), fabs(xa[rxa]),\r
fabs(ya[rya]), fabs(yb[ryb]), d[rxb],\r
d[rxa], d[rx]);\r
} else if (rxa == ryb) {\r
tmp\r
- = apply0Int(F_ort, fabs(xb[rxb]), fabs(xa[rxa]),\r
+ = apply0Int4(F_ort, fabs(xb[rxb]), fabs(xa[rxa]),\r
fabs(yb[ryb]), fabs(ya[rya]), d[rxb],\r
d[rxa], d[rx]);\r
} else if (rxb == rya) {\r
tmp\r
- = apply0Int(F_ort, fabs(xa[rxa]), fabs(xb[rxb]),\r
+ = apply0Int4(F_ort, fabs(xa[rxa]), fabs(xb[rxb]),\r
fabs(ya[rya]), fabs(yb[ryb]), d[rxa],\r
d[rxb], d[rx]);\r
} else {\r
tmp\r
- = apply0Int(F_ort, fabs(xa[rxa]), fabs(xb[rxb]),\r
+ = apply0Int4(F_ort, fabs(xa[rxa]), fabs(xb[rxb]),\r
fabs(yb[ryb]), fabs(ya[rya]), d[rxa],\r
d[rxb], d[rx]);\r
}\r
+/*\r
+ * voll Analytisch\r
+ * Element mit groesserer Diagonale nach aussen gedreht\r
+ *\r
+ *\r
+ */\r
+\r
+\r
#include <iostream>\r
#include <cmath>\r
#include <cassert>\r
double tmp,tmp2;\r
\r
int itmp;\r
-\r
+ double dtmp;\r
double * vtmp;\r
\r
+ long double xda,xdb,yda,ydb;\r
+\r
//LageInformationen\r
int rx, rxa, rxb, ry, rya, ryb;\r
+ int rtxa, rtxb, rtx;\r
\r
//Ausrechnen\r
for (j = 0; j < em; ++j) {\r
// Lageeigenschaften des Flaechenstuecks\r
//if(xn[0]*xn[0]+xn[1]*xn[1]<xn[2]*xn[2])\r
\r
- rx = dimOfVec(xn);\r
+ rtx = dimOfVec(xn);\r
\r
- rxa = dimOfVec(xa);\r
+ rtxa = dimOfVec(xa);\r
\r
- rxb = dimOfVec(xb);\r
+ rtxb = dimOfVec(xb);\r
\r
\r
//kleinste Ecke finden und fuer \delta verwenden\r
\r
- if (xa[rxa] > 0) {\r
- if (xb[rxb] > 0) {\r
+ if (xa[rtxa] > 0) {\r
+ if (xb[rtxb] > 0) {\r
for (i = 0; i < 3; ++i)\r
dt[i] = -x0[i];\r
} else {\r
dt[i] = -x3[i];\r
}\r
} else {\r
- if (xb[rxb] > 0) {\r
+ if (xb[rtxb] > 0) {\r
for (i = 0; i < 3; ++i)\r
dt[i] = -x1[i];\r
} else {\r
// printf("(%d n- %f | %f | %f)\n",j,xn[0],xn[1],xn[2]);\r
\r
for (k = 0; k < em; ++k) {\r
+\r
+ xda = xa[rtxa];\r
+ xdb = xb[rtxb];\r
+\r
+ rx = rtx;\r
+ rxa = rtxa;\r
+ rxb = rtxb;\r
+\r
+\r
y0[0] = C[(int) E[k] - 1];\r
y0[1] = C[cm + (int) E[k] - 1];\r
y0[2] = C[2 * cm + (int) E[k] - 1];\r
}\r
}\r
\r
- // for (i = 0; i<3;++i)\r
- // d[i] = y0[i]-x0[i];\r
-\r
+ yda = ya[rya];\r
+ ydb = yb[ryb];\r
\r
- if(ry == rx){\r
\r
- if(xa[rxa]*xa[rxa]+xb[rxb]*xb[rxb]>ya[rya]*ya[rya]+yb[ryb]*yb[ryb]){\r
+ if(xda*xda+xdb*xdb>yda*yda+ydb*ydb){\r
\r
- printf("+(%d,%d@%d,%d)",rxa,rxb,rya,ryb);\r
- printf("[%.2f,%.2f@%.2f,%.2f]",xa[rxa],xb[rxb],ya[rya],yb[ryb]);\r
+ /* printf("+(%d,%d@%d,%d)",rxa,rxb,rya,ryb);\r
+ printf("[%.2f,%.2f@%.2f,%.2f]",xda,xb[rxb],ya[rya],yb[ryb]);\r
printf("{%d%d} %.1f %.1f %.1f",j,k,d[0],d[1],d[2]);\r
- printf("\n");\r
+ printf("\n");*/\r
\r
\r
- vtmp = xa; xa = ya; ya = vtmp;\r
- vtmp = xb; xb = yb; yb = vtmp;\r
+ dtmp = xda; xda = yda; yda = dtmp;\r
+ dtmp = xdb; xdb = ydb; ydb = dtmp;\r
\r
itmp = rxa; rxa = rya; rya = itmp;\r
itmp = rxb; rxb = ryb; ryb = itmp;\r
\r
\r
\r
- printf("-(%d,%d@%d,%d)",rxa,rxb,rya,ryb);\r
- printf("[%.2f,%.2f@%.2f,%.2f]",xa[rxa],xb[rxb],ya[rya],yb[ryb]);\r
+ /* printf("-(%d,%d@%d,%d)",rxa,rxb,rya,ryb);\r
+ printf("[%.2f,%.2f@%.2f,%.2f]",xda,xb[rxb],ya[rya],yb[ryb]);\r
printf("{%d%d} %.1f %.1f %.1f",j,k,d[0],d[1],d[2]);\r
- printf("\n");\r
+ printf("\n");*/\r
}\r
\r
\r
- }\r
-\r
//printf("(%d,%d)",rx,ry);\r
if (rx == ry) {\r
//printf("(%d,%d@%d,%d)",rxa,rxb,rya,ryb);\r
- //printf("[%.2f,%.2f@%.2f,%.2f]",xa[rxa],xb[rxb],ya[rya],yb[ryb]);\r
+ //printf("[%.2f,%.2f@%.2f,%.2f]",xda,xdb,yda,ydb);\r
//printf("%d%d %.1f %.1f %.1f|||",j,k,dt[0],dt[1],dt[2]);\r
//printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
if (rxa == rya) {\r
// y1[0], y0[1], y3[1], d[0], d[1], d[2]);\r
//printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
\r
- if(xa[rxa]*xa[rxa]+xb[rxb]*xb[rxb]<=ya[rya]*ya[rya]+yb[ryb]*yb[ryb]){\r
+ // if(xda*xda+xdb*xdb<=yda*yda+ydb*ydb){\r
\r
tmp\r
- = apply0Int(F_par, fabs(xa[rxa]), fabs(xb[rxb]),\r
- fabs(ya[rya]), fabs(yb[ryb]), d[rxa],\r
+ = apply0Int4(F_par, fabs(xda), fabs(xdb),\r
+ fabs(yda), fabs(ydb), d[rxa],\r
d[rxb], d[rx]);\r
\r
- }else{\r
+ // }else{\r
\r
- tmp\r
- = apply0Int(F_par, fabs(ya[rya]), fabs(yb[ryb]),\r
- fabs(xa[rxa]), fabs(xb[rxb]), -d[rxa],\r
- -d[rxb], -d[rx]);\r
- }\r
+ // tmp\r
+ // = apply0Int4(F_par, fabs(yda), fabs(ydb),\r
+ // fabs(xda), fabs(xdb), -d[rxa],\r
+ // -d[rxb], -d[rx]);\r
+ // }\r
// if(fabs(tmp-tmp2)>10e-16)\r
// printf("wtf");\r
// printf("%d%d|%.2f\n",j,k,tmp);\r
// y1[0], y0[1], y3[1], d[0], d[1], d[2]);\r
//printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
tmp\r
- = apply0Int(F_par, fabs(xa[rxa]), fabs(xb[rxb]),\r
- fabs(yb[rxa]), fabs(ya[rxb]), d[rxa],\r
+ = apply0Int4(F_par, fabs(xda), fabs(xdb),\r
+ fabs(ydb), fabs(yda), d[rxa],\r
d[rxb], d[rx]);\r
// printf("%d%d|%.2f\n",j,k,tmp);\r
}\r
\r
if (rxa == rya) {\r
tmp\r
- = apply0Int(F_ort, fabs(xb[rxb]), fabs(xa[rxa]),\r
- fabs(ya[rya]), fabs(yb[ryb]), d[rxb],\r
+ = apply0Int4(F_ort, fabs(xdb), fabs(xda),\r
+ fabs(yda), fabs(ydb), d[rxb],\r
d[rxa], d[rx]);\r
} else if (rxa == ryb) {\r
tmp\r
- = apply0Int(F_ort, fabs(xb[rxb]), fabs(xa[rxa]),\r
- fabs(yb[ryb]), fabs(ya[rya]), d[rxb],\r
+ = apply0Int4(F_ort, fabs(xdb), fabs(xda),\r
+ fabs(ydb), fabs(yda), d[rxb],\r
d[rxa], d[rx]);\r
} else if (rxb == rya) {\r
tmp\r
- = apply0Int(F_ort, fabs(xa[rxa]), fabs(xb[rxb]),\r
- fabs(ya[rya]), fabs(yb[ryb]), d[rxa],\r
+ = apply0Int4(F_ort, fabs(xda), fabs(xdb),\r
+ fabs(yda), fabs(ydb), d[rxa],\r
d[rxb], d[rx]);\r
} else {\r
tmp\r
- = apply0Int(F_ort, fabs(xa[rxa]), fabs(xb[rxb]),\r
- fabs(yb[ryb]), fabs(ya[rya]), d[rxa],\r
+ = apply0Int4(F_ort, fabs(xda), fabs(xdb),\r
+ fabs(ydb), fabs(yda), d[rxa],\r
d[rxb], d[rx]);\r
}\r
- //A[(k * em) + j] = tmp;\r
\r
}\r
A[(k * em) + j] = 1. / (4 * M_PI) * tmp;\r
--- /dev/null
+/*\r
+ * voll Analytisch\r
+ * Element mit groesserer Diagonale nach aussen gedreht\r
+ *\r
+ *\r
+ */\r
+\r
+\r
+#include <iostream>\r
+#include <cmath>\r
+#include <cassert>\r
+#include "mex.h"\r
+#include <stdlib.h>\r
+\r
+//#include "tbb/parallel_for.h"\r
+\r
+\r
+#include "slpRectangle.hpp"\r
+\r
+#define EPS 0.02\r
+\r
+using namespace std;\r
+\r
+inline int dimOfVec(double * vec)\r
+{\r
+ if (vec[2] != 0)\r
+ return 2;\r
+ else if (vec[1] != 0)\r
+ return 1;\r
+ else\r
+ return 0;\r
+}\r
+\r
+\r
+void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {\r
+\r
+ int i, j, k;\r
+\r
+ //sicherheitsabfragen zu Datengroessen\r
+ if (nrhs != 2)\r
+ mexErrMsgTxt("expected (coordinates(Nx3),elements(Mx4))");\r
+ if (nlhs > 1)\r
+ mexErrMsgTxt("has only one output argument");\r
+\r
+ int cm = mxGetM(prhs[0]);\r
+ int cn = mxGetN(prhs[0]);\r
+\r
+ if (cn != 3)\r
+ mexErrMsgTxt("expected coordinates (Nx3)");\r
+ int em = mxGetM(prhs[1]);\r
+ int en = mxGetN(prhs[1]);\r
+ if (en != 4)\r
+ mexErrMsgTxt("expected elements (Mx4)");\r
+ //Vorbereitung der Daten\r
+\r
+ plhs[0] = mxCreateDoubleMatrix(em, em, mxREAL);\r
+ double * A = mxGetPr(plhs[0]);\r
+ double * C = mxGetPr(prhs[0]);\r
+ double * E = mxGetPr(prhs[1]);\r
+\r
+ double * x0 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * x1 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * x2 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * x3 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * xn = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * xa = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * xb = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+\r
+ double * y0 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * y1 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * y2 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * y3 = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * yn = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * ya = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * yb = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+\r
+ double * d = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+ double * dt = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
+\r
+ double tmp,tmp2;\r
+\r
+ int itmp;\r
+ double dtmp;\r
+ double * vtmp;\r
+\r
+ long double xda,xdb,yda,ydb;\r
+\r
+ //LageInformationen\r
+ int rx, rxa, rxb, ry, rya, ryb;\r
+ int rtxa, rtxb, rtx;\r
+\r
+ //Ausrechnen\r
+ for (j = 0; j < em; ++j) {\r
+ x0[0] = C[(int) E[j] - 1];\r
+ x0[1] = C[cm + (int) E[j] - 1];\r
+ x0[2] = C[2 * cm + (int) E[j] - 1];\r
+\r
+ x1[0] = C[(int) E[em + j] - 1];\r
+ x1[1] = C[cm + (int) E[em + j] - 1];\r
+ x1[2] = C[2 * cm + (int) E[em + j] - 1];\r
+\r
+ x2[0] = C[(int) E[2 * em + j] - 1];\r
+ x2[1] = C[cm + (int) E[2 * em + j] - 1];\r
+ x2[2] = C[2 * cm + (int) E[2 * em + j] - 1];\r
+\r
+ x3[0] = C[(int) E[3 * em + j] - 1];\r
+ x3[1] = C[cm + (int) E[3 * em + j] - 1];\r
+ x3[2] = C[2 * cm + (int) E[3 * em + j] - 1];\r
+\r
+ for (i = 0; i < 3; ++i)\r
+ xa[i] = x1[i] - x0[i];\r
+\r
+ for (i = 0; i < 3; ++i)\r
+ xb[i] = x3[i] - x0[i];\r
+\r
+ //Kreuzprodukt\r
+ xn[0] = (xa[1]) * (xb[2]) - (xa[2]) * (xb[1]);\r
+ xn[1] = (xa[2]) * (xb[0]) - (xa[0]) * (xb[2]);\r
+ xn[2] = (xa[0]) * (xb[1]) - (xa[1]) * (xb[0]);\r
+\r
+ // Lageeigenschaften des Flaechenstuecks\r
+ //if(xn[0]*xn[0]+xn[1]*xn[1]<xn[2]*xn[2])\r
+\r
+ rtx = dimOfVec(xn);\r
+\r
+ rtxa = dimOfVec(xa);\r
+\r
+ rtxb = dimOfVec(xb);\r
+\r
+\r
+ //kleinste Ecke finden und fuer \delta verwenden\r
+\r
+ if (xa[rtxa] > 0) {\r
+ if (xb[rtxb] > 0) {\r
+ for (i = 0; i < 3; ++i)\r
+ dt[i] = -x0[i];\r
+ } else {\r
+ for (i = 0; i < 3; ++i)\r
+ dt[i] = -x3[i];\r
+ }\r
+ } else {\r
+ if (xb[rtxb] > 0) {\r
+ for (i = 0; i < 3; ++i)\r
+ dt[i] = -x1[i];\r
+ } else {\r
+ for (i = 0; i < 3; ++i)\r
+ dt[i] = -x2[i];\r
+ //printf("Error! Daten existieren nicht. Zugriff auf vierten punkt");\r
+ }\r
+ }\r
+\r
+ //for (i=0;i<3;++i)\r
+ // dt[i] = 0;\r
+\r
+\r
+ // printf("(%d n- %f | %f | %f)\n",j,xn[0],xn[1],xn[2]);\r
+\r
+ for (k = 0; k < em; ++k) {\r
+\r
+ xda = xa[rtxa];\r
+ xdb = xb[rtxb];\r
+\r
+ rx = rtx;\r
+ rxa = rtxa;\r
+ rxb = rtxb;\r
+\r
+\r
+ y0[0] = C[(int) E[k] - 1];\r
+ y0[1] = C[cm + (int) E[k] - 1];\r
+ y0[2] = C[2 * cm + (int) E[k] - 1];\r
+\r
+ y1[0] = C[(int) E[em + k] - 1];\r
+ y1[1] = C[cm + (int) E[em + k] - 1];\r
+ y1[2] = C[2 * cm + (int) E[em + k] - 1];\r
+\r
+ y2[0] = C[(int) E[2 * em + k] - 1];\r
+ y2[1] = C[cm + (int) E[2 * em + k] - 1];\r
+ y2[2] = C[2 * cm + (int) E[2 * em + k] - 1];\r
+\r
+ y3[0] = C[(int) E[3 * em + k] - 1];\r
+ y3[1] = C[cm + (int) E[3 * em + k] - 1];\r
+ y3[2] = C[2 * cm + (int) E[3 * em + k] - 1];\r
+\r
+ for (i = 0; i < 3; ++i)\r
+ ya[i] = y1[i] - y0[i];\r
+\r
+ for (i = 0; i < 3; ++i)\r
+ yb[i] = y3[i] - y0[i];\r
+\r
+ yn[0] = (ya[1]) * (yb[2]) - (ya[2]) * (yb[1]);\r
+ yn[1] = (ya[2]) * (yb[0]) - (ya[0]) * (yb[2]);\r
+ yn[2] = (ya[0]) * (yb[1]) - (ya[1]) * (yb[0]);\r
+\r
+ ry = dimOfVec(yn);\r
+\r
+ rya = dimOfVec(ya);\r
+\r
+ ryb = dimOfVec(yb);\r
+\r
+ //kleinste Ecke finden und fuer \delta verwenden\r
+\r
+ if (ya[rya] > 0) {\r
+ if (yb[ryb] > 0) {\r
+ for (i = 0; i < 3; ++i)\r
+ d[i] = dt[i] + y0[i];\r
+ } else {\r
+ for (i = 0; i < 3; ++i)\r
+ d[i] = dt[i] + y3[i];\r
+ }\r
+ } else {\r
+ if (yb[ryb] > 0) {\r
+ for (i = 0; i < 3; ++i)\r
+ d[i] = dt[i] + y1[i];\r
+ } else {\r
+ for (i = 0; i < 3; ++i)\r
+ d[i] = dt[i] + y2[i];\r
+ //printf("Error! Daten existieren nicht. Zugriff auf vierten punkt");\r
+ }\r
+ }\r
+\r
+ yda = ya[rya];\r
+ ydb = yb[ryb];\r
+\r
+ //groesseres Element nach aussen drehen\r
+ if(xda*xda+xdb*xdb>yda*yda+ydb*ydb){\r
+\r
+ dtmp = xda; xda = yda; yda = dtmp;\r
+ dtmp = xdb; xdb = ydb; ydb = dtmp;\r
+\r
+ itmp = rxa; rxa = rya; rya = itmp;\r
+ itmp = rxb; rxb = ryb; ryb = itmp;\r
+ itmp = rx; rx = ry; ry = itmp;\r
+\r
+ for (i = 0; i<3;++i)\r
+ d[i] = -d[i];\r
+\r
+ }\r
+\r
+ //if(xda*xda+xdb*xdb>=d[0]*d[0]+d[1]*d[1]+d[2]*d[2]){\r
+ // printf(".");\r
+ //}\r
+\r
+ //printf("(%d,%d)",rx,ry);\r
+ if (rx == ry) {\r
+ //printf("(%d,%d@%d,%d)",rxa,rxb,rya,ryb);\r
+ //printf("[%.2f,%.2f@%.2f,%.2f]",xda,xdb,yda,ydb);\r
+ //printf("%d%d %.1f %.1f %.1f|||",j,k,dt[0],dt[1],dt[2]);\r
+ //printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
+ if (rxa == rya) {\r
+ //printf("%d%d %.1f %.1f | %.1f %.1f || %.1f %.1f | %.1f %.1f || %.1f %.1f %.1f\n",j,k,x0[0], x1[0], x0[1], x3[1], y0[0],\r
+ // y1[0], y0[1], y3[1], d[0], d[1], d[2]);\r
+ //printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
+\r
+ // if(xda*xda+xdb*xdb<d[0]*d[0]+d[1]*d[1]+d[2]*d[2]){\r
+\r
+ tmp\r
+ = apply0Int4(F_par, fabs(xda), fabs(xdb),\r
+ fabs(yda), fabs(ydb), d[rxa],\r
+ d[rxb], d[rx]);\r
+\r
+ // }else{\r
+\r
+ tmp2\r
+ = apply0Int2(F_parY1Y2_2, fabs(xda), fabs(xdb),\r
+ fabs(yda), fabs(ydb), d[rxa],\r
+ d[rxb], d[rx]);\r
+ // }\r
+ if(fabs(tmp-tmp2)>10e-8)\r
+ return;\r
+ // printf("%d%d|%.2f\n",j,k,tmp);\r
+ } else {\r
+ //printf("%d%d %.1f %.1f | %.1f %.1f || %.1f %.1f | %.1f %.1f || %.1f %.1f %.1f\n",j,k,x0[0], x1[0], x0[1], x3[1], y0[0],\r
+ // y1[0], y0[1], y3[1], d[0], d[1], d[2]);\r
+ //printf("%d%d %.1f %.1f %.1f\n",j,k,d[0],d[1],d[2]);\r
+ tmp\r
+ = apply0Int4(F_par, fabs(xda), fabs(xdb),\r
+ fabs(ydb), fabs(yda), d[rxa],\r
+ d[rxb], d[rx]);\r
+ // printf("%d%d|%.2f\n",j,k,tmp);\r
+ }\r
+\r
+ } else {\r
+ //printf("(%d,%d@%d,%d)", rxa, rxb, rya, ryb);\r
+ //printf("(%d,%d)", rx, ry);\r
+ //printf("\n");\r
+\r
+ if (rxa == rya) {\r
+ tmp\r
+ = apply0Int4(F_ort, fabs(xdb), fabs(xda),\r
+ fabs(yda), fabs(ydb), d[rxb],\r
+ d[rxa], d[rx]);\r
+ } else if (rxa == ryb) {\r
+ tmp\r
+ = apply0Int4(F_ort, fabs(xdb), fabs(xda),\r
+ fabs(ydb), fabs(yda), d[rxb],\r
+ d[rxa], d[rx]);\r
+ } else if (rxb == rya) {\r
+ tmp\r
+ = apply0Int4(F_ort, fabs(xda), fabs(xdb),\r
+ fabs(yda), fabs(ydb), d[rxa],\r
+ d[rxb], d[rx]);\r
+ } else {\r
+ tmp\r
+ = apply0Int4(F_ort, fabs(xda), fabs(xdb),\r
+ fabs(ydb), fabs(yda), d[rxa],\r
+ d[rxb], d[rx]);\r
+ }\r
+\r
+ }\r
+ A[(k * em) + j] = 1. / (4 * M_PI) * tmp;\r
+\r
+ }\r
+\r
+ }\r
+ //printf("\n");\r
+ //Rueckgabe (eventuell zurueck schreiben)\r
+ // mxFree(x0);\r
+ //mxFree(x1);\r
+ //mxFree(x3);\r
+ //mxFree(y0);\r
+ //mxFree(y1);\r
+ //mxFree(y3);\r
+ //mxFree(xn);\r
+ //mxFree(yn);\r
+ //mxFree(d);\r
+\r
+ return;\r
+}\r
//printf("%f,%f,%f,%f",*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]));
*mxGetPr(plhs[0]) = g0(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]));
- *mxGetPr(plhs[1]) = compute_g0(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3]));
+ *mxGetPr(plhs[1]) = *mxGetPr(prhs[1])!=0?singleQuad(*mxGetPr(prhs[0]),*mxGetPr(prhs[1]),*mxGetPr(prhs[2]),*mxGetPr(prhs[3])):0;
}
mex mex_Fort.cpp slpRectangle.cpp
mex mex_build_A.cpp slpRectangle.cpp
+mex mex_build_As1.cpp slpRectangle.cpp
+mex mex_build_As2.cpp slpRectangle.cpp
#include <cassert>\r
#include <stdlib.h>\r
\r
+#include <mex.h>\r
+\r
#include "slpRectangle.hpp"\r
\r
-#define EPS 0.00001\r
+#define EPS 10e5\r
\r
using namespace std;\r
\r
+double gauss_w5[] = {0.1185,0.2393,0.2844,0.2393,0.1185};\r
+double gauss_n5[] = {0.0469,0.2308,0.5000,0.7692,0.9531};\r
+\r
int sign(double);\r
//double arsinh(double);\r
\r
return log(x + sqrt(x * x + 1));\r
}\r
*/\r
+\r
+double singleQuad(double p, double y, double x, double l) {\r
+\r
+ double sol = 0;\r
+\r
+ for(int i = 0;i<5;++i){\r
+ sol += pow((x-gauss_n5[i]*y)*(x-gauss_n5[i]*y)+l*l,p)*gauss_w5[i]*y;\r
+ }\r
+\r
+ return sol;\r
+}\r
+\r
+\r
+double doubleQuad(double p, double y1, double y2, double x1, double x2, double l) {\r
+\r
+ double sol = 0;\r
+ for(int i = 0;i<5;++i){\r
+ for(int j=0;j<5;++j){\r
+ sol += pow((x1-y1*gauss_n5[i])*(x1-y1*gauss_n5[i])\r
+ +(x2-y2*gauss_n5[j])*(x2-y2*gauss_n5[j])+l*l,p)*y1*gauss_w5[i]*y2*gauss_w5[j];\r
+ }\r
+ }\r
+ return sol;\r
+}\r
+\r
//y-x muss != 0 sein\r
double g0(double p, double y, double x, double l) {\r
//printf("%.1f | %.1f | %.1f | %.1f +",p,x,y,l);\r
return sol;\r
}\r
\r
+double F_parY1Y2_2(double x1, double x2, double y1, double y2, double d1, double d2,\r
+ double d3) {\r
+\r
+ // printf("%.1f %.1f | %.1f %.1f | %.1f %.1f %.1f",x1,x2,y1,y2,d1,d2,d3);\r
+ double sol = (x1 - y1 - d1) * (x2 - y2 - d2);\r
+\r
+ if (sol != 0)\r
+ sol *= doubleQuad(-0.5, x1, x2, y1 + d1, y2 + d2, d3);\r
+\r
+ if ((x1 - y1 - d1) != 0)\r
+ sol -= (x1 - y1 - d1) * singleQuad(0.5, x1, y1 + d1,\r
+ sqrt((x2 - y2 - d2) * (x2 - y2 - d2) + d3 * d3));\r
+\r
+ if ((x2 - y2 - d2) != 0)\r
+ sol -= (x2 - y2 - d2) * singleQuad(0.5, x2, y2 + d2,\r
+ sqrt((x1 - y1 - d1) * (x1 - y1 - d1) + d3 * d3));\r
+\r
+ double hlp = ((x1 - y1 - d1) * (x1 - y1 - d1) + (x2 - y2 - d2) * (x2 - y2\r
+ - d2) + d3 * d3);\r
+ sol += 1. / 3 * hlp * sqrt(hlp);\r
+ return sol;\r
+}\r
+\r
double F_ort(double x1, double x2, double y2, double y3, double d1, double d2,\r
double d3) {\r
\r
return sol / 2.;\r
}\r
\r
-double applyInt(\r
+double applyInt4(\r
double(*f)(double, double, double, double, double, double, double),\r
double a, double b, double c, double d, double r, double t, double u,\r
double v, double d1, double d2, double d3) {\r
*/\r
}\r
\r
-double apply0Int(\r
+double apply0Int4(\r
double(*f)(double, double, double, double, double, double, double),\r
double b, double d, double t, double v, double d1, double d2, double d3) {\r
\r
\r
}\r
\r
+double apply0Int2(\r
+ double(*f)(double, double, double, double, double, double, double),\r
+ double b, double d, double t, double v, double d1, double d2, double d3) {\r
+\r
+ return f(b, d, t, v, d1, d2, d3)\r
+ -f(b, 0, t, v, d1, d2, d3)\r
+ -f(0, d, t, v, d1, d2, d3)\r
+ +f(0, 0, t, v, d1, d2, d3);\r
+\r
+}\r
+\r
double slpADLO(double y1, double y2, double x1, double x2, double a) {\r
double G3 = 0;\r
double gL = 0;\r
int sign(double);
double arsinh(double);
+// sol = g0(p,y,x,l); Quadratur !!! 0-y
+double singleQuad(double, double, double, double);
+
+// sol = G00(p,y1,y2,x1,x2,l); Quadratur !!! 0-y1 & 0-y2
+double doubleQuad(double, double, double, double, double, double);
+
// sol = g0(p,y,x,l);
double g0(double, double, double, double);
// sol = G00(p,y1,y2,x1,x2,l);
// sol = F_par(x1,x2,y1,y2,d1,d2,d3);
double F_parX1Y2(double, double, double, double, double, double, double);
+// sol = F_par(x1,x2,y1,y2,d1,d2,d3); Quadratur!!!
+double F_parY1Y2_2(double, double, double, double, double, double, double);
+
+/*
+// funktionen von Maik
double slpADLO(double, double, double, double, double);
double compute_g0(double, double, double, double);
double FLO_plane(double, double, double, double, double, double, double);
double FLO_perp(double, double, double, double, double, double, double);
+*/
// sol = quadInt((F_par/F_ort),a,b,c,d,r,t,u,v,d1,d2,d3);
-double applyInt(
+double applyInt4(
double(*)(double, double, double, double, double, double, double),
double, double, double, double, double, double, double, double, double,
double, double);
// sol = quad0Int((F_par/F_ort),b,d,t,v,d1,d2,d3);
-double apply0Int(
+double apply0Int4(
+ double(*)(double, double, double, double, double, double, double),
+ double, double, double, double, double, double, double);
+
+double apply0Int2(
double(*)(double, double, double, double, double, double, double),
double, double, double, double, double, double, double);
quad_sol = surfDoubleQuad(@(x1,x2,y1,y2)1/sqrt((x1-y1-l1).^2+(x2-y2-l2).^2+l3.^2)...
- ,a,b,c,d,r,t,u,v,4);
+ ,a,b,c,d,r,t,u,v,5);
intF = @(f,a,b,c,d,r,t,u,v)...
f(b,d,t,v)-f(b,d,t,u)-f(b,d,r,v)+f(b,d,r,u)...
-f(b,c,t,v)+f(b,c,t,u)+f(b,c,r,v)-f(b,c,r,u)...
-f(a,d,t,v)+f(a,d,t,u)+f(a,d,r,v)-f(a,d,r,u)...
+f(a,c,t,v)-f(a,c,t,u)-f(a,c,r,v)+f(a,c,r,u);
+
+
+ intF2 = @(f,a,b,c,d,r,t,u,v)...
+ f(b,d,t,v)-f(a,d,t,v)-f(b,c,t,v)+f(a,c,t,v);
+
+
+ [dm sol] = mex_Fpar(b,d,t,v,l1,l2,l3)
+
+ [dm sol1] = mex_Fpar(b,d,0,v,l1,l2,l3)
+ sol = sol - sol1;
+ [dm sol1] = mex_Fpar(b,d,t,0,l1,l2,l3)
+ sol = sol - sol1;
+ [dm sol1] = mex_Fpar(b,d,0,0,l1,l2,l3)
+ q_sol = sol + sol1;
+
+
sol = intF(@(x1,x2,y1,y2)mex_Fpar(x1,x2,y1,y2,l1,l2,l3),a,b,c,d,r,t,u,v);
-
-
- ret = [quad_sol sol];
+ ret = [quad_sol sol q_sol sol/q_sol];
end
quad_sol = surfQuad(@(y1,y2)((x1-y1).^2+(x2-y2).^2+l.^2).^p,a,b,c,d,4);
- [my(1) mk(1)] = mex_G00(p,a,c,x1,x2,l);
- [my(2) mk(2)] = mex_G00(p,b,d,x1,x2,l);
- [my(3) mk(3)] = mex_G00(p,b,c,x1,x2,l);
- [my(4) mk(4)] = mex_G00(p,a,d,x1,x2,l);
+ [my(1) ] = mex_G00(p,a,c,x1,x2,l);
+ [my(2) mq_sol] = mex_G00(p,b,d,x1,x2,l);
+ [my(3) ] = mex_G00(p,b,c,x1,x2,l);
+ [my(4) ] = mex_G00(p,a,d,x1,x2,l);
my_sol = my(1)+my(2)-my(3)-my(4);
- if(p==-0.5)
- mk_sol = mk(1)+mk(2)-mk(3)-mk(4);
- else
- mk_sol = nan;
- end
-
- ret = [quad_sol my_sol mk_sol];
+ ret = [quad_sol my_sol mq_sol];
end
% quad_sol = quad(@(y)((x-y).^2+l.^2).^p,a,b);
-[no we] = gauss(11,a,b);
+[no we] = gauss(5,a,b);
f = @(y)((x-y).^2+l.^2).^p;
quad_sol = we*f(no);
+cumsum(f(no))'
+
% X = 0:0.2:5;
% Y = ((x-X).^2+l.^2).^p;
%
% plot(X,Y)
-[my(1) mk(1)] = mex_g0(p,a,x,l);
-[my(2) mk(2)] = mex_g0(p,b,x,l);
+my(1) = mex_g0(p,a,x,l);
+[my(2) mq_sol]= mex_g0(p,b,x,l);
my_sol = my(2) - my(1);
-mk_sol = mk(2) - mk(1);
-ret = [quad_sol my_sol mk_sol];
+
+ret = [quad_sol my_sol mq_sol];
end
\r
dataIso =[];\r
dataAniso =[];\r
-maxSize = 10^2;\r
+maxSize = 10^3;\r
Netz = 'exmpl_2DLShape'; %Energienorm sollte gegen 8.28466 konvergieren\r
% Netz = 'exmpl_3DFichCube'; %Energienorm sollte gegen 162265 konvergieren\r
% Netz = 'exmpl_2DQuad';\r
\r
%Matrix mit feinem Netz berechnen\r
A_fine = mex_build_As1(coordinates_fine,elements_fine);\r
- A2 = mex_build_A(coordinates_fine,elements_fine);\r
+% A2 = mex_build_A(coordinates_fine,elements_fine);\r
\r
% figure(1)\r
% spy(A_fine-A_fine')\r
% \r
% figure (2)\r
% spy(A2-A2')\r
- eh = A_fine - A2;\r
+% eh = A_fine - A2;\r
% sum(sum(abs(A2-A2')))\r
% sum(sum(abs(A_fine-A_fine')))\r
\r
- spy(eh)\r
+% spy(eh)\r
\r
- sum(sum(abs(eh)))\r
- if(eh.^2)\r
- disp 'hä'\r
- end\r
+% sum(sum(abs(eh)))\r
+% if(eh.^2)\r
+% disp 'hä'\r
+% end\r
\r
%rechte Seite Aufbauen\r
b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
--- /dev/null
+\r
+dataIso =[];\r
+dataAniso =[];\r
+maxSize = 500;\r
+Netz = 'exmpl_2DLShape'; %Energienorm sollte gegen 8.28466 konvergieren\r
+% Netz = 'exmpl_3DFichCube'; %Energienorm sollte gegen 162265 konvergieren\r
+% Netz = 'exmpl_2DQuad';\r
+\r
+%% Anisotrope Verfeinerung\r
+disp 'Anisotrop'\r
+load(Netz)\r
+\r
+ref = 0;\r
+while size(elements,1)<maxSize\r
+ tic\r
+ ref = ref+1; \r
+\r
+ %Netz Isotrop verfeinern (4 Teile)\r
+ [coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
+ \r
+ %Matrix mit feinem Netz berechnen\r
+ A_fine = mex_build_A(coordinates_fine,elements_fine);\r
+ \r
+ %rechte Seite Aufbauen\r
+ b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
+ \r
+ %Lösungsvektor bestimmen\r
+ x_fine = A_fine\b;\r
+ \r
+ %Energienorm^2 bestimmen\r
+ xe_fine = x_fine'*A_fine*x_fine;\r
+\r
+ % Welche Elemente sollen verfeinert werden\r
+ ind = computeEstSlpMuTilde(x_fine,coordinates,elements,f2s);\r
+ \r
+ % Wie soll verfeinert werden\r
+ marked = mark(x_fine(f2s)',ind,0.5,0.5);\r
+\r
+ %Daten zur Auswertung zwischenspeichern (testweise?)\r
+ dataAniso(ref,:) = [size(elements,1) sqrt(sum(ind)) xe_fine];\r
+ \r
+ %Sicherheit falls keine Elemente markiert sind\r
+ if(sum(marked~=1)==0)\r
+ disp 'Abgebrochen weil nicht mehr verfeinert wird!'\r
+ break;\r
+ end\r
+ \r
+ %Verfeinern\r
+ [coordinates, elements] = refineQuad(coordinates,elements,marked);\r
+ file = ['save' int2str(ref)];\r
+ save ([file], 'coordinates', 'elements')\r
+ toc\r
+end\r
+dataAniso\r
+\r
+clear ref b A_fine coordinates_fine elements_fine marked ind f2s x_fine\r
+\r
+++ /dev/null
-\r
-dataIso =[];\r
-dataAniso =[];\r
-maxSize = 500;\r
-Netz = 'exmpl_2DLShape'; %Energienorm sollte gegen 8.28466 konvergieren\r
-% Netz = 'exmpl_3DFichCube'; %Energienorm sollte gegen 162265 konvergieren\r
-% Netz = 'exmpl_2DQuad';\r
-\r
-%% Anisotrope Verfeinerung\r
-disp 'Anisotrop'\r
-load(Netz)\r
-\r
-ref = 0;\r
-while size(elements,1)<maxSize\r
- tic\r
- ref = ref+1; \r
-\r
- %Netz Isotrop verfeinern (4 Teile)\r
- [coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
- \r
- %Matrix mit feinem Netz berechnen\r
- A_fine = mex_build_A(coordinates_fine,elements_fine);\r
- \r
- %rechte Seite Aufbauen\r
- b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
- \r
- %Lösungsvektor bestimmen\r
- x_fine = A_fine\b;\r
- \r
- %Energienorm^2 bestimmen\r
- xe_fine = x_fine'*A_fine*x_fine;\r
-\r
- % Welche Elemente sollen verfeinert werden\r
- ind = computeEstSlpMuTilde(x_fine,coordinates,elements,f2s);\r
- \r
- % Wie soll verfeinert werden\r
- marked = mark(x_fine(f2s)',ind,0.5,0.5);\r
-\r
- %Daten zur Auswertung zwischenspeichern (testweise?)\r
- dataAniso(ref,:) = [size(elements,1) sqrt(sum(ind)) xe_fine];\r
- \r
- %Sicherheit falls keine Elemente markiert sind\r
- if(sum(marked~=1)==0)\r
- disp 'Abgebrochen weil nicht mehr verfeinert wird!'\r
- break;\r
- end\r
- \r
- %Verfeinern\r
- [coordinates, elements] = refineQuad(coordinates,elements,marked);\r
- file = ['save' int2str(ref)];\r
- save ([file], 'coordinates', 'elements')\r
- toc\r
-end\r
-dataAniso\r
-\r
-clear ref b A_fine coordinates_fine elements_fine marked ind f2s x_fine\r
-\r
--- /dev/null
+\r
+mex mex_build_As1.cpp slpRectangle.cpp\r
+\r
+dataIso =[];\r
+dataAniso =[];\r
+maxSize = 500;\r
+fileName = './test_save';\r
+Netz = 'exmpl_2DLShape'; %Energienorm sollte gegen 8.28466 konvergieren\r
+% Netz = 'exmpl_3DFichCube'; %Energienorm sollte gegen 162265 konvergieren\r
+% Netz = 'exmpl_2DQuad';\r
+\r
+\r
+%% Anisotrope Verfeinerung\r
+if(~exist('d1'))\r
+ disp 'Normal'\r
+ load(Netz)\r
+\r
+ ref = 0;\r
+\r
+ while size(elements,1)<maxSize\r
+ tic\r
+ ref = ref+1; \r
+\r
+\r
+\r
+ %Netz Isotrop verfeinern (4 Teile)\r
+ [coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
+\r
+ %Matrix mit feinem Netz berechnen\r
+ A_fine = mex_build_A(coordinates_fine,elements_fine);\r
+\r
+ %rechte Seite Aufbauen\r
+ b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
+\r
+ %Lösungsvektor bestimmen\r
+ x_fine = A_fine\b;\r
+\r
+ %Energienorm^2 bestimmen\r
+ xe_fine = x_fine'*A_fine*x_fine;\r
+\r
+ % Welche Elemente sollen verfeinert werden\r
+ ind = computeEstSlpMuTilde(x_fine,coordinates,elements,f2s);\r
+\r
+ % Wie soll verfeinert werden\r
+ marked = mark(x_fine(f2s)',ind,0.5,0.5);\r
+\r
+ %Daten zur Auswertung zwischenspeichern (testweise?)\r
+ dataAniso(ref,:) = [size(elements,1) sqrt(sum(ind)) xe_fine];\r
+\r
+ %Sicherheit falls keine Elemente markiert sind\r
+ if(sum(marked~=1)==0)\r
+ disp 'Abgebrochen weil nicht mehr verfeinert wird!'\r
+ break;\r
+ end\r
+\r
+ %Verfeinern\r
+ %[coordinates, elements] = refineQuad(coordinates,elements,marked);\r
+ file = ['save' int2str(ref)];\r
+ load(file);\r
+ toc\r
+ end\r
+ d1 = dataAniso\r
+end\r
+\r
+%% Anisotrope Verfeinerung\r
+disp 'Optimiert'\r
+load(Netz)\r
+\r
+ref = 0;\r
+while size(elements,1)<maxSize\r
+ tic\r
+ ref = ref+1; \r
+ \r
+\r
+\r
+ %Netz Isotrop verfeinern (4 Teile)\r
+ [coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
+ \r
+ %Matrix mit feinem Netz berechnen\r
+ A_fine = mex_build_As1(coordinates_fine,elements_fine);\r
+ \r
+ %rechte Seite Aufbauen\r
+ b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
+ \r
+ %Lösungsvektor bestimmen\r
+ x_fine = A_fine\b;\r
+ \r
+ %Energienorm^2 bestimmen\r
+ xe_fine = x_fine'*A_fine*x_fine;\r
+\r
+ % Welche Elemente sollen verfeinert werden\r
+ ind = computeEstSlpMuTilde(x_fine,coordinates,elements,f2s);\r
+ \r
+ % Wie soll verfeinert werden\r
+ marked = mark(x_fine(f2s)',ind,0.5,0.5);\r
+\r
+ %Daten zur Auswertung zwischenspeichern (testweise?)\r
+ dataAniso(ref,:) = [size(elements,1) sqrt(sum(ind)) xe_fine];\r
+ \r
+ %Sicherheit falls keine Elemente markiert sind\r
+ if(sum(marked~=1)==0)\r
+ disp 'Abgebrochen weil nicht mehr verfeinert wird!'\r
+ break;\r
+ end\r
+ \r
+ %Verfeinern\r
+ %[coordinates, elements] = refineQuad(coordinates,elements,marked);\r
+ file = ['save' int2str(ref)];\r
+ load(file);\r
+ toc\r
+end\r
+d2 = dataAniso\r
+\r
+clear ref b A_fine coordinates_fine elements_fine marked ind f2s x_fine\r
+\r
+\r
+%% Alles Zeichnen\r
+figure (1)\r
+loglog(d1(:,1),d1(:,2),d2(:,1),d2(:,2));\r
+\r
+legend('Normal','optimiert')\r
+xlabel('Elemente')\r
+ylabel('Fehler')\r
+\r
+figure (2)\r
+loglog(d1(:,1),d1(:,3),d2(:,1),d2(:,3));\r
+\r
+legend('Normal','Optimiert')\r
+xlabel('Elemente')\r
+ylabel('EnergieNorm')\r
\r
+mex mex_build_As2.cpp slpRectangle.cpp\r
+\r
dataIso =[];\r
dataAniso =[];\r
maxSize = 500;\r
% Netz = 'exmpl_2DQuad';\r
\r
\r
-% %% Anisotrope Verfeinerung\r
-% disp 'Anisotrop1'\r
-% load(Netz)\r
-% \r
-% ref = 0;\r
-% while size(elements,1)<maxSize\r
-% tic\r
-% ref = ref+1; \r
-% \r
-% \r
-% \r
-% %Netz Isotrop verfeinern (4 Teile)\r
-% [coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
-% \r
-% %Matrix mit feinem Netz berechnen\r
-% A_fine = mex_build_A(coordinates_fine,elements_fine);\r
-% \r
-% %rechte Seite Aufbauen\r
-% b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
-% \r
-% %Lösungsvektor bestimmen\r
-% x_fine = A_fine\b;\r
-% \r
-% %Energienorm^2 bestimmen\r
-% xe_fine = x_fine'*A_fine*x_fine;\r
-% \r
-% % Welche Elemente sollen verfeinert werden\r
-% ind = computeEstSlpMuTilde(x_fine,coordinates,elements,f2s);\r
-% \r
-% % Wie soll verfeinert werden\r
-% marked = mark(x_fine(f2s)',ind,0.5,0.5);\r
-% \r
-% %Daten zur Auswertung zwischenspeichern (testweise?)\r
-% dataAniso(ref,:) = [size(elements,1) sqrt(sum(ind)) xe_fine];\r
-% \r
-% %Sicherheit falls keine Elemente markiert sind\r
-% if(sum(marked~=1)==0)\r
-% disp 'Abgebrochen weil nicht mehr verfeinert wird!'\r
-% break;\r
-% end\r
-% \r
-% %Verfeinern\r
-% %[coordinates, elements] = refineQuad(coordinates,elements,marked);\r
-% file = ['save' int2str(ref)];\r
-% load(file);\r
-% toc\r
-% end\r
-% d1 = dataAniso\r
+%% Anisotrope Verfeinerung\r
\r
+if(~exist('d1'))\r
+ \r
+ disp 'Normal'\r
+ load(Netz)\r
\r
-%% Anisotrope Verfeinerung\r
-disp 'Anisotrop2'\r
-load(Netz)\r
+ ref = 0;\r
\r
-ref = 0;\r
while size(elements,1)<maxSize\r
tic\r
ref = ref+1; \r
[coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
\r
%Matrix mit feinem Netz berechnen\r
- A_fine = mex_build_As1(coordinates_fine,elements_fine);\r
+ A_fine = mex_build_A(coordinates_fine,elements_fine);\r
\r
%rechte Seite Aufbauen\r
b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
load(file);\r
toc\r
end\r
+d1 = dataAniso\r
+end\r
+\r
+%% Anisotrope Verfeinerung\r
+disp 'Optimiert'\r
+load(Netz)\r
+\r
+ref = 0;\r
+while size(elements,1)<maxSize\r
+ tic\r
+ ref = ref+1; \r
+ \r
+\r
+\r
+ %Netz Isotrop verfeinern (4 Teile)\r
+ [coordinates_fine,elements_fine, f2s]=refineQuad(coordinates,elements,2*ones(1,size(elements,1)));\r
+ \r
+ %Matrix mit feinem Netz berechnen\r
+ A_fine = mex_build_As2(coordinates_fine,elements_fine);\r
+ \r
+ %rechte Seite Aufbauen\r
+ b = sqrt(sum(quadNorm(coordinates_fine,elements_fine,'w').^2,2));\r
+ \r
+ %Lösungsvektor bestimmen\r
+ x_fine = A_fine\b;\r
+ \r
+ %Energienorm^2 bestimmen\r
+ xe_fine = x_fine'*A_fine*x_fine;\r
+\r
+ % Welche Elemente sollen verfeinert werden\r
+ ind = computeEstSlpMuTilde(x_fine,coordinates,elements,f2s);\r
+ \r
+ % Wie soll verfeinert werden\r
+ marked = mark(x_fine(f2s)',ind,0.5,0.5);\r
+\r
+ %Daten zur Auswertung zwischenspeichern (testweise?)\r
+ dataAniso(ref,:) = [size(elements,1) sqrt(sum(ind)) xe_fine];\r
+ \r
+ %Sicherheit falls keine Elemente markiert sind\r
+% if(sum(marked~=1)==0)\r
+% disp 'Abgebrochen weil nicht mehr verfeinert wird!'\r
+% break;\r
+% end\r
+ \r
+ %Verfeinern\r
+ %[coordinates, elements] = refineQuad(coordinates,elements,marked);\r
+ file = ['save' int2str(ref)];\r
+ load(file);\r
+ toc\r
+end\r
d2 = dataAniso\r
\r
clear ref b A_fine coordinates_fine elements_fine marked ind f2s x_fine\r
figure (1)\r
loglog(d1(:,1),d1(:,2),d2(:,1),d2(:,2));\r
\r
-legend('Isotrop','Anisotrop')\r
+legend('Normal','optimiert')\r
xlabel('Elemente')\r
ylabel('Fehler')\r
\r
figure (2)\r
loglog(d1(:,1),d1(:,3),d2(:,1),d2(:,3));\r
\r
-legend('Isotrop','Anisotrop')\r
+legend('Normal','Optimiert')\r
xlabel('Elemente')\r
ylabel('EnergieNorm')\r