/*\r
- * Art der Berechnung durch Parameter bestimmt...\r
- * Analytisch/Semianalytisch/...\r
+ * MEX FUNKTION mex_build_V(coo,ele,zeta,type)\r
*\r
+ * coo : Koordinaten Matrix\r
+ * ele : Element Matrix\r
+ * zeta : Steuerungsvariable der Zulaessigeitsbedingungen\r
+ * type : Bestimmt die Art der Berechnung\r
*\r
+ * TYPES----\r
+ * 1 : Voll Analytisch\r
+ * zeta wird ignoriert\r
+ *\r
+ * 0 : Semianalytisch im Fernfeld Quadratur ueber beide Elemente\r
+ * Quadratur bei : ((t * t + v * v) < zeta[0] * (d1 * d1 + d2 * d2 + d3 * d3)) : wobei v,t jeweils die laengste Seite\r
+ * in x und in y Richtung ist und d(1,2,3) der Abstandsvektor zwischen den Elementen\r
+ *\r
+ * 2 : Semianalytisch im Fernfeld Quadratur ueber ein Element\r
+ * Quadratur bei : ((b * b + d * d) < zeta[0] * (d1 * d1 + d2 * d2 + d3 * d3)) : wobei b,d jeweils die kuerzeste Seite\r
+ * in x und in y Richtung ist und d(1,2,3) der Abstandsvektor zwischen den Elementen\r
+ *\r
+ *\r
+ *\r
+ * Peter Schaefer\r
*/\r
//#include <iostream>\r
#include <cmath>\r
#include "mex.h"\r
/*/#include <stdlib.h>\r
\r
-//#include "gauss.hpp"\r
-*/\r
+ //#include "gauss.hpp"\r
+ */\r
//#define M_EPS 10e-8\r
/*\r
-//#include "tbb/parallel_for.h"\r
-*/\r
+ //#include "tbb/parallel_for.h"\r
+ */\r
#include "slpRectangle.hpp"\r
/*\r
-//using namespace std;\r
-//using namespace slpR;\r
-*/\r
+ //using namespace std;\r
+ //using namespace slpR;\r
+ */\r
int dimOfVec(double* vec) {\r
if (vec[2] != 0)\r
return 2;\r
else {\r
mexErrMsgTxt("length of Site is zero");\r
/*\r
-// cerr << "dimOfVec : (" << vec[0] << " " << vec[1] << " " << vec[2]\r
-// << ") alle Werte 0 \n";*/\r
+ // cerr << "dimOfVec : (" << vec[0] << " " << vec[1] << " " << vec[2]\r
+ // << ") alle Werte 0 \n";*/\r
return -1;\r
}\r
\r
}\r
\r
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {\r
-/*\r
-// initeQuad();\r
-// cout << Quad[1].nod[0];\r
-*/\r
+ /*\r
+ // initeQuad();\r
+ // cout << Quad[1].nod[0];\r
+ */\r
int i, j, k; //Schleifenindizes\r
double tmp; //Zwischenspeicherung der Einzelnen Werte\r
int count;\r
double * dt = mxGetPr(mxCreateDoubleMatrix(3, 1, mxREAL));\r
\r
// Welche Funktion soll verwendet werden\r
- double(*ctypeP)(double, double, double, double, double, double, double,\r
+ double (*ctypeP)(double, double, double, double, double, double, double,\r
double*);\r
- double(*ctypeO)(double, double, double, double, double, double, double,\r
+ double (*ctypeO)(double, double, double, double, double, double, double,\r
double*);\r
\r
//Art der Berechnung bestimmen\r
A[(k * em) + j] = 1. / (4 * M_PI) * tmp;\r
if (k != j)\r
A[(j * em) + k] = 1. / (4 * M_PI) * tmp;\r
-/* if (count++ > ((em * (em + 1)) / 2) / 10) {\r
- count = 0;\r
-// mexPrintf("#");\r
-// cout << "#";\r
-// cout.flush();\r
- }*/\r
+ /* if (count++ > ((em * (em + 1)) / 2) / 10) {\r
+ count = 0;\r
+ // mexPrintf("#");\r
+ // cout << "#";\r
+ // cout.flush();\r
+ }*/\r
\r
}\r
\r
}\r
// cout << endl;\r
//Rueckgabe (eventuell zurueck schreiben)\r
-/* mxFree(x0);\r
- mxFree(x1);\r
- mxFree(x3);\r
- mxFree(xa);\r
- mxFree(xb);\r
- mxFree(y0);\r
- mxFree(y1);\r
- mxFree(y3);\r
- mxFree(ya);\r
- mxFree(yb);\r
- mxFree(d);\r
- mxFree(dt);\r
-*/\r
+ /* mxFree(x0);\r
+ mxFree(x1);\r
+ mxFree(x3);\r
+ mxFree(xa);\r
+ mxFree(xb);\r
+ mxFree(y0);\r
+ mxFree(y1);\r
+ mxFree(y3);\r
+ mxFree(ya);\r
+ mxFree(yb);\r
+ mxFree(d);\r
+ mxFree(dt);\r
+ */\r
return;\r
}\r
#include "gauss.hpp"\r
\r
#define quad 4 // Anzahl der Quadratur Auswertungstellen 2^quad\r
-\r
//using namespace std;\r
\r
int sign(double);\r
sol += (x2 - y2) * log(sqrt(hlp) - (x2 - y2));\r
\r
if (sol != sol /*|| fabs(sol) == numeric_limits<double>::infinity()*/) {\r
- // cout << "G_AY2X2: " << sol << " isn't a Number. (" << y1 << "," << y2\r
- // << ")(" << x1 << "," << x2 << ")(" << d3 << ")" << endl;\r
- // cout << (x2 - y2) << "__" << sqrt(hlp) << endl;\r
- // cout << (x1 - y1) * (x1 - y1) << " " << hlp << endl;\r
+ // cout << "G_AY2X2: " << sol << " isn't a Number. (" << y1 << "," << y2\r
+ // << ")(" << x1 << "," << x2 << ")(" << d3 << ")" << endl;\r
+ // cout << (x2 - y2) << "__" << sqrt(hlp) << endl;\r
+ // cout << (x1 - y1) * (x1 - y1) << " " << hlp << endl;\r
}\r
return sol;\r
}\r
sol /= 2 * p + 2;\r
} else {\r
sol = NAN;\r
- // cout << "warning in G_AY1Y2: no case for p=" << p\r
- // << " defined. Possible: [-1.5,-0.5,0.5,...]" << endl;\r
+ // cout << "warning in G_AY1Y2: no case for p=" << p\r
+ // << " defined. Possible: [-1.5,-0.5,0.5,...]" << endl;\r
}\r
\r
return sol;\r
\r
if ((x1 - d1) != 0)\r
sol += (x1 - d1)\r
- * g_AY(\r
- 0.5,\r
- y3,\r
- -d3,\r
+ * g_AY(0.5, y3, -d3,\r
sqrt(\r
(x1 - d1) * (x1 - d1)\r
+ (x2 - y2 - d2) * (x2 - y2 - d2)));\r
\r
if ((y3 + d3) != 0)\r
sol += (y3 + d3)\r
- * g_AY(\r
- 0.5,\r
- x1,\r
- d1,\r
+ * g_AY(0.5, x1, d1,\r
sqrt(\r
(x2 - y2 - d2) * (x2 - y2 - d2)\r
+ (y3 + d3) * (y3 + d3)));\r
}*/\r
\r
double inline apply0Int4(\r
- double(*f)(double, double, double, double, double, double, double),\r
+ double (*f)(double, double, double, double, double, double, double),\r
double b, double d, double t, double v, double d1, double d2,\r
double d3) {\r
\r
}\r
\r
double inline apply0Int2(\r
- double(*f)(double, double, double, double, double, double, double),\r
+ double (*f)(double, double, double, double, double, double, double),\r
double b, double d, double t, double v, double d1, double d2,\r
double d3) {\r
\r
}\r
\r
// Berechnet das eigentliche Integral fuer parallele Elemente voll Analytisch\r
-double calcParIntA(double b, double d, double t, double v, double d1,\r
- double d2, double d3) {\r
+double calcParIntA(double b, double d, double t, double v, double d1, double d2,\r
+ double d3) {\r
return apply0Int4(F_par, b, d, t, v, d1, d2, d3);\r
\r
}\r
b * gauss_nodes[quad][i].n, 0, d3) * t * b\r
* gauss_nodes[quad][i].w * gauss_nodes[quad][j].w;\r
\r
- if (sol != sol /*|| fabs(sol) == numeric_limits<double>::infinity()*/) {\r
-/* cout << "->(" << i << "," << j << ")" << endl;\r
- cout << "-|("\r
- << G_AY2X2(t * gauss_nodes[quad][j].n + d1, v + d2,\r
- b * gauss_nodes[quad][i].n, d, d3) * t * b\r
- * gauss_nodes[quad][i].w\r
- * gauss_nodes[quad][j].w << ","\r
- << G_AY2X2(t * gauss_nodes[quad][j].n + d1, v + d2,\r
- b * gauss_nodes[quad][i].n, 0, d3) * t * b\r
- * gauss_nodes[quad][i].w\r
- * gauss_nodes[quad][j].w << ","\r
- << G_AY2X2(t * gauss_nodes[quad][j].n + d1, d2,\r
- b * gauss_nodes[quad][i].n, d, d3) * t * b\r
- * gauss_nodes[quad][i].w\r
- * gauss_nodes[quad][j].w << ","\r
- << G_AY2X2(t * gauss_nodes[quad][j].n + d1, d2,\r
- b * gauss_nodes[quad][i].n, 0, d3) * t * b\r
- * gauss_nodes[quad][i].w\r
- * gauss_nodes[quad][j].w << ")" << endl;\r
- cout << "||"\r
- << t * b * gauss_nodes[quad][i].w\r
- * gauss_nodes[quad][j].w\r
- << "||-----------------" << endl;\r
-\r
- cout << "? ("\r
- << G_AY2X2(t * gauss_nodes[quad][j].n + d1, d2,\r
- b * gauss_nodes[quad][i].n, 0, d3) << ","\r
- << t * b * gauss_nodes[quad][i].w\r
- * gauss_nodes[quad][j].w << ")" << endl;\r
-\r
- cout << endl;*/\r
+ if (sol\r
+ != sol /*|| fabs(sol) == numeric_limits<double>::infinity()*/) {\r
+ /* cout << "->(" << i << "," << j << ")" << endl;\r
+ cout << "-|("\r
+ << G_AY2X2(t * gauss_nodes[quad][j].n + d1, v + d2,\r
+ b * gauss_nodes[quad][i].n, d, d3) * t * b\r
+ * gauss_nodes[quad][i].w\r
+ * gauss_nodes[quad][j].w << ","\r
+ << G_AY2X2(t * gauss_nodes[quad][j].n + d1, v + d2,\r
+ b * gauss_nodes[quad][i].n, 0, d3) * t * b\r
+ * gauss_nodes[quad][i].w\r
+ * gauss_nodes[quad][j].w << ","\r
+ << G_AY2X2(t * gauss_nodes[quad][j].n + d1, d2,\r
+ b * gauss_nodes[quad][i].n, d, d3) * t * b\r
+ * gauss_nodes[quad][i].w\r
+ * gauss_nodes[quad][j].w << ","\r
+ << G_AY2X2(t * gauss_nodes[quad][j].n + d1, d2,\r
+ b * gauss_nodes[quad][i].n, 0, d3) * t * b\r
+ * gauss_nodes[quad][i].w\r
+ * gauss_nodes[quad][j].w << ")" << endl;\r
+ cout << "||"\r
+ << t * b * gauss_nodes[quad][i].w\r
+ * gauss_nodes[quad][j].w\r
+ << "||-----------------" << endl;\r
+\r
+ cout << "? ("\r
+ << G_AY2X2(t * gauss_nodes[quad][j].n + d1, d2,\r
+ b * gauss_nodes[quad][i].n, 0, d3) << ","\r
+ << t * b * gauss_nodes[quad][i].w\r
+ * gauss_nodes[quad][j].w << ")" << endl;\r
+\r
+ cout << endl;*/\r
return sol;\r
}\r
\r
\r
}\r
\r
-double calcParIntQ(double b, double d, double t, double v, double d1,\r
- double d2, double d3) {\r
+double calcParIntQ(double b, double d, double t, double v, double d1, double d2,\r
+ double d3) {\r
//Fall 0\r
\r
double sol = 0;\r
- int i,j,k,l;\r
+ int i, j, k, l;\r
\r
for (i = 0; i < gauss_size[quad]; ++i) {\r
for (j = 0; j < gauss_size[quad]; ++j) {\r
return sol;\r
}\r
\r
-double calcOrtIntA(double b, double d, double t, double v, double d1,\r
- double d2, double d3) {\r
+double calcOrtIntA(double b, double d, double t, double v, double d1, double d2,\r
+ double d3) {\r
return apply0Int4(F_ort, b, d, t, v, d1, d2, d3);\r
\r
}\r
if ((b * b + d * d) * zeta <= d1 * d1 + d2 * d2 + d3 * d3) {\r
return calcOrtIntQX1X2(b, d, t, v, d1, d2, d3);\r
} else {\r
- // cout << "2error";\r
+ // cout << "2error";\r
return calcOrtIntA(b, d, t, v, d1, d2, d3);\r
}\r
}\r
}\r
}\r
\r
-double cParO0(double b, double d, double t, double v, double d1,\r
- double d2, double d3, double* zeta) {\r
+double cParO0(double b, double d, double t, double v, double d1, double d2,\r
+ double d3, double* zeta) {\r
double tmp = 0;\r
\r
// kleine Seite nach vorn\r
d2 = -d2;\r
}\r
\r
- if ((t * t + v * v) * zeta[0] < d1 * d1 + d2 * d2 + d3 * d3) {\r
+ if ((t * t + v * v) < zeta[0] * (d1 * d1 + d2 * d2 + d3 * d3)) {\r
return calcParIntQ(b, d, t, v, d1, d2, d3);\r
} else {\r
return calcParIntA(b, d, t, v, d1, d2, d3);\r
return 0;\r
}\r
\r
-double cParO1(double b, double d, double t, double v, double d1,\r
- double d2, double d3, double* zeta) {\r
+double cParO1(double b, double d, double t, double v, double d1, double d2,\r
+ double d3, double* zeta) {\r
return calcParIntA(b, d, t, v, d1, d2, d3);\r
}\r
\r
-double cParO2(double b, double d, double t, double v, double d1,\r
- double d2, double d3, double* zeta) {\r
+double cParO2(double b, double d, double t, double v, double d1, double d2,\r
+ double d3, double* zeta) {\r
\r
double tmp = 0;\r
\r
d2 = -d2;\r
}\r
\r
- if ((b * b + d * d) < zeta[0]* (d1 * d1 + d2 * d2 + d3 * d3)) {\r
+ if ((b * b + d * d) < zeta[0] * (d1 * d1 + d2 * d2 + d3 * d3)) {\r
// cout << "E";\r
return calcParIntQX1X2(b, d, t, v, d1, d2, d3);\r
} else {\r
return 0;\r
}\r
\r
-double cParO3(double b, double d, double t, double v, double d1,\r
- double d2, double d3, double* zeta) {\r
+double cParO3(double b, double d, double t, double v, double d1, double d2,\r
+ double d3, double* zeta) {\r
\r
double tmp = 0;\r
\r
d2 = -d2;\r
}\r
\r
- if ((b * b + d * d) < zeta[0] * (d1 * d1 + d2 * d2 + d3 * d3)) {\r
+ if ((b * b + d * d) < zeta[0] * (d1 * d1 + d2 * d2 + d3 * d3)) {\r
\r
//kleinere Achse nach vorn\r
if (b * b + t * t > d * d + v * v) {\r
d2 = tmp;\r
}\r
\r
- if (min(b, t) <= zeta[1] * d1) {\r
+ if (min(b, t) <= zeta[1] * d1) {\r
// cout << "A";\r
return calcParIntQY1X1(b, d, t, v, d1, d2, d3);\r
} else {\r