Commit 96502fb2 authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

ehm, was habe ich gemacht?

parent 603155d0
...@@ -389,16 +389,148 @@ namespace AMDiS { ...@@ -389,16 +389,148 @@ namespace AMDiS {
std::vector<DOFAdmin*>::iterator dai = std::find(admin.begin(),admin.end(),localAdmin); std::vector<DOFAdmin*>::iterator dai = std::find(admin.begin(),admin.end(),localAdmin);
if (dai!= admin.end()) { TEST_EXIT(dai == admin.end())
ERROR("admin %s is already associated to mesh %s\n", ("admin %s is already associated to mesh %s\n",
localAdmin->getName().c_str(), this->getName().c_str()); localAdmin->getName().c_str(), this->getName().c_str());
}
// ===== adding dofs to already existing elements ============================ // ===== adding dofs to already existing elements ============================
// If adding DOFAdmins to already initilized meshes is required, see older TEST_EXIT(!initialized)("Adding DOFAdmins to initilized meshes does not work yet!\n");
// AMDiS version (revision < 244) at the same code position.
TEST_EXIT(!initialized)("Adding DOFAdmins to initilized meshes does not work!\n"); if (initialized) {
static bool pnd_1d_0[2] = {true, true};
static bool pnd_1d_1[1] = {false};
static bool pnd_2d_0[3] = {true, true, true};
static bool pnd_2d_1[3] = {true, true, false};
static bool pnd_2d_2[1] = {false};
static bool pnd_3d_0[4] = {true, true, true, true};
static bool pnd_3d_1[6] = {false, true, true, true, true, true};
static bool pnd_3d_2[4] = {true, true, false, false};
static bool pnd_3d_3[1] = {false};
static bool *pnd_1d[2] = {pnd_1d_0, pnd_1d_1};
static bool *pnd_2d[3] = {pnd_2d_0, pnd_2d_1, pnd_2d_2};
static bool *pnd_3d[4] = {pnd_3d_0, pnd_3d_1, pnd_3d_2, pnd_3d_3};
static bool **parentNeedsDOF[4] = {NULL, pnd_1d, pnd_2d, pnd_3d};
std::list<struct delmem> delList;
std::map< std::set<DegreeOfFreedom>, DegreeOfFreedom*> dofPtrMap;
const DOFAdmin *vertexAdmin = getVertexAdmin();
int vertexAdminPreDOFs = vertexAdmin->getNumberOfPreDOFs(VERTEX);
// finding necessary node number for new admin
int newNNode = 0;
GeoIndex geoIndex;
for (int d = 0; d < dim + 1; d++) {
geoIndex = INDEX_OF_DIM(d, dim);
if (localAdmin->getNumberOfDOFs(geoIndex)>0||nDOF[geoIndex]>0)
newNNode+=getGeo(geoIndex);
}
bool extendNodes = (newNNode>nNodeEl);
nNodeEl = newNNode;
TraverseStack stack;
ElInfo *elInfo = NULL;
elInfo = stack.traverseFirst(this, -1, CALL_EVERY_EL_PREORDER);
while(elInfo) {
Element *element = elInfo->getElement();
DegreeOfFreedom *newDOF, **oldDOF, **dof =
const_cast<DegreeOfFreedom**>(element->getDOF());
int index = 0;
if (extendNodes) {
oldDOF=dof;
element->setDOFPtrs();
dof=const_cast<DegreeOfFreedom**>(element->getDOF());
int index=0,oldIndex=0;
for (int d = 0; d < dim+1; d++) {
geoIndex = INDEX_OF_DIM(d, dim);
if (nDOF[geoIndex]>0) {
for(int i=0;i<getGeo(geoIndex);++i)
dof[index++]=oldDOF[oldIndex++];
}
else {
if (localAdmin->getNumberOfDOFs(geoIndex)>0)
index+=getGeo(geoIndex);
}
}
FREE_MEMORY(oldDOF, DegreeOfFreedom*, oldNNodes);
TEST_EXIT_DBG(index == nNodeEl)("ERROR: Number of entered nodes %f != number of nodes %f\n",index,nNodeEl);
}
index=0;
// allocate new memory at elements
for(int d = 0; d < dim+1; d++) {
geoIndex = INDEX_OF_DIM(d, dim);
int numberOfDOFs = localAdmin->getNumberOfDOFs(geoIndex);
int numberOfPreDOFs = nDOF[geoIndex];
if (numberOfDOFs>0||numberOfPreDOFs>0) {
// for all vertices/edges/...
for(int i = 0; i < getGeo(geoIndex); i++, index++) {
std::set<DegreeOfFreedom> dofSet;
for(int j = 0; j < d+1; j++) {
dofSet.insert(dof[element->getVertexOfPosition(geoIndex, i, j)][vertexAdminPreDOFs]);
}
if(element->isLeaf() || parentNeedsDOF[dim][d][i]) {
if(dofPtrMap[dofSet] == NULL) {
if(localAdmin->getNumberOfDOFs(geoIndex)) {
newDOF = GET_MEMORY(DegreeOfFreedom, numberOfPreDOFs + numberOfDOFs);
// copy old dofs to new memory and free old memory
if(dof[index]) {
for(int j = 0; j < numberOfPreDOFs; j++) {
newDOF[j] = dof[index][j];
}
// FREE_MEMORY(dof[index], DegreeOfFreedom, numberOfPreDOFs);
// Do not free memory. The information has to be used to identify the part in other elements.
// The memory is only marked for freeing.
struct delmem fm;
fm.ptr=dof[index];
fm.len=numberOfPreDOFs;
delList.push_back(fm);
}
for(int j = 0; j < numberOfDOFs; j++) {
newDOF[numberOfPreDOFs + j] = localAdmin->getDOFIndex();
}
dof[index] = newDOF;
}
dofPtrMap[dofSet] = dof[index];
} else {
dof[index] = dofPtrMap[dofSet];
}
}
}
}
}
elInfo = stack.traverseNext(elInfo);
}
// now free the old dof memory:
std::list<struct delmem>::iterator it=delList.begin();
while(it!=delList.end()) {
FREE_MEMORY((*it).ptr, DegreeOfFreedom, (*it).len);
it++;
}
delList.clear();
}
admin.push_back(localAdmin); admin.push_back(localAdmin);
...@@ -540,14 +672,14 @@ namespace AMDiS { ...@@ -540,14 +672,14 @@ namespace AMDiS {
} }
const DOFAdmin *Mesh::createDOFAdmin(const std::string& lname,DimVec<int> lnDOF) const DOFAdmin *Mesh::createDOFAdmin(const std::string& lname, DimVec<int> lnDOF)
{ {
FUNCNAME("Mesh::createDOFAdmin()"); FUNCNAME("Mesh::createDOFAdmin()");
DOFAdmin *localAdmin = new DOFAdmin(this, lname); DOFAdmin *localAdmin = new DOFAdmin(this, lname);
for (int i = 0; i < dim+1; i++) for (int i = 0; i < dim + 1; i++)
localAdmin->setNumberOfDOFs(i,lnDOF[i]); localAdmin->setNumberOfDOFs(i, lnDOF[i]);
addDOFAdmin(localAdmin); addDOFAdmin(localAdmin);
......
...@@ -38,7 +38,7 @@ namespace AMDiS { ...@@ -38,7 +38,7 @@ namespace AMDiS {
WARNING("meshes already created\n"); WARNING("meshes already created\n");
} else { } else {
if (initFlag.isSet(CREATE_MESH) || if (initFlag.isSet(CREATE_MESH) ||
((!adoptFlag.isSet(INIT_MESH))&& (!adoptFlag.isSet(INIT_MESH) &&
(initFlag.isSet(INIT_SYSTEM) || initFlag.isSet(INIT_FE_SPACE)))) { (initFlag.isSet(INIT_SYSTEM) || initFlag.isSet(INIT_FE_SPACE)))) {
createMesh(); createMesh();
} }
...@@ -72,7 +72,7 @@ namespace AMDiS { ...@@ -72,7 +72,7 @@ namespace AMDiS {
WARNING("feSpaces already created\n"); WARNING("feSpaces already created\n");
} else { } else {
if (initFlag.isSet(INIT_FE_SPACE) || if (initFlag.isSet(INIT_FE_SPACE) ||
(initFlag.isSet(INIT_SYSTEM)&&!adoptFlag.isSet(INIT_FE_SPACE))) { (initFlag.isSet(INIT_SYSTEM) && !adoptFlag.isSet(INIT_FE_SPACE))) {
createFESpace(); createFESpace();
} }
if (adoptProblem && if (adoptProblem &&
...@@ -87,9 +87,8 @@ namespace AMDiS { ...@@ -87,9 +87,8 @@ namespace AMDiS {
TEST_EXIT(feSpaces.size() == 1)("Daran muss ich noch arbeiten!\n"); TEST_EXIT(feSpaces.size() == 1)("Daran muss ich noch arbeiten!\n");
componentSpaces.resize(nComponents); componentSpaces.resize(nComponents);
for (int i = adoptProblem->getNumComponents(); i < nComponents; i++) { for (int i = adoptProblem->getNumComponents(); i < nComponents; i++)
componentSpaces[i] = componentSpaces[0]; componentSpaces[i] = componentSpaces[0];
}
} }
} }
...@@ -125,27 +124,21 @@ namespace AMDiS { ...@@ -125,27 +124,21 @@ namespace AMDiS {
WARNING("no solver created\n"); WARNING("no solver created\n");
// === create estimator === // === create estimator ===
if (initFlag.isSet(INIT_ESTIMATOR)) { if (initFlag.isSet(INIT_ESTIMATOR))
createEstimator(); createEstimator();
}
if (adoptProblem && adoptFlag.isSet(INIT_ESTIMATOR)) { if (adoptProblem && adoptFlag.isSet(INIT_ESTIMATOR))
estimator = adoptProblem->getEstimator(); estimator = adoptProblem->getEstimator();
}
// === create marker === // === create marker ===
if (initFlag.isSet(INIT_MARKER)) { if (initFlag.isSet(INIT_MARKER))
createMarker(); createMarker();
} if (adoptProblem && adoptFlag.isSet(INIT_MARKER))
if (adoptProblem && adoptFlag.isSet(INIT_MARKER)) {
marker = adoptProblem->getMarker(); marker = adoptProblem->getMarker();
}
// === create file writer === // === create file writer ===
if (initFlag.isSet(INIT_FILEWRITER)) { if (initFlag.isSet(INIT_FILEWRITER))
createFileWriter(); createFileWriter();
}
// === read serialization and init mesh === // === read serialization and init mesh ===
......
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