Skip to content

Commit

Permalink
clean up code generation, reactivate tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mhochsteger committed Feb 7, 2022
1 parent 7281182 commit eda758d
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 166 deletions.
23 changes: 0 additions & 23 deletions fem/code_generation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,29 +196,6 @@ namespace ngfem
}


template<typename TFunc>
void TraverseDimensions( FlatArray<int> dims, const TFunc &func)

{
switch(dims.Size())
{
case 0:
func(0,0,0);
break;
case 1:
for (int i : Range(max2(1, dims[0])))
func(i,i,0);
break;
case 2:
for (int i : Range(max2(1, dims[0])))
for (int j : Range(max2(1, dims[1])))
func(i*dims[1]+j, i, j);
break;
default:
throw Exception("TraverseDimensions: too many dimensions!");
}
}

inline void GetIndex( FlatArray<int> dims, int i, int &iout, int &jout )
{
iout = jout = 0;
Expand Down
125 changes: 12 additions & 113 deletions fem/coefficient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,21 +55,11 @@ namespace ngfem
code.header += Code::Map(mycode, variables);
if(code.is_simd)
{
/*
TraverseDimensions( Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign(values.S()+"("+ToString(ind)+",i)");
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,Dimensions()).Assign(values.S()+"("+ToString(i)+",i)");
}
else
{
/*
TraverseDimensions( Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign(values.S()+"(i,"+ToString(ind)+")");
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,Dimensions()).Assign(values.S()+"(i,"+ToString(i)+")");
}
Expand Down Expand Up @@ -1291,11 +1281,6 @@ class ZeroCoefficientFunction : public T_CoefficientFunction<ZeroCoefficientFunc

virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
/*
TraverseDimensions( Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign(string("0.0"));
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,this->Dimensions()).Assign(string("0.0"));
}
Expand Down Expand Up @@ -1400,11 +1385,6 @@ class ScaleCoefficientFunction : public T_CoefficientFunction<ScaleCoefficientFu

virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
/*
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign(Var(scal) * Var(inputs[0],i,j));
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,this->Dimensions()).Assign(Var(scal) * Var(inputs[0],i,c1->Dimensions()));
}
Expand Down Expand Up @@ -1550,9 +1530,8 @@ class ScaleCoefficientFunctionC : public CoefficientFunction

virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign(Var(scal) * Var(inputs[0],i,j));
});
for (int i = 0; i < c1->Dimension(); i++)
code.body += Var(index,i,Dimensions()).Assign( Var(scal) * Var(inputs[0],i,c1->Dimensions()) );
}

virtual double Evaluate (const BaseMappedIntegrationPoint & ip) const override
Expand Down Expand Up @@ -1647,11 +1626,6 @@ class MultScalVecCoefficientFunction : public T_CoefficientFunction<MultScalVecC

virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
/*
TraverseDimensions( c2->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign( Var(inputs[0]) * Var(inputs[1],i,j) );
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,Dimensions()).Assign( Var(inputs[0]) * Var(inputs[1],i,Dimensions()) );
}
Expand Down Expand Up @@ -1801,13 +1775,6 @@ class MultVecVecCoefficientFunction : public T_CoefficientFunction<MultVecVecCoe
virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
CodeExpr result;
/*
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
int i2, j2;
GetIndex( c2->Dimensions(), ind, i2, j2 );
result += Var(inputs[0],i,j) * Var(inputs[1],i2,j2);
});
*/
for (int i = 0; i < c1->Dimension(); i++)
result += Var(inputs[0], i, c1->Dimensions()) * Var(inputs[1], i, c2->Dimensions());
code.body += Var(index).Assign(result.S());
Expand Down Expand Up @@ -1978,13 +1945,6 @@ class T_MultVecVecCoefficientFunction : public T_CoefficientFunction<T_MultVecVe
virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
CodeExpr result;
/*
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
int i2, j2;
GetIndex( c2->Dimensions(), ind, i2, j2 );
result += Var(inputs[0],i,j) * Var(inputs[1],i2,j2);
});
*/
for (int i = 0; i < c1->Dimension(); i++)
result += Var(inputs[0], i, c1->Dimensions()) * Var(inputs[1], i, c2->Dimensions());
code.body += Var(index).Assign(result.S());
Expand Down Expand Up @@ -2208,11 +2168,6 @@ class T_MultVecVecSameCoefficientFunction : public T_CoefficientFunction<T_MultV
virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
CodeExpr result;
/*
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
result += Var(inputs[0],i,j) * Var(inputs[0],i,j);
});
*/
for (int i = 0; i < c1->Dimension(); i++)
result += Var(inputs[0], i, c1->Dimensions()) * Var(inputs[0], i, c1->Dimensions());
code.body += Var(index).Assign(result.S());
Expand Down Expand Up @@ -2478,10 +2433,9 @@ class NormCoefficientFunction : public T_CoefficientFunction<NormCoefficientFunc
virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
auto res = CodeExpr();
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
res += Var(inputs[0],i,j).Func("L2Norm2");
});
code.body += Var(index,0,0).Assign( res.Func("sqrt"));
for (int i = 0; i < c1->Dimension(); i++)
res += Var(inputs[0],i,c1->Dimensions()).Func("L2Norm2");
code.body += Var(index).Assign( res.Func("sqrt"));
}

