Ignore:
Timestamp:
Apr 10, 2012, 1:55:49 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
a40eea
Parents:
d24c2f
Message:

Merge recent changes of the vmg library into ScaFaCos.

Includes a fix for the communication problems on Jugene.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1666 5161e1c8-67bf-11de-9fd5-51895aff932f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/comm/domain_decomposition_mpi.cpp

    rd24c2f rac6d04  
    2525  GlobalIndices global_l;
    2626  Index remainder, procs;
    27   Index begin_finest, end_finest;
    2827  Index last_procs = comm->GlobalProcs();
    2928
     
    3231  for (unsigned int i=0; i<interface->Global().size(); ++i) {
    3332
    34     global_l.BeginFinest() = interface->Global()[i].BeginFinest();
    35     global_l.EndFinest() = interface->Global()[i].EndFinest();
    36     global_l.SizeFinest() = interface->Global()[i].SizeFinest();
    37     global_l.SizeGlobal() = interface->Global()[i].SizeGlobal();
    38 
     33    /*
     34     * Inherit global properties from interface
     35     */
     36    global_l.GlobalFinerBegin() = interface->Global()[i].GlobalFinerBegin();
     37    global_l.GlobalFinerEnd() = interface->Global()[i].GlobalFinerEnd();
     38    global_l.GlobalFinerSize() = interface->Global()[i].GlobalFinerSize();
     39    global_l.FinestAbsBegin() = interface->Global()[i].FinestAbsBegin();
     40    global_l.FinestAbsEnd() = interface->Global()[i].FinestAbsEnd();
     41    global_l.FinestAbsSize() = interface->Global()[i].FinestAbsSize();
     42    global_l.GlobalSize() = interface->Global()[i].GlobalSize();
    3943    global_l.BoundaryType() = interface->Global()[i].BoundaryType();
    4044
    41     if (IsActive(comm, global_l.SizeGlobal(), procs)) {
     45    if (IsActive(comm, global_l.GlobalSize(), procs)) {
    4246
    4347      if (i == 0) {
    4448
    45         global_l.SizeLocal() = global_l.SizeGlobal() / procs;
    46         remainder = global_l.SizeGlobal() % procs;
     49        global_l.LocalSize() = global_l.GlobalSize() / procs;
    4750
     51        remainder = global_l.GlobalSize() % procs;
    4852        for (int j=0; j<3; ++j)
    4953          if (comm->GlobalPos()[j] < remainder[j])
    50             ++(global_l.SizeLocal()[j]);
     54            ++(global_l.LocalSize()[j]);
    5155
    52         global_l.BeginLocal() = comm->GlobalPos() * global_l.SizeLocal();
     56        global_l.LocalBegin() = comm->GlobalPos() * global_l.LocalSize();
    5357
    5458        for (int j=0; j<3; ++j)
    5559          if (comm->GlobalPos()[j] >= remainder[j])
    56           global_l.BeginLocal()[j] += remainder[j];
     60            global_l.LocalBegin()[j] += remainder[j];
    5761
    58         global_l.EndLocal() = global_l.BeginLocal() + global_l.SizeLocal();
     62        global_l.LocalEnd() = global_l.LocalBegin() + global_l.LocalSize();
     63
     64        global_l.LocalFinerBegin() = 0;
     65        global_l.LocalFinerEnd() = 0;
     66        global_l.LocalFinerSize() = 0;
    5967
    6068      }else {
     
    6472          if (procs[j] == last_procs[j]) {
    6573
    66             begin_finest[j] = (global.back().BeginFinest() +
    67                                GridIndexTranslations::GlobalToFiner(global.back().BeginLocal(), i-1))[j];
    68             end_finest[j] = (global.back().BeginFinest() +
    69                              GridIndexTranslations::GlobalToFiner(global.back().EndLocal(), i-1))[j];
     74            if (global.back().LocalBegin()[j] == 0)
     75              global_l.LocalBegin()[j] = 0;
     76            else
     77              global_l.LocalBegin()[j] = global.back().LocalBegin()[j] / 2 + global_l.GlobalFinerBegin()[j];
    7078
    71             if (global.back().BeginLocal()[j] == 0)
    72               begin_finest[j] = global_l.BeginFinest()[j];
     79            if (global.back().LocalEnd()[j] == global.back().GlobalSize()[j])
     80              global_l.LocalEnd()[j] = global_l.GlobalSize()[j];
     81            else
     82              global_l.LocalEnd()[j] = global.back().LocalEnd()[j] / 2 + global_l.GlobalFinerBegin()[j];
    7383
    74             if (global.back().EndLocal()[j] == global.back().SizeGlobal()[j])
    75               end_finest[j] = global_l.EndFinest()[j];
    76 
    77             begin_finest[j] -= global_l.BeginFinest()[j];
    78             end_finest[j] -= global_l.BeginFinest()[j];
    79 
    80             FineToCoarse(comm, begin_finest[j], end_finest[j], i);
    81 
    82             global_l.BeginLocal()[j] = begin_finest[j];
    83             global_l.EndLocal()[j] = end_finest[j];
    84             global_l.SizeLocal()[j] = end_finest[j] - begin_finest[j];
     84            global_l.LocalSize()[j] = global_l.LocalEnd()[j] - global_l.LocalBegin()[j];
    8585
    8686          }else {
    8787
    88             global_l.SizeLocal()[j] = global_l.SizeGlobal()[j] / procs[j];
    89             remainder[j] = global_l.SizeGlobal()[j] % procs[j];
     88            global_l.LocalSize()[j] = global_l.GlobalSize()[j] / procs[j];
    9089
     90            remainder[j] = global_l.GlobalSize()[j] % procs[j];
     91            if (comm->GlobalPos()[j] < remainder[j])
     92              ++(global_l.LocalSize()[j]);
    9193
    92             if (comm->GlobalPos()[j] < remainder[j])
    93               ++(global_l.SizeLocal()[j]);
    94 
    95             global_l.BeginLocal()[j] = comm->GlobalPos()[j] * global_l.SizeLocal()[j];
    96 
     94            global_l.LocalBegin()[j] = comm->GlobalPos()[j] * global_l.LocalSize()[j];
    9795
    9896            if (comm->GlobalPos()[j] >= remainder[j])
    99               global_l.BeginLocal()[j] += remainder[j];
     97              global_l.LocalBegin()[j] += remainder[j];
    10098
    101             global_l.EndLocal()[j] = global_l.BeginLocal()[j] + global_l.SizeLocal()[j];
     99            global_l.LocalEnd()[j] = global_l.LocalBegin()[j] + global_l.LocalSize()[j];
    102100
    103101          }
    104102        }
     103
     104        global_l.LocalFinerBegin() = global_l.LocalBegin().Clamp(global_l.GlobalFinerBegin(), global_l.GlobalFinerEnd());
     105        global_l.LocalFinerEnd() = global_l.LocalEnd().Clamp(global_l.GlobalFinerBegin(), global_l.GlobalFinerEnd());
     106        global_l.LocalFinerSize() = global_l.LocalFinerEnd() - global_l.LocalFinerBegin();
     107
    105108      }
     109
    106110    }else {
    107111
    108       global_l.BeginLocal() = 0;
    109       global_l.EndLocal() = 0;
    110       global_l.SizeLocal() = 0;
     112      global_l.LocalBegin() = 0;
     113      global_l.LocalEnd() = 0;
     114      global_l.LocalSize() = 0;
     115      global_l.LocalFinerBegin() = 0;
     116      global_l.LocalFinerEnd() = 0;
     117      global_l.LocalFinerSize() = 0;
    111118
    112119    }
Note: See TracChangeset for help on using the changeset viewer.