00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SPECTRAL_LEGENDRE_DISCRETIZER_HPP
00021 #define SPECTRAL_LEGENDRE_DISCRETIZER_HPP
00022
00023 #include <Problem.hpp>
00024 #include <DegreeOfFreedomSet.hpp>
00025 #include <Structured3DMesh.hpp>
00026 #include <SpectralMesh.hpp>
00027
00028 #include <SpectralFunction.hpp>
00029 #include <ScalarFunctionBase.hpp>
00030
00031 #include <Interval.hpp>
00032 #include <LegendreBasis.hpp>
00033 #include <GaussLobatto.hpp>
00034
00035 #include <SpectralConformTransformation.hpp>
00036
00037 #include <DoubleHashedMatrix.hpp>
00038 #include <UnAssembledMatrix.hpp>
00039
00040 #include <DiscretizationType.hpp>
00041
00042 #include <Discretization.hpp>
00043 #include <ScalarDiscretizationTypeSpectral.hpp>
00044
00045 #include <PDE.hpp>
00046 #include <PDEProblem.hpp>
00047 #include <MassOperator.hpp>
00048 #include <FirstOrderOperator.hpp>
00049 #include <DivMuGrad.hpp>
00050 #include <SecondOrderOperator.hpp>
00051
00052 #include <PDESystem.hpp>
00053
00054 #include <VariationalProblem.hpp>
00055
00056 #include <VariationalOperatorFV.hpp>
00057 #include <VariationalOperatorFdxV.hpp>
00058 #include <VariationalOperatorFdxGV.hpp>
00059 #include <VariationalOperatorFgradGgradV.hpp>
00060
00061 #include <VariationalOperatorAlphaUV.hpp>
00062 #include <VariationalOperatorMuGradUGradV.hpp>
00063 #include <VariationalOperatorAlphaDxUDxV.hpp>
00064 #include <VariationalOperatorNuUdxV.hpp>
00065 #include <VariationalOperatorNuDxUV.hpp>
00066
00067 #include <Mesh.hpp>
00068
00069 #include <ErrorHandler.hpp>
00070
00071 class SpectralLegendreDiscretizer
00072 {
00073 private:
00074 const Problem& __problem;
00075 BaseVector& __b;
00076
00077 const DegreeOfFreedomSet& __degreeOfFreedomSet;
00078
00079 const SpectralMesh& __mesh;
00080
00081 Vector<TinyVector<3,size_t> > __dofShape;
00082
00083
00084
00085 TinyVector<3, ConstReferenceCounting<Interval> > __interval;
00086 Vector<TinyVector<3, ConstReferenceCounting<Interval> > > __intervalU;
00087 TinyVector<3, ConstReferenceCounting<SpectralConformTransformation> > __transform;
00088 Vector<TinyVector<3, ConstReferenceCounting<SpectralConformTransformation> > > __transformU;
00089 TinyVector<3, ConstReferenceCounting<GaussLobatto> > __gaussLobatto;
00090 Vector<TinyVector<3, ConstReferenceCounting<LegendreBasis> > > __basisU;
00091
00092 void _interpolateLagrange(const ScalarFunctionBase& alpha,
00093 Structured3DVector<real_t>& alpha_rst) const
00094 {
00095 TinyVector<3,Vector<real_t> > nodes;
00096 for( size_t i=0; i<3; ++i){
00097 nodes[i].resize((*__gaussLobatto[i]).numberOfPoints());
00098 for (size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints(); ++j) {
00099 nodes[i][j] =(*__transform[i])((*__gaussLobatto[i])(j));
00100 }
00101 }
00102 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
00103 const real_t& x = nodes[0][r];
00104 for (size_t s=0; s < __gaussLobatto[1]->numberOfPoints(); ++s) {
00105 const real_t& y = nodes[1][s];
00106 for (size_t t=0; t < __gaussLobatto[2]->numberOfPoints(); ++t) {
00107 const real_t& z = nodes[2][t];
00108 alpha_rst(r,s,t) = alpha(x,y,z);
00109 }
00110 }
00111 }
00112 }
00113
00114
00115 void _getAu(const Structured3DVector<real_t>& coef,
00116 const real_t& detXU, const real_t& detYU, const real_t& detZU,
00117 const real_t& detXV, const real_t& detYV, const real_t& detZV,
00118 const Vector<Vector<real_t> >& basisOrDerivativeValueU0,
00119 const Vector<Vector<real_t> >& basisOrDerivativeValueU1,
00120 const Vector<Vector<real_t> >& basisOrDerivativeValueU2,
00121 const Vector<Vector<real_t> >& basisOrDerivativeValueV0,
00122 const Vector<Vector<real_t> >& basisOrDerivativeValueV1,
00123 const Vector<Vector<real_t> >& basisOrDerivativeValueV2,
00124 const size_t& unknownNumber, const size_t& testFunctionNumber,
00125 const Vector<real_t>& u,
00126 Vector<real_t>& v) const
00127 {
00128 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& unknownBasis
00129 = __basisU[unknownNumber];
00130
00131 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& testBasis
00132 = __basisU[testFunctionNumber];
00133
00134 Structured3DVector<real_t> u_ijt(Array3DShape(unknownBasis[0]->dimension(),
00135 unknownBasis[1]->dimension(),
00136 __gaussLobatto[2]->numberOfPoints()));
00137
00138 u_ijt=0;
00139
00140
00141 const TinyVector<3,size_t>& dofShapeU = __dofShape[unknownNumber];
00142
00143 {
00144 for (size_t i=0; i< unknownBasis[0]->dimension(); ++i) {
00145 for (size_t j=0; j< unknownBasis[1]->dimension(); ++j) {
00146 for (size_t k=0; k< unknownBasis[2]->dimension(); ++k) {
00147 size_t l = i*dofShapeU[1]*dofShapeU[2] + j*dofShapeU[2] + k;
00148 const real_t& u_ijk = u[__degreeOfFreedomSet(unknownNumber,l)];
00149 for (size_t t=0; t< __gaussLobatto[2]->numberOfPoints(); ++t) {
00150 u_ijt(i,j,t) += u_ijk * basisOrDerivativeValueU2[t][k];
00151 }
00152 }
00153 }
00154 }
00155 }
00156
00157 Structured3DVector<real_t> u_ist(Array3DShape(unknownBasis[0]->dimension(),
00158 __gaussLobatto[1]->numberOfPoints(),
00159 __gaussLobatto[2]->numberOfPoints()));
00160
00161 u_ist=0;
00162
00163 for (size_t i=0; i< unknownBasis[0]->dimension(); ++i) {
00164 for (size_t j=0; j< unknownBasis[1]->dimension(); ++j) {
00165 for (size_t t=0; t<__gaussLobatto[2]->numberOfPoints(); ++t) {
00166 const real_t& u_ijt_value = u_ijt(i,j,t);
00167 for (size_t s=0; s<__gaussLobatto[1]->numberOfPoints(); ++s) {
00168 u_ist(i,s,t) += u_ijt_value*basisOrDerivativeValueU1[s][j];
00169 }
00170 }
00171 }
00172 }
00173
00174
00175 Structured3DVector<real_t> u_rst(Array3DShape(__gaussLobatto[0]->numberOfPoints(),
00176 __gaussLobatto[1]->numberOfPoints(),
00177 __gaussLobatto[2]->numberOfPoints()));
00178 u_rst=0;
00179
00180 for (size_t i=0; i< unknownBasis[0]->dimension(); ++i) {
00181 for (size_t s=0; s<__gaussLobatto[1]->numberOfPoints(); ++s) {
00182 for (size_t t=0; t<__gaussLobatto[2]->numberOfPoints(); ++t) {
00183 const real_t& u_ist_value = u_ist(i,s,t);
00184 for (size_t r=0; r<__gaussLobatto[0]->numberOfPoints(); ++r) {
00185 u_rst(r,s,t) += u_ist_value*basisOrDerivativeValueU0[r][i];
00186 }
00187 }
00188 }
00189 }
00190
00191 Structured3DVector<real_t> v_rsk(Array3DShape(__gaussLobatto[0]->numberOfPoints(),
00192 __gaussLobatto[1]->numberOfPoints(),
00193 testBasis[2]->dimension()));
00194 v_rsk=0;
00195
00196
00197
00198 {
00199 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
00200 for (size_t s=0; s < __gaussLobatto[1]->numberOfPoints(); ++s) {
00201 for (size_t t=0; t < __gaussLobatto[2]->numberOfPoints(); ++t) {
00202 const real_t& wt = __gaussLobatto[2]->weight(t);
00203 const real_t value_rst = coef(r,s,t)*u_rst(r,s,t)
00204 *(__transform[2]->determinant())*wt;
00205 for (size_t k=0; k< testBasis[2]->dimension(); ++k) {
00206 v_rsk(r,s,k) += value_rst * basisOrDerivativeValueV2[t][k];
00207 }
00208 }
00209 }
00210 }
00211
00212 Structured3DVector<real_t> v_rjk(Array3DShape(__gaussLobatto[0]->numberOfPoints(),
00213 testBasis[1]->dimension(),
00214 testBasis[2]->dimension()));
00215 v_rjk=0;
00216
00217 {
00218 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
00219 for (size_t s=0; s < __gaussLobatto[1]->numberOfPoints(); ++s) {
00220 const real_t& ws = __gaussLobatto[1]->weight(s);
00221 for (size_t k=0; k < testBasis[2]->dimension(); ++k) {
00222 const real_t value_rsk = v_rsk(r,s,k)
00223 *(__transform[1]->determinant())*ws;
00224 for (size_t j=0; j< testBasis[1]->dimension(); ++j) {
00225 v_rjk(r,j,k) += value_rsk * basisOrDerivativeValueV1[s][j];
00226 }
00227 }
00228 }
00229 }
00230 }
00231
00232 real_t detUV = detXU * detYU *detZU *detXV *detYV *detZV;
00233
00234 {
00235 const TinyVector<3,size_t>& dofShape = __dofShape[testFunctionNumber];
00236
00237 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
00238 const real_t& wr = __gaussLobatto[0]->weight(r);
00239 for (size_t j=0; j < testBasis[1]->dimension(); ++j) {
00240 for (size_t k=0; k < testBasis[2]->dimension(); ++k) {
00241 const real_t value_rjk = v_rjk(r,j,k)*(__transform[0]->determinant())*wr*detUV;
00242 for (size_t i=0; i< testBasis[0]->dimension(); ++i) {
00243 size_t dofNumber = i*dofShape[1]*dofShape[2] + j*dofShape[2] + k;
00244 v[__degreeOfFreedomSet(testFunctionNumber, dofNumber)] +=
00245 value_rjk * basisOrDerivativeValueV0[r][i];
00246 }
00247 }
00248 }
00249 }
00250 }
00251 }
00252 }
00253
00259 void _getA(const Structured3DVector<real_t>& coef,
00260 const real_t& detXU, const real_t& detYU, const real_t& detZU,
00261 const real_t& detXV, const real_t& detYV, const real_t& detZV,
00262 const Vector<Vector<real_t> >& basisOrDerivativeValueU0,
00263 const Vector<Vector<real_t> >& basisOrDerivativeValueU1,
00264 const Vector<Vector<real_t> >& basisOrDerivativeValueU2,
00265 const Vector<Vector<real_t> >& basisOrDerivativeValueV0,
00266 const Vector<Vector<real_t> >& basisOrDerivativeValueV1,
00267 const Vector<Vector<real_t> >& basisOrDerivativeValueV2,
00268 const size_t& unknownNumber,
00269 DoubleHashedMatrix& A) const
00270 {
00271 }
00272
00278 void _getD(const Structured3DVector<real_t>& coef,
00279 const real_t& detXU, const real_t& detYU, const real_t& detZU,
00280 const real_t& detXV, const real_t& detYV, const real_t& detZV,
00281 const Vector<Vector<real_t> >& basisOrDerivativeValueU0,
00282 const Vector<Vector<real_t> >& basisOrDerivativeValueU1,
00283 const Vector<Vector<real_t> >& basisOrDerivativeValueU2,
00284 const Vector<Vector<real_t> >& basisOrDerivativeValueV0,
00285 const Vector<Vector<real_t> >& basisOrDerivativeValueV1,
00286 const Vector<Vector<real_t> >& basisOrDerivativeValueV2,
00287 const size_t& unknownNumber,
00288 Vector<real_t>& v) const
00289 {
00290 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& unknownBasis
00291 = __basisU[unknownNumber];
00292
00293
00294 TinyVector<3, Vector<real_t> > diag;
00295 for (size_t i=0; i< 3; ++i) {
00296 diag[i].resize(__gaussLobatto[i]->numberOfPoints());
00297 diag[i] =0;
00298 }
00299
00300 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
00301 const real_t& wr = __gaussLobatto[0]->weight(r);
00302 for (size_t i=0; i < unknownBasis[0]->dimension(); ++i) {
00303 diag[0][i] += basisOrDerivativeValueU0[r][i]* basisOrDerivativeValueV0[r][i]* wr;
00304 }
00305 }
00306
00307 for (size_t s=0; s < __gaussLobatto[1]->numberOfPoints(); ++s) {
00308 const real_t& ws = __gaussLobatto[1]->weight(s);
00309 for (size_t j=0; j < unknownBasis[1]->dimension(); ++j) {
00310 diag[1][j] += basisOrDerivativeValueU1[s][j]* basisOrDerivativeValueV1[s][j]* ws;
00311 }
00312 }
00313
00314 for (size_t t=0; t < __gaussLobatto[2]->numberOfPoints(); ++t) {
00315 const real_t& wt = __gaussLobatto[2]->weight(t);
00316 for (size_t k=0; k < unknownBasis[2]->dimension(); ++k) {
00317 diag[2][k] += basisOrDerivativeValueU2[t][k]* basisOrDerivativeValueV2[t][k]* wt;
00318 }
00319 }
00320 const TinyVector<3,size_t>& dofShapeU = __dofShape[unknownNumber];
00321 const real_t det = detXU * detYU *detZU *detXV *detYV *detZV
00322 * __transform[0]->determinant()
00323 * __transform[1]->determinant()
00324 * __transform[2]->determinant() ;
00325
00326 for (size_t i=0; i < unknownBasis[0]->dimension(); ++i){
00327 const real_t diag1= diag[0][i]*det;
00328 for (size_t j=0; j < unknownBasis[1]->dimension(); ++j){
00329 const real_t diag2 = diag1 *diag[1][j];
00330 for (size_t k=0; k < unknownBasis[2]->dimension(); ++k){
00331 size_t l = i*dofShapeU[1]*dofShapeU[2] + j*dofShapeU[2] + k;
00332 v[__degreeOfFreedomSet(unknownNumber,l)] += diag2*diag[2][k];
00333 }
00334 }
00335 }
00336 }
00337
00338 public:
00345 void timesX(const BaseVector& U, BaseVector& V) const
00346 {
00347 const Vector<real_t>& u = dynamic_cast<const Vector<real_t>&>(U);
00348 Vector<real_t>& v = dynamic_cast<Vector<real_t>&>(V);
00349
00350 const size_t& numberOfUnknown = __problem.numberOfUnknown();
00351
00352 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseValuesU(numberOfUnknown);
00353 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseDerivativeValuesU(numberOfUnknown);
00354
00355 for (size_t unknownNumber =0; unknownNumber < numberOfUnknown; ++unknownNumber){
00356 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& unknownBasis
00357 = __basisU[unknownNumber];
00358
00359 for(size_t i=0; i<3; ++i){
00360 quadratureBaseValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
00361 quadratureBaseDerivativeValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
00362 for(size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints();++j){
00363 real_t xi=(*__transformU[unknownNumber][i]).inverse((*__transform[i])((*__gaussLobatto[i])(j)));
00364 quadratureBaseValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
00365 quadratureBaseDerivativeValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
00366 unknownBasis[i]->getValues(xi,quadratureBaseValuesU[unknownNumber][i][j]);
00367 unknownBasis[i]->getDerivativeValues(xi,quadratureBaseDerivativeValuesU[unknownNumber][i][j]);
00368 }
00369 }
00370 }
00371
00372 switch (__problem.type()) {
00373 case Problem::pde: {
00374 const PDESystem& pdeSystem = dynamic_cast<const PDESystem&>(__problem);
00375
00376 throw ErrorHandler(__FILE__,__LINE__,
00377 "not implemented yet!",
00378 ErrorHandler::unexpected);
00379 break;
00380 }
00381 case Problem::variational: {
00382 const VariationalProblem& P
00383 = dynamic_cast<const VariationalProblem&>(__problem);
00384
00385 for (VariationalProblem::bilinearOperatorConst_iterator
00386 iOperator = P.beginBilinearOperator();
00387 iOperator != P.endBilinearOperator(); ++iOperator) {
00388
00389 switch ((**iOperator).type()) {
00390 case VariationalBilinearOperator::alphaUV: {
00391 const VariationalAlphaUVOperator& alphaUV
00392 = dynamic_cast<const VariationalAlphaUVOperator&>(**iOperator);
00393
00394 const ScalarFunctionBase& alpha = *alphaUV.alpha();
00395
00396 Structured3DVector<real_t> alpha_rst(Array3DShape(__gaussLobatto[0]->numberOfPoints(),
00397 __gaussLobatto[1]->numberOfPoints(),
00398 __gaussLobatto[2]->numberOfPoints()));
00399
00400
00401 _interpolateLagrange(alpha,alpha_rst);
00402 _getAu(alpha_rst,
00403 1.,1.,1.,
00404 1.,1.,1.,
00405 quadratureBaseValuesU[alphaUV.unknownNumber()][0],
00406 quadratureBaseValuesU[alphaUV.unknownNumber()][1],
00407 quadratureBaseValuesU[alphaUV.unknownNumber()][2],
00408 quadratureBaseValuesU[alphaUV.testFunctionNumber()][0],
00409 quadratureBaseValuesU[alphaUV.testFunctionNumber()][1],
00410 quadratureBaseValuesU[alphaUV.testFunctionNumber()][2],
00411 alphaUV.unknownNumber(),alphaUV.testFunctionNumber(),
00412 u,v);
00413 break;
00414 }
00415
00416 case VariationalBilinearOperator::muGradUGradV: {
00417 const VariationalMuGradUGradVOperator& muGradUgradV
00418 = dynamic_cast<const VariationalMuGradUGradVOperator&>(**iOperator);
00419 const ScalarFunctionBase& mu = *muGradUgradV.mu();
00420
00421 Structured3DVector<real_t> mu_rst(__gaussLobatto[0]->numberOfPoints(),
00422 __gaussLobatto[1]->numberOfPoints(),
00423 __gaussLobatto[2]->numberOfPoints());
00424 _interpolateLagrange(mu,mu_rst);
00425
00426 _getAu(mu_rst,
00427 __transformU[muGradUgradV.unknownNumber()][0]->inverseDeterminant(),1.,1.,
00428 __transformU[muGradUgradV.testFunctionNumber()][0]->inverseDeterminant(),1.,1.,
00429 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][0],
00430 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
00431 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
00432 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][0],
00433 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
00434 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
00435 muGradUgradV.unknownNumber(), muGradUgradV.testFunctionNumber(),
00436 u,v);
00437
00438 _getAu(mu_rst,
00439 1.,__transformU[muGradUgradV.unknownNumber()][1]->inverseDeterminant(),1.,
00440 1.,__transformU[muGradUgradV.testFunctionNumber()][1]->inverseDeterminant(),1.,
00441 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
00442 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][1],
00443 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
00444 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
00445 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][1],
00446 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
00447 muGradUgradV.unknownNumber(), muGradUgradV.testFunctionNumber(),
00448 u,v);
00449
00450 _getAu(mu_rst,
00451 1., 1.,__transformU[muGradUgradV.unknownNumber()][2]->inverseDeterminant(),
00452 1., 1.,__transformU[muGradUgradV.testFunctionNumber()][2]->inverseDeterminant(),
00453 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
00454 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
00455 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][2],
00456 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
00457 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
00458 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][2],
00459 muGradUgradV.unknownNumber(), muGradUgradV.testFunctionNumber(),
00460 u,v);
00461 break;
00462 }
00463 case VariationalBilinearOperator::alphaDxUDxV: {
00464 const VariationalAlphaDxUDxVOperator& alphaDxUDxV
00465 = dynamic_cast<const VariationalAlphaDxUDxVOperator&>(**iOperator);
00466 const ScalarFunctionBase& alpha = *alphaDxUDxV.alpha();
00467
00468
00469
00470
00471
00472
00473 TinyVector<3, real_t> detsU;
00474 detsU[0] = 1.;
00475 detsU[1] = 1.;
00476 detsU[2] = 1.;
00477
00478 TinyVector<3, real_t> detsV;
00479 detsV[0] = 1.;
00480 detsV[1] = 1.;
00481 detsV[2] = 1.;
00482
00483 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
00484 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
00485
00486
00487
00488 for (size_t i=0; i<3;++i) {
00489 pQuadratureUValues[i] = &quadratureBaseValuesU[alphaDxUDxV.unknownNumber()][i];
00490 pQuadratureVValues[i] = &quadratureBaseValuesU[alphaDxUDxV.testFunctionNumber()][i];
00491 }
00492
00493 detsU[alphaDxUDxV.j()] *=
00494 __transformU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()]->inverseDeterminant();
00495
00496 detsV[alphaDxUDxV.i()] *=
00497 __transformU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()]->inverseDeterminant();
00498 pQuadratureUValues[alphaDxUDxV.j()] =
00499 &quadratureBaseDerivativeValuesU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()];
00500
00501 pQuadratureVValues[alphaDxUDxV.i()] =
00502 &quadratureBaseDerivativeValuesU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()];
00503
00504 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
00505 __gaussLobatto[1]->numberOfPoints(),
00506 __gaussLobatto[2]->numberOfPoints());
00507 _interpolateLagrange(alpha,alpha_rst);
00508
00509 _getAu(alpha_rst,
00510 detsU[0],detsU[1], detsU[2],
00511 detsV[0],detsV[1], detsV[2],
00512 *pQuadratureUValues[0],*pQuadratureUValues[1],*pQuadratureUValues[2],
00513 *pQuadratureVValues[0],*pQuadratureVValues[1],*pQuadratureVValues[2],
00514 alphaDxUDxV.unknownNumber(), alphaDxUDxV.testFunctionNumber(),
00515 u,v);
00516
00517 break;
00518 }
00519
00520 case VariationalBilinearOperator::nuUdxV: {
00521 const VariationalNuUdxVOperator& nuUdxV
00522 = dynamic_cast<const VariationalNuUdxVOperator&>(**iOperator);
00523
00524 const ScalarFunctionBase& nu = *nuUdxV.nu();
00525
00526
00527
00528
00529
00530 TinyVector<3, real_t> detsV;
00531 detsV[0] = 1.;
00532 detsV[1] = 1.;
00533 detsV[2] = 1.;
00534
00535 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
00536
00537 for (size_t i=0; i<3;++i) {
00538 pQuadratureVValues[i] = &quadratureBaseValuesU[nuUdxV.testFunctionNumber()][i];
00539 }
00540
00541 detsV[nuUdxV.i()] *=
00542 __transformU[nuUdxV.testFunctionNumber()][nuUdxV.i()]->inverseDeterminant();
00543
00544 pQuadratureVValues[nuUdxV.i()] =
00545 &quadratureBaseDerivativeValuesU[nuUdxV.testFunctionNumber()][nuUdxV.i()];
00546
00547 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
00548 __gaussLobatto[1]->numberOfPoints(),
00549 __gaussLobatto[2]->numberOfPoints());
00550
00551 _interpolateLagrange(nu,nu_rst);
00552
00553 _getAu(nu_rst,
00554 1.,1.,1.,
00555 detsV[0], detsV[1], detsV[2],
00556 quadratureBaseValuesU[nuUdxV.unknownNumber()][0],
00557 quadratureBaseValuesU[nuUdxV.unknownNumber()][1],
00558 quadratureBaseValuesU[nuUdxV.unknownNumber()][2],
00559 *pQuadratureVValues[0],
00560 *pQuadratureVValues[1],
00561 *pQuadratureVValues[2],
00562 nuUdxV.unknownNumber(), nuUdxV.testFunctionNumber(),
00563 u,v);
00564
00565 break;
00566 }
00567
00568
00569 case VariationalBilinearOperator::nuDxUV: {
00570 const VariationalNuDxUVOperator& nuDxUV
00571 = dynamic_cast<const VariationalNuDxUVOperator&>(**iOperator);
00572
00573 const ScalarFunctionBase& nu = *nuDxUV.nu();
00574
00575
00576
00577
00578
00579 TinyVector<3, real_t> detsU;
00580 detsU[0] = 1.;
00581 detsU[1] = 1.;
00582 detsU[2] = 1.;
00583
00584 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
00585
00586
00587
00588 for (size_t i=0; i<3;++i) {
00589 pQuadratureUValues[i] = &quadratureBaseValuesU[nuDxUV.unknownNumber()][i];
00590 }
00591
00592 detsU[nuDxUV.i()] *=
00593 __transformU[nuDxUV.unknownNumber()][nuDxUV.i()]->inverseDeterminant();
00594
00595 pQuadratureUValues[nuDxUV.i()] =
00596 &quadratureBaseDerivativeValuesU[nuDxUV.unknownNumber()][nuDxUV.i()];
00597
00598 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
00599 __gaussLobatto[1]->numberOfPoints(),
00600 __gaussLobatto[2]->numberOfPoints());
00601
00602 _interpolateLagrange(nu,nu_rst);
00603
00604 _getAu(nu_rst,
00605 detsU[0], detsU[1], detsU[2],
00606 1.,1.,1.,
00607 *pQuadratureUValues[0],
00608 *pQuadratureUValues[1],
00609 *pQuadratureUValues[2],
00610 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][0],
00611 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][1],
00612 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][2],
00613 nuDxUV.unknownNumber(), nuDxUV.testFunctionNumber(),
00614 u,v);
00615
00616 break;
00617 }
00618 default: {
00619 throw ErrorHandler(__FILE__,__LINE__,
00620 "unexpected operator type",
00621 ErrorHandler::unexpected);
00622 }
00623 }
00624 }
00625 break;
00626 }
00627 default: {
00628 throw ErrorHandler(__FILE__,__LINE__,
00629 "unexpected problem type",
00630 ErrorHandler::unexpected);
00631 }
00632 }
00633 }
00634
00641 void transposedTimesX(const BaseVector& X, BaseVector& Z) const
00642 {
00643 const Vector<real_t>& x = dynamic_cast<const Vector<real_t>&>(X);
00644 Vector<real_t>& z = dynamic_cast<Vector<real_t>&>(Z);
00645
00646 const size_t& numberOfUnknown = __problem.numberOfUnknown();
00647
00648 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseValuesU(numberOfUnknown);
00649 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseDerivativeValuesU(numberOfUnknown);
00650
00651 for (size_t unknownNumber =0; unknownNumber < numberOfUnknown; ++ unknownNumber){
00652 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& unknownBasis
00653 = __basisU[unknownNumber];
00654
00655 for(size_t i=0; i<3; ++i){
00656 quadratureBaseValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
00657 quadratureBaseDerivativeValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
00658 for(size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints();++j){
00659 real_t xi=(*__transformU[unknownNumber][i]).inverse((*__transform[i])((*__gaussLobatto[i])(j)));
00660
00661 quadratureBaseValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
00662 quadratureBaseDerivativeValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
00663 unknownBasis[i]->getValues(xi,quadratureBaseValuesU[unknownNumber][i][j]);
00664 unknownBasis[i]->getDerivativeValues(xi,quadratureBaseDerivativeValuesU[unknownNumber][i][j]);
00665 }
00666 }
00667 }
00668
00669 switch (__problem.type()) {
00670 case Problem::pde: {
00671 const PDESystem& pdeSystem = dynamic_cast<const PDESystem&>(__problem);
00672
00673 throw ErrorHandler(__FILE__,__LINE__,
00674 "not implemented yet!",
00675 ErrorHandler::unexpected);
00676 break;
00677 }
00678 case Problem::variational: {
00679 const VariationalProblem& P
00680 = dynamic_cast<const VariationalProblem&>(__problem);
00681
00682 for (VariationalProblem::bilinearOperatorConst_iterator
00683 iOperator = P.beginBilinearOperator();
00684 iOperator != P.endBilinearOperator(); ++iOperator) {
00685
00686 switch ((**iOperator).type()) {
00687 case VariationalBilinearOperator::alphaUV: {
00688 const VariationalAlphaUVOperator& alphaUV
00689 = dynamic_cast<const VariationalAlphaUVOperator&>(**iOperator);
00690
00691 const ScalarFunctionBase& alpha = *alphaUV.alpha();
00692
00693 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
00694 __gaussLobatto[1]->numberOfPoints(),
00695 __gaussLobatto[2]->numberOfPoints());
00696
00697 _interpolateLagrange(alpha,alpha_rst);
00698
00699 _getAu(alpha_rst,
00700 1.,1.,1.,
00701 1.,1.,1.,
00702 quadratureBaseValuesU[alphaUV.testFunctionNumber()][0],
00703 quadratureBaseValuesU[alphaUV.testFunctionNumber()][1],
00704 quadratureBaseValuesU[alphaUV.testFunctionNumber()][2],
00705 quadratureBaseValuesU[alphaUV.unknownNumber()][0],
00706 quadratureBaseValuesU[alphaUV.unknownNumber()][1],
00707 quadratureBaseValuesU[alphaUV.unknownNumber()][2],
00708 alphaUV.testFunctionNumber(),alphaUV.unknownNumber(),
00709 x,z);
00710 break;
00711 }
00712
00713 case VariationalBilinearOperator::muGradUGradV: {
00714 const VariationalMuGradUGradVOperator& muGradUgradV
00715 = dynamic_cast<const VariationalMuGradUGradVOperator&>(**iOperator);
00716 const ScalarFunctionBase& mu = *muGradUgradV.mu();
00717
00718 Structured3DVector<real_t> mu_rst(__gaussLobatto[0]->numberOfPoints(),
00719 __gaussLobatto[1]->numberOfPoints(),
00720 __gaussLobatto[2]->numberOfPoints());
00721
00722 _interpolateLagrange(mu,mu_rst);
00723
00724 _getAu(mu_rst,
00725 __transformU[muGradUgradV.testFunctionNumber()][0]->inverseDeterminant(),1.,1.,
00726 __transformU[muGradUgradV.unknownNumber()][0]->inverseDeterminant(),1.,1.,
00727 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][0],
00728 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
00729 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
00730 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][0],
00731 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
00732 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
00733 muGradUgradV.testFunctionNumber(), muGradUgradV.unknownNumber(),
00734 x,z);
00735
00736 _getAu(mu_rst,
00737 1.,__transformU[muGradUgradV.testFunctionNumber()][1]->inverseDeterminant(),1.,
00738 1.,__transformU[muGradUgradV.unknownNumber()][1]->inverseDeterminant(),1.,
00739 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
00740 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][1],
00741 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
00742 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
00743 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][1],
00744 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
00745 muGradUgradV.testFunctionNumber(), muGradUgradV.unknownNumber(),
00746 x,z);
00747
00748 _getAu(mu_rst,
00749 1., 1.,__transformU[muGradUgradV.testFunctionNumber()][2]->inverseDeterminant(),
00750 1., 1.,__transformU[muGradUgradV.unknownNumber()][2]->inverseDeterminant(),
00751 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
00752 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
00753 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][2],
00754 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
00755 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
00756 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][2],
00757 muGradUgradV.testFunctionNumber(), muGradUgradV.unknownNumber(),
00758 x,z);
00759 break;
00760 }
00761
00762 case VariationalBilinearOperator::alphaDxUDxV: {
00763 const VariationalAlphaDxUDxVOperator& alphaDxUDxV
00764 = dynamic_cast<const VariationalAlphaDxUDxVOperator&>(**iOperator);
00765 const ScalarFunctionBase& alpha = *alphaDxUDxV.alpha();
00766
00767
00768
00769
00770 TinyVector<3, real_t> detsU;
00771 detsU[0] = 1.;
00772 detsU[1] = 1.;
00773 detsU[2] = 1.;
00774
00775 TinyVector<3, real_t> detsV;
00776 detsV[0] = 1.;
00777 detsV[1] = 1.;
00778 detsV[2] = 1.;
00779
00780 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
00781 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
00782
00783
00784 for (size_t i=0; i<3;++i) {
00785 pQuadratureUValues[i] = &quadratureBaseValuesU[alphaDxUDxV.unknownNumber()][i];
00786 pQuadratureVValues[i] = &quadratureBaseValuesU[alphaDxUDxV.testFunctionNumber()][i];
00787 }
00788
00789 detsU[alphaDxUDxV.j()] *= __transformU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()]->inverseDeterminant();
00790
00791 detsV[alphaDxUDxV.i()] *= __transformU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()]->inverseDeterminant();
00792
00793 pQuadratureUValues[alphaDxUDxV.j()] = &quadratureBaseDerivativeValuesU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()];
00794
00795 pQuadratureVValues[alphaDxUDxV.i()] = &quadratureBaseDerivativeValuesU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()];
00796
00797 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
00798 __gaussLobatto[1]->numberOfPoints(),
00799 __gaussLobatto[2]->numberOfPoints());
00800
00801 _interpolateLagrange(alpha,alpha_rst);
00802
00803 _getAu(alpha_rst,
00804 detsV[0], detsV[1], detsV[2],
00805 detsU[0], detsU[1], detsU[2],
00806 *pQuadratureVValues[0],*pQuadratureVValues[1],*pQuadratureVValues[2],
00807 *pQuadratureUValues[0],*pQuadratureUValues[1],*pQuadratureUValues[2],
00808 alphaDxUDxV.testFunctionNumber(), alphaDxUDxV.unknownNumber(),
00809 x,z);
00810 break;
00811 }
00812
00813 case VariationalBilinearOperator::nuUdxV: {
00814 const VariationalNuUdxVOperator& nuUdxV
00815 = dynamic_cast<const VariationalNuUdxVOperator&>(**iOperator);
00816
00817 const ScalarFunctionBase& nu = *nuUdxV.nu();
00818
00819 TinyVector<3, real_t> detsV;
00820 detsV[0] = 1.;
00821 detsV[1] = 1.;
00822 detsV[2] = 1.;
00823
00824 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
00825
00826 for (size_t i=0; i<3;++i) {
00827
00828 pQuadratureVValues[i] = &quadratureBaseValuesU[nuUdxV.testFunctionNumber()][i];
00829 }
00830
00831 detsV[nuUdxV.i()] *= __transformU[nuUdxV.testFunctionNumber()][nuUdxV.i()]->inverseDeterminant();
00832 pQuadratureVValues[nuUdxV.i()] = &quadratureBaseDerivativeValuesU[nuUdxV.testFunctionNumber()][nuUdxV.i()];
00833
00834
00835 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
00836 __gaussLobatto[1]->numberOfPoints(),
00837 __gaussLobatto[2]->numberOfPoints());
00838
00839 _interpolateLagrange(nu,nu_rst);
00840
00841 _getAu(nu_rst,
00842 detsV[0], detsV[1], detsV[2],
00843 1.,1.,1.,
00844 *pQuadratureVValues[0],
00845 *pQuadratureVValues[1],
00846 *pQuadratureVValues[2],
00847 quadratureBaseValuesU[ nuUdxV.unknownNumber()][0],
00848 quadratureBaseValuesU[ nuUdxV.unknownNumber()][1],
00849 quadratureBaseValuesU[ nuUdxV.unknownNumber()][2],
00850 nuUdxV.testFunctionNumber(),nuUdxV.unknownNumber(),
00851 x,z);
00852 break;
00853 }
00854 case VariationalBilinearOperator::nuDxUV: {
00855 const VariationalNuDxUVOperator& nuDxUV
00856 = dynamic_cast<const VariationalNuDxUVOperator&>(**iOperator);
00857
00858 const ScalarFunctionBase& nu = *nuDxUV.nu();
00859
00860
00861
00862 TinyVector<3, real_t> detsU;
00863 detsU[0] = 1.;
00864 detsU[1] = 1.;
00865 detsU[2] = 1.;
00866
00867 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
00868
00869 for (size_t i=0; i<3;++i) {
00870 pQuadratureUValues[i] = &quadratureBaseValuesU[nuDxUV.unknownNumber()][i];
00871 }
00872
00873 detsU[nuDxUV.i()] *= __transformU[nuDxUV.unknownNumber()][nuDxUV.i()]->inverseDeterminant();
00874 pQuadratureUValues[nuDxUV.i()] = &quadratureBaseDerivativeValuesU[nuDxUV.unknownNumber()][nuDxUV.i()];
00875
00876 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
00877 __gaussLobatto[1]->numberOfPoints(),
00878 __gaussLobatto[2]->numberOfPoints());
00879
00880 _interpolateLagrange(nu,nu_rst);
00881
00882 _getAu(nu_rst,
00883 detsU[0], detsU[1], detsU[2],
00884 1.,1.,1.,
00885 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][0],
00886 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][1],
00887 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][2],
00888 *pQuadratureUValues[0],
00889 *pQuadratureUValues[1],
00890 *pQuadratureUValues[2],
00891 nuDxUV.testFunctionNumber(),nuDxUV.unknownNumber(),
00892 x,z);
00893 break;
00894 }
00895 default: {
00896 throw ErrorHandler(__FILE__,__LINE__,
00897 "unexpected operator type",
00898 ErrorHandler::unexpected);
00899 }
00900 }
00901 }
00902 break;
00903 }
00904 default: {
00905 throw ErrorHandler(__FILE__,__LINE__,
00906 "unexpected problem type",
00907 ErrorHandler::unexpected);
00908 }
00909 }
00910 }
00911
00912 void getMultiDiagonal(BaseMatrix& ABase) const
00913 {
00914 DoubleHashedMatrix& A = dynamic_cast <DoubleHashedMatrix&> (ABase);
00915
00916 const size_t& numberOfUnknown = __problem.numberOfUnknown();
00917
00918 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseValuesU(numberOfUnknown);
00919 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseDerivativeValuesU(numberOfUnknown);
00920
00921 for (size_t unknownNumber =0; unknownNumber < numberOfUnknown; ++unknownNumber){
00922 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& unknownBasis
00923 = __basisU[unknownNumber];
00924
00925 for(size_t i=0; i<3; ++i){
00926 quadratureBaseValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
00927 quadratureBaseDerivativeValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
00928 for(size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints();++j){
00929 real_t xi=(*__transformU[unknownNumber][i]).inverse((*__transform[i])((*__gaussLobatto[i])(j)));
00930 quadratureBaseValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
00931 quadratureBaseDerivativeValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
00932 unknownBasis[i]->getValues(xi,quadratureBaseValuesU[unknownNumber][i][j]);
00933 unknownBasis[i]->getDerivativeValues(xi,quadratureBaseDerivativeValuesU[unknownNumber][i][j]);
00934 }
00935 }
00936 }
00937 switch (__problem.type()) {
00938 case Problem::pde: {
00939 const PDESystem& pdeSystem = dynamic_cast<const PDESystem&>(__problem);
00940
00941 throw ErrorHandler(__FILE__,__LINE__,
00942 "not implemented yet!",
00943 ErrorHandler::unexpected);
00944 break;
00945 }
00946 case Problem::variational: {
00947 const VariationalProblem& P
00948 = dynamic_cast<const VariationalProblem&>(__problem);
00949
00950 for (VariationalProblem::bilinearOperatorConst_iterator
00951 iOperator = P.beginBilinearOperator();
00952 iOperator != P.endBilinearOperator(); ++iOperator) {
00953
00954 switch ((**iOperator).type()) {
00955 case VariationalBilinearOperator::alphaUV: {
00956 const VariationalAlphaUVOperator& alphaUV
00957 = dynamic_cast<const VariationalAlphaUVOperator&>(**iOperator);
00958
00959 const ScalarFunctionBase& alpha = *alphaUV.alpha();
00960
00961 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
00962 __gaussLobatto[1]->numberOfPoints(),
00963 __gaussLobatto[2]->numberOfPoints());
00964
00965 _interpolateLagrange(alpha,alpha_rst);
00966
00967 _getA(alpha_rst,
00968 1.,1.,1.,
00969 1.,1.,1.,
00970 quadratureBaseValuesU[alphaUV.unknownNumber()][0],
00971 quadratureBaseValuesU[alphaUV.unknownNumber()][1],
00972 quadratureBaseValuesU[alphaUV.unknownNumber()][2],
00973 quadratureBaseValuesU[alphaUV.testFunctionNumber()][0],
00974 quadratureBaseValuesU[alphaUV.testFunctionNumber()][1],
00975 quadratureBaseValuesU[alphaUV.testFunctionNumber()][2],
00976 alphaUV.unknownNumber(),
00977 A);
00978 break;
00979 }
00980
00981 case VariationalBilinearOperator::muGradUGradV: {
00982 const VariationalMuGradUGradVOperator& muGradUgradV
00983 = dynamic_cast<const VariationalMuGradUGradVOperator&>(**iOperator);
00984 const ScalarFunctionBase& mu = *muGradUgradV.mu();
00985
00986 Structured3DVector<real_t> mu_rst(__gaussLobatto[0]->numberOfPoints(),
00987 __gaussLobatto[1]->numberOfPoints(),
00988 __gaussLobatto[2]->numberOfPoints());
00989
00990
00991 _interpolateLagrange(mu,mu_rst);
00992
00993 _getA(mu_rst,
00994 __transformU[muGradUgradV.unknownNumber()][0]->inverseDeterminant(),1.,1.,
00995 __transformU[muGradUgradV.testFunctionNumber()][0]->inverseDeterminant(),1.,1.,
00996 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][0],
00997 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
00998 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
00999 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][0],
01000 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
01001 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
01002 muGradUgradV.unknownNumber(),
01003 A);
01004
01005 _getA(mu_rst,
01006 1.,__transformU[muGradUgradV.unknownNumber()][1]->inverseDeterminant(),1.,
01007 1.,__transformU[muGradUgradV.testFunctionNumber()][1]->inverseDeterminant(),1.,
01008 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
01009 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][1],
01010 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
01011 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
01012 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][1],
01013 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
01014 muGradUgradV.unknownNumber(),
01015 A);
01016
01017 _getA(mu_rst,
01018 1., 1.,__transformU[muGradUgradV.unknownNumber()][2]->inverseDeterminant(),
01019 1., 1.,__transformU[muGradUgradV.testFunctionNumber()][2]->inverseDeterminant(),
01020 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
01021 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
01022 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][2],
01023 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
01024 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
01025 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][2],
01026 muGradUgradV.unknownNumber(),
01027 A);
01028 break;
01029 }
01030 case VariationalBilinearOperator::alphaDxUDxV: {
01031 const VariationalAlphaDxUDxVOperator& alphaDxUDxV
01032 = dynamic_cast<const VariationalAlphaDxUDxVOperator&>(**iOperator);
01033 const ScalarFunctionBase& alpha = *alphaDxUDxV.alpha();
01034
01035 TinyVector<3, real_t> detsU;
01036 detsU[0] = 1.;
01037 detsU[1] = 1.;
01038 detsU[2] = 1.;
01039
01040 TinyVector<3, real_t> detsV;
01041 detsV[0] = 1.;
01042 detsV[1] = 1.;
01043 detsV[2] = 1.;
01044
01045 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
01046 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
01047
01048
01049
01050 for (size_t i=0; i<3;++i) {
01051 pQuadratureUValues[i] = &quadratureBaseValuesU[alphaDxUDxV.unknownNumber()][i];
01052 pQuadratureVValues[i] = &quadratureBaseValuesU[alphaDxUDxV.unknownNumber()][i];
01053 }
01054
01055 detsU[alphaDxUDxV.j()] *=
01056 __transformU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()]->inverseDeterminant();
01057
01058 detsV[alphaDxUDxV.i()] *=
01059 __transformU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()]->inverseDeterminant();
01060 pQuadratureUValues[alphaDxUDxV.j()] =
01061 &quadratureBaseDerivativeValuesU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()];
01062
01063 pQuadratureVValues[alphaDxUDxV.i()] =
01064 &quadratureBaseDerivativeValuesU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()];
01065
01066 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
01067 __gaussLobatto[1]->numberOfPoints(),
01068 __gaussLobatto[2]->numberOfPoints());
01069
01070 _interpolateLagrange(alpha,alpha_rst);
01071
01072 _getA(alpha_rst,
01073 detsU[0],detsU[1], detsU[2],
01074 detsV[0],detsV[1], detsV[2],
01075 *pQuadratureUValues[0],*pQuadratureUValues[1],*pQuadratureUValues[2],
01076 *pQuadratureVValues[0],*pQuadratureVValues[1],*pQuadratureVValues[2],
01077 alphaDxUDxV.unknownNumber(),
01078 A);
01079 break;
01080 }
01081 case VariationalBilinearOperator::nuUdxV: {
01082 const VariationalNuUdxVOperator& nuUdxV
01083 = dynamic_cast<const VariationalNuUdxVOperator&>(**iOperator);
01084
01085 const ScalarFunctionBase& nu = *nuUdxV.nu();
01086
01087 TinyVector<3, real_t> detsV;
01088 detsV[0] = 1.;
01089 detsV[1] = 1.;
01090 detsV[2] = 1.;
01091
01092 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
01093
01094 for (size_t i=0; i<3;++i) {
01095 pQuadratureVValues[i] = &quadratureBaseValuesU[nuUdxV.unknownNumber()][i];
01096 }
01097
01098 detsV[nuUdxV.i()] *=
01099 __transformU[nuUdxV.testFunctionNumber()][nuUdxV.i()]->inverseDeterminant();
01100
01101 pQuadratureVValues[nuUdxV.i()] =
01102 &quadratureBaseDerivativeValuesU[nuUdxV.testFunctionNumber()][nuUdxV.i()];
01103
01104 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
01105 __gaussLobatto[1]->numberOfPoints(),
01106 __gaussLobatto[2]->numberOfPoints());
01107
01108 _interpolateLagrange(nu,nu_rst);
01109
01110 _getA(nu_rst,
01111 1.,1.,1.,
01112 detsV[0], detsV[1], detsV[2],
01113 quadratureBaseValuesU[nuUdxV.unknownNumber()][0],
01114 quadratureBaseValuesU[nuUdxV.unknownNumber()][1],
01115 quadratureBaseValuesU[nuUdxV.unknownNumber()][2],
01116 *pQuadratureVValues[0], *pQuadratureVValues[1], *pQuadratureVValues[2],
01117 nuUdxV.unknownNumber(),
01118 A);
01119 break;
01120 }
01121 case VariationalBilinearOperator::nuDxUV: {
01122 const VariationalNuDxUVOperator& nuDxUV
01123 = dynamic_cast<const VariationalNuDxUVOperator&>(**iOperator);
01124
01125 const ScalarFunctionBase& nu = *nuDxUV.nu();
01126
01127
01128 TinyVector<3, real_t> detsU;
01129 detsU[0] = 1.;
01130 detsU[1] = 1.;
01131 detsU[2] = 1.;
01132
01133 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
01134
01135 for (size_t i=0; i<3;++i) {
01136 pQuadratureUValues[i] = &quadratureBaseValuesU[nuDxUV.unknownNumber()][i];
01137 }
01138 detsU[nuDxUV.i()] *=
01139 __transformU[nuDxUV.unknownNumber()][nuDxUV.i()]->inverseDeterminant();
01140
01141 pQuadratureUValues[nuDxUV.i()] =
01142 &quadratureBaseDerivativeValuesU[nuDxUV.unknownNumber()][nuDxUV.i()];
01143
01144 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
01145 __gaussLobatto[1]->numberOfPoints(),
01146 __gaussLobatto[2]->numberOfPoints());
01147
01148
01149 _interpolateLagrange(nu,nu_rst);
01150
01151 _getA(nu_rst,
01152 detsU[0], detsU[1], detsU[2],
01153 1.,1.,1.,
01154 *pQuadratureUValues[0],
01155 *pQuadratureUValues[1],
01156 *pQuadratureUValues[2],
01157 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][0],
01158 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][1],
01159 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][2],
01160 nuDxUV.unknownNumber(),
01161 A);
01162 break;
01163 }
01164 default: {
01165 throw ErrorHandler(__FILE__,__LINE__,
01166 "unexpected operator type",
01167 ErrorHandler::unexpected);
01168 }
01169 }
01170 }
01171 break;
01172 }
01173 default: {
01174 throw ErrorHandler(__FILE__,__LINE__,
01175 "unexpected problem type",
01176 ErrorHandler::unexpected);
01177 }
01178 }
01179 }
01180
01181 void getDiagonal(BaseVector& Z) const
01182 {
01183 Vector<real_t>& z = dynamic_cast<Vector<real_t>&>(Z);
01184
01185 const size_t& numberOfUnknown = __problem.numberOfUnknown();
01186
01187 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseValuesU(numberOfUnknown);
01188 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseDerivativeValuesU(numberOfUnknown);
01189
01190 for (size_t unknownNumber =0; unknownNumber < numberOfUnknown; ++unknownNumber){
01191 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& unknownBasis
01192 = __basisU[unknownNumber];
01193
01194 for(size_t i=0; i<3; ++i){
01195 quadratureBaseValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
01196 quadratureBaseDerivativeValuesU[unknownNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
01197 for(size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints();++j){
01198 real_t xi=(*__transformU[unknownNumber][i]).inverse((*__transform[i])((*__gaussLobatto[i])(j)));
01199 quadratureBaseValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
01200 quadratureBaseDerivativeValuesU[unknownNumber][i][j].resize(unknownBasis[i]->dimension());
01201 unknownBasis[i]->getValues(xi,quadratureBaseValuesU[unknownNumber][i][j]);
01202 unknownBasis[i]->getDerivativeValues(xi,quadratureBaseDerivativeValuesU[unknownNumber][i][j]);
01203 }
01204 }
01205 }
01206 switch (__problem.type()) {
01207 case Problem::pde: {
01208 const PDESystem& pdeSystem = dynamic_cast<const PDESystem&>(__problem);
01209
01210 throw ErrorHandler(__FILE__,__LINE__,
01211 "not implemented yet!",
01212 ErrorHandler::unexpected);
01213 break;
01214 }
01215 case Problem::variational: {
01216 const VariationalProblem& P
01217 = dynamic_cast<const VariationalProblem&>(__problem);
01218
01219 for (VariationalProblem::bilinearOperatorConst_iterator
01220 iOperator = P.beginBilinearOperator();
01221 iOperator != P.endBilinearOperator(); ++iOperator) {
01222
01223 switch ((**iOperator).type()) {
01224 case VariationalBilinearOperator::alphaUV: {
01225 const VariationalAlphaUVOperator& alphaUV
01226 = dynamic_cast<const VariationalAlphaUVOperator&>(**iOperator);
01227
01228 const ScalarFunctionBase& alpha = *alphaUV.alpha();
01229
01230 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
01231 __gaussLobatto[1]->numberOfPoints(),
01232 __gaussLobatto[2]->numberOfPoints());
01233
01234 _interpolateLagrange(alpha,alpha_rst);
01235
01236 _getD(alpha_rst,
01237 1.,1.,1.,
01238 1.,1.,1.,
01239 quadratureBaseValuesU[alphaUV.unknownNumber()][0],
01240 quadratureBaseValuesU[alphaUV.unknownNumber()][1],
01241 quadratureBaseValuesU[alphaUV.unknownNumber()][2],
01242 quadratureBaseValuesU[alphaUV.testFunctionNumber()][0],
01243 quadratureBaseValuesU[alphaUV.testFunctionNumber()][1],
01244 quadratureBaseValuesU[alphaUV.testFunctionNumber()][2],
01245 alphaUV.unknownNumber(),
01246 z);
01247 break;
01248 }
01249
01250 case VariationalBilinearOperator::muGradUGradV: {
01251 const VariationalMuGradUGradVOperator& muGradUgradV
01252 = dynamic_cast<const VariationalMuGradUGradVOperator&>(**iOperator);
01253 const ScalarFunctionBase& mu = *muGradUgradV.mu();
01254
01255 Structured3DVector<real_t> mu_rst(__gaussLobatto[0]->numberOfPoints(),
01256 __gaussLobatto[1]->numberOfPoints(),
01257 __gaussLobatto[2]->numberOfPoints());
01258
01259
01260 _interpolateLagrange(mu,mu_rst);
01261
01262 _getD(mu_rst,
01263 __transformU[muGradUgradV.unknownNumber()][0]->inverseDeterminant(),1.,1.,
01264 __transformU[muGradUgradV.testFunctionNumber()][0]->inverseDeterminant(),1.,1.,
01265 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][0],
01266 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
01267 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
01268 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][0],
01269 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
01270 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
01271 muGradUgradV.unknownNumber(),
01272 z);
01273
01274 _getD(mu_rst,
01275
01276 1.,__transformU[muGradUgradV.unknownNumber()][1]->inverseDeterminant(),1.,
01277 1.,__transformU[muGradUgradV.testFunctionNumber()][1]->inverseDeterminant(),1.,
01278 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
01279 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][1],
01280 quadratureBaseValuesU[muGradUgradV.unknownNumber()][2],
01281 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
01282 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][1],
01283 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][2],
01284 muGradUgradV.unknownNumber(),
01285 z);
01286
01287 _getD(mu_rst,
01288 1., 1.,__transformU[muGradUgradV.unknownNumber()][2]->inverseDeterminant(),
01289 1., 1.,__transformU[muGradUgradV.testFunctionNumber()][2]->inverseDeterminant(),
01290 quadratureBaseValuesU[muGradUgradV.unknownNumber()][0],
01291 quadratureBaseValuesU[muGradUgradV.unknownNumber()][1],
01292 quadratureBaseDerivativeValuesU[muGradUgradV.unknownNumber()][2],
01293 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][0],
01294 quadratureBaseValuesU[muGradUgradV.testFunctionNumber()][1],
01295 quadratureBaseDerivativeValuesU[muGradUgradV.testFunctionNumber()][2],
01296 muGradUgradV.unknownNumber(),
01297 z);
01298 break;
01299 }
01300 case VariationalBilinearOperator::alphaDxUDxV: {
01301 const VariationalAlphaDxUDxVOperator& alphaDxUDxV
01302 = dynamic_cast<const VariationalAlphaDxUDxVOperator&>(**iOperator);
01303 const ScalarFunctionBase& alpha = *alphaDxUDxV.alpha();
01304
01305 TinyVector<3, real_t> detsU;
01306 detsU[0] = 1.;
01307 detsU[1] = 1.;
01308 detsU[2] = 1.;
01309
01310 TinyVector<3, real_t> detsV;
01311 detsV[0] = 1.;
01312 detsV[1] = 1.;
01313 detsV[2] = 1.;
01314
01315 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
01316 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
01317
01318
01319
01320 for (size_t i=0; i<3;++i) {
01321 pQuadratureUValues[i] = &quadratureBaseValuesU[alphaDxUDxV.unknownNumber()][i];
01322 pQuadratureVValues[i] = &quadratureBaseValuesU[alphaDxUDxV.unknownNumber()][i];
01323 }
01324
01325 detsU[alphaDxUDxV.j()] *=
01326 __transformU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()]->inverseDeterminant();
01327
01328 detsV[alphaDxUDxV.i()] *=
01329 __transformU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()]->inverseDeterminant();
01330 pQuadratureUValues[alphaDxUDxV.j()] =
01331 &quadratureBaseDerivativeValuesU[alphaDxUDxV.unknownNumber()][alphaDxUDxV.j()];
01332
01333 pQuadratureVValues[alphaDxUDxV.i()] =
01334 &quadratureBaseDerivativeValuesU[alphaDxUDxV.testFunctionNumber()][alphaDxUDxV.i()];
01335
01336 Structured3DVector<real_t> alpha_rst(__gaussLobatto[0]->numberOfPoints(),
01337 __gaussLobatto[1]->numberOfPoints(),
01338 __gaussLobatto[2]->numberOfPoints());
01339
01340 _interpolateLagrange(alpha,alpha_rst);
01341
01342 _getD(alpha_rst,
01343 detsU[0],detsU[1], detsU[2],
01344 detsV[0],detsV[1], detsV[2],
01345 *pQuadratureUValues[0],*pQuadratureUValues[1],*pQuadratureUValues[2],
01346 *pQuadratureVValues[0],*pQuadratureVValues[1],*pQuadratureVValues[2],
01347 alphaDxUDxV.unknownNumber(),
01348 z);
01349 break;
01350 }
01351
01352 case VariationalBilinearOperator::nuUdxV: {
01353 const VariationalNuUdxVOperator& nuUdxV
01354 = dynamic_cast<const VariationalNuUdxVOperator&>(**iOperator);
01355
01356 const ScalarFunctionBase& nu = *nuUdxV.nu();
01357
01358 TinyVector<3, real_t> detsV;
01359 detsV[0] = 1.;
01360 detsV[1] = 1.;
01361 detsV[2] = 1.;
01362
01363 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureVValues(0,0,0);
01364
01365 for (size_t i=0; i<3;++i) {
01366 pQuadratureVValues[i] = &quadratureBaseValuesU[nuUdxV.unknownNumber()][i];
01367 }
01368
01369 detsV[nuUdxV.i()] *=
01370 __transformU[nuUdxV.testFunctionNumber()][nuUdxV.i()]->inverseDeterminant();
01371
01372 pQuadratureVValues[nuUdxV.i()] =
01373 &quadratureBaseDerivativeValuesU[nuUdxV.testFunctionNumber()][nuUdxV.i()];
01374
01375 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
01376 __gaussLobatto[1]->numberOfPoints(),
01377 __gaussLobatto[2]->numberOfPoints());
01378
01379 _interpolateLagrange(nu,nu_rst);
01380
01381 _getD(nu_rst,
01382 1.,1.,1.,
01383 detsV[0], detsV[1], detsV[2],
01384 quadratureBaseValuesU[nuUdxV.unknownNumber()][0],
01385 quadratureBaseValuesU[nuUdxV.unknownNumber()][1],
01386 quadratureBaseValuesU[nuUdxV.unknownNumber()][2],
01387 *pQuadratureVValues[0], *pQuadratureVValues[1], *pQuadratureVValues[2],
01388 nuUdxV.unknownNumber(),
01389 z);
01390 break;
01391 }
01392 case VariationalBilinearOperator::nuDxUV: {
01393 const VariationalNuDxUVOperator& nuDxUV
01394 = dynamic_cast<const VariationalNuDxUVOperator&>(**iOperator);
01395
01396 const ScalarFunctionBase& nu = *nuDxUV.nu();
01397
01398
01399 TinyVector<3, real_t> detsU;
01400 detsU[0] = 1.;
01401 detsU[1] = 1.;
01402 detsU[2] = 1.;
01403
01404 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureUValues(0,0,0);
01405
01406 for (size_t i=0; i<3;++i) {
01407 pQuadratureUValues[i] = &quadratureBaseValuesU[nuDxUV.unknownNumber()][i];
01408 }
01409 detsU[nuDxUV.i()] *=
01410 __transformU[nuDxUV.unknownNumber()][nuDxUV.i()]->inverseDeterminant();
01411
01412 pQuadratureUValues[nuDxUV.i()] =
01413 &quadratureBaseDerivativeValuesU[nuDxUV.unknownNumber()][nuDxUV.i()];
01414
01415 Structured3DVector<real_t> nu_rst(__gaussLobatto[0]->numberOfPoints(),
01416 __gaussLobatto[1]->numberOfPoints(),
01417 __gaussLobatto[2]->numberOfPoints());
01418
01419
01420 _interpolateLagrange(nu,nu_rst);
01421
01422 _getD(nu_rst,
01423 detsU[0], detsU[1], detsU[2],
01424 1.,1.,1.,
01425 *pQuadratureUValues[0],
01426 *pQuadratureUValues[1],
01427 *pQuadratureUValues[2],
01428 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][0],
01429 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][1],
01430 quadratureBaseValuesU[nuDxUV.testFunctionNumber()][2],
01431 nuDxUV.unknownNumber(),
01432 z);
01433 break;
01434 }
01435 default: {
01436 throw ErrorHandler(__FILE__,__LINE__,
01437 "unexpected operator type",
01438 ErrorHandler::unexpected);
01439 }
01440 }
01441 }
01442 break;
01443 }
01444 default: {
01445 throw ErrorHandler(__FILE__,__LINE__,
01446 "unexpected problem type",
01447 ErrorHandler::unexpected);
01448 }
01449 }
01450 }
01451
01456 void assembleSecondMember()
01457 {
01459 Vector<real_t>& b = (static_cast<Vector<real_t>&>(this->__b));
01460
01461
01462
01463
01464 const size_t& numberOfUnknown = __problem.numberOfUnknown();
01465
01466 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseValuesU(numberOfUnknown);
01467 Vector<TinyVector<3,Vector<Vector<real_t> > > > quadratureBaseDerivativeValuesU(numberOfUnknown);
01468
01469 for (size_t testFunctionNumber =0; testFunctionNumber < numberOfUnknown; ++ testFunctionNumber){
01470
01471 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& testBasis
01472 = __basisU[testFunctionNumber];
01473 for(size_t i=0; i<3; ++i){
01474 quadratureBaseValuesU[testFunctionNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
01475 quadratureBaseDerivativeValuesU[testFunctionNumber][i].resize((*__gaussLobatto[i]).numberOfPoints());
01476 for(size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints();++j){
01477 real_t xi= (*__transformU[testFunctionNumber][i]).inverse((*__transform[i])((*__gaussLobatto[i])(j)));
01478 quadratureBaseValuesU[testFunctionNumber][i][j].resize(testBasis[i]->dimension());
01479 quadratureBaseDerivativeValuesU[testFunctionNumber][i][j].resize(testBasis[i]->dimension());
01480 testBasis[i]->getValues(xi,quadratureBaseValuesU[testFunctionNumber][i][j]);
01481 testBasis[i]->getDerivativeValues(xi,quadratureBaseDerivativeValuesU[testFunctionNumber][i][j]);
01482 }
01483 }
01484 }
01485
01486
01487 TinyVector<3,Vector<real_t> > nodes;
01488 for( size_t i=0; i<3; ++i){
01489 nodes[i].resize((*__gaussLobatto[i]).numberOfPoints());
01490 for (size_t j=0; j<(*__gaussLobatto[i]).numberOfPoints(); ++j) {
01491 nodes[i][j] =(*__transform[i])((*__gaussLobatto[i])(j));
01492 }
01493 }
01494
01495 switch(__problem.type()) {
01496 case Problem::pde: {
01497 const PDESystem& pdeSystem
01498 = static_cast<const PDESystem&>(__problem);
01499
01500 throw ErrorHandler(__FILE__,__LINE__,
01501 "not implemented yet!",
01502 ErrorHandler::unexpected);
01503 break;
01504 }
01505 case Problem::variational: {
01506 const VariationalProblem& variationalProblem
01507 = dynamic_cast<const VariationalProblem&>(__problem);
01508
01509 for (VariationalProblem::linearOperatorConst_iterator i
01510 = variationalProblem.beginLinearOperator();
01511 i != variationalProblem.endLinearOperator(); ++i) {
01512 switch ((*(*i)).type()) {
01513 case VariationalLinearOperator::FV: {
01514 const VariationalOperatorFV& fv
01515 = dynamic_cast<const VariationalOperatorFV&>(*(*i));
01516
01517 const ScalarFunctionBase& f = fv.f();
01518
01519 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
01520 const real_t& x = nodes[0][r];
01521 const real_t& wr = __gaussLobatto[0]->weight(r);
01522
01523 for (size_t s=0; s < __gaussLobatto[1]->numberOfPoints(); ++s) {
01524 const real_t& y = nodes[1][s];
01525 const real_t& wrs = __gaussLobatto[1]->weight(s)*wr;
01526
01527 for (size_t t=0; t < __gaussLobatto[2]->numberOfPoints(); ++t) {
01528 const real_t& z = nodes[2][t];
01529 const real_t& wrst = __gaussLobatto[2]->weight(t)*wrs;
01530
01531 const real_t fweight = f(x,y,z)* wrst *
01532 (*__transform[0]).determinant()*
01533 (*__transform[1]).determinant()*
01534 (*__transform[2]).determinant();
01535
01536 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& testBasis
01537 = __basisU[fv.testFunctionNumber()];
01538
01539 const TinyVector<3,size_t>& dofShape = __dofShape[fv.testFunctionNumber()];
01540 for (size_t m=0; m< testBasis[0]->dimension(); ++m) {
01541 const real_t p1 = fweight*quadratureBaseValuesU[fv.testFunctionNumber()][0][r][m];
01542 for (size_t p=0; p< testBasis[1]->dimension(); ++p) {
01543 const real_t p2 = quadratureBaseValuesU[fv.testFunctionNumber()][1][s][p] *p1;
01544 for (size_t q=0; q< testBasis[2]->dimension(); ++q) {
01545 const real_t p3 = quadratureBaseValuesU[fv.testFunctionNumber()][2][t][q]*p2;
01546 size_t l = m*dofShape[1]*dofShape[2] + p*dofShape[2] + q;
01547 b[__degreeOfFreedomSet(fv.testFunctionNumber(),l)] +=p3;
01548 }
01549 }
01550 }
01551 }
01552 }
01553 }
01554
01555 break;
01556 }
01557
01558 case VariationalLinearOperator::FdxV: {
01559 const VariationalOperatorFdxV& fdxV
01560 = dynamic_cast<const VariationalOperatorFdxV&>(*(*i));
01561
01562 const ScalarFunctionBase& f = fdxV.f();
01563
01564 const TinyVector<3, ConstReferenceCounting<LegendreBasis> >& testBasis
01565 = __basisU[fdxV.testFunctionNumber()];
01566
01567 TinyVector<3,real_t> detsV;
01568 detsV[0] =1.;
01569 detsV[1] =1.;
01570 detsV[2] =1.;
01571
01572 TinyVector<3,Vector<Vector<real_t> >*>pQuadratureVValues(0,0,0);
01573 for (size_t i=0;i<3;i++){
01574 pQuadratureVValues[i] = &quadratureBaseValuesU[fdxV.testFunctionNumber()][i];
01575 }
01576
01577 detsV[fdxV.number()] *=
01578 __transformU[fdxV.testFunctionNumber()][fdxV.number()]->inverseDeterminant();
01579
01580 pQuadratureVValues[fdxV.number()] =
01581 &quadratureBaseDerivativeValuesU[fdxV.testFunctionNumber()][fdxV.number()];
01582
01583 for (size_t r=0; r < __gaussLobatto[0]->numberOfPoints(); ++r) {
01584 const real_t& x = nodes[0][r];
01585 const real_t& wr = __gaussLobatto[0]->weight(r);
01586
01587 for (size_t s=0; s < __gaussLobatto[1]->numberOfPoints(); ++s) {
01588 const real_t& y = nodes[1][s];
01589 const real_t& wrs = __gaussLobatto[1]->weight(s)*wr;
01590
01591 for (size_t t=0; t < __gaussLobatto[2]->numberOfPoints(); ++t) {
01592 const real_t& z = nodes[2][t];
01593 const real_t& wrst = __gaussLobatto[2]->weight(t)*wrs;
01594
01595 const real_t fweight = f(x,y,z)* wrst *
01596 (*__transform[0]).determinant()*
01597 (*__transform[1]).determinant()*
01598 (*__transform[2]).determinant()*
01599 detsV[0]*detsV[1]*detsV[2];
01600
01601 const TinyVector<3,size_t>& dofShape = __dofShape[fdxV.testFunctionNumber()];
01602
01603 for (size_t m=0; m< testBasis[0]->dimension(); ++m) {
01604 const real_t p1 = fweight*(*pQuadratureVValues[0])[r][m];
01605 for (size_t p=0; p< testBasis[1]->dimension(); ++p) {
01606 const real_t p2=(*pQuadratureVValues[1])[s][p] *p1;
01607 for (size_t q=0; q< testBasis[2]->dimension(); ++q) {
01608 const real_t p3= (*pQuadratureVValues[2])[t][q]*p2;
01609 size_t l = m*dofShape[1]*dofShape[2] + p*dofShape[2] + q; b[__degreeOfFreedomSet(fdxV.testFunctionNumber(),l)] +=p3;
01610 }
01611 }
01612 }
01613 }
01614 }
01615 }
01616
01617 break;
01618 }
01619 case VariationalLinearOperator::FdxGV: {
01620 const VariationalOperatorFdxGV& fdxGV
01621 = dynamic_cast<const VariationalOperatorFdxGV&>(*(*i));
01622
01623 const ScalarFunctionBase& f = fdxGV.f();
01624 const ScalarFunctionBase& g = fdxGV.g();
01625
01626 TinyVector<3, real_t> A;
01627 TinyVector<3, real_t> B;
01628 for (size_t direction=0; direction<3; ++direction) {
01629 A[direction] = __intervalU[fdxGV.testFunctionNumber()][direction]->a();
01630 B[direction] = __intervalU[fdxGV.testFunctionNumber()][direction]->b();
01631 }
01632
01633 Structured3DMeshShape s3dM(TinyVector<3,size_t>(__basisU[fdxGV.testFunctionNumber()][0]->dimension()-1,
01634 __basisU[fdxGV.testFunctionNumber()][1]->dimension()-1,
01635 __basisU[fdxGV.testFunctionNumber()][2]->dimension()-1),
01636 A, B);
01637 ReferenceCounting<VerticesCorrespondance> correspondance
01638 = new VerticesCorrespondance((__basisU[fdxGV.testFunctionNumber()][0]->dimension()+1)*
01639 (__basisU[fdxGV.testFunctionNumber()][1]->dimension()+1)*
01640 (__basisU[fdxGV.testFunctionNumber()][2]->dimension()+1));
01641
01642 ReferenceCounting<SpectralMesh> uMesh = new SpectralMesh(s3dM, correspondance);
01643 SpectralFunction gProjection(uMesh, g);
01644
01645 TinyVector<3,real_t> detsV;
01646 detsV[0] =1.;
01647 detsV[1] =1.;
01648 detsV[2] =1.;
01649
01650 detsV[fdxGV.number()] *=
01651 __transformU[fdxGV.testFunctionNumber()][fdxGV.number()]->inverseDeterminant();
01652
01653 TinyVector<3,Vector<Vector<real_t> >*> pQuadratureGValues(0,0,0);
01654 for (size_t i=0; i<3; ++i) {
01655 pQuadratureGValues[i] = &quadratureBaseValuesU[fdxGV.testFunctionNumber()][i];
01656 }
01657
01658 pQuadratureGValues[fdxGV.number()] =
01659 &quadratureBaseDerivativeValuesU[fdxGV.testFunctionNumber()][fdxGV.number()];
01660
01661 Structured3DVector<real_t> f_rst(__gaussLobatto[0]->numberOfPoints(),
01662 __gaussLobatto[1]->numberOfPoints(),
01663 __gaussLobatto[2]->numberOfPoints());
01664
01665 _interpolateLagrange(f,f_rst);
01666
01667 _getAu(f_rst,
01668 1.,1.,1.,
01669 detsV[0], detsV[1], detsV[2],
01670 *pQuadratureGValues[0],
01671 *pQuadratureGValues[1],
01672 *pQuadratureGValues[2],
01673 quadratureBaseValuesU[fdxGV.testFunctionNumber()][0],
01674 quadratureBaseValuesU[fdxGV.testFunctionNumber()][1],
01675 quadratureBaseValuesU[fdxGV.testFunctionNumber()][2],
01676 fdxGV.testFunctionNumber(),fdxGV.testFunctionNumber(),
01677 gProjection.values(),b);
01678
01679 break;
01680 }
01681
01682 case VariationalLinearOperator::FgradGgradV: {
01683 const VariationalOperatorFgradGgradV& fgradGgradV
01684 = dynamic_cast<const VariationalOperatorFgradGgradV&>(*(*i));
01685
01686 const ScalarFunctionBase& f = fgradGgradV.f();
01687 const ScalarFunctionBase& g = fgradGgradV.g();
01688
01689
01690 Structured3DVector<real_t> f_rst(Array3DShape(__gaussLobatto[0]->numberOfPoints(),
01691 __gaussLobatto[1]->numberOfPoints(),
01692 __gaussLobatto[2]->numberOfPoints()));
01693
01694
01695
01696
01697 _interpolateLagrange(f,f_rst);
01698
01699 TinyVector<3, real_t> A;
01700 TinyVector<3, real_t> B;
01701 for (size_t direction=0; direction<3; ++direction) {
01702 A[direction] = __intervalU[fgradGgradV.testFunctionNumber()][direction]->a();
01703 B[direction] = __intervalU[fgradGgradV.testFunctionNumber()][direction]->b();
01704 }
01705
01706 Structured3DMeshShape s3dM(TinyVector<3,size_t>(__basisU[fgradGgradV.testFunctionNumber()][0]->dimension()-1,
01707 __basisU[fgradGgradV.testFunctionNumber()][1]->dimension()-1,
01708 __basisU[fgradGgradV.testFunctionNumber()][2]->dimension()-1),
01709 A, B);
01710 ReferenceCounting<VerticesCorrespondance> correspondance
01711 = new VerticesCorrespondance((__basisU[fgradGgradV.testFunctionNumber()][0]->dimension()+1)*
01712 (__basisU[fgradGgradV.testFunctionNumber()][1]->dimension()+1)*
01713 (__basisU[fgradGgradV.testFunctionNumber()][2]->dimension()+1));
01714
01715 ReferenceCounting<SpectralMesh> uMesh = new SpectralMesh(s3dM, correspondance);
01716 SpectralFunction gProjection(uMesh, g);
01717
01718 _getAu(f_rst,
01719 __transformU[fgradGgradV.testFunctionNumber()][0]->inverseDeterminant(),1.,1.,
01720 __transformU[fgradGgradV.testFunctionNumber()][0]->inverseDeterminant(),1.,1.,
01721 quadratureBaseDerivativeValuesU[fgradGgradV.testFunctionNumber()][0],
01722 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][1],
01723 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][2],
01724 quadratureBaseDerivativeValuesU[fgradGgradV.testFunctionNumber()][0],
01725 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][1],
01726 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][2],
01727 fgradGgradV.testFunctionNumber(), fgradGgradV.testFunctionNumber(),
01728 gProjection.values(),b);
01729
01730 _getAu(f_rst,
01731 1., __transformU[fgradGgradV.testFunctionNumber()][1]->inverseDeterminant(),1.,
01732 1., __transformU[fgradGgradV.testFunctionNumber()][1]->inverseDeterminant(),1.,
01733 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][0],
01734 quadratureBaseDerivativeValuesU[fgradGgradV.testFunctionNumber()][1],
01735 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][2],
01736 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][0],
01737 quadratureBaseDerivativeValuesU[fgradGgradV.testFunctionNumber()][1],
01738 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][2],
01739 fgradGgradV.testFunctionNumber(), fgradGgradV.testFunctionNumber(),
01740 gProjection.values(),b);
01741
01742 _getAu(f_rst,
01743 1.,1.,__transformU[fgradGgradV.testFunctionNumber()][2]->inverseDeterminant(),
01744 1.,1.,__transformU[fgradGgradV.testFunctionNumber()][2]->inverseDeterminant(),
01745 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][0],
01746 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][1],
01747 quadratureBaseDerivativeValuesU[fgradGgradV.testFunctionNumber()][2],
01748 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][0],
01749 quadratureBaseValuesU[fgradGgradV.testFunctionNumber()][1],
01750 quadratureBaseDerivativeValuesU[fgradGgradV.testFunctionNumber()][2],
01751 fgradGgradV.testFunctionNumber(), fgradGgradV.testFunctionNumber(),
01752 gProjection.values(),b);
01753
01754 break;
01755 }
01756
01757 default: {
01758 throw ErrorHandler(__FILE__,__LINE__,
01759 "unknown variational operator",
01760 ErrorHandler::unexpected);
01761 }
01762 }
01763 }
01764 break;
01765 }
01766 default: {
01767 throw ErrorHandler(__FILE__,__LINE__,
01768 "unknown problem type",
01769 ErrorHandler::unexpected);
01770 }
01771 }
01772 }
01773
01774 public:
01775
01786 SpectralLegendreDiscretizer(const Problem& p,
01787 const SpectralMesh& m,
01788 BaseMatrix& a,
01789 BaseVector& bb,
01790 const DegreeOfFreedomSet& dof,
01791 const DiscretizationType& discretizationType)
01792 : __problem(p),
01793 __b(bb),
01794 __degreeOfFreedomSet(dof),
01795 __mesh(m),
01796 __dofShape(__problem.numberOfUnknown()),
01797 __interval(new Interval(__mesh.shape().a()[0],__mesh.shape().b()[0]),
01798 new Interval(__mesh.shape().a()[1],__mesh.shape().b()[1]),
01799 new Interval(__mesh.shape().a()[2],__mesh.shape().b()[2])),
01800
01801 __intervalU(__problem.numberOfUnknown()),
01802
01803 __transform(new SpectralConformTransformation(*__interval[0]),
01804 new SpectralConformTransformation(*__interval[1]),
01805 new SpectralConformTransformation(*__interval[2])),
01806
01807 __transformU(__problem.numberOfUnknown()),
01808 __gaussLobatto(GaussLobattoManager::instance().getReference(__mesh.degree(0)+1),
01809 GaussLobattoManager::instance().getReference(__mesh.degree(1)+1),
01810 GaussLobattoManager::instance().getReference(__mesh.degree(2)+1)),
01811 __basisU(__problem.numberOfUnknown())
01812 {
01813 for (size_t i=0; i < __problem.numberOfUnknown(); i++) {
01814 if (discretizationType[i].type() != ScalarDiscretizationTypeBase::spectralLegendre) {
01815 throw ErrorHandler(__FILE__,__LINE__,
01816 "discretization '"
01817 +ScalarDiscretizationTypeBase::name(discretizationType[i])
01818 +"' is incompatible with spectral method",
01819 ErrorHandler::unexpected);
01820 }
01821 const ScalarDiscretizationTypeSpectral& discretization
01822 = dynamic_cast<const ScalarDiscretizationTypeSpectral&>(discretizationType[i]);
01823
01824 __dofShape[i] = discretization.degrees()+TinyVector<3,size_t>(1,1,1);
01825
01826 __intervalU[i][0]= new Interval(discretization.a()[0],discretization.b()[0]);
01827 __intervalU[i][1]= new Interval(discretization.a()[1],discretization.b()[1]);
01828 __intervalU[i][2]= new Interval(discretization.a()[2],discretization.b()[2]);
01829 __transformU[i][0] = new SpectralConformTransformation(*__intervalU[i][0]);
01830 __transformU[i][1] = new SpectralConformTransformation(*__intervalU[i][1]);
01831 __transformU[i][2] = new SpectralConformTransformation(*__intervalU[i][2]);
01832 __basisU[i][0]= new LegendreBasis(discretization.degrees()[0]);
01833 __basisU[i][1]= new LegendreBasis(discretization.degrees()[1]);
01834 __basisU[i][2]= new LegendreBasis(discretization.degrees()[2]);
01835 }
01836
01837 }
01838
01843 ~SpectralLegendreDiscretizer()
01844 {
01845 ;
01846 }
01847 };
01848
01849 #endif // SPECTRAL_LEGENDRE_DISCRETIZER_HPP