/*
Expand Down Expand Up @@ -2629,10 +2583,9 @@ class NormCoefficientFunctionC : public CoefficientFunction
virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
auto res = CodeExpr();
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
res += Var(inputs[0],i,j).Func("L2Norm2");
});
code.body += Var(index,0,0).Assign( res.Func("sqrt"));
for (int i = 0; i < c1->Dimension(); i++)
res += Var(inputs[0],i,c1->Dimensions()).Func("L2Norm2");
code.body += Var(index).Assign( res.Func("sqrt"));
}

/*
Expand Down Expand Up @@ -5805,32 +5758,17 @@ class DomainWiseCoefficientFunction : public T_CoefficientFunction<DomainWiseCoe
for(int in : inputs)
type += "+decltype("+Var(in,0,Dimensions()).S()+")()";
type += ")";
/*
TraverseDimensions( Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Declare(type);
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,this->Dimensions()).Declare(type);
code.body += "switch(domain_index) {\n";
for(int domain : Range(inputs))
{
code.body += "case " + ToLiteral(domain) + ": \n";
/*
TraverseDimensions( Dimensions(), [&](int ind, int i, int j) {
code.body += " "+Var(index, i, j).Assign(Var(inputs[domain], i, j), false);
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += " "+Var(index, i, Dimensions()).Assign(Var(inputs[domain], i, Dimensions()), false);
code.body += " break;\n";
}
code.body += "default: \n";
/*
TraverseDimensions( Dimensions(), [&](int ind, int i, int j) {
code.body += " "+Var(index, i, j).Assign(string("0.0"), false);
});
*/
for (int i = 0; i < Dimension(); i++)
code.body += " "+Var(index, i, Dimensions()).Assign(string("0.0"), false);
code.body += " break;\n";
Expand Down Expand Up @@ -6345,40 +6283,19 @@ class IfPosCoefficientFunction : public T_CoefficientFunction<IfPosCoefficientFu
};

auto var_if = Var(inputs[0]);
/*
TraverseDimensions( cf_then->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Declare(code.res_type);
});
*/
for (int i = 0; i < cf_then->Dimension(); i++)
code.body += Var(index,i,cf_then->Dimensions()).Declare(code.res_type);

if(code.is_simd) {
/*
TraverseDimensions( cf_then->Dimensions(), [&](int ind, int i, int j) {
// cast all input parameters of IfPos to enforce the right overload (f.i. intermediate results could be double instead of AutoDiff<>)
code.body += Var(index,i,j).Assign("IfPos("+cast_value(0, 0, 0) + ',' + cast_value(1, i, j) + ',' + cast_value(2, i, j)+')', false);
});
*/
for (int i = 0; i < cf_then->Dimension(); i++)
// cast all input parameters of IfPos to enforce the right overload (f.i. intermediate results could be double instead of AutoDiff<>)
code.body += Var(index,i,cf_then->Dimensions()).Assign("IfPos("+cast_value(0, 0, cf_if->Dimensions()) + ',' + cast_value(1, i, cf_then->Dimensions()) +
',' + cast_value(2, i, cf_else->Dimensions())+')', false);
} else {
code.body += "if (" + var_if.S() + ">0.0) {\n";
/*
TraverseDimensions( cf_then->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign( Var(inputs[1],i,j), false );
});
*/
for (int i = 0; i < cf_then->Dimension(); i++)
code.body += Var(index,i,cf_then->Dimensions()).Assign( Var(inputs[1],i,cf_then->Dimensions()), false );
code.body += "} else {\n";
/*
TraverseDimensions( cf_then->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign( Var(inputs[2],i,j), false );
});
*/
for (int i = 0; i < cf_then->Dimension(); i++)
code.body += Var(index,i,cf_then->Dimensions()).Assign( Var(inputs[2],i,cf_then->Dimensions()), false );

Expand Down Expand Up @@ -6821,20 +6738,6 @@ class VectorialCoefficientFunction : public T_CoefficientFunction<VectorialCoeff
int input = 0;
int input_index = 0;
FlatArray<int> dims = Dimensions();
/*
TraverseDimensions( dims, [&](int ind, int i, int j) {
auto cfi = ci[input];
int i1, j1;
GetIndex( cfi->Dimensions(), input_index, i1, j1 );
code.body += Var(index,i,j).Assign( Var(inputs[input], i1, j1) );
input_index++;
if (input_index == cfi->Dimension() )
{
input++;
input_index = 0;
}
});
*/
for (int i = 0; i < Dimension(); i++)
{
auto cfi = ci[input];
Expand Down Expand Up @@ -8077,9 +7980,8 @@ class CompiledCoefficientFunction : public CoefficientFunction //, public std::e

void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
TraverseDimensions( cf->Dimensions(), [&](int ind, int i, int j) {
code.body += Var(index,i,j).Assign( Var(inputs[0],i,j).S() );
});
for (int i = 0; i < cf->Dimension(); i++)
code.body += Var(index,i,cf->Dimensions()).Assign( Var(inputs[0], i, cf->Dimensions()) );
}

virtual Array<shared_ptr<CoefficientFunction>> InputCoefficientFunctions() const override
Expand Down Expand Up @@ -8120,11 +8022,8 @@ class RealCF : public CoefficientFunctionNoDerivative

void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
TraverseDimensions( this->Dimensions(), [&](int ind, int i, int j) {
int i1, j1;
GetIndex( cf->Dimensions(), ind, i1, j1 );
code.body += Var(index,i,j).Assign( string(Var(inputs[0],i1,j1)) + ".real()");
});
for (int i = 0; i < Dimension(); i++)
code.body += Var(index,i,Dimensions()).Assign( string(Var(inputs[0],i,cf->Dimensions())) + ".real()");
}

