NeoPZ
TPZSBFemVolume.cpp
Go to the documentation of this file.
1 
2 //
3 // TPZSBFemVolume.cpp
4 // PZ
5 //
6 // Created by Philippe Devloo on 4/4/16.
7 //
8 //
9 
10 #include "TPZSBFemVolume.h"
11 #include "TPZSBFemElementGroup.h"
12 #include "pzintel.h"
13 #include "TPZMaterial.h"
14 #include "pzelmat.h"
15 #include "pzgraphelq2dd.h"
16 #include "pzgraphelq3dd.h"
17 #include "tpzgraphelprismmapped.h"
18 #include "pzbndcond.h"
19 #include "pzvec_extras.h"
20 #include "pzcmesh.h"
21 
22 #ifdef LOG4CXX
23 static LoggerPtr logger(Logger::getLogger("pz.mesh.sbfemvolume"));
24 #endif
25 
26 TPZSBFemVolume::TPZSBFemVolume(TPZCompMesh &mesh, TPZGeoEl *gel, int64_t &index) : TPZInterpolationSpace(mesh, gel, index), fElementGroupIndex(-1), fSkeleton(-1), fDensity(1.) {
27 
28 }
29 
30 
31 
33 
35  // do all the computations here
36 
38 
39  TPZGeoEl *Ref2D = Reference();
40  TPZGeoMesh *gmesh = Ref2D->Mesh();
41 
42  TPZCompMesh *cmesh = Mesh();
43 
44  TPZInterpolatedElement *CSkeleton = dynamic_cast<TPZInterpolatedElement *> (cmesh->Element(fSkeleton));
45 
46  CSkeleton->InitializeElementMatrix(E0, efmat);
47  CSkeleton->InitializeElementMatrix(E1, efmat);
48  CSkeleton->InitializeElementMatrix(E2, efmat);
49  CSkeleton->InitializeElementMatrix(M0, efmat);
50 
51  TPZGeoEl *Ref1D = CSkeleton->Reference();
52  int dim1 = Ref1D->Dimension();
53 
54  int matid = Ref2D->MaterialId();
55  int dim2 = Ref2D->Dimension();
56 
57  // find the first face side
58  int nsides = Ref2D->NSides();
59  int is;
60  for (is = 0; is < nsides; is++) {
61  if (Ref2D->SideDimension(is) == dim1) {
62  break;
63  }
64  }
65  int faceside = is;
66 
67  TPZGeoElSide thisside(Ref2D, faceside);
68 
69 
70  TPZMaterial *mat2d = cmesh->FindMaterial(matid);
71 
72  if (!mat2d) DebugStop();
73 
74  int nstate = mat2d->NStateVariables();
75 
76  TPZGeoElSide SkeletonSide(Ref1D, Ref1D->NSides() - 1);
77 
78  TPZTransform<REAL> tr(dim2, dim1);
79  tr = SkeletonSide.NeighbourSideTransform(thisside);
80  TPZTransform<REAL> t2 = Ref2D->SideToSideTransform(thisside.Side(), Ref2D->NSides() - 1);
81  tr = t2.Multiply(tr);
82  // create a one-d integration rule
83  TPZIntPoints &intpoints = CSkeleton->GetIntegrationRule();
84 
85  TPZMaterialData data1d;
86  TPZMaterialData data2d;
87  CSkeleton->InitMaterialData(data1d);
88  CSkeleton->InitMaterialData(data2d);
89  int nshape = data2d.phi.Rows();
90  data2d.phi.Redim(nshape * 2, 1);
91  data2d.dphi.Redim(dim2, 2 * nshape);
92  data2d.dphix.Redim(dim2, 2 * nshape);
93  data2d.dsol[0].Redim(dim2, nstate);
94 
95  TPZFNMatrix<200, STATE> ek(nshape * nstate * 2, nshape * nstate * 2, 0.), ef(nshape * nstate * 2, 1, 0.);
96  int npoint = intpoints.NPoints();
97  for (int ip = 0; ip < npoint; ip++) {
98  TPZManVector<REAL, 3> xi(dim1), xiquad(dim2), xivol(dim2);
99  REAL weight;
100  intpoints.Point(ip, xi, weight);
101  tr.Apply(xi, xiquad);
102  xivol = xiquad;
103  xivol[dim2 - 1] = -0.5;
104  TPZFNMatrix<9, REAL> jacobian(dim1, dim1), axes(dim1, 3), jacinv(dim1, dim1);
105  REAL detjac;
106  Ref1D->Jacobian(xi, jacobian, axes, detjac, jacinv);
107  Ref2D->Jacobian(xiquad, data2d.jacobian, data2d.axes, data2d.detjac, data2d.jacinv);
108  Ref2D->X(xivol, data2d.x);
109  CSkeleton->ComputeRequiredData(data1d, xi);
110 #ifdef PZDEBUG
111  // if the dimension of the problem is 2, we assume that the 1D axes corresponds to the first axis of the 2D problem
112  if (dim2 == 2) {
113  REAL norm = 0;
114  for (int i = 0; i < 3; i++) {
115  norm += (axes(0, i) - data2d.axes(0, i))*(axes(0, i) - data2d.axes(0, i));
116  }
117  norm = sqrt(norm);
118  if (norm > 1.e-8) DebugStop();
119  }
120 #endif
121  // adjust the axes of the 3D element to match the axes of the side element
122  if (dim2 == 3) {
123  // TPZFNMatrix<9,REAL> jacorig(data2d.jacobian);
124  AdjustAxes3D(axes, data2d.axes, data2d.jacobian, data2d.jacinv, data2d.detjac);
125 #ifdef LOG4CXX2
126  if (logger->isDebugEnabled()) {
127  std::stringstream sout;
128  sout << "x 2d " << data1d.x << std::endl;
129  data1d.axes.Print("axes 2D", sout);
130  data2d.axes.Print("axes 3D", sout);
131  data2d.jacobian.Print("jacobian", sout);
132  // jacorig.Print("jacobian original",sout);
133  sout << "detjac = " << data2d.detjac << std::endl;
134  LOGPZ_DEBUG(logger, sout.str())
135  }
136 #endif
137  }
138 #ifdef LOG4CXX2
139  if (logger->isDebugEnabled()) {
140  std::stringstream sout;
141  TPZFNMatrix<9> axest, gradx(3, dim2);
142  data2d.axes.Transpose(&axest);
143  axest.Multiply(data2d.jacobian, gradx);
144  gradx.Print("gradx ", sout);
145  LOGPZ_DEBUG(logger, sout.str())
146  }
147 #endif
148  ExtendShapeFunctions(data1d, data2d);
149 
150  weight *= fabs(data2d.detjac)*2.;
151  for (int i = 0; i < nshape; i++) {
152  for (int j = 0; j < nshape; j++) {
153  for (int st = 0; st < nstate; st++) {
154  M0.fMat(i * nstate + st, j * nstate + st) += weight * data1d.phi(i, 0) * data1d.phi(j, 0) * fDensity;
155  }
156  }
157  }
158  // compute the contributions to K11 K12 and K22
159  mat2d->Contribute(data2d, weight, ek, ef);
160 #ifdef PZDEBUG
161  if (Norm(ef) > 1.e-6) {
162  DebugStop();
163  }
164 #endif
165  }
166  for (int i = 0; i < nstate * nshape; i++) {
167  for (int j = 0; j < nstate * nshape; j++) {
168  E0.fMat(i, j) = ek(i, j);
169  E1.fMat(j, i) = ek(i, j + nstate * nshape);
170  E2.fMat(i, j) = ek(i + nstate*nshape, j + nstate * nshape);
171  }
172  }
173 }
174 
176 
177 void TPZSBFemVolume::AdjustAxes3D(const TPZFMatrix<REAL> &axes2D, TPZFMatrix<REAL> &axes3D, TPZFMatrix<REAL> &jac3D, TPZFMatrix<REAL> &jacinv3D, REAL detjac) {
178  TPZManVector<REAL, 3> ax1(3), ax2(3), ax3(3);
179  for (int i = 0; i < 3; i++) {
180  ax1[i] = axes2D.g(0, i);
181  ax2[i] = axes2D.g(1, i);
182  Cross(ax1, ax2, ax3);
183  }
184  for (int i = 0; i < 3; i++) {
185  axes3D(0, i) = ax1[i];
186  axes3D(1, i) = ax2[i];
187  axes3D(2, i) = ax3[i];
188  if (detjac < 0.) {
189  axes3D(2, i) *= -1.;
190  }
191  }
192  TPZFNMatrix<9, REAL> jacnew(3, 3), axest(3, 3), jacinv(3, 3);
193  axes3D.Transpose(&axest);
194  axes3D.Multiply(jac3D, jacnew);
195  jacinv3D.Multiply(axest, jacinv);
196  jac3D = jacnew;
197  jacinv3D = jacinv;
198 #ifdef PZDEBUG
199  // check whether the axes are orthogonal and whether the jacobian is still the inverse of jacinv
200  {
201  TPZFNMatrix<9, REAL> ident1(3, 3, 0.), ident2(3, 3, 0.), identity(3, 3);
202  identity.Identity();
203  for (int i = 0; i < 3; i++) {
204  for (int j = 0; j < 3; j++) {
205  for (int k = 0; k < 3; k++) {
206  ident1(i, j) += axes3D(i, k) * axes3D(j, k);
207  ident2(i, j) += jac3D(i, k) * jacinv3D(k, j);
208  }
209  }
210  }
211  for (int i = 0; i < 3; i++) {
212  for (int j = 0; j < 3; j++) {
213  if (fabs(ident1(i, j) - identity(i, j)) > 1.e-6) {
214  DebugStop();
215  }
216  if (fabs(ident2(i, j) - identity(i, j)) > 1.e-6) {
217  DebugStop();
218  }
219  }
220  }
221  }
222 #endif
223 }
224 
225 
226 
228 
230  int dim = Reference()->Dimension();
231  int64_t nshape = data2d.phi.Rows() / 2;
232  for (int ish = 0; ish < nshape; ish++) {
233  data2d.phi(ish + nshape, 0) = data1d.phi(ish, 0);
234  for (int d = 0; d < dim - 1; d++) {
235  data2d.dphi(d, ish + nshape) = data1d.dphi(d, ish);
236  data2d.dphi(d, ish) = 0.;
237  }
238  data2d.dphi(dim - 1, ish) = -data1d.phi(ish) / 2.;
239  data2d.dphi(dim - 1, ish + nshape) = 0.;
240  }
241  TPZInterpolationSpace::Convert2Axes(data2d.dphi, data2d.jacinv, data2d.dphix);
242 
243 }
244 
245 TPZCompEl * CreateSBFemCompEl(TPZGeoEl *gel, TPZCompMesh &mesh, int64_t &index) {
246  return new TPZSBFemVolume(mesh, gel, index);
247 }
248 
250 
251 void TPZSBFemVolume::SetPhiEigVal(TPZFMatrix<std::complex<double> > &phi, TPZManVector<std::complex<double> > &eigval) {
252  fEigenvalues = eigval;
253  int nrow = fLocalIndices.size();
254  fPhi.Resize(nrow, phi.Cols());
255  for (int i = 0; i < nrow; i++) {
256  for (int j = 0; j < phi.Cols(); j++) {
257  fPhi(i, j) = phi(fLocalIndices[i], j);
258  }
259  }
260 }
261 
268 void TPZSBFemVolume::LoadCoef(TPZFMatrix<std::complex<double> > &coef) {
269  fCoeficients = coef;
270 }
271 
280  TPZSolVec &sol, TPZGradSolVec &dsol, TPZFMatrix<REAL> &axes) {
281  TPZCompMesh *cmesh = Mesh();
282  sol.Resize(fCoeficients.Cols());
283  dsol.Resize(fCoeficients.Cols());
284  TPZGeoEl *Ref2D = Reference();
285  int matid = Ref2D->MaterialId();
286  TPZMaterial *mat2d = cmesh->FindMaterial(matid);
287 
288  int dim = Ref2D->Dimension();
289  REAL sbfemparam = (1. - qsi[dim - 1]) / 2.;
290  if (sbfemparam < 0.) {
291  std::cout << "sbfemparam " << sbfemparam << std::endl;
292  sbfemparam = 0.;
293  }
294  if (IsZero(sbfemparam)) {
295  for (int i = 0; i < dim - 1; i++) {
296  qsi[i] = 0.;
297  }
298  if (dim == 2) {
299  sbfemparam = 1.e-6;
300  qsi[dim - 1] = 1. - 2.e-6;
301  } else {
302  sbfemparam = 1.e-4;
303  qsi[dim - 1] = 1. - 2.e-4;
304  }
305  }
306  TPZInterpolatedElement *CSkeleton = dynamic_cast<TPZInterpolatedElement *> (cmesh->Element(fSkeleton));
307  TPZMaterialData data1d, data2d;
308  // compute the lower dimensional shape functions
309  TPZManVector<REAL, 3> qsilow(qsi);
310  qsilow.Resize(dim - 1);
311  CSkeleton->InitMaterialData(data1d);
312  TPZGeoEl *Ref1D = CSkeleton->Reference();
313 
314  Ref1D->Jacobian(qsilow, data1d.jacobian, data1d.axes, data1d.detjac, data1d.jacinv);
315  Ref2D->Jacobian(qsi, data2d.jacobian, data2d.axes, data2d.detjac, data2d.jacinv);
316  if (dim == 3) {
317 
318  AdjustAxes3D(data1d.axes, data2d.axes, data2d.jacobian, data2d.jacinv, data2d.detjac);
319  }
320  axes = data2d.axes;
321  CSkeleton->ComputeRequiredData(data1d, qsilow);
322 
323  int nshape = data1d.phi.Rows();
324  int nstate = mat2d->NStateVariables();
325 #ifdef PZDEBUG
326  if (fPhi.Cols() != fCoeficients.Rows()) {
327  DebugStop();
328  }
329 #endif
330 #ifdef LOG4CXX2
331  if (logger->isDebugEnabled()) {
333  for (int i = 0; i < fCoeficients.Rows(); i++) {
334  coefcol[i] = fCoeficients(i, 0);
335  }
336  std::stringstream sout;
337  sout << "coefficients " << coefcol << std::endl;
338  LOGPZ_DEBUG(logger, sout.str())
339  }
340 #endif
341 
342  for (int s = 0; s < sol.size(); s++) {
343  TPZManVector<std::complex<double>, 10> uh_xi(fPhi.Rows(), 0.), Duh_xi(fPhi.Rows(), 0.);
344  int nphixi = fPhi.Rows();
345  int numeig = fPhi.Cols();
346  for (int c = 0; c < numeig; c++) {
347  std::complex<double> xiexp;
348  std::complex<double> xiexpm1;
349  if (IsZero(fEigenvalues[c] + 0.5 * (dim - 2))) {
350  xiexp = 1;
351  xiexpm1 = 0;
352  } else if (IsZero(fEigenvalues[c] + 1. + 0.5 * (dim - 2))) {
353  xiexp = sbfemparam;
354  xiexpm1 = 1;
355  } else {
356  xiexp = pow(sbfemparam, -fEigenvalues[c] - 0.5 * (dim - 2));
357  xiexpm1 = pow(sbfemparam, -fEigenvalues[c] - 1. - 0.5 * (dim - 2));
358  }
359  for (int i = 0; i < nphixi; i++) {
360  uh_xi[i] += fCoeficients(c, s) * xiexp * fPhi(i, c);
361  Duh_xi[i] += -fCoeficients(c, s)*(fEigenvalues[c] + 0.5 * (dim - 2)) * xiexpm1 * fPhi(i, c);
362  }
363  }
364 #ifdef LOG4CXX2
365  if (s == 0 && logger->isDebugEnabled()) {
366  std::stringstream sout;
367  sout << "uh_xi " << uh_xi << std::endl;
368  sout << "Duh_xi " << Duh_xi << std::endl;
369  data1d.phi.Print(sout);
370  LOGPZ_DEBUG(logger, sout.str())
371  }
372 #endif
373  // std::cout << "uh_xi " << uh_xi << std::endl;
374  // std::cout << "Duh_xi " << Duh_xi << std::endl;
375  sol[s].Resize(nstate);
376  sol[s].Fill(0.);
377  TPZFNMatrix<9, STATE> dsollow(dim - 1, nstate, 0.), dsolxieta(dim, nstate, 0.);
378  TPZManVector<STATE, 3> dsolxi(nstate, 0.);
379  for (int ishape = 0; ishape < nshape; ishape++) {
380  for (int istate = 0; istate < nstate; istate++) {
381  sol[s][istate] += data1d.phi(ishape) * uh_xi[ishape * nstate + istate].real();
382  dsolxi[istate] += data1d.phi(ishape) * Duh_xi[ishape * nstate + istate].real();
383  for (int d = 0; d < dim - 1; d++) {
384  dsollow(d, istate) += data1d.dphi(d, ishape) * uh_xi[ishape * nstate + istate].real();
385  }
386  }
387  }
388  for (int istate = 0; istate < nstate; istate++) {
389  for (int d = 0; d < dim - 1; d++) {
390  dsolxieta(d, istate) = dsollow(d, istate);
391  }
392  dsolxieta(dim - 1, istate) = -dsolxi[istate] / 2.;
393  }
394  dsol[s].Resize(dim, nstate);
395  dsol[s].Zero();
396  for (int istate = 0; istate < nstate; istate++) {
397  for (int d1 = 0; d1 < dim; d1++) {
398  for (int d2 = 0; d2 < dim; d2++) {
399  dsol[s](d1, istate) += data2d.jacinv(d2, d1) * dsolxieta(d2, istate);
400  }
401  }
402  }
403  }
404 
405  // tototototot
406  // std::cout << "qsi " << qsi << " Solution " << sol[0] << std::endl;
407  // dsol[0].Print("DSol",std::cout);
408 }
409 
422  TPZCompMesh *cmesh = Mesh();
423  TPZCompEl *celgroup = cmesh->Element(fElementGroupIndex);
424  TPZSBFemElementGroup *elgr = dynamic_cast<TPZSBFemElementGroup *> (celgroup);
425  TPZFMatrix<std::complex<double> > &CoefficientLoc = elgr->PhiInverse();
426 #ifdef LOG4CXX2
427  if (logger->isDebugEnabled()) {
428  std::stringstream sout;
429  CoefficientLoc.Print("Coefficients = ", sout, EMathematicaInput);
430  LOGPZ_DEBUG(logger, sout.str())
431  }
432 #endif
433  TPZGeoEl *Ref2D = Reference();
434  int matid = Ref2D->MaterialId();
435  TPZMaterial *mat2d = cmesh->FindMaterial(matid);
436  int dim = Ref2D->Dimension();
437  int nstate = mat2d->NStateVariables();
438 
439  phi.Redim(CoefficientLoc.Cols() * nstate, 1);
440  dphidxi.Redim(dim*nstate, CoefficientLoc.Cols());
441 
442  REAL sbfemparam = (1. - qsi[dim - 1]) / 2.;
443  if (sbfemparam < 0.) {
444  std::cout << "sbfemparam " << sbfemparam << std::endl;
445  sbfemparam = 0.;
446  }
447  if (IsZero(sbfemparam)) {
448  for (int i = 0; i < dim - 1; i++) {
449  qsi[i] = 0.;
450  }
451  if (dim == 2) {
452  sbfemparam = 1.e-6;
453  qsi[dim - 1] = 1. - 2.e-6;
454  } else {
455  sbfemparam = 1.e-4;
456  qsi[dim - 1] = 1. - 2.e-4;
457  }
458  }
459  TPZInterpolatedElement *CSkeleton = dynamic_cast<TPZInterpolatedElement *> (cmesh->Element(fSkeleton));
460  TPZMaterialData data1d, data2d;
461  // compute the lower dimensional shape functions
462  TPZManVector<REAL, 3> qsilow(qsi);
463  qsilow.Resize(dim - 1);
464  CSkeleton->InitMaterialData(data1d);
465  TPZGeoEl *Ref1D = CSkeleton->Reference();
466 
467  Ref1D->Jacobian(qsilow, data1d.jacobian, data1d.axes, data1d.detjac, data1d.jacinv);
468  Ref2D->Jacobian(qsi, data2d.jacobian, data2d.axes, data2d.detjac, data2d.jacinv);
469  if (dim == 3) {
470 
471  AdjustAxes3D(data1d.axes, data2d.axes, data2d.jacobian, data2d.jacinv, data2d.detjac);
472  }
473  CSkeleton->ComputeRequiredData(data1d, qsilow);
474 
475  int nshape = data1d.phi.Rows();
476 #ifdef PZDEBUG
477  if (fPhi.Cols() != fCoeficients.Rows()) {
478  DebugStop();
479  }
480 #endif
481  phi.Zero();
482 #ifdef LOG4CXX2
483  if (logger->isDebugEnabled()) {
484  int eq = 1;
485  TPZManVector<std::complex<double> > coefcol(CoefficientLoc.Rows());
486  for (int i = 0; i < CoefficientLoc.Rows(); i++) {
487  coefcol[i] = CoefficientLoc(i, eq);
488  }
489  std::stringstream sout;
490  sout << "coefficients " << coefcol << std::endl;
491  LOGPZ_DEBUG(logger, sout.str())
492  }
493 #endif
494 
495  for (int s = 0; s < CoefficientLoc.Cols(); s++) {
496  TPZManVector<std::complex<double>, 10> uh_xi(fPhi.Rows(), 0.), Duh_xi(fPhi.Rows(), 0.);
497  int nphixi = fPhi.Rows();
498  int numeig = fPhi.Cols();
499  for (int c = 0; c < numeig; c++) {
500  std::complex<double> xiexp;
501  std::complex<double> xiexpm1;
502  if (IsZero(fEigenvalues[c] + 0.5 * (dim - 2))) {
503  xiexp = 1;
504  xiexpm1 = 0;
505  } else if (IsZero(fEigenvalues[c] + 1. + 0.5 * (dim - 2))) {
506  xiexp = sbfemparam;
507  xiexpm1 = 1;
508  } else {
509  xiexp = pow(sbfemparam, -fEigenvalues[c] - 0.5 * (dim - 2));
510  xiexpm1 = pow(sbfemparam, -fEigenvalues[c] - 1. - 0.5 * (dim - 2));
511  }
512  for (int i = 0; i < nphixi; i++) {
513  uh_xi[i] += CoefficientLoc(c, s) * xiexp * fPhi(i, c);
514  Duh_xi[i] += -CoefficientLoc(c, s)*(fEigenvalues[c] + 0.5 * (dim - 2)) * xiexpm1 * fPhi(i, c);
515  }
516  }
517 #ifdef LOG4CXX2
518  if (s == 1 && logger->isDebugEnabled()) {
519  std::stringstream sout;
520  sout << "uh_xi " << uh_xi << std::endl;
521  sout << "Duh_xi " << Duh_xi << std::endl;
522  data1d.phi.Print(sout);
523  LOGPZ_DEBUG(logger, sout.str())
524  }
525 #endif
526  // std::cout << "uh_xi " << uh_xi << std::endl;
527  // std::cout << "Duh_xi " << Duh_xi << std::endl;
528  TPZFNMatrix<9, STATE> dsollow(dim - 1, nstate, 0.), dsolxieta(dim, nstate, 0.);
529  TPZManVector<STATE, 3> dsolxi(nstate, 0.);
530  for (int ishape = 0; ishape < nshape; ishape++) {
531  for (int istate = 0; istate < nstate; istate++) {
532  phi(s * nstate + istate, 0) += data1d.phi(ishape) * uh_xi[ishape * nstate + istate].real();
533  // sol[s][istate] += data1d.phi(ishape)*uh_xi[ishape*nstate+istate].real();
534  dsolxi[istate] += data1d.phi(ishape) * Duh_xi[ishape * nstate + istate].real();
535  for (int d = 0; d < dim - 1; d++) {
536  dsollow(d, istate) += data1d.dphi(d, ishape) * uh_xi[ishape * nstate + istate].real();
537  }
538  }
539  }
540  for (int istate = 0; istate < nstate; istate++) {
541  for (int d = 0; d < dim - 1; d++) {
542  dsolxieta(d, istate) = dsollow(d, istate);
543  }
544  dsolxieta(dim - 1, istate) = -dsolxi[istate] / 2.;
545  }
546  for (int istate = 0; istate < nstate; istate++) {
547  for (int d1 = 0; d1 < dim; d1++) {
548  for (int d2 = 0; d2 < dim; d2++) {
549  // dsol[s](d1,istate) += data2d.jacinv(d2,d1)*dsolxieta(d2,istate);
550  dphidxi(istate * nstate + d1, s) += data2d.jacinv(d2, d1) * dsolxieta(d2, istate);
551  }
552  }
553  }
554  }
555 
556 }
557 
567  TPZGeoEl *Ref2D = Reference();
568  int matid = Ref2D->MaterialId();
569  TPZCompMesh *cmesh = Mesh();
570 
571  TPZMaterial *mat2d = cmesh->FindMaterial(matid);
572  TPZMaterialData data2d;
573 
574  ComputeSolution(qsi, data2d.sol, data2d.dsol, data2d.axes);
575  data2d.x.Resize(3, 0.);
576  Reference()->X(qsi, data2d.x);
577  mat2d->Solution(data2d, var, sol);
578 
579 }
580 
582 
583  TPZGeoEl *ref = Reference();
584  if (ref->Dimension() != dimension) {
585  return;
586  }
587  MElementType ty = ref->Type();
588  if (ty == EQuadrilateral) {
589  new TPZGraphElQ2dd(this, &graphmesh);
590  } else if (ty == ECube) {
591  new TPZGraphElQ3dd(this, &graphmesh);
592  } else if (ty == EPrisma) {
593  new TPZGraphElPrismMapped(this, &graphmesh);
594  } else {
595  DebugStop();
596  }
597 }
598 
599 #include "pzaxestools.h"
600 
601 void TPZSBFemVolume::EvaluateError(std::function<void(const TPZVec<REAL> &loc,TPZVec<STATE> &val,TPZFMatrix<STATE> &deriv)> fp,
602  TPZVec<REAL> &errors,bool store_error) {
603  int NErrors = this->Material()->NEvalErrors();
604  errors.Resize(NErrors);
605  errors.Fill(0.);
606  TPZMaterial * material = Material();
607  //TPZMaterial * matptr = material.operator->();
608  if (!material) {
609  PZError << "TPZInterpolatedElement::EvaluateError : no material for this element\n";
610  Print(PZError);
611  return;
612  }
613  if (dynamic_cast<TPZBndCond *> (material)) {
614  std::cout << "Exiting EvaluateError - null error - boundary condition material.";
615  DebugStop();
616  }
617  int problemdimension = Mesh()->Dimension();
618  TPZGeoEl *ref = Reference();
619  if (ref->Dimension() < problemdimension) return;
620 
621  // Adjust the order of the integration rule
622  //Cesar 2007-06-27 ==>> Begin
623  //this->MaxOrder is usefull to evaluate polynomial function of the aproximation space.
624  //fp can be any function and max order of the integration rule could produce best results
625  int dim = Dimension();
626  TPZAutoPointer<TPZIntPoints> intrule = ref->CreateSideIntegrationRule(ref->NSides() - 1, 5);
627  int maxIntOrder = intrule->GetMaxOrder();
628  TPZManVector<int, 3> prevorder(dim), maxorder(dim, maxIntOrder);
629  //end
630  intrule->GetOrder(prevorder);
631 
632  intrule->SetOrder(maxorder);
633 
634  int ndof = material->NStateVariables();
635  TPZManVector<STATE, 10> u_exact(ndof);
636  TPZFNMatrix<90, STATE> du_exact(dim, ndof);
637  TPZManVector<REAL, 10> intpoint(problemdimension), values(NErrors);
638  values.Fill(0.0);
639  REAL weight;
640  TPZManVector<STATE, 9> flux_el(0, 0.);
641 
642  TPZMaterialData data;
643  data.x.Resize(3);
644  int nintpoints = intrule->NPoints();
645 
646  for (int nint = 0; nint < nintpoints; nint++) {
647 
648  intrule->Point(nint, intpoint, weight);
649 
650  ref->Jacobian(intpoint, data.jacobian, data.axes, data.detjac, data.jacinv);
651 
652  weight *= fabs(data.detjac);
653  ComputeSolution(intpoint, data.sol, data.dsol, data.axes);
654  // this->ComputeSolution(intpoint, data.phi, data.dphix, data.axes, data.sol, data.dsol);
655  //this->ComputeSolution(intpoint, data);
656  //contribuicoes dos erros
657  ref->X(intpoint, data.x);
658 
659  if (fp) {
660  fp(data.x, u_exact, du_exact);
661 
662  material->Errors(data.x, data.sol[0], data.dsol[0], data.axes, flux_el, u_exact, du_exact, values);
663 
664  for (int ier = 0; ier < NErrors; ier++)
665  errors[ier] += values[ier] * weight;
666  }
667 
668  }//fim for : integration rule
669  //Norma sobre o elemento
670  for (int ier = 0; ier < NErrors; ier++) {
671  errors[ier] = sqrt(errors[ier]);
672  }//for ier
673 
674  intrule->SetOrder(prevorder);
675 
676 }
677 
679  if (!fIntRule) {
681  }
682  int dim = Reference()->Dimension();
683  TPZManVector<int, 3> ordervec(dim, order);
684  ordervec[dim - 1] = 10;
685  if (10 < order + 6) ordervec[dim - 1] = order + 6;
686  // std::cout << "Order of the radial direction " << ordervec[dim-1] << std::endl;
687  fIntRule->SetOrder(ordervec);
688  // std::cout << "Number of integration points " << fIntRule->NPoints() << std::endl;
689 }
690 
692  fElementGroupIndex = index;
693  std::map<int64_t, int> globtolocal;
694  TPZCompEl *celgr = Mesh()->Element(index);
695  fElementGroup = celgr;
696  int nc = celgr->NConnects();
697  TPZManVector<int, 10> firsteq(nc + 1, 0);
698  for (int ic = 0; ic < nc; ic++) {
699  globtolocal[celgr->ConnectIndex(ic)] = ic;
700  TPZConnect &c = celgr->Connect(ic);
701  firsteq[ic + 1] = firsteq[ic] + c.NShape() * c.NState();
702  }
703  int neq = 0;
704  TPZCompEl *celskeleton = Mesh()->Element(fSkeleton);
705  nc = celskeleton->NConnects();
706  for (int ic = 0; ic < nc; ic++) {
707  TPZConnect &c = celskeleton->Connect(ic);
708  neq += c.NShape() * c.NState();
709  }
710  fLocalIndices.Resize(neq);
711  int count = 0;
712  for (int ic = 0; ic < nc; ic++) {
713  int64_t cindex = celskeleton->ConnectIndex(ic);
714 #ifdef PZDEBUG
715  if (globtolocal.find(cindex) == globtolocal.end()) {
716  DebugStop();
717  }
718 #endif
719  TPZConnect &c = celskeleton->Connect(ic);
720  int neq = c.NShape() * c.NState();
721  int locfirst = firsteq[globtolocal[cindex]];
722  for (int eq = 0; eq < neq; eq++) {
723  fLocalIndices[count++] = locfirst + eq;
724  }
725  }
726 #ifdef PZDEBUG
727  if (count != neq) DebugStop();
728 #endif
729 }
730 
732 
734  data.gelElId = this->Reference()->Id();
735  TPZMaterial *mat = Material();
736 #ifdef PZDEBUG
737  if (!mat) {
738  mat = Material();
739  DebugStop();
740  }
741 #endif
742  mat->FillDataRequirements(data);
743  const int dim = this->Dimension();
744  const int nshape = this->NShapeF();
745  const int nstate = this->Material()->NStateVariables();
746  data.phi.Redim(nstate * nshape*dim, 1);
747  data.dphi.Redim(dim*nstate, nshape * nstate);
748  data.dphix.Redim(dim*nstate, nshape * nstate);
749  data.axes.Redim(dim, 3);
750  data.jacobian.Redim(dim, dim);
751  data.jacinv.Redim(dim, dim);
752  data.x.Resize(3);
753  if (data.fNeedsSol) {
754  int64_t nsol = data.sol.size();
755  for (int64_t is = 0; is < nsol; is++) {
756  data.sol[is].Resize(nstate);
757  data.dsol[is].Redim(dim, nstate);
758  }
759  }
760 }//void
761 
763  TPZFMatrix<REAL> &jacobian, TPZFMatrix<REAL> &axes,
764  REAL &detjac, TPZFMatrix<REAL> &jacinv,
765  TPZFMatrix<REAL> &phi, TPZFMatrix<REAL> &dphi, TPZFMatrix<REAL> &dphidx) {
766  TPZGeoEl * ref = this->Reference();
767  if (!ref) {
768  PZError << "\nERROR AT " << __PRETTY_FUNCTION__ << " - this->Reference() == NULL\n";
769  return;
770  }//if
771 
772  ref->Jacobian(intpoint, jacobian, axes, detjac, jacinv);
773  this->Shape(intpoint, phi, dphidx);
774 
775 }
776 
777 void TPZSBFemVolume::BuildCornerConnectList(std::set<int64_t>& connectindexes) const {
778  if (fSkeleton == -1) {
779  DebugStop();
780  }
781  Mesh()->Element(fSkeleton)->BuildCornerConnectList(connectindexes);
782 }
783 
784 void TPZSBFemVolume::PRefine(int order) {
785  TPZCompEl *cel = Mesh()->Element(fSkeleton);
786  TPZInterpolationSpace *intel = dynamic_cast<TPZInterpolationSpace *> (cel);
787  intel->PRefine(order);
788 }
789 
791  fPreferredOrder = order;
792  TPZCompEl *cel = Mesh()->Element(fSkeleton);
793  TPZInterpolationSpace *intel = dynamic_cast<TPZInterpolationSpace *> (cel);
794  intel->SetPreferredOrder(order);
795 }
796 
797 void TPZSBFemVolume::SetSkeleton(int64_t skeleton) {
798 #ifdef PZDEBUG
799  if (fSkeleton != -1) {
800  DebugStop();
801  }
802  if (fLocalIndices.size()) {
803  DebugStop();
804  }
805 #endif
806  fSkeleton = skeleton;
807  TPZCompEl *cel = Mesh()->Element(fSkeleton);
808  TPZInterpolationSpace *intel = dynamic_cast<TPZInterpolationSpace *> (cel);
809  int order = intel->GetPreferredOrder();
810  SetIntegrationRule(2 * order);
811 }
virtual void Solution(TPZMaterialData &data, int var, TPZVec< STATE > &Solout)
Returns the solution associated with the var index based on the finite element approximation.
virtual void GetOrder(TPZVec< int > &ord) const =0
Gets the order of the integration rule for each dimension of the master element.
int64_t fElementGroupIndex
index of element group
Represents a graphical mesh used for post processing purposes. Post processing.
Definition: pzgraphmesh.h:34
expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ fabs
Definition: tfadfunc.h:140
virtual void BuildCornerConnectList(std::set< int64_t > &connectindexes) const =0
adds the connect indexes associated with base shape functions to the set
virtual int NPoints() const =0
Returns number of points for the cubature rule related.
Represents a set of shape functions associated with a computational element/side. Computational Eleme...
Definition: pzconnect.h:30
bool IsZero(long double a)
Returns if the value a is close Zero as the allowable tolerance.
Definition: pzreal.h:668
virtual void Errors(TPZMaterialData &data, TPZVec< STATE > &u_exact, TPZFMatrix< STATE > &du_exact, TPZVec< REAL > &errors)
Definition: TPZMaterial.h:496
TPZManVector< REAL, 3 > x
value of the coordinate at the integration point
virtual void InitMaterialData(TPZMaterialData &data)
Initialize a material data and its attributes based on element dimension, number of state variables a...
virtual void Shape(TPZVec< REAL > &qsi, TPZFMatrix< REAL > &phi, TPZFMatrix< REAL > &dphidxi)
Computes the shape function set at the point x.
virtual void ComputeShape(TPZVec< REAL > &intpoint, TPZVec< REAL > &X, TPZFMatrix< REAL > &jacobian, TPZFMatrix< REAL > &axes, REAL &detjac, TPZFMatrix< REAL > &jacinv, TPZFMatrix< REAL > &phi, TPZFMatrix< REAL > &dphi, TPZFMatrix< REAL > &dphidx)
Compute shape functions based on master element in the classical FEM manner.
int MaterialId() const
Returns the material index of the element.
Definition: pzgeoel.h:250
void CreateGraphicalElement(TPZGraphMesh &, int)
Creates corresponding graphical element(s) if the dimension matches graphical elements are used to ge...
void ExtendShapeFunctions(TPZMaterialData &data1d, TPZMaterialData &data2d)
extend the border shape functions for SBFem computations
TPZFNMatrix< 30, std::complex< double > > fPhi
Section of the phi vector associated with this volume element.
clarg::argInt dimension("-d", "Matrices dimension M x M", 1000)
int64_t fSkeleton
index of the skeleton element
TPZFNMatrix< 660, REAL > dphi
values of the derivative of the shape functions over the master element
TPZFNMatrix< 1000, STATE > fMat
Pointer to a blocked matrix object.
Definition: pzelmat.h:41
virtual int NShapeF() const
It returns the shapes number of the element.
To export a graphical two-dimensional discontinuous element. Post processing.
Definition: pzgraphelq2dd.h:16
To export a graphical three dimensional discontinuous element. Post processing.
Definition: pzgraphelq3dd.h:20
virtual void Identity()
Converts the matrix in an identity matrix.
Definition: pzmatrix.cpp:199
void SetPhiEigVal(TPZFMatrix< std::complex< double > > &phi, TPZManVector< std::complex< double > > &eigval)
initialize the data structures of the eigenvectors and eigenvalues associated with this volume elemen...
virtual int Dimension() const =0
Returns the integrable dimension of the material.
virtual int NStateVariables() const =0
Returns the number of state variables associated with the material.
TPZManVector< std::complex< double > > fEigenvalues
Eigenvlues associated with the internal shape functions.
TPZGradSolVec dsol
vector of the derivatives of the solution at the integration point
MShapeFunctionType fShapeType
TPZFNMatrix< 9, REAL > jacinv
value of the inverse of the jacobian at the integration point
Utility class which represents an element with its side. The Geometric approximation classes Geometry...
Definition: pzgeoelside.h:83
virtual void Print(std::ostream &out=std::cout) const
Prints element data.
REAL val(STATE &number)
Returns value of the variable.
Definition: pzartdiff.h:23
TPZGeoMesh * Mesh() const
Returns the mesh to which the element belongs.
Definition: pzgeoel.h:220
virtual int NSides() const =0
Returns the number of connectivities of the element.
virtual void InitMaterialData(TPZMaterialData &data)
Initialize a material data and its attributes based on element dimension, number of state variables a...
virtual const TPZIntPoints & GetIntegrationRule() const override=0
Returns a reference to an integration rule suitable for integrating the interior of the element...
virtual void Contribute(TPZMaterialData &data, REAL weight, TPZFMatrix< STATE > &ek, TPZFMatrix< STATE > &ef)=0
It computes a contribution to the stiffness matrix and load vector at one integration point...
virtual int SideDimension(int side) const =0
Return the dimension of side.
virtual void Resize(const int64_t newsize, const T &object)
Resizes the vector object.
Definition: pzmanvector.h:426
TPZFNMatrix< 9, REAL > jacobian
value of the jacobian at the integration point
TPZFMatrix< std::complex< double > > & PhiInverse()
TPZFNMatrix< 220, REAL > phi
vector of shapefunctions (format is dependent on the value of shapetype)
TPZFNMatrix< 660, REAL > dphix
values of the derivative of the shape functions
TPZCompEl * fElementGroup
pointer to the element group computational element
Abstract class defining integration rules. Numerical Integration.
Definition: tpzintpoints.h:19
virtual void SetPreferredOrder(int order)
Defines the desired order for entire element.
This abstract class defines the behaviour which each derived class needs to implement.
Definition: TPZMaterial.h:39
Contains declaration of TPZElementMatrix struct which associates an element matrix with the coeficien...
virtual TPZIntPoints * CreateSideIntegrationRule(int side, int order)=0
Creates an integration rule for the topology of the corresponding side and able to integrate a polyno...
Contains the TPZBndCond class which implements a boundary condition for TPZMaterial objects...
virtual TPZMaterial * Material() const
Identify the material object associated with the element.
Definition: pzcompel.cpp:959
int Zero() override
Makes Zero all the elements.
Definition: pzfmatrix.h:651
int64_t size() const
Returns the number of elements of the vector.
Definition: pzvec.h:196
virtual void Resize(const int64_t newsize, const T &object)
Resizes the vector object reallocating the necessary storage, copying the existing objects to the new...
Definition: pzvec.h:373
TPZCompEl * Element(int64_t iel)
Definition: pzcmesh.h:185
virtual int NEvalErrors()
Returns the number of norm errors. Default is 3: energy, L2 and H1.
Definition: TPZMaterial.h:524
virtual void BuildCornerConnectList(std::set< int64_t > &connectindexes) const
adds the connect indexes associated with base shape functions to the set
Implements the graphical element for a prism using a degenerated cube element. Post processing...
Defines the behaviour of all geometric elements. GeometryTPZGeoEl is the common denominator for all g...
Definition: pzgeoel.h:43
Contains the TPZGraphElQ2dd class which implements the graphical two-dimensional discontinuous elemen...
TPZCompEl * CreateSBFemCompEl(TPZGeoEl *gel, TPZCompMesh &mesh, int64_t &index)
TVar Norm(const TPZFMatrix< TVar > &A)
Returns the norm of the matrix A.
virtual void FillDataRequirements(TPZMaterialData &data)
Fill material data parameter with necessary requirements for the.
Definition: TPZMaterial.cpp:81
#define DebugStop()
Returns a message to user put a breakpoint in.
Definition: pzerror.h:20
virtual void SetOrder(TPZVec< int > &ord, int type=0)=0
Sets the order of the cubature rule.
virtual void LoadCoef(TPZFMatrix< std::complex< double > > &coef)
Loads the solution within the internal data structure of the element.
Contains the TPZGraphElPrismMapped class which implements the graphical element for a prism using a d...
static void Convert2Axes(const TPZFMatrix< REAL > &dphi, const TPZFMatrix< REAL > &jacinv, TPZFMatrix< REAL > &dphidx)
convert a shapefunction derivative in xi-eta to a function derivative in axes
#define LOGPZ_DEBUG(A, B)
Define log for debug info.
Definition: pzlog.h:87
TPZCompMesh * Mesh() const
Return a pointer to the grid of the element.
Definition: pzcompel.cpp:288
virtual void Solution(TPZVec< REAL > &qsi, int var, TPZVec< STATE > &sol)
Calculates the solution - sol - for the variable var at point qsi, where qsi is expressed in terms of...
int Dimension() const
Returns the dimension of the simulation.
Definition: pzcmesh.h:148
virtual MElementType Type() const =0
Returns the element type acording to pzeltype.h.
void Jacobian(TPZVec< REAL > &qsi, TPZFMatrix< REAL > &jac, TPZFMatrix< REAL > &axes, REAL &detjac, TPZFMatrix< REAL > &jacinv) const
Compute a decomposition of the gradient of the mapping function, as a rotation matrix (Jacobian) and ...
Definition: pzgeoel.cpp:1144
TPZMaterial * FindMaterial(int id)
Find the material with identity id.
Definition: pzcmesh.cpp:297
unsigned int NShape() const
Definition: pzconnect.h:151
int64_t Rows() const
Returns number of rows.
Definition: pzmatrix.h:803
expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ sqrt
Definition: tfadfunc.h:120
void AdjustAxes3D(const TPZFMatrix< REAL > &axes2D, TPZFMatrix< REAL > &axes3D, TPZFMatrix< REAL > &jac3D, TPZFMatrix< REAL > &jacinv3D, REAL detjac)
adjust the axes and jacobian of the 3D element
TPZFNMatrix< 9, REAL > axes
axes indicating the directions of the derivatives of the shapefunctions
virtual void PRefine(int order)=0
Change the preferred order for the element and proceed the adjust of the aproximation space taking ...
virtual void PRefine(int order)
Change the preferred order for the element and proceed the adjust of the aproximation space taking ...
virtual void InitializeElementMatrix(TPZElementMatrix &ek, TPZElementMatrix &ef)
Initialize element matrix in which is computed CalcStiff.
Contains declaration of TPZCompMesh class which is a repository for computational elements...
int Redim(const int64_t newRows, const int64_t newCols) override
Redimension a matrix and ZERO your elements.
Definition: pzfmatrix.h:616
virtual TPZConnect & Connect(int i) const
Returns a pointer to the ith node.
Definition: pzcompel.cpp:298
virtual int GetPreferredOrder()
Returns the prefered order for the element.
unsigned char NState() const
Number of state variables associated with the connect.
Definition: pzconnect.h:146
virtual int64_t ConnectIndex(int i) const =0
Returns the index of the ith connectivity of the element.
TPZTransform< T > Multiply(TPZTransform< T > &right)
Multiply the transformation object (to the right) with right (Multiplying matrices) ...
Definition: pztrnsform.cpp:112
This class associates an element matrix with the coeficients of its contribution in the global stiffn...
Definition: pzelmat.h:30
Implements the interfaces for TPZCompElDisc, TPZInterfaceElement and TPZInterpolatedElement. Computational element.
virtual int NConnects() const =0
Returns the number of nodes of the element.
virtual void SetPreferredOrder(int order)=0
Defines the desired order for entire element.
virtual void SetIntegrationRule(int order)
virtual int Dimension() const
Dimension of the element.
TPZFlopCounter pow(const TPZFlopCounter &orig, const TPZFlopCounter &xp)
Returns the power and increments the counter of the power.
Definition: pzreal.h:487
virtual int Dimension() const =0
Returns the dimension of the element.
virtual TPZTransform< REAL > SideToSideTransform(int sidefrom, int sideto)=0
Compute the transformation between the master element space of one side of an element to the master e...
void SetSkeleton(int64_t skeleton)
Data structure initialization.
int64_t Id() const
Returns the Id of the element.
Definition: pzgeoel.h:223
TPZGeoEl * Reference() const
Return a pointer to the corresponding geometric element if such exists, return 0 otherwise.
Definition: pzcompel.cpp:1137
virtual void X(TPZVec< REAL > &qsi, TPZVec< REAL > &result) const =0
Return the coordinate in real space of the point coordinate in the master element space...
This class implements a geometric mesh for the pz environment. Geometry.
Definition: pzgmesh.h:48
virtual int GetMaxOrder() const
Returns the minimum order to integrate polinomials exactly for all implemented cubature rules...
Definition: pzquad.cpp:30
MElementType
Define the element types.
Definition: pzeltype.h:52
void ComputeKMatrices(TPZElementMatrix &E0, TPZElementMatrix &E1, TPZElementMatrix &E2, TPZElementMatrix &M0)
Compute the E0, E1 and E2 matrices.
void EvaluateError(std::function< void(const TPZVec< REAL > &loc, TPZVec< STATE > &val, TPZFMatrix< STATE > &deriv)> fp, TPZVec< REAL > &errors, bool store_error)
Performs an error estimate on the elemen.
TPZFNMatrix< 30, std::complex< double > > fCoeficients
Multiplier coeficients associated with the solution.
Implements computational mesh. Computational Mesh.
Definition: pzcmesh.h:47
virtual void Multiply(const TPZFMatrix< TVar > &A, TPZFMatrix< TVar > &res, int opt=0) const
It mutiplies itself by TPZMatrix<TVar>A putting the result in res.
Definition: pzmatrix.cpp:1916
Definition: pzeltype.h:61
int Side() const
Definition: pzgeoelside.h:169
Contains declaration of TPZInterpolatedElement class which implements computational element of the in...
void Fill(const T &copy, const int64_t from=0, const int64_t numelem=-1)
Will fill the elements of the vector with a copy object.
Definition: pzvec.h:460
Contains declaration of the TPZAxesTools class which implements verifications over axes...
REAL fDensity
Density associated with the mass matrix.
TPZSBFemVolume(TPZCompMesh &mesh, TPZGeoEl *gel, int64_t &index)
int64_t Cols() const
Returns number of cols.
Definition: pzmatrix.h:809
virtual void Print(std::ostream &out) const
Definition: pzmatrix.h:253
int Resize(const int64_t newRows, const int64_t wCols) override
Redimension a matrix, but maintain your elements.
Definition: pzfmatrix.cpp:1016
Implements an affine transformation between points in parameter space. Topology Utility.
Definition: pzmganalysis.h:14
def values
Definition: rdt.py:119
void SetElementGroupIndex(int64_t index)
Initialize the data structure indicating the group index.
Extra utilities for TPZVec. Implementations of the saxpy, sscal, sdot, intercept, max and min functio...
virtual void ComputeRequiredData(TPZMaterialData &data, TPZVec< REAL > &qsi)
Compute and fill data with requested attributes.
TPZManVector< int64_t > fLocalIndices
vector of local indices of multipliers in the group
TPZIntPoints * fIntRule
pointer to the integration rule
int fPreferredOrder
Preferred polynomial order.
Defines the interface of a computational element. Computational Element.
Definition: pzcompel.h:59
virtual void ComputeSolution(TPZVec< REAL > &qsi, TPZSolVec &sol, TPZGradSolVec &dsol, TPZFMatrix< REAL > &axes)
Computes solution and its derivatives in the local coordinate qsi.
TPZSolVec sol
vector of the solutions at the integration point
void Transpose(TPZMatrix< TVar > *const T) const override
It makes *T the transpose of current matrix.
Definition: pzfmatrix.cpp:1073
Contains the TPZGraphElQ3dd class which implements the graphical three dimensional discontinuous elem...
REAL detjac
determinant of the jacobian
TVar & g(const int64_t row, const int64_t col) const
Definition: pzfmatrix.h:594
Implements computational element based on an interpolation space. Computational Element.
Definition: pzintel.h:27
Non abstract class which implements full matrices with preallocated storage with (N+1) entries...
Definition: pzfmatrix.h:716
virtual void Point(int i, TPZVec< REAL > &pos, REAL &w) const =0
Returns i-th point at master element and related weight.
#define PZError
Defines the output device to error messages and the DebugStop() function.
Definition: pzerror.h:15
void Cross(const TPZVec< T > &x1, const TPZVec< T > &x2, TPZVec< T > &result)
Definition: pzvec_extras.h:255
void InitializeIntegrationRule()