38 printf(
"\n Darcy's velocities reconstruction \n");
40 unsigned int i, j, l, k1, k2;
41 unsigned long int fracture1 = 0, fracture2 = 0;
46 unsigned short int flag1 = 0, flag2 = 0;
48 for (i = 0; i <
nnodes; i++) {
49 for (j = 0; j < 4; j++) {
54 if ((
node[i].typeN == 0) || (
node[i].typeN == 310) || (
node[i].typeN == 210) || (
node[i].typeN == 300) || (
node[i].typeN == 200))
65 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[0], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[1], 2));
71 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[0], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[1], 2));
79 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[3], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[4], 2));
85 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[3], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[4], 2));
96 if ((
node[i].typeN == 10)) {
97 unsigned short int edge01 = 200, edge02 = 200, s = 0, kk;
104 for (kk = 0; kk < 4; kk++) {
105 if (
node[i].cells[j][kk] != 0) {
120 if ((edge01 != 200) && (edge02 != 200)) {
123 printf(
" Two boundary edges for node %d not found ! \n", i + 1);
130 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[0], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[1], 2));
136 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[0], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[1], 2));
144 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[3], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[4], 2));
150 length = sqrt(pow(
node[i].coord_xy[0] -
node[
node[i].indnodes[j] - 1].coord_xy[3], 2) + pow(
node[i].coord_xy[1] -
node[
node[i].indnodes[j] - 1].coord_xy[4], 2));
164 if ((
node[i].typeN == 12) || (
node[i].typeN == 2) || (
node[i].typeN == 302) || (
node[i].typeN == 202) || (
node[i].typeN == 312) || (
node[i].typeN == 212)) {
178 while (
node[i].fracts[j][l] != 0) {
179 if (
node[i].fracts[j][l] == fracture1) {
187 if (
node[i].fracts[j][l] == fracture2)
204 printf(
" Velocities on nodes are calculated \n" );
219 sprintf(filename,
"%s/plot_vel",
maindir);
220 FILE *wq = fopen (filename,
"w");
221 sprintf(filename,
"%s/fract_nodes",
maindir);
222 FILE *wn = fopen (filename,
"w");
225 fprintf(wn,
" %d \n",
nfract);
227 for (f = 1; f <
nfract + 1; f++) {
230 for(i = 0; i <
nnodes; i++) {
233 fprintf(wq,
" %5.8e %5.8e %5.8e %5.8e %5.8e %5.8e\n",
node[i].coord_xy[0],
node[i].coord_xy[1],
node[i].velocity[0][0],
node[i].velocity[0][1],
node[i].pressure, speed);
236 if (
node[i].velocity[1][0] != 0.) {
238 fprintf(wq,
" %5.8e %5.8e %5.8e %5.8e %5.8e %5.8e\n",
node[i].coord_xy[0],
node[i].coord_xy[1],
node[i].velocity[1][0],
node[i].velocity[1][1],
node[i].pressure, speed);
244 fprintf(wq,
" %5.8e %5.8e %5.8e %5.8e %5.8e %5.8e\n",
node[i].coord_xy[3],
node[i].coord_xy[4],
node[i].velocity[2][0],
node[i].velocity[2][1],
node[i].pressure, speed);
247 if (
node[i].velocity[3][0] != 0.) {
249 fprintf(wq,
" %5.8e %5.8e %5.8e %5.8e %5.8e %5.8e\n",
node[i].coord_xy[3],
node[i].coord_xy[4],
node[i].velocity[3][0],
node[i].velocity[3][1],
node[i].pressure, speed);
256 fprintf(wn,
"%d \n", sumf);
266 struct matr matrices;
267 double dp[2][2] = {{0, 0}, {0, 0}};
268 unsigned int j, m, n;
270 for (j = 0; j < number; j++) {
272 for (m = 0; m < 2; m++) {
273 for (n = 0; n < 2; n++) {
274 dp[n][m] = dp[n][m] + normxarea[j][n] * normxarea[j][m];
280 double determinant = dp[0][0] * dp[1][1] - dp[0][1] * dp[1][0];
283 if ((determinant < eps) && (determinant > -eps)) {
288 double invdet = 1.0 / determinant;
289 matrices.
matinv[0][0] = dp[1][1] * invdet;
290 matrices.matinv[1][0] = -dp[1][0] * invdet;
291 matrices.matinv[0][1] = -dp[0][1] * invdet;
292 matrices.matinv[1][1] = dp[0][0] * invdet;
295 for (m = 0; m < 2; m++) {
296 for (j = 0; j < number; j++) {
297 matrices.matrinvG[m][j] = matrices.matinv[m][0] * normxarea[j][0] + matrices.matinv[m][1] * normxarea[j][1];
308 double u[2] = {0, 0}, v[2] = {0, 0};
330 lbound.angle =
DefineAngle(u[0], u[1], v[0], v[1]);
331 normu = sqrt(u[1] * u[1] + u[0] * u[0]);
332 normv = sqrt(v[1] * v[1] + v[0] * v[0]);
335 lbound.norm[0] = -u[1];
336 lbound.norm[1] = u[0];
338 lbound.norm[0] = -v[1];
339 lbound.norm[1] = v[0];
342 lbound.length_b = normu + normv;
348 double angle, normu, normv;
349 normu = sqrt(u1 * u1 + u2 * u2);
350 normv = sqrt(v1 * v1 + v2 * v2);
351 angle = acosf(((u1 * v1 + u2 * v2) / (normu * normv)));
360 double qhat[2] = {0, 0};
361 struct matr matrices;
362 double massbalance = 0;
363 matrices.
matinv[0][0] = 0.0;
364 matrices.
matinv[0][1] = 0.0;
365 matrices.
matinv[1][0] = 0.0;
366 matrices.
matinv[1][1] = 0.0;
368 for (k = 0; k < 40; k++) {
375 for (m = 0; m < 2; m++) {
378 for (j = 0; j < number; j++) {
380 massbalance = massbalance +
node[i].
flux[indj[j]];
393 double qhat[2] = {0, 0};
394 struct matr matrices;
395 double Bmatr[2] = {0, 0};
396 double q_b[2] = {0, 0}, b1[2] = {0, 0}, inv, bqhat, btw[2] = {0, 0};
397 double massbalance = 0;
398 matrices.
matinv[0][0] = 0.0;
399 matrices.
matinv[0][1] = 0.0;
400 matrices.
matinv[1][0] = 0.0;
401 matrices.
matinv[1][1] = 0.0;
403 for (k = 0; k < 40; k++) {
410 for (m = 0; m < 2; m++) {
413 for (j = 0; j < number; j++) {
415 massbalance = massbalance +
node[i].
flux[indj[j]];
422 bqhat = Bmatr[0] * qhat[0] + Bmatr[1] * qhat[1];
424 b1[0] = Bmatr[0] * matrices.
matinv[0][0] + Bmatr[1] * matrices.
matinv[1][0];
425 b1[1] = Bmatr[0] * matrices.
matinv[0][1] + Bmatr[1] * matrices.
matinv[1][1];
427 inv = 1. / (b1[0] * Bmatr[0] + b1[1] * Bmatr[1]);
429 btw[0] = Bmatr[0] * inv;
430 btw[1] = Bmatr[1] * inv;
432 b1[0] = matrices.
matinv[0][0] * btw[0] + matrices.
matinv[0][1] * btw[1];
433 b1[1] = matrices.
matinv[1][0] * btw[0] + matrices.
matinv[1][1] * btw[1];
434 q_b[0] = qhat[0] - b1[0] * bqhat;
435 q_b[1] = qhat[1] - b1[1] * bqhat;
437 for (m = 0; m < 2; m++) {
448 long int i, j, n1, n2, n3, celln = 0;
450 for(i = 0; i <
ncells; i++) {
452 long int k1 = 0, k2 = 0, v1 = 0, v2 = 0, k3 = 0, v3 = 0, node3 = 0, vel3 = 0, kk3 = 0, vv3 = 0;
455 if ((
node[n1 - 1].typeN == 10) || (
node[n1 - 1].typeN == 12) || (
node[n1 - 1].typeN == 310) || (
node[n1 - 1].typeN == 312)) {
463 if ((
node[n2 - 1].typeN == 10) || (
node[n2 - 1].typeN == 12) || (
node[n2 - 1].typeN == 310) || (
node[n2 - 1].typeN == 312)) {
477 if ((
node[n3 - 1].typeN == 10) || (
node[n3 - 1].typeN == 12) || (
node[n3 - 1].typeN == 310) || (
node[n3 - 1].typeN == 312)) {
497 if ((k1 * k2 != 0)) {
500 long int jk3 = 0, jk2 = 0, jk1 = 0, notcorner = 0, notcorner1 = 0, k;
503 if (((
node[k1 - 1].type[j] == 10) || (
node[k1 - 1].type[j] == 12) || (
node[
node[k1 - 1].indnodes[j] - 1].typeN == 310)) && (
node[k1 - 1].indnodes[j] != k2)) {
504 for (k = 0; k < 4; k++) {
506 if (
node[k1 - 1].cells[j][1] == 0) {
515 if (
node[k1 - 1].indnodes[j] == k2) {
520 if ((k3 != 0) && (
node[k1 - 1].cells[jk2][1] == 0) && (
node[k1 - 1].cells[jk3][1] == 0))
523 if (
cell[celln - 1].node_ind[0] == k3) {
527 if (
cell[celln - 1].node_ind[1] == k3) {
531 if (
cell[celln - 1].node_ind[2] == k3) {
543 if (((
node[k2 - 1].type[j] == 10) || (
node[k2 - 1].type[j] == 12) || (
node[
node[k2 - 1].indnodes[j] - 1].typeN == 310)) && (
node[k2 - 1].indnodes[j] != k1)) {
544 for (k = 0; k < 4; k++) {
546 if (
node[k2 - 1].cells[j][1] == 0) {
555 if (
node[k2 - 1].indnodes[j] == k1) {
560 if ((k3 != 0) && (
node[k2 - 1].cells[jk1][1] == 0) && (
node[k2 - 1].cells[jk3][1] == 0))
563 if (
cell[celln - 1].node_ind[0] == k3) {
567 if (
cell[celln - 1].node_ind[1] == k3) {
571 if (
cell[celln - 1].node_ind[2] == k3) {
581 if ((notcorner + notcorner1) > 0) {
582 double vk1[2] = {0, 0}, vk2[2] = {0, 0}, vk3[2] = {0, 0}, velx, vely, angleuv;
583 double angle, eps = 0.0001, node3x = 0, node3y = 0;
591 angle_1 =
DefineAngle(vk1[0], vk1[1], vk2[0], vk2[1]);
594 if ((vk1[0]*vk2[0] < 0) && (vk1[1]*vk2[1] < 0) && (angle_1 < (
pi + eps)) && (angle_1 > (
pi - eps)) && ((
node[k1 - 1].typeN +
node[k2 - 1].typeN) == 20)) {
596 double minpressure = 1000;
600 if ((
node[
node[k1 - 1].indnodes[ni] - 1].pressure < minpressure) && (
node[k1 - 1].indnodes[ni] != k2)) {
608 angleuv =
DefineAngle(vk1[0], vk1[1], node3x, node3y);
609 velx = vk1[0] * cos(angleuv) - vk1[1] * sin(angleuv);
610 vely = vk1[0] * sin(angleuv) + vk1[1] * cos(angleuv);
614 velx = vk1[0] * cos(angleuv) + vk1[1] * sin(angleuv);
615 vely = -1 * vk1[0] * sin(angleuv) + vk1[1] * cos(angleuv);
626 if ((vk1[0]*vk2[0] < 0) && (vk1[1]*vk2[1] < 0) && ((
node[k1 - 1].typeN +
node[k2 - 1].typeN) != 20)) {
628 if (
node[k1 - 1].typeN == 12) {
632 if (
node[k2 - 1].typeN == 12) {
641 if((k1 * k2 != 0) && (kk3 != 0)) {
642 if (
node[kk3 - 1].numneighb == 2) {
659 double v[2] = {0, 0}, u[2] = {0, 0}, vk1[2] = {0, 0}, vk2[2] = {0, 0}, vk3[2] = {0, 0}, ang_uv, ang_vk1u, ang_vk1v, ang_vk1vk2, ang_vk1vk3;
675 double eps = 0.001, angle;
678 if (((ang_uv >= (
pi - eps)) && (ang_uv <= (
pi + eps))) || ((ang_uv >= (-eps)) && (ang_uv <= (+eps)))) {
682 if ((ang_uv < (
pi - eps)) && (ang_uv > eps)) {
690 ang_vk1v =
DefineAngle(vk1[0], vk1[1], v[0], v[1]);
691 ang_vk1u =
DefineAngle(vk1[0], vk1[1], u[0], u[1]);
692 ang_vk1vk2 =
DefineAngle(vk1[0], vk1[1], vk2[0], vk2[1]);
693 ang_vk1vk3 =
DefineAngle(vk1[0], vk1[1], vk3[0], vk3[1]);
695 if ((ang_vk1u > (
pi - eps)) && (ang_vk1u < (
pi + eps)) && ((ang_vk1vk2 < eps) || (ang_vk1vk2 > (
pi - eps)))) {
696 if ((
node[m1 - 1].typeN < 300) && (
node[m3 - 1].typeN < 300)) {
713 if ((ang_vk1v > (
pi - eps)) && (ang_vk1v < (
pi + eps)) && ((ang_vk1vk3 < eps) || (ang_vk1vk3 > (
pi - eps)))) {
714 if ((
node[m1 - 1].typeN < 300) && (
node[m2 - 1].typeN < 300)) {
736 if (((
node[m1 - 1].typeN == 310) || (
node[m1 - 1].typeN == 312)) && (
node[m2 - 1].typeN != 310) && (
node[m2 - 1].typeN != 312)) {
753 if (((
node[m1 - 1].typeN == 310) || (
node[m1 - 1].typeN == 312)) && (
node[m3 - 1].typeN != 310) && (
node[m3 - 1].typeN != 312)) {
809 unsigned short int sc1f = 0, sc2f = 0, j;
810 double inters_v[2] = {0.0, 0.0}, pr, bx = 0, by = 0;
811 unsigned short int s1 = 0, ss = 0, kk, edge11 = 200, edge12 = 200;
822 for (j = 0; j < k; j++) {
826 for (kk = 0; kk < 4; kk++) {
827 if (
node[i].cells[fractj[j]][kk] != 0) {
828 if (
node[i].fracts[fractj[j]][kk] == fractn) {
847 if ((
node[i].type[fractj[j]] == 2) || (
node[i].type[fractj[j]] == 12)) {
853 for (j = 0; j < k; j++) {
857 length = sqrt(bx * bx + by * by);
863 length = sqrt(bx * bx + by * by);
866 pr = bx * inters_v[1] - by * inters_v[0];
872 subcell1f[sc1f - 1] = fractj[j];
875 normxarea21[sc1f - 1][0] = -1.*(bx *
node[i].
area[fractj[j]]);
876 normxarea21[sc1f - 1][1] = -1.*(by *
node[i].
area[fractj[j]]);
880 normxarea21[sc1f - 1][0] = -1.*(bx *
node[i].
area[fractj[j]] / (length));
881 normxarea21[sc1f - 1][1] = -1.*(by *
node[i].
area[fractj[j]] / (length));
884 if ((
node[i].type[fractj[j]] != 2) && (
node[i].
type[fractj[j]] != 12)) {
889 if (
cell[
node[i].cells[fractj[j]][kk] - 1].node_ind[0] == i + 1) {
891 }
else if (
cell[
node[i].cells[fractj[j]][kk] - 1].node_ind[1] == i + 1) {
898 }
while (
node[i].cells[fractj[j]][kk] != 0);
904 subcell2f[sc2f - 1] = fractj[j];
907 normxarea22[sc2f - 1][0] = -1.*(bx *
node[i].
area[fractj[j]]);
908 normxarea22[sc2f - 1][1] = -1.*(by *
node[i].
area[fractj[j]]);
912 normxarea22[sc2f - 1][0] = -1.*(bx *
node[i].
area[fractj[j]] / (length));
913 normxarea22[sc2f - 1][1] = -1.*(by *
node[i].
area[fractj[j]] / (length));
916 if ((
node[i].type[fractj[j]] != 2) && (
node[i].
type[fractj[j]] != 12)) {
921 if (
cell[
node[i].cells[fractj[j]][kk] - 1].node_ind[0] == i + 1) {
923 }
else if (
cell[
node[i].cells[fractj[j]][kk] - 1].node_ind[1] == i + 1) {
930 }
while (
node[i].cells[fractj[j]][kk] != 0);
struct material * fracture
void HalfPolygonVelocity(int i, int k, int fractn, int indc, unsigned int fractj[max_neighb])
int YindexC(int nodenum, int ii)
double DefineAngle(double u1, double u2, double v1, double v2)
void VelocityInteriorNode(double normx_area[][2], int i, int number, unsigned int indj[max_neighb], int vi)
int XindexC(int nodenum, int ii)
int CornerVelocity(int i, int m1, int m2, int m3, int s1, int s2, int s3)
struct matr MatrixProducts(double normxarea[][2], int number)
struct lb DefineBoundaryAngle(int i, unsigned int edge_1, unsigned int edge_2, int f1, int coorf)
void VelocityExteriorNode(double norm_xarea[][2], int i, int number, unsigned int indj[max_neighb], struct lb lbound, int vi)
unsigned int veloc_ind[3]