From: Ralf Hartmann Date: Mon, 18 Dec 2000 10:48:21 +0000 (+0000) Subject: First implementation of values and grads. grad_grads not yet implemented. X-Git-Tag: v8.0.0~19885 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1715afd2eab326ed1c110b7de2034fe54289434a;p=dealii.git First implementation of values and grads. grad_grads not yet implemented. git-svn-id: https://svn.dealii.org/trunk@3548 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/base/source/tensor_product_polynomials.cc b/deal.II/base/source/tensor_product_polynomials.cc new file mode 100644 index 0000000000..c7d7553ede --- /dev/null +++ b/deal.II/base/source/tensor_product_polynomials.cc @@ -0,0 +1,266 @@ +//---------------------- tensor_product_polynomials.cc ------------ +// $Id$ +// Version: $Name$ +// +// Copyright (C) 2000 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------- tensor_product_polynomials.cc ------------ + + +#include +#include + +#include + + +template +TensorProductPolynomials::TensorProductPolynomials( + const vector > &pols): + polynomials(pols) +{} + + // first version of this function +// template +// void TensorProductPolynomials::shape_values_and_grads( +// const Point &p, +// vector &values, +// vector > &grads, +// vector > &grad_grads) const +// { +// unsigned int n_pols=polynomials->size(); +// unsigned int n_pols2=n_pols*n_pols; +// unsigned int n_tensor_pols=pow(n_pols, dim); +// Assert(values.size()==n_tensor_pols || values.size()==0, +// ExcDimensionMismatch2(values.size(), n_tensor_pols, 0)); +// Assert(grads.size()==n_tensor_pols|| grads.size()==0, +// ExcDimensionMismatch2(grads.size(), n_tensor_pols, 0)); +// Assert(grad_grads.size()==n_tensor_pols|| grad_grads.size()==0, +// ExcDimensionMismatch2(grad_grads.size(), n_tensor_pols, 0)); + +// unsigned int v_size=0; +// bool update_values=false, update_grads=false, update_grad_grads=false; +// if (values.size()==n_tensor_pols) +// { +// update_values=true; +// v_size=1; +// } +// if (grads.size()==n_tensor_pols) +// { +// update_grads=true; +// v_size=2; +// } +// if (grad_grads.size()==n_tensor_pols) +// { +// update_grad_grads=true; +// v_size=3; +// } + +// vector > > v( +// dim, vector > (n_pols, vector (v_size))); + +// for (unsigned int d=0; d > &v_d=v[d]; +// Assert(v_d.size()==n_pols, ExcInternalError()); +// for (unsigned int i=0; ioperator[](i)->value(p(d), v_d[i]); +// } + +// if (update_values) +// { +// // values[i]=p_j(x) +// for (unsigned i=0; i1) +// for (unsigned i=0; i2) +// for (unsigned int i=0; i1) +// for (unsigned i=0; i2) +// for (unsigned i=0; i +number pow(number x, unsigned int y) +{ + number value=1; + for (unsigned int i=0; i +void TensorProductPolynomials::shape_values_and_grads( + const Point &p, + vector &values, + vector > &grads, + vector > &grad_grads) const +{ + unsigned int n_pols=polynomials.size(); + unsigned int n_tensor_pols=pow(n_pols, dim); + Assert(values.size()==n_tensor_pols || values.size()==0, + ExcDimensionMismatch2(values.size(), n_tensor_pols, 0)); + Assert(grads.size()==n_tensor_pols|| grads.size()==0, + ExcDimensionMismatch2(grads.size(), n_tensor_pols, 0)); + Assert(grad_grads.size()==n_tensor_pols|| grad_grads.size()==0, + ExcDimensionMismatch2(grad_grads.size(), n_tensor_pols, 0)); + + unsigned int v_size=0; + bool update_values=false, update_grads=false, update_grad_grads=false; + if (values.size()==n_tensor_pols) + { + update_values=true; + v_size=1; + } + if (grads.size()==n_tensor_pols) + { + update_grads=true; + v_size=2; + } + if (grad_grads.size()==n_tensor_pols) + { + update_grad_grads=true; + v_size=3; + } + + vector > > v( + dim, vector > (n_pols, vector (v_size))); + + for (unsigned int d=0; d > &v_d=v[d]; + Assert(v_d.size()==n_pols, ExcInternalError()); + for (unsigned int i=0; ivalue(p(d), v_d[i]); + } + + vector n_pols_to(dim+1); + n_pols_to[0]=1; + for (unsigned int i=0; i &gradsi=grads[i]; grads[d]; + // faster than grads[i][d]?? + for (unsigned int i=0; i; +template class TensorProductPolynomials<2>; +template class TensorProductPolynomials<3>;