virtual Array<shared_ptr<CoefficientFunction>> InputCoefficientFunctions() const override
Expand Down
22 changes: 0 additions & 22 deletions fem/coefficient.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1229,13 +1229,6 @@ namespace ngfem

virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
/*
TraverseDimensions( this->Dimensions(), [&](int ind, int i, int j) {
int i1, j1;
GetIndex( c1->Dimensions(), ind, i1, j1 );
code.body += Var(index,i,j).Assign( Var(inputs[0],i1,j1).Func(name) );
});
*/
for (int i = 0; i < this->Dimension(); i++)
code.body += Var(index, i, this->Dimensions())
.Assign( Var(inputs[0], i, c1->Dimensions()).Func(name) );
Expand Down Expand Up @@ -1467,21 +1460,6 @@ namespace ngfem
}
virtual void GenerateCode(Code &code, FlatArray<int> inputs, int index) const override
{
/*
TraverseDimensions( c1->Dimensions(), [&](int ind, int i, int j) {
int i2,j2;
GetIndex(c2->Dimensions(), ind, i2, j2);
string expr;
auto op1 = Var(inputs[0],i,j).S();
auto op2 = Var(inputs[1],i2,j2).S();
if(opname.size()>2) // atan2, pow, etc.
expr = opname + '(' + op1 + ',' + op2 + ')';
else // +,-,*,/, etc.
expr = op1 + ' ' + opname + ' ' + op2;
code.body += Var(index,i,j).Assign( expr );
});
*/
for (int i = 0; i < this->Dimension(); i++)
{
auto op1 = Var(inputs[0], i, c1->Dimensions()).S();
Expand Down
8 changes: 1 addition & 7 deletions fem/python_fem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,7 @@ cl_UnaryOpCF<GenericBSpline>::GenerateCode(Code &code, FlatArray<int> inputs, in
s << "reinterpret_cast<BSpline*>(" << code.AddPointer(lam.sp.get()) << ")";
code.body += Var(index,0,1).Assign(s.str());

TraverseDimensions( this->Dimensions(), [&](int ind, int i, int j) {
int i1, j1;
GetIndex( c1->Dimensions(), ind, i1, j1 );
code.body += Var(index).Assign(
Var(inputs[0],i1,j1).Func(Var(index,0,1).S()+"->operator()"));
});

Var(index).Assign( Var(inputs[0],0,c1->Dimensions()).Func(Var(index,0,1).S()+"->operator()"));
}

template <> shared_ptr<CoefficientFunction>
Expand Down
5 changes: 4 additions & 1 deletion tests/pytest/test_code_generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ def test_code_generation_volume_terms(unit_mesh_3d):
cfvec = CF((1,)*10)
cf10 = InnerProduct(cfvec, cfvec)

cf_tensor3 = CF(tuple(range(1,25)), dims=(2,3,4))
cf_tensor = InnerProduct(cf_tensor3, cf_tensor3)

# piecewise polynomials - also test interpolation on L2 space and the resulting GridFunction
functions = [x,y,x*y, specialcf.mesh_size, CoefficientFunction((x,y)).Norm()**2, Id(3)[:,2][2], cf10][-1:]
functions = [x,y,x*y, specialcf.mesh_size, CoefficientFunction((x,y)).Norm()**2, Id(3)[:,2][2], cf10, cf_tensor]

for cf in functions:
gfu.Set(cf)
Expand Down

0 comments on commit eda758d

Please sign in to comment.