109 OOFEM_ERROR(
"Matrix gridCoords passed to Grid :: setZeroValues should have 2 columns.");
112 for (
int ival = 1; ival <= nValues; ival++ ) {
114 double CPx = gridCoords->
at(ival, 1);
115 double CPy = gridCoords->
at(ival, 2);
117 double j = ( int ) ceil(CPx - 0.5);
120 }
else if ( j >
n ) {
123 double i = ( int ) ceil(CPy - 0.5);
126 }
else if ( i >
m ) {
130 int CPInd =
ij2ind((
int)i, (
int)j, (
int)
m);
133 double Fij =
F.at((
size_t)i, (
size_t)j);
134 T.at((
size_t)i, (
size_t)j) = sqrt( ( i - CPy ) * ( i - CPy ) + ( j - CPx ) * ( j - CPx ) ) / Fij;
141 for (
int neigh = 0; neigh < 4; neigh++ ) {
142 int ni = (int)(i +
iOffsets [ neigh ]);
143 int nj = (int)(j +
jOffsets [ neigh ]);
148 time = sqrt( ( ni - CPy ) * ( ni - CPy ) + ( nj - CPx ) * ( nj - CPx ) ) / ( 0.5 * ( Fij +
F.at(ni, nj) ) );
150 time = sqrt( ( ni - CPy ) * ( ni - CPy ) + ( nj - CPx ) * ( nj - CPx ) ) /
F.at(ni, nj);
153 T.at(ni, nj) = std::min( time,
T.at(ni, nj) );
161 for (
int neigh = 0; neigh < 8; neigh++ ) {
168 time = sqrt( ( ni - CPy ) * ( ni - CPy ) + ( nj - CPx ) * ( nj - CPx ) ) / ( 0.5 * ( Fij +
F.at(ni, nj) ) );
170 time = sqrt( ( ni - CPy ) * ( ni - CPy ) + ( nj - CPx ) * ( nj - CPx ) ) /
F.at(ni, nj);
177 T.at(ni, nj) = std::min( time,
T.at(ni, nj) );
297Grid :: calcTime(
int i,
int j,
double Fij,
int ord,
int &eFlag)
304 double Inf = std::numeric_limits<float>::infinity();
310 double CrossVals [ 8 ];
319 double xmin1 = 0., xmin2, ymin1 = 0., ymin2;
322 for (
int iter = 0; iter < 8; iter++ ) {
327 CrossVals [ iter ] =
T.at(ni, nj);
329 CrossVals [ iter ] = Inf;
334 if ( ( CrossVals [ 1 ] == Inf ) && ( CrossVals [ 2 ] == Inf ) &&
335 ( CrossVals [ 5 ] == Inf ) && ( CrossVals [ 6 ] == Inf ) ) {
351 if ( !( ( CrossVals [ 1 ] == Inf ) && ( CrossVals [ 2 ] == Inf ) ) ) {
352 ymin1 = std::min(CrossVals [ 1 ], CrossVals [ 2 ]);
358 if ( CrossVals [ 1 ] < CrossVals [ 2 ] ) {
370 if ( !( ( CrossVals [ 5 ] == Inf ) && ( CrossVals [ 6 ] == Inf ) ) ) {
371 xmin1 = std::min(CrossVals [ 5 ], CrossVals [ 6 ]);
377 if ( CrossVals [ 5 ] < CrossVals [ 6 ] ) {
393 if ( !( ( CrossVals [ 1 ] == Inf ) && ( CrossVals [ 2 ] == Inf ) ) ) {
394 if ( CrossVals [ 1 ] < CrossVals [ 2 ] ) {
395 ymin1 = CrossVals [ 1 ];
401 if ( CrossVals [ 0 ] <= CrossVals [ 1 ] ) {
402 ymin2 = CrossVals [ 0 ];
404 b += -6. * ymin1 + 1.5 * ymin2;
405 c += 4.0 * ymin1 * ymin1 + 0.25 * ymin2 * ymin2 - 2.0 * ymin1 * ymin2;
412 ymin1 = CrossVals [ 2 ];
418 if ( CrossVals [ 3 ] <= CrossVals [ 2 ] ) {
419 ymin2 = CrossVals [ 3 ];
421 b += -6. * ymin1 + 1.5 * ymin2;
422 c += 4.0 * ymin1 * ymin1 + 0.25 * ymin2 * ymin2 - 2.0 * ymin1 * ymin2;
431 if ( !( ( CrossVals [ 5 ] == Inf ) && ( CrossVals [ 6 ] == Inf ) ) ) {
432 if ( CrossVals [ 5 ] < CrossVals [ 6 ] ) {
433 xmin1 = CrossVals [ 5 ];
439 if ( CrossVals [ 4 ] <= CrossVals [ 5 ] ) {
440 xmin2 = CrossVals [ 4 ];
442 b += -6. * xmin1 + 1.5 * xmin2;
443 c += 4.0 * xmin1 * xmin1 + 0.25 * xmin2 * xmin2 - 2.0 * xmin1 * xmin2;
450 xmin1 = CrossVals [ 6 ];
456 if ( CrossVals [ 7 ] <= CrossVals [ 6 ] ) {
457 xmin2 = CrossVals [ 7 ];
459 b += -6. * xmin1 + 1.5 * xmin2;
460 c += 4.0 * xmin1 * xmin1 + 0.25 * xmin2 * xmin2 - 2.0 * xmin1 * xmin2;
474 }
else if ( Fx >= 0. && Fy >= 0. ) {
475 Faver = 0.5 * Fij + 0.25 * ( Fx + Fy );
476 }
else if ( Fx >= 0. ) {
477 Faver = 0.5 * ( Fij + Fx );
478 }
else if ( Fy >= 0. ) {
479 Faver = 0.5 * ( Fij + Fy );
484 c -= 1. / ( Faver * Faver );
487 double d = ( b * b ) - ( 4.0 * a * c );
490 if ( ( d < 0.0 ) && ( ord == 2 ) ) {
492 time =
calcTime(i, j, Fij, 1, tmpFlag);
493 eFlag = std::max(1, tmpFlag);
494 }
else if ( ( d < 0.0 ) && ( ord == 1 ) ) {
495 if ( ( CrossVals [ 1 ] == Inf ) && ( CrossVals [ 2 ] == Inf ) ) {
498 if ( ( CrossVals [ 5 ] == Inf ) && ( CrossVals [ 6 ] == Inf ) ) {
503 time = std::min(xmin1, ymin1) + 1.0 / Fij;
506 time = ( -b + sqrt(d) ) / ( 2.0 * a );
double calcTime(int i, int j, double Fij, int ord, int &eFlag)
Auxiliary function that evaluates the tentative value at one grid point, exploited by the fast marchi...