Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Die Konto der externen Nutzer:innen sind ü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. The accounts of external users can be accessed via the "Standard" tab. The administrators

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

First try to move assembling from DimMat to dense2D taken from the very cool mtl.

parent 1a50a838
......@@ -47,6 +47,7 @@ namespace AMDiS {
class ITL_BasePreconditioner;
class LeafDataPeriodic;
class LevelAdmin;
class MacroElement;
class Marker;
class Mesh;
class OEMSolver;
......@@ -54,6 +55,7 @@ namespace AMDiS {
class ProblemInstat;
class ProblemIterationInterface;
class ProblemVec;
class Projection;
class PreconditionerScal;
class Quadrature;
class RCNeighbourList;
......
......@@ -25,12 +25,10 @@
#include "Traverse.h"
#include "Flag.h"
#include "MemoryManager.h"
#include "AMDiS_fwd.h"
namespace AMDiS {
class Mesh;
class ElInfo;
/// Parallel traversal of two meshes.
class DualTraverse
{
......@@ -56,9 +54,7 @@ namespace AMDiS {
ElInfo **elInfoSmall,
ElInfo **elInfoLarge);
/** \brief
* Get next ElInfo combination
*/
/// Get next ElInfo combination
bool traverseNext(ElInfo **elInfoNext1,
ElInfo **elInfoNext2,
ElInfo **elInfoSmall,
......
......@@ -29,22 +29,21 @@ namespace AMDiS {
neighbourCoord_(mesh_->getDim(), NO_INIT),
oppVertex_(mesh_->getDim(), NO_INIT),
grdLambda(mesh_->getDim(), NO_INIT),
subElemCoordsMat(NULL)
subElemCoordsMat(NULL),
subElemCoordsMat_mtl(2, 2)
{
projection_.set(NULL);
for (int i = 0; i < neighbourCoord_.getSize(); i++) {
for (int i = 0; i < neighbourCoord_.getSize(); i++)
neighbourCoord_[i].init(mesh_->getDim());
}
dimOfWorld = Global::getGeo(WORLD);
}
ElInfo::~ElInfo()
{
if (subElemCoordsMat) {
if (subElemCoordsMat)
DELETE subElemCoordsMat;
}
}
......
......@@ -22,21 +22,17 @@
#ifndef AMDIS_ELINFO_H
#define AMDIS_ELINFO_H
#include <boost/numeric/mtl/mtl.hpp>
#include "Flag.h"
#include "Boundary.h"
#include "Global.h"
#include "FixVec.h"
#include "Element.h"
#include "AMDiS_fwd.h"
namespace AMDiS {
class MacroElement;
class Mesh;
class Element;
class BasisFunction;
class Projection;
template<typename ReturnType, typename ArgumentType> class AbstractFunction;
/** \ingroup Traverse
* \brief
* An ElInfo object holds informations wich are not stored in the corresponding
......@@ -217,6 +213,10 @@ namespace AMDiS {
return subElemCoordsMat;
}
inline mtl::dense2D<double>& getSubElemCoordsMat_mtl4() {
return subElemCoordsMat_mtl;
}
/** \} */
/** \name setting methods
......@@ -379,10 +379,18 @@ namespace AMDiS {
virtual void getRefSimplexCoords(const BasisFunction *basisFcts,
DimMat<double> *coords) const = 0;
virtual void getRefSimplexCoords(const BasisFunction *basisFcts,
mtl::dense2D<double>& coords) const = 0;
virtual void getSubElementCoords(const BasisFunction *basisFcts,
int iChild,
DimMat<double> *coords) const = 0;
virtual void getSubElementCoords(const BasisFunction *basisFcts,
int iChild,
mtl::dense2D<double>& coords) const = 0;
protected:
/// Pointer to the current mesh
Mesh *mesh_;
......@@ -483,6 +491,8 @@ namespace AMDiS {
*/
DimMat<double> *subElemCoordsMat;
mtl::dense2D<double> subElemCoordsMat_mtl;
public:
/** \brief
* child_vertex[el_type][child][i] = father's local vertex index of new
......
......@@ -22,6 +22,8 @@
#ifndef AMDIS_ELINFO2D_H
#define AMDIS_ELINFO2D_H
#include <boost/numeric/mtl/mtl.hpp>
#include "ElInfo.h"
#include "MemoryManager.h"
......@@ -63,10 +65,18 @@ namespace AMDiS {
void getRefSimplexCoords(const BasisFunction *basisFcts,
DimMat<double> *coords) const;
void getRefSimplexCoords(const BasisFunction *basisFcts,
mtl::dense2D<double>& coords) const {}
void getSubElementCoords(const BasisFunction *basisFcts,
int iChild,
DimMat<double> *coords) const;
void getSubElementCoords(const BasisFunction *basisFcts,
int iChild,
mtl::dense2D<double>& coords) const {}
protected:
/// Temp vectors for function \ref calcGrdLambda.
WorldVector<double> *e1, *e2, *normal;
......
......@@ -22,9 +22,10 @@
#ifndef AMDIS_ELINFO3D_H
#define AMDIS_ELINFO3D_H
#include <boost/numeric/mtl/mtl.hpp>
#include "ElInfo.h"
#include "MemoryManager.h"
#include "OpenMP.h"
namespace AMDiS {
......@@ -93,10 +94,17 @@ namespace AMDiS {
void getRefSimplexCoords(const BasisFunction *basisFcts,
DimMat<double> *coords) const;
void getRefSimplexCoords(const BasisFunction *basisFcts,
mtl::dense2D<double>& coords) const {}
void getSubElementCoords(const BasisFunction *basisFcts,
int iChild,
DimMat<double> *coords) const;
void getSubElementCoords(const BasisFunction *basisFcts,
int iChild,
mtl::dense2D<double>& coords) const {}
protected:
/// \ref el 's type. Is Filled automatically by the traversal routines.
unsigned char el_type;
......
......@@ -649,7 +649,7 @@ namespace AMDiS {
default:
ERROR_EXIT("invalid dim\n");
return NULL;
};
}
}
bool Mesh::findElInfoAtPoint(const WorldVector<double>& xy,
......@@ -690,9 +690,8 @@ namespace AMDiS {
/* now, descend in tree to find leaf element at point */
bool inside = findElementAtPointRecursive(mel_info, lambda, k, el_info);
for (int i = 0; i <= dim; i++) {
bary[i] = final_lambda[i];
}
for (int i = 0; i <= dim; i++)
bary[i] = final_lambda[i];
DELETE mel_info;
......@@ -716,8 +715,6 @@ namespace AMDiS {
return val;
}
bool Mesh::findElementAtPointRecursive(ElInfo *el_info,
const DimVec<double>& lambda,
int outside,
......@@ -940,18 +937,16 @@ namespace AMDiS {
node.serialize(out);
// write admins
int i, size = static_cast<int>(admin.size());
int size = static_cast<int>(admin.size());
out.write(reinterpret_cast<const char*>(&size), sizeof(int));
for (i = 0; i < size; i++) {
for (int i = 0; i < size; i++)
admin[i]->serialize(out);
}
// write macroElements
size = static_cast<int>(macroElements.size());
out.write(reinterpret_cast<const char*>(&size), sizeof(int));
for (i = 0; i < size; i++) {
for (int i = 0; i < size; i++)
macroElements[i]->serialize(out);
}
// write elementIndex
out.write(reinterpret_cast<const char*>(&elementIndex), sizeof(int));
......@@ -1020,9 +1015,9 @@ namespace AMDiS {
in.read(reinterpret_cast<char*>(&size), sizeof(int));
admin.resize(size, NULL);
for (int i = 0; i < size; i++) {
if (!admin[i]) {
if (!admin[i])
admin[i] = NEW DOFAdmin(this);
}
admin[i]->deserialize(in);
}
......@@ -1032,10 +1027,10 @@ namespace AMDiS {
std::vector< std::vector<int> > neighbourIndices(size);
for (int i = 0; i < static_cast<int>(macroElements.size()); i++) {
if (macroElements[i]) {
if (macroElements[i])
DELETE macroElements[i];
}
}
macroElements.resize(size);
for (int i = 0; i < size; i++) {
macroElements[i] = NEW MacroElement(dim);
......@@ -1151,9 +1146,8 @@ namespace AMDiS {
result += admin[i]->getUsedSize() * sizeof(DegreeOfFreedom);
}
for (int i = 0; i < static_cast<int>(macroElements.size()); i++) {
result += macroElements[i]->calcMemoryUsage();
}
for (int i = 0; i < static_cast<int>(macroElements.size()); i++)
result += macroElements[i]->calcMemoryUsage();
return result;
}
......
......@@ -151,9 +151,8 @@ namespace AMDiS {
Projection *projector = el_info->getProjection(0);
if (!projector || projector->getType() != VOLUME_PROJECTION) {
projector = el_info->getProjection(2);
}
if (!projector || projector->getType() != VOLUME_PROJECTION)
projector = el_info->getProjection(2);
if (el->getFirstChild() && projector && (!el->isNewCoordSet())) {
WorldVector<double> *new_coord = NEW WorldVector<double>;
......@@ -229,9 +228,8 @@ namespace AMDiS {
/* if there are functions to interpolate data to the finer grid, do so */
/****************************************************************************/
int iadmin;
int nrAdmin = mesh->getNumberOfDOFAdmin();
for(iadmin = 0; iadmin < nrAdmin; iadmin++) {
for(int iadmin = 0; iadmin < nrAdmin; iadmin++) {
std::list<DOFIndexedBase*>::iterator it;
DOFAdmin* admin = const_cast<DOFAdmin*>(&mesh->getDOFAdmin(iadmin));
std::list<DOFIndexedBase*>::iterator end = admin->endDOFIndexed();
......@@ -358,15 +356,12 @@ namespace AMDiS {
{
FUNCNAME("RefinementManager2d::getRefinePatch()");
Triangle *el = dynamic_cast<Triangle*>(const_cast<Element*>( (*el_info)->getElement()));
int opp_vertex = 0;
if ((*el_info)->getNeighbour(2) && (*el_info)->getOppVertex(2) != 2) {
/****************************************************************************/
/* neighbour is not compatible devisible; refine neighbour first, store the*/
/* opp_vertex to traverse back to el */
/****************************************************************************/
opp_vertex = (*el_info)->getOppVertex(2);
int opp_vertex = (*el_info)->getOppVertex(2);
ElInfo *neigh_info = stack->traverseNeighbour2d(*el_info, 2);
neigh_info->getElement()->setMark(max(neigh_info->getElement()->getMark(), 1));
......@@ -376,7 +371,9 @@ namespace AMDiS {
/* now go back to the original element and refine the patch */
/****************************************************************************/
*el_info = neigh_info = stack->traverseNeighbour2d(neigh_info, opp_vertex);
TEST_EXIT_DBG(neigh_info->getElement() == el)("invalid traverse_neighbour1\n");
TEST_EXIT_DBG(neigh_info->getElement() ==
dynamic_cast<Triangle*>(const_cast<Element*>((*el_info)->getElement())))
("invalid traverse_neighbour1\n");
}
if (refineList->setElement(1, (*el_info)->getNeighbour(2))) {
......@@ -385,7 +382,7 @@ namespace AMDiS {
*n_neigh = 2;
}
return(0);
return 0;
}
}
......@@ -1064,9 +1064,8 @@ namespace AMDiS {
TEST_EXIT_DBG(traverse_mesh->getDim() == 3)("update only in 3d\n");
for (int i = stack_used; i > 0; i--) {
for (int i = stack_used; i > 0; i--)
dynamic_cast<ElInfo3d*>(elinfo_stack[i])->update();
}
}
void TraverseStack::getCoordsInElem(const ElInfo *upperElInfo,
......@@ -1077,11 +1076,24 @@ namespace AMDiS {
upperElInfo->getRefSimplexCoords(basisFcts, coords);
for (int i = 1; i <= levelDif; i++) {
for (int i = 1; i <= levelDif; i++)
upperElInfo->getSubElementCoords(basisFcts,
elinfo_stack[stack_used - levelDif + i]->getIChild(),
coords);
}
void TraverseStack::getCoordsInElem(const ElInfo *upperElInfo,
const BasisFunction *basisFcts,
mtl::dense2D<double>& coords)
{
int levelDif = elinfo_stack[stack_used]->getLevel() - upperElInfo->getLevel();
upperElInfo->getRefSimplexCoords(basisFcts, coords);
for (int i = 1; i <= levelDif; i++)
upperElInfo->getSubElementCoords(basisFcts,
elinfo_stack[stack_used - levelDif + i]->getIChild(),
coords);
}
}
}
......@@ -29,21 +29,20 @@
#ifndef AMDIS_TRAVERSE_H
#define AMDIS_TRAVERSE_H
#include <vector>
#include <deque>
#include <stack>
#include "Flag.h"
#include "Global.h"
#include "ElInfo.h"
#include "ElInfoStack.h"
#include "MemoryManager.h"
#include "OpenMP.h"
#include <vector>
#include <deque>
#include <stack>
#include "AMDiS_fwd.h"
namespace AMDiS {
class MacroElement;
class Mesh;
/** \ingroup Traverse
* \brief
* Mesh refinement and coarsening routines are examples of functions which
......@@ -59,9 +58,7 @@ namespace AMDiS {
public:
MEMORY_MANAGED(TraverseStack);
/** \brief
* Creates an empty TraverseStack
*/
/// Creates an empty TraverseStack
TraverseStack()
: traverse_mel(NULL),
stack_size(0),
......@@ -69,20 +66,16 @@ namespace AMDiS {
save_stack_used(0),
myThreadId_(0),
maxThreads_(1)
{
}
{}
/** \brief
* Destructor
*/
/// Destructor
~TraverseStack()
{
for (int i = 0; i < static_cast<int>(elinfo_stack.size()); i++) {
for (int i = 0; i < static_cast<int>(elinfo_stack.size()); i++)
DELETE elinfo_stack[i];
}
for (int i = 0; i < static_cast<int>(save_elinfo_stack.size()); i++) {
for (int i = 0; i < static_cast<int>(save_elinfo_stack.size()); i++)
DELETE save_elinfo_stack[i];
}
}
public:
......@@ -127,6 +120,9 @@ namespace AMDiS {
void getCoordsInElem(const ElInfo *upperElInfo, const BasisFunction *basisFcts,
DimMat<double> *coords);
void getCoordsInElem(const ElInfo *upperElInfo, const BasisFunction *basisFcts,
mtl::dense2D<double>& coords);
/// Is used for parallel mesh traverse.
inline void setMyThreadId(int myThreadId) {
myThreadId_ = myThreadId;
......
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