12#ifndef CHECK_DERIVATIVE_HH
13#define CHECK_DERIVATIVE_HH
23#include <boost/mpl/size.hpp>
24#include <boost/lexical_cast.hpp>
33 static int const xml_increment=2;
39 for(
int i=0; i<xml_level; ++i) result.append(
" ");
44 XMLBlock(std::ofstream &f,
const char* s,
const char* d=
"") : file(f), str(s), data(d), offset(
"")
46 xml_level += xml_increment;
50 XMLBlock(std::ofstream &f, std::string &s, std::string d=
"") : file(f), str(s), data(d), offset(
"")
52 xml_level += xml_increment;
58 file << offset.c_str() <<
"</" << str.c_str() <<
">" << std::endl;
59 xml_level -= xml_increment;
64 for(
int i=0; i<xml_level; ++i) offset.append(
" ");
68 file << offset.c_str() <<
"<" << str.c_str() << data.c_str() <<
">" << std::endl;
72 std::string
const str, data;
78namespace DerivativeCheck
82 template <
class SparseInt>
83 void writeConnectivity(std::ofstream &file, SparseInt row, SparseInt col, SparseInt numRows)
85 int const upperLeftVertexId = row+col*numRows;
86 file << upperLeftVertexId <<
" " << upperLeftVertexId+1 <<
" " << upperLeftVertexId+numRows <<
" " << upperLeftVertexId+numRows+1 <<
" ";
90 template <
class Assembler,
class Functional,
int firstBlock=0,
int lastBlock = Functional::AnsatzVars::noOfVariables>
91 typename Functional::Scalar
d1(Assembler& assembler, Functional
const& f,
typename Functional::AnsatzVars::VariableSet& x,
typename Functional::Scalar tolerance = 1e-6,
typename Functional::Scalar increment = 1e-12,
bool toFile=
false, std::string
const& filename = std::string(
"d1error"))
93 typedef typename Functional::Scalar Scalar;
94 typedef typename Functional::AnsatzVars::template CoefficientVectorRepresentation<firstBlock,lastBlock>::type CoefficientVector;
96 std::cout <<
"checking first derivative" << std::endl;
97 std::cout <<
"assembling...";
105 CoefficientVector analytic(assembler.template rhs<firstBlock,lastBlock>());
106 std::vector<Scalar> analyticD1(assembler.template nrows<firstBlock,lastBlock>());
107 analytic.write(analyticD1.begin());
110 Scalar
const reference_value = assembler.functional();
112 std::vector<Scalar> xAsVector(assembler.nrows());
113 x.write(xAsVector.begin());
116 std::vector<Scalar> firstDerivativeError(analyticD1.size(),0.);
118 size_t offset = (0!=firstBlock) ? assembler.template nrows<0,firstBlock>() : 0;
119 size_t end = (lastBlock!=Functional::AnsatzVars::noOfVariables) ? (offset + assembler.template nrows<firstBlock,lastBlock>()) : xAsVector.size();
122 for(
size_t i=offset; i<end; ++i)
125 xAsVector[i] += increment;
126 x.read(xAsVector.begin());
129 distorted = assembler.functional();
130 xAsVector[i] -= increment;
133 firstDerivativeError[i-offset] = (distorted - reference_value)/increment;
134 if(i%100==0) std::cout <<
".";
137 x.read(xAsVector.begin());
138 std::cout <<
"done." << std::endl;
139 for(
size_t i=0; i<firstDerivativeError.size(); ++i)
140 firstDerivativeError[i] -= analyticD1[i];
143 bool errorBelowTolerance = infinityError < tolerance;
144 if(errorBelowTolerance)
145 std::cout <<
"\n first derivative seems to be trustworthy!\nInfinityError: " << infinityError << std::endl << std::endl;
147 std::cout <<
"\n first derivative does not seem to be trustworthy!\nInfinity error: " << infinityError << std::endl << std::endl;
151 return infinityError;
154 template <
class Assembler,
class Functional,
int firstRow=0,
int lastRow=Functional::TestVars::noOfVariables,
int firstCol=0,
int lastCol=Functional::AnsatzVars::noOfVariables>
155 typename Functional::Scalar
d2(Assembler& assembler, Functional
const& f,
typename Functional::AnsatzVars::VariableSet
const& x,
typename Functional::Scalar increment = 1e-12,
typename Functional::Scalar tolerance = 1e-6,
bool toFile =
false, std::string
const& savefilename = std::string(
"d2error"))
157 typedef typename Functional::Scalar Scalar;
158 typedef typename Functional::TestVars::template CoefficientVectorRepresentation<firstRow,lastRow>::type RowVector;
159 typedef typename Functional::AnsatzVars::template CoefficientVectorRepresentation<firstCol,lastCol>::type ColumnVector;
161 std::cout <<
"checking second derivative:" << std::endl;
162 std::cout <<
"assembling...";
166 SparseMatrix secondDerivativeError;
170 SparseMatrix analytic_solution = assembler.template get<SparseMatrix,firstRow,lastRow,firstCol,lastCol>(
false);
171 RowVector reference_value(assembler.
template rhs<firstRow,lastRow>());
172 RowVector copyOfRefVal(reference_value);
175 std::vector<Scalar> xAsVector(assembler.nrows());
176 x.write(xAsVector.begin());
178 size_t offset = (firstRow != 0) ? assembler.template nrows<0,firstRow>() : 0;
179 size_t end = (lastRow!=Functional::TestVars::noOfVariables) ? (offset + assembler.template nrows<firstRow,lastRow>()) : xAsVector.size();
182 for(
size_t i=offset; i<end; ++i)
184 copyOfRefVal = reference_value;
185 xAsVector[i] += increment;
186 x.read(xAsVector.begin());
189 RowVector distorted_value(assembler.template rhs<firstRow,lastRow>());
191 xAsVector[i] -= increment;
193 std::vector<Scalar>
column(end-offset);
194 copyOfRefVal -= distorted_value;
195 copyOfRefVal.write(
column.begin());
197 secondDerivativeError.addColumn(
column,i);
203 if(i%100==0) std::cout <<
".";
206 x.read(xAsVector.begin());
207 std::cout <<
"done." << std::endl;
208 analytic_solution *= -1;
209 secondDerivativeError += analytic_solution;
213 if( (tolerance > infinityError) )
214 std::cout <<
"\nSecond derivative seems to be trustworthy!\nInfinity error: " << infinityError << std::endl << std::endl;
216 std::cout <<
"\nSecond derivative does not seem to be trustworthy!\nInfinity error: " << infinityError << std::endl << std::endl;
218 return infinityError;
222 template <
class Vector>
228 size_t const numberOfRows =
vec.size(),
229 numberOfPoints = (1+numberOfRows)*2;
230 size_t const cell_type = 8,
233 XMLHelper::xml_level = 0;
236 savefilename.append(
".vtu");
237 std::ofstream file(savefilename.c_str());
238 file <<
"<?xml version=\"1.0\"?>" << endl;
239 { XMLBlock xvtk(file,
"VTKFile",
" type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"");
240 { XMLBlock xgrid(file,
"UnstructuredGrid");
241 {
string str = string(
" NumberOfPoints=\"") + boost::lexical_cast<string>(numberOfPoints) +
" \" numberOfRows=\"" +
242 boost::lexical_cast<string>(numberOfRows) +
"\"";
243 XMLBlock xpiece(file,
"Piece", str.c_str());
244 { XMLBlock xcd(file,
"CellData");
245 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"d2error\" NumberOfComponents=\"1\" format=\"ascii\"");
246 for(
size_t cell=0; cell<numberOfRows; ++cell){
247 if(cell%12==0) file <<
" ";
249 file << fabs(
vec[numberOfRows-1-cell]) <<
" ";
250 if(cell%12==11 || cell==(numberOfRows-1) ) file << endl;
254 { XMLBlock xpoints(file,
"Points");
255 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"Coordinates\" NumberOfComponents=\"3\" format=\"ascii\"");
256 for(
size_t cell=0; cell<numberOfRows+1; ++cell){
257 if(cell%2==0) file <<
" ";
258 file << cell <<
" 0 0 " << cell <<
" 1 0 ";
259 if(cell%2==1 || cell==numberOfRows) file << endl;
263 { XMLBlock xcells(file,
"Cells");
264 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"connectivity\" NumberOfComponents=\"1\" format=\"ascii\"");
265 for(
size_t cell=0; cell<numberOfRows; ++cell){
266 if(cell%3==0) file <<
" ";
267 file << 2*cell <<
" " << 2*cell+1 <<
" " << 2*cell+2 <<
" " << 2*cell+3 <<
" " << endl;
268 if(cell%3==11 || cell==(numberOfRows-1)) file << endl;
271 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"offsets\" NumberOfComponents=\"1\" format=\"ascii\"");
272 for(
size_t cell=0; cell<numberOfRows; ++cell){
273 if(cell%12==0) file <<
" ";
274 file << cell*offset <<
" ";
275 if(cell%12==1 || cell==(numberOfRows-1)) file << endl;
278 { XMLBlock xda(file,
"DataArray",
" type=\"UInt8\" Name=\"types\" NumberOfComponents=\"1\" format=\"ascii\"");
279 for(
size_t cell=0; cell<numberOfRows; ++cell){
280 if(cell%12==0) file <<
" ";
281 file << cell_type <<
" ";
282 if(cell%12==11 || cell==(numberOfRows-1) ) file << endl;
291 template <
class Scalar,
class SparseInt>
298 cout <<
"writing file";
301 std::vector<std::pair<SparseInt,SparseInt> > indices(matrix.
data.size());
302 for(
size_t i=0; i<indices.size(); ++i)
303 indices[i] = std::make_pair(matrix.
ridx[i], matrix.
cidx[i]);
305 SparseInt
const numberOfRows = matrix.
nrows()+1,
306 numberOfColumns = matrix.
ncols()+1,
307 numberOfPoints = numberOfRows*numberOfColumns,
308 numberOfCells = (numberOfRows-1)*(numberOfColumns-1);
309 size_t const cell_type = 8,
312 XMLHelper::xml_level = 0;
316 savefilename.append(
".vtu");
317 std::ofstream file(savefilename.c_str());
318 file <<
"<?xml version=\"1.0\"?>" << endl;
319 { XMLBlock xvtk(file,
"VTKFile",
" type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"");
320 { XMLBlock xgrid(file,
"UnstructuredGrid");
321 {
string str = string(
" NumberOfPoints=\"") + boost::lexical_cast<string>(numberOfPoints) +
" \" NumberOfCells=\"" +
322 boost::lexical_cast<string>(numberOfCells) +
"\"";
323 XMLBlock xpiece(file,
"Piece", str.c_str());
324 { XMLBlock xcd(file,
"CellData");
325 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"d2error\" NumberOfComponents=\"1\" format=\"ascii\"");
328 for(SparseInt col=0; col<numberOfColumns-1; ++col){
329 for(SparseInt row=0; row<numberOfRows-1; ++row){
330 if(cell%12==0) file << indent.c_str();
331 typename std::vector<std::pair<SparseInt,SparseInt> >::const_iterator iter = std::find(indices.begin(), indices.end(), std::make_pair(numberOfRows-2-row,col)),
332 iterStart = indices.begin();
333 if(iter!=indices.end())
337 if(cell%12==11 || cell==numberOfCells-1) file << endl;
344 { XMLBlock xp(file,
"Points");
345 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"Coordinates\" NumberOfComponents=\"3\" format=\"ascii\"");
347 for(SparseInt col=0; col<numberOfColumns; ++col){
348 for(SparseInt row=0; row<numberOfRows; ++row){
349 if(cell%4==0) file << indent.c_str();
350 file << row <<
" " << col <<
" 0 ";
351 if(cell%4==3 || cell==(numberOfCells-1)) file << endl;
358 { XMLBlock xcell(file,
"Cells");
359 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"connectivity\" NumberOfComponents=\"1\" format=\"ascii\"");
361 for(SparseInt col=0; col<numberOfColumns-1; ++col){
362 for(SparseInt row=0; row<numberOfRows-1; ++row){
363 if(cell%3==0) file << indent.c_str();
365 if(cell%3==2 || cell==(numberOfCells-1)) file << endl;
371 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"offsets\" NumberOfComponents=\"1\" format=\"ascii\"");
372 for(SparseInt cell=0; cell<numberOfCells; ++cell){
373 if(cell%12==0) file << indent.c_str();
374 file << (cell+1)*offset <<
" ";
375 if(cell%12==11 || cell==(numberOfCells-1)) file << endl;
379 { XMLBlock xda(file,
"DataArray",
" type=\"UInt8\" Name=\"types\" NumberOfComponents=\"1\" format=\"ascii\"");
380 for(SparseInt cell=0; cell<numberOfCells; ++cell){
381 if(cell%12==0) file << indent.c_str();
382 file << cell_type <<
" ";
383 if(cell%12==11 || cell==(numberOfCells-1) ) file << endl;
390 cout <<
"done" << endl;
406template <
class Functional,
bool checkD1=true,
class SparseInt=
int>
410 typedef typename Functional::AnsatzVars VariableSet;
412 typedef typename VariableSet::template CoefficientVectorRepresentation<> CoefficientVectorRepresentation;
413 typedef typename CoefficientVectorRepresentation::type CoefficientVector;
416 typedef typename Functional::Scalar
Scalar;
418 idOfLastBlock = boost::mpl::size<typename Functional::AnsatzVars::Variables>::type::value };
428 assembler(assembler_), f(f_), x(x_), variableSet(variableSet_), tolerance(tol), increment(incr)
442 std::cout <<
"checking first derivative" << std::endl;
443 std::cout <<
"assembling...";
451 CoefficientVector analytic(assembler.rhs());
452 std::vector<Scalar> analyticD1(assembler.nrows());
453 analytic.write(analyticD1.begin());
456 Scalar const reference_value = assembler.functional();
458 std::vector<Scalar> xAsVector(analyticD1.size());
459 x.write(xAsVector.begin());
462 firstDerivativeError.resize(xAsVector.size(),0);
464 EvaluationPoint copyOfX(x);
466 for(
size_t i=0; i<xAsVector.size(); ++i)
468 xAsVector[i] += increment;
469 copyOfX.read(xAsVector.begin());
472 Scalar distorted_value = assembler.functional();
473 xAsVector[i] -= increment;
476 firstDerivativeError[i] = (distorted_value - reference_value)/increment;
477 if(i%100==0) std::cout <<
".";
479 std::cout <<
"done." << std::endl;
480 for(
size_t i=0; i<firstDerivativeError.size(); ++i)
481 firstDerivativeError[i] -= analyticD1[i];
484 firstDerivativeOk_ = infinityError < tolerance;
485 if(firstDerivativeOk_)
486 std::cout <<
"\n first derivative seems to be trustworthy!\nInfinityError: " << infinityError << std::endl << std::endl;
488 std::cout <<
"\n first derivative does not seem to be trustworthy!\nInfinity error: " << infinityError << std::endl << std::endl;
499 std::cout <<
"checking second derivative:" << std::endl;
501 std::cout <<
"assembling...";
508 SparseMatrix analytic_solution = assembler.template get<SparseMatrix>(
false);
509 CoefficientVector reference_value(assembler.rhs());
510 CoefficientVector copyOfRefVal(reference_value);
513 std::vector<Scalar> xAsVector(assembler.nrows());
514 x.write(xAsVector.begin());
516 EvaluationPoint copyOfX(x);
518 for(
size_t i=0; i<xAsVector.size(); ++i)
520 copyOfRefVal = reference_value;
521 xAsVector[i] += increment;
522 copyOfX.read(xAsVector.begin());
525 CoefficientVector distorted_value(assembler.rhs());
527 xAsVector[i] -= increment;
529 std::vector<Scalar>
column(xAsVector.size());
530 copyOfRefVal -= distorted_value;
531 copyOfRefVal.write(
column.begin());
533 secondDerivativeError.addColumn(
column,i);
539 if(i%100==0) std::cout <<
".";
541 std::cout <<
"done." << std::endl;
542 analytic_solution *= -1;
543 secondDerivativeError += analytic_solution;
547 if( (secondDerivativeOk_ = tolerance > infinityError) )
548 std::cout <<
"\nSecond derivative seems to be trustworthy!\nInfinity error: " << infinityError << std::endl << std::endl;
550 std::cout <<
"\nSecond derivative does not seem to be trustworthy!\nInfinity error: " << infinityError << std::endl << std::endl;
593 std::cout <<
"components in D1 over tolerance:\n";
594 for(
size_t i=0; i<firstDerivativeError.size(); ++i)
595 if(fabs(firstDerivativeError[i]) > tolerance)
596 std::cout << i <<
": " << firstDerivativeError[i] << std::endl;
602 std::cout <<
"components in D1:\n" << firstDerivativeError << std::endl;
608 std::cout <<
"components in D2 over tolerance:\n";
609 secondDerivativeError.print(std::cout,tolerance);
615 std::cout <<
"components in D2:\n";
616 secondDerivativeError.print(std::cout);
638 template <
class Vector>
644 size_t const numberOfRows = vector.size(),
645 numberOfPoints = (1+numberOfRows)*2;
646 size_t const cell_type = 8,
649 XMLHelper::xml_level = 0;
652 string filename(
"d1error");
653 filename.append(boost::lexical_cast<string>(steps)).append(
".vtu");
655 std::ofstream file(filename.c_str());
656 file <<
"<?xml version=\"1.0\"?>" << endl;
657 { XMLBlock xvtk(file,
"VTKFile",
" type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"");
658 { XMLBlock xgrid(file,
"UnstructuredGrid");
659 {
string str = string(
" NumberOfPoints=\"") + boost::lexical_cast<string>(numberOfPoints) +
" \" numberOfRows=\"" +
660 boost::lexical_cast<string>(numberOfRows) +
"\"";
661 XMLBlock xpiece(file,
"Piece", str.c_str());
662 { XMLBlock xcd(file,
"CellData");
663 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"d2error\" NumberOfComponents=\"1\" format=\"ascii\"");
664 for(
size_t cell=0; cell<numberOfRows; ++cell){
665 if(cell%12==0) file <<
" ";
667 file << fabs(vector[numberOfRows-1-cell]) <<
" ";
668 if(cell%12==11 || cell==(numberOfRows-1) ) file << endl;
672 { XMLBlock xpoints(file,
"Points");
673 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"Coordinates\" NumberOfComponents=\"3\" format=\"ascii\"");
674 for(
size_t cell=0; cell<numberOfRows+1; ++cell){
675 if(cell%2==0) file <<
" ";
676 file << cell <<
" 0 0 " << cell <<
" 1 0 ";
677 if(cell%2==1 || cell==numberOfRows) file << endl;
681 { XMLBlock xcells(file,
"Cells");
682 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"connectivity\" NumberOfComponents=\"1\" format=\"ascii\"");
683 for(
size_t cell=0; cell<numberOfRows; ++cell){
684 if(cell%3==0) file <<
" ";
685 file << 2*cell <<
" " << 2*cell+1 <<
" " << 2*cell+2 <<
" " << 2*cell+3 <<
" " << endl;
686 if(cell%3==11 || cell==(numberOfRows-1)) file << endl;
689 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"offsets\" NumberOfComponents=\"1\" format=\"ascii\"");
690 for(
size_t cell=0; cell<numberOfRows; ++cell){
691 if(cell%12==0) file <<
" ";
692 file << cell*offset <<
" ";
693 if(cell%12==1 || cell==(numberOfRows-1)) file << endl;
696 { XMLBlock xda(file,
"DataArray",
" type=\"UInt8\" Name=\"types\" NumberOfComponents=\"1\" format=\"ascii\"");
697 for(
size_t cell=0; cell<numberOfRows; ++cell){
698 if(cell%12==0) file <<
" ";
699 file << cell_type <<
" ";
700 if(cell%12==11 || cell==(numberOfRows-1) ) file << endl;
722 cout <<
"writing file";
725 std::vector<std::pair<SparseInt,SparseInt> > indices(matrix.
data.size());
726 for(
size_t i=0; i<indices.size(); ++i)
727 indices[i] = std::make_pair(matrix.
ridx[i], matrix.
cidx[i]);
729 SparseInt
const numberOfRows = matrix.
nrows()+1,
730 numberOfColumns = matrix.
ncols()+1,
731 numberOfPoints = numberOfRows*numberOfColumns,
732 numberOfCells = (numberOfRows-1)*(numberOfColumns-1);
733 size_t const cell_type = 8,
736 XMLHelper::xml_level = 0;
740 string filename(
"d2error");
741 filename.append(boost::lexical_cast<string>(steps)).append(
".vtu");
743 std::ofstream file(filename.c_str());
744 file <<
"<?xml version=\"1.0\"?>" << endl;
745 { XMLBlock xvtk(file,
"VTKFile",
" type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"");
746 { XMLBlock xgrid(file,
"UnstructuredGrid");
747 {
string str = string(
" NumberOfPoints=\"") + boost::lexical_cast<string>(numberOfPoints) +
" \" NumberOfCells=\"" +
748 boost::lexical_cast<string>(numberOfCells) +
"\"";
749 XMLBlock xpiece(file,
"Piece", str.c_str());
750 { XMLBlock xcd(file,
"CellData");
751 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"d2error\" NumberOfComponents=\"1\" format=\"ascii\"");
754 for(SparseInt col=0; col<numberOfColumns-1; ++col){
755 for(SparseInt row=0; row<numberOfRows-1; ++row){
756 if(cell%12==0) file << indent.c_str();
757 typename std::vector<std::pair<SparseInt,SparseInt> >::const_iterator iter = std::find(indices.begin(), indices.end(), std::make_pair(numberOfRows-2-row,col)),
758 iterStart = indices.begin();
759 if(iter!=indices.end())
761 if(cell%12==11 || cell==numberOfCells-1) file << endl;
768 { XMLBlock xp(file,
"Points");
769 { XMLBlock xda(file,
"DataArray",
" type=\"Float32\" Name=\"Coordinates\" NumberOfComponents=\"3\" format=\"ascii\"");
771 for(
size_t col=0; col<numberOfColumns; ++col){
772 for(
size_t row=0; row<numberOfRows; ++row){
773 if(cell%4==0) file << indent.c_str();
774 file << row <<
" " << col <<
" 0 ";
775 if(cell%4==3 || cell==(numberOfCells-1)) file << endl;
782 { XMLBlock xcell(file,
"Cells");
783 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"connectivity\" NumberOfComponents=\"1\" format=\"ascii\"");
785 for(
size_t col=0; col<numberOfColumns-1; ++col){
786 for(
size_t row=0; row<numberOfRows-1; ++row){
787 if(cell%3==0) file << indent.c_str();
788 writeConnectivity(file, row, col, numberOfRows);
789 if(cell%3==2 || cell==(numberOfCells-1)) file << endl;
795 { XMLBlock xda(file,
"DataArray",
" type=\"Int32\" Name=\"offsets\" NumberOfComponents=\"1\" format=\"ascii\"");
796 for(
size_t cell=0; cell<numberOfCells; ++cell){
797 if(cell%12==0) file << indent.c_str();
798 file << (cell+1)*offset <<
" ";
799 if(cell%12==11 || cell==(numberOfCells-1)) file << endl;
803 { XMLBlock xda(file,
"DataArray",
" type=\"UInt8\" Name=\"types\" NumberOfComponents=\"1\" format=\"ascii\"");
804 for(
size_t cell=0; cell<numberOfCells; ++cell){
805 if(cell%12==0) file << indent.c_str();
806 file << cell_type <<
" ";
807 if(cell%12==11 || cell==(numberOfCells-1) ) file << endl;
814 cout <<
"done" << endl;
826 void writeConnectivity(std::ofstream &file, SparseInt row, SparseInt col, SparseInt numRows)
const
828 int const upperLeftVertexId = row+col*numRows;
829 file << upperLeftVertexId <<
" " << upperLeftVertexId+1 <<
" " << upperLeftVertexId+numRows <<
" " << upperLeftVertexId+numRows+1 <<
" ";
832 Assembler& assembler;
835 VariableSet
const& variableSet;
836 Scalar tolerance, increment;
837 std::vector<Scalar> firstDerivativeError;
838 MatrixAsTriplet<Scalar,SparseInt> secondDerivativeError;
839 bool firstDerivativeOk_, secondDerivativeOk_;
Class that checks the derivatives of a functional at a linearization point.
DerivativeChecker(Assembler &assembler_, Functional const &f_, EvaluationPoint const &x_, VariableSet const &variableSet_, Scalar const tol=1.0e-6, Scalar const incr=1.0e-9)
Constructor.
void checkFirstDerivative()
Check first derivative.
void printD2Error() const
print error in second derivative (only values below tolerance)
void printD1Error() const
print error in first derivative (only values below tolerance)
Functional::Scalar Scalar
void setTolerance(Scalar const tol)
Only errors below tolerance will be displayed.
void setIncrement(Scalar const incr)
Set increment for finite differences.
bool secondDerivativeOk() const
void printFullD2Error() const
print error in second derivative
void matrixToVTK(MatrixAsTriplet< Scalar, SparseInt > const &matrix, int const steps=0) const
write, possibly sparse, matrix in triplet format to .vtu-file
void d2ToVTK()
write d2 to .vtu file
void checkSecondDerivative()
Check second derivative.
void d2ErrorToVTK(int const steps) const
write error in second derivative to .vtu-file
void printFullD1Error() const
print error in first derivative
void d1ErrorToVTK(int const steps) const
write error in first derivative to .vtu file
bool firstDerivativeOk() const
void vectorToVTK(Vector &vector, int const steps=0) const
write Vector vector to .vtu file
SparseIndexInt nrows() const
Returns number of rows (computes them, if not known)
SparseIndexInt ncols() const
Returns number of cols (computes them, if not known)
std::vector< SparseIndexInt > ridx
row indices
std::vector< SparseIndexInt > cidx
column indices
std::vector< Scalar > data
data
VariableSet(Self const &vs)
Copy constructor.
A class for assembling Galerkin representation matrices and right hand sides for variational function...
static unsigned int const VALUE
DEPRECATED, enums in the Assembler namespace.
static unsigned int const RHS
static unsigned int const MATRIX
Scalar distance(Point< Scalar, dim > const &first, Point< Scalar, dim > const &second)
void writeConnectivity(std::ofstream &file, SparseInt row, SparseInt col, SparseInt numRows)
Functional::Scalar d1(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet &x, typename Functional::Scalar tolerance=1e-6, typename Functional::Scalar increment=1e-12, bool toFile=false, std::string const &filename=std::string("d1error"))
void matrixToVTK(MatrixAsTriplet< Scalar, SparseInt > const &matrix, std::string savefilename=std::string("d2error"))
void vectorToVTK(Vector const &vec, std::string savefilename=std::string("d1error"))
Functional::Scalar d2(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet const &x, typename Functional::Scalar increment=1e-12, typename Functional::Scalar tolerance=1e-6, bool toFile=false, std::string const &savefilename=std::string("d2error"))
Dune::FieldVector< Scalar, dim > Vector
std::string getXMLIndent()
Dune::FieldVector< Scalar, n > column(Dune::FieldMatrix< Scalar, n, m > const &A, int j)
Extracts the j-th column of the given matrix A.
Infinity norm for stl-container, Dune::FieldVector and Dune::FieldMatrix.
XMLBlock(std::ofstream &f, std::string &s, std::string d="")
XMLBlock(std::ofstream &f, const char *s, const char *d="")