Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Ein Anmelden über dieses erzeugt ein neues Konto. Das alte Konto ist über den Reiter "Standard" erreichbar. Die Administratoren

Dear Gitlab user, it is now possible to log in to our service using the ZIH login/LDAP. Logging in via this will create a new account. The old account can be accessed via the "Standard" tab. The administrators

Commit e8983bcb authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

Work on FETI-DP, Initfile parses changes due to exception throw problem when debugging.

parent f582eb49
......@@ -47,7 +47,7 @@ namespace AMDiS {
if (string(argv[0]) != "ddt")
Parameters::init(string(argv[1]));
else
Parameters::init(string(argv[2]));
Parameters::init(string(argv[1]));
Parameters::readArgv(argc, argv);
}
......
......@@ -149,7 +149,8 @@ namespace AMDiS {
posVarBegin = posVar;
}
std::string varName = inputSwap.substr(posVarBegin + 1 , posVarEnd - posVarBegin - 1);
std::string varParam = checkedGet(varName);
std::string varParam = "";
int error_code = checkedGet(varName, varParam);
// if varname is found in parameter list then replace variable by value
// otherwise throw tagNotFound exception
std::string replaceName = inputSwap.substr(posVar , posVarEnd - posVar + (posVarBegin - posVar));
......
......@@ -58,6 +58,12 @@ namespace AMDiS {
{}
};
struct GetTagError : std::runtime_error {
GetTagError(std::string m)
: std::runtime_error(m)
{}
};
template<typename T>
struct WrongValueFormat : std::runtime_error {
static std::string name(int)
......@@ -384,6 +390,8 @@ namespace AMDiS {
{
typedef std::map< std::string, std::string > super;
static const int TAG_NOT_FOUND = 1;
static const int TAG_NOT_FOUND_BREAK = 2;
/// Exceptions
struct TagNotFound : std::invalid_argument {
......@@ -409,8 +417,9 @@ namespace AMDiS {
static void init(int print, string filename, const char *flags = NULL)
{
ERROR_EXIT("Parameters::init(int,std::string,const char*) is depreciated. "
"Use Parameters::init(std::string) instead!\n");
WARNING("Parameters::init(int,std::string,const char*) is depreciated. "
"Use Parameters::init(std::string) instead!\n");
init(filename);
}
......@@ -430,17 +439,19 @@ namespace AMDiS {
if (debugInfo == -1)
debugInfo = singlett->getMsgInfo();
try {
std::string valStr(singlett->checkedGet(tag));
valStr = trim(valStr);
convert(valStr, value);
if (debugInfo == 2) {
std::cout << "Parameter '" << tag << "'"
<< " initialized with: " << value << std::endl;
}
} catch (TagNotFound ia) {
if (debugInfo >= 1)
std::cout << ia.what() << std::endl;
std::string valStr;
int error_code = singlett->checkedGet(tag, valStr);
if (error_code == 0) {
valStr = trim(valStr);
convert(valStr, value);
} else if(error_code == TAG_NOT_FOUND_BREAK)
throw TagNotFoundBreak("required tag '" + tag + "' not found");
else if (error_code == TAG_NOT_FOUND && debugInfo == 2)
std::cout << "there is no tag '" + tag + "'" << std::endl;
if (debugInfo == 2) {
std::cout << "Parameter '" << tag << "'"
<< " initialized with: " << value << std::endl;
}
}
......@@ -449,16 +460,19 @@ namespace AMDiS {
static InitEntry get(const std::string tag)
{
using namespace InitfileInternal;
int debugInfo = singlett->getMsgInfo();
singlett->getMsgInfo();
InitEntry result;
try {
std::string valStr(singlett->checkedGet(tag));
valStr = trim(valStr);
result = InitEntry(valStr);
} catch (TagNotFound ia) {
if (debugInfo >= 1)
std::cout << ia.what() << std::endl;
}
std::string valStr;
int error_code = singlett->checkedGet(tag, valStr);
if (error_code == 0) {
valStr = trim(valStr);
result = InitEntry(valStr);
} else if(error_code == TAG_NOT_FOUND_BREAK)
throw TagNotFoundBreak("required tag '" + tag + "' not found");
else if (error_code == TAG_NOT_FOUND)
throw TagNotFound("there is no tag '" + tag + "'"); // exception must be thrown, because an empty object would be return otherwise
return result;
}
......@@ -568,16 +582,18 @@ protected:
/// return the value of the given tag or throws an exception if the tag
/// does not exist
std::string checkedGet(const std::string& tag) const
int checkedGet(const std::string& tag, std::string &valStr) const
{
super::const_iterator it = find(tag);
if (it == end()) {
if (breakOnMissingTag == 0 || msgInfo <= 2)
throw TagNotFound("there is no tag '" + tag + "'");
return TAG_NOT_FOUND;
else
throw TagNotFoundBreak("required tag '" + tag + "' not found");
return TAG_NOT_FOUND_BREAK;
}
return it->second;
valStr = it->second;
return 0;
}
/// replace variables by its value defined as parameter previousely
......
......@@ -168,6 +168,8 @@ namespace AMDiS {
macroElIndexTypeMap[(*it)->getIndex()] = (*it)->getElType();
}
createBoundaryDofs();
#if (DEBUG != 0)
ParallelDebug::writeDebugFile(*this, debugOutputDir + "mpi-dbg", "dat");
#endif
......
......@@ -13,6 +13,7 @@
#include "parallel/PetscSolverFeti.h"
#include "parallel/StdMpi.h"
#include "parallel/MpiHelper.h"
#include "io/VtkWriter.h"
namespace AMDiS {
......@@ -203,10 +204,13 @@ namespace AMDiS {
string preconditionerName = "";
Parameters::get("parallel->solver->precon", preconditionerName);
if (preconditionerName == "" || preconditionerName == "none") {
MSG("Create FETI-DP solver with no preconditioner!\n");
fetiPreconditioner = FETI_NONE;
} else if (preconditionerName == "dirichlet") {
MSG("Create FETI-DP solver with Dirichlet preconditioner!\n");
fetiPreconditioner = FETI_DIRICHLET;
} else if (preconditionerName == "lumped") {
MSG("Create FETI-DP solver with lumped preconditioner!\n");
fetiPreconditioner = FETI_LUMPED;
} else {
ERROR_EXIT("Preconditioner \"%s\" not available!\n",
......@@ -244,7 +248,9 @@ namespace AMDiS {
// === Define all vertices on the interior boundaries of the macro mesh ===
// === to be primal variables. ===
primals.clear();
/// Set of DOF indices that are considered to be primal variables.
DofIndexSet primals;
DofContainerSet& vertices =
meshDistributor->getBoundaryDofInfo().geoDofs[VERTEX];
TEST_EXIT_DBG(vertices.size())("No primal vertices on this rank!\n");
......@@ -329,10 +335,6 @@ namespace AMDiS {
TEST_EXIT_DBG(primals.size() == globalPrimalIndex.size())
("Number of primals %d, but number of global primals on this rank is %d!\n",
primals.size(), globalPrimalIndex.size());
TEST_EXIT_DBG(nOverallPrimals > 0)
("There are zero primal nodes in domain!\n");
}
......@@ -351,7 +353,7 @@ namespace AMDiS {
for (DofContainer::iterator dofIt = it->second.begin();
dofIt != it->second.end(); ++dofIt) {
// If DOF is not primal, i.e., its a dual node
if (primals.count(**dofIt) == 0) {
if (globalPrimalIndex.count(**dofIt) == 0) {
boundaryDofRanks[**dofIt].insert(mpiRank);
boundaryDofRanks[**dofIt].insert(it->first);
}
......@@ -367,7 +369,7 @@ namespace AMDiS {
it != sendDofs.end(); ++it)
for (DofContainer::iterator dofIt = it->second.begin();
dofIt != it->second.end(); ++dofIt)
if (primals.count(**dofIt) == 0)
if (globalPrimalIndex.count(**dofIt) == 0)
stdMpi.getSendData(it->first).push_back(boundaryDofRanks[**dofIt]);
stdMpi.updateSendDataSize();
......@@ -378,7 +380,7 @@ namespace AMDiS {
bool recvFromRank = false;
for (DofContainer::iterator dofIt = it->second.begin();
dofIt != it->second.end(); ++dofIt)
if (primals.count(**dofIt) == 0) {
if (globalPrimalIndex.count(**dofIt) == 0) {
recvFromRank = true;
break;
}
......@@ -393,7 +395,7 @@ namespace AMDiS {
int i = 0;
for (DofContainer::iterator dofIt = it->second.begin();
dofIt != it->second.end(); ++dofIt)
if (primals.count(**dofIt) == 0)
if (globalPrimalIndex.count(**dofIt) == 0)
boundaryDofRanks[**dofIt] = stdMpi.getRecvData(it->first)[i++];
}
......@@ -404,7 +406,7 @@ namespace AMDiS {
globalDualIndex.clear();
int nRankAllDofs = meshDistributor->getFeSpace()->getAdmin()->getUsedDofs();
nRankB = nRankAllDofs - primals.size();
nRankB = nRankAllDofs - globalPrimalIndex.size();
nOverallB = 0;
rStartB = 0;
mpi::getDofNumbering(meshDistributor->getMpiComm(),
......@@ -416,7 +418,7 @@ namespace AMDiS {
int nRankDuals = 0;
for (DofContainer::iterator it = allBoundaryDofs.begin();
it != allBoundaryDofs.end(); ++it) {
if (primals.count(**it) == 0) {
if (globalPrimalIndex.count(**it) == 0) {
duals.insert(**it);
globalDualIndex[**it] = rStartB + nRankInteriorDofs + nRankDuals;
nRankDuals++;
......@@ -473,7 +475,7 @@ namespace AMDiS {
it != sendDofs.end(); ++it)
for (DofContainer::iterator dofIt = it->second.begin();
dofIt != it->second.end(); ++dofIt) {
if (primals.count(**dofIt) == 0) {
if (globalPrimalIndex.count(**dofIt) == 0) {
TEST_EXIT_DBG(dofFirstLagrange.count(**dofIt))("Should not happen!\n");
stdMpi.getSendData(it->first).push_back(dofFirstLagrange[**dofIt]);
}
......@@ -486,7 +488,7 @@ namespace AMDiS {
bool recvData = false;
for (DofContainer::iterator dofIt = it->second.begin();
dofIt != it->second.end(); ++dofIt)
if (primals.count(**dofIt) == 0) {
if (globalPrimalIndex.count(**dofIt) == 0) {
recvData = true;
break;
}
......@@ -501,7 +503,7 @@ namespace AMDiS {
it != recvDofs.end(); ++it) {
int counter = 0;
for (unsigned int i = 0; i < it->second.size(); i++)
if (primals.count(*(it->second[i])) == 0)
if (globalPrimalIndex.count(*(it->second[i])) == 0)
dofFirstLagrange[*(it->second[i])] = stdMpi.getRecvData(it->first)[counter++];
}
}
......@@ -519,8 +521,8 @@ namespace AMDiS {
// === without defining a correct index. ===
for (int i = 0; i < admin->getUsedSize(); i++)
if (admin->isDofFree(i) == false && primals.count(i) == 0)
if (duals.count(i) == 0 && primals.count(i) == 0)
if (admin->isDofFree(i) == false && globalPrimalIndex.count(i) == 0)
if (duals.count(i) == 0 && globalPrimalIndex.count(i) == 0)
localIndexB[i] = -1;
......@@ -534,7 +536,7 @@ namespace AMDiS {
}
nLocalDuals = duals.size();
TEST_EXIT_DBG(nLocalInterior + primals.size() + duals.size() ==
TEST_EXIT_DBG(nLocalInterior + globalPrimalIndex.size() + duals.size() ==
static_cast<unsigned int>(admin->getUsedDofs()))
("Should not happen!\n");
......@@ -610,6 +612,8 @@ namespace AMDiS {
FUNCNAME("PetscSolverFeti::createSchurPrimal()");
if (schurPrimalSolver == 0) {
MSG("Create iterative schur primal solver!\n");
schurPrimalData.mat_primal_primal = &mat_primal_primal;
schurPrimalData.mat_primal_b = &mat_primal_b;
schurPrimalData.mat_b_primal = &mat_b_primal;
......@@ -635,6 +639,8 @@ namespace AMDiS {
KSPSetOptionsPrefix(ksp_schur_primal, "solver_sp_");
KSPSetFromOptions(ksp_schur_primal);
} else {
MSG("Create direct schur primal solver!\n");
TEST_EXIT(ksp_b)("No solver object for local problem!\n");
double wtime = MPI::Wtime();
......@@ -832,6 +838,8 @@ namespace AMDiS {
PCShellSetContext(precon_feti, static_cast<void*>(&fetiLumpedPreconData));
PCShellSetApply(precon_feti, petscApplyFetiLumpedPrecon);
break;
default:
break;
}
}
......@@ -884,6 +892,8 @@ namespace AMDiS {
VecDestroy(&fetiLumpedPreconData.tmp_vec_duals0);
VecDestroy(&fetiLumpedPreconData.tmp_vec_duals1);
break;
default:
break;
}
}
......@@ -894,6 +904,12 @@ namespace AMDiS {
{
FUNCNAME("PetscSolverFeti::recoverSolution()");
PetscScalar *ttt;
VecGetArray(vec_sol_primal, &ttt);
for (int i = 0; i < nRankPrimals; i++)
MSG("PRIM VAL = %f\n", ttt[i * 3 + 1]);
VecRestoreArray(vec_sol_primal, &ttt);
// === Get local part of the solution for B variables. ===
PetscScalar *localSolB;
......@@ -912,6 +928,8 @@ namespace AMDiS {
for (DofMapping::iterator it = globalPrimalIndex.begin();
it != globalPrimalIndex.end(); ++it) {
for (int i = 0; i < nComponents; i++) {
MSG("COPY GLOBAL PRIM %d of COMP %d TO LOCAL TMP %d\n",
it->second, i, counter);
globalIsIndex.push_back(it->second * nComponents + i);
localIsIndex.push_back(counter++);
}
......@@ -948,6 +966,9 @@ namespace AMDiS {
PetscScalar *localSolPrimal;
VecGetArray(local_sol_primal, &localSolPrimal);
for (int i = 0; i < globalPrimalIndex.size(); i++)
MSG("TEST VAL %f\n", localSolPrimal[i * 3 + 1]);
// === And copy from PETSc local vectors to the DOF vectors. ===
......@@ -963,12 +984,16 @@ namespace AMDiS {
int counter = 0;
for (DofMapping::iterator it = globalPrimalIndex.begin();
it != globalPrimalIndex.end(); ++it) {
if (i == 1)
MSG("AND SET THE VAL OF DOF %d TO VAL %f\n",
it->first,
localSolPrimal[counter * nComponents + i]);
dofVec[it->first] = localSolPrimal[counter * nComponents + i];
counter++;
}
}
MSG("VAL BOUNDS: %f %f\n", vec.getDOFVector(1)->min(), vec.getDOFVector(1)->max());
VecRestoreArray(vec_sol_b, &localSolB);
VecRestoreArray(local_sol_primal, &localSolPrimal);
......@@ -1076,7 +1101,7 @@ namespace AMDiS {
for (cursor_type cursor = begin<row>((*mat)[i][j]->getBaseMatrix()),
cend = end<row>((*mat)[i][j]->getBaseMatrix()); cursor != cend; ++cursor) {
bool rowPrimal = primals.count(*cursor) != 0;
bool rowPrimal = globalPrimalIndex.count(*cursor) != 0;
cols.clear();
colsOther.clear();
......@@ -1093,7 +1118,7 @@ namespace AMDiS {
for (icursor_type icursor = begin<nz>(cursor), icend = end<nz>(cursor);
icursor != icend; ++icursor) {
bool colPrimal = primals.count(col(*icursor)) != 0;
bool colPrimal = globalPrimalIndex.count(col(*icursor)) != 0;
if (colPrimal) {
// Column is a primal variable.
......@@ -1242,6 +1267,8 @@ namespace AMDiS {
}
}
break;
default:
break;
}
}
}
......@@ -1323,7 +1350,7 @@ namespace AMDiS {
DOFVector<double>::Iterator dofIt(vec->getDOFVector(i), USED_DOFS);
for (dofIt.reset(); !dofIt.end(); ++dofIt) {
int index = dofIt.getDOFIndex();
if (primals.count(index)) {
if (globalPrimalIndex.count(index)) {
TEST_EXIT_DBG(globalPrimalIndex.count(index))
("Should not happen!\n");
......@@ -1520,7 +1547,9 @@ namespace AMDiS {
solveReducedFetiMatrix(vec);
// printStatistics();
VtkWriter::writeFile(&vec, "test-before.vtu");
MeshDistributor::globalMeshDistributor->synchVector(vec);
VtkWriter::writeFile(&vec, "test-after.vtu");
}
......
......@@ -255,9 +255,6 @@ namespace AMDiS {
/// Number of components in the PDE to be solved.
int nComponents;
/// Set of DOF indices that are considered to be primal variables.
DofIndexSet primals;
/// Mapping from primal DOF indices to a global index of primals.
DofMapping globalPrimalIndex;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment