/*
 $Id: family.cc,v 1.2 1996/11/20 09:57:23 roitzsch Exp $
 (C)opyright 1996 by Konrad-Zuse-Center, Berlin
 All rights reserved.
 Part of the Kaskade distribution
*/

#include "family.h"
#include "familyA.h"

//-------------------------------------------------------------------------

void FamilyTree:: notImplemented(const char* name) const
{
    cout << "\n*** class FamilyTree: function " << name 
         << " not implemented\n";
    cout.flush(); abort();
}
//-------------------------------------------------------------------------
    
FamilyTree:: ~FamilyTree()
{
    int i;
    FORALL(generation,i) delete generation[i];
}
//-------------------------------------------------------------------------

void FamilyTree:: setGeneration(Generation* gen) { generation.push(gen); }

Generation* FamilyTree:: getGeneration(int level) { return generation[level]; }

void FamilyTree:: extendGeneration(int level, int noOfNodes)
    					{ generation[level]->extend(noOfNodes); }
//-------------------------------------------------------------------------

void FamilyTree:: newPointSon(int node, int father, int depth) 
{ 
    PointSon* son = new PointSon;
    son->father = father;
    generation[depth]->insertSon(node, son); 
}
//-------------------------------------------------------------------------

void FamilyTree:: newEdgeSon(int node, int father1, int father2, int depth) 
{ 
    EdgeSon* son = new EdgeSon;
    son->father1 = father1;
    son->father2 = father2;
    generation[depth]->insertSon(node, son); 
}
//-------------------------------------------------------------------------

void FamilyTree:: prolong(const Vector<Num>& el, Vector<Num>& eh, int highLevel)
			     						   const
{ 
    generation[highLevel]->prolong(el, eh); 
}
//-------------------------------------------------------------------------

void FamilyTree:: restr(Vector<Num>& rh, Vector<Num>& rl, int highLevel) const 
{ 
    generation[highLevel]->restr(rh, rl); 
}
//-------------------------------------------------------------------------

void FamilyTree:: rhsToHB(Vector<Num>& r, int level) const
{ 
    generation[level]->rhsToHB(r); 
}
//-------------------------------------------------------------------------

void FamilyTree:: solToNB(Vector<Num>& e, int level) const
{ 
     generation[level]->solToNB(e); 
}
//-------------------------------------------------------------------------

void FamilyTree:: print() const
{
    int i;
    FORALL(generation,i)  
    {
	cout << "\nFamilyTree:  Generation " << i << ":\n";
	generation[i]->print();
    }
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

Generation:: Generation(int noOfNodes) : son(1,noOfNodes) 
{ 
    int i;
    FORALL(son,i) son[i] = 0;
}
//-------------------------------------------------------------------------

Generation:: ~Generation()
{
    int i;
    FORALL(son,i) { delete son[i]; son[i] = 0; }
}
//-------------------------------------------------------------------------

void Generation:: extend(int noOfNodes)  { son.extendAndCopy(noOfNodes); }

//-------------------------------------------------------------------------

void Generation:: notImplemented(const char* name) const
{
    cout << "\n*** class Generation: function " << name 
         << " not implemented\n";
    cout.flush(); abort();
};
//-------------------------------------------------------------------------

void Generation:: prolong(const Vector<Num>& el, Vector<Num>& eh) const
{
    int i;
    FORALL(son,i) son[i]->prolong(el, eh[i]);
}
//-------------------------------------------------------------------------

void Generation:: restr(Vector<Num>& rh, Vector<Num>& rl) const
{
    int  i;
    FORALL(rl,i) rl[i] = 0.0;
    FORALL(son,i) son[i]->restr(rh[i], rl);	// distributes his residual rh[i]
}
//-------------------------------------------------------------------------

void Generation:: solToNB(Vector<Num>& e) const
{
    int i;
    FORALL(son,i) son[i]->prolong(e, e[i]);
}
//-------------------------------------------------------------------------

void Generation:: rhsToHB(Vector<Num>& r) const
{
    int i;
    FORALL(son,i) son[i]->restr(r[i], r);	// distributes his residual rh[i]
}
//-------------------------------------------------------------------------

void Generation:: print() const  
{ 
    int i;
    cout << "\n";
    FORALL(son,i) { cout << "Node " << i << ": ";  son[i]->print(); }
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------


void Son:: notImplemented(const char* name) const
{
    cout << "\n*** class Son: function " << name 
         << " not implemented\n";
    cout.flush(); abort();
}
//-------------------------------------------------------------------------

void Son:: print() const { notImplemented("print"); }

//-------------------------------------------------------------------------


syntax highlighted by Code2HTML, v. 0.9.1