NeoPZ
tpzquadraticcube.cpp
Go to the documentation of this file.
1 
5 #include "tpzquadraticcube.h"
6 #include "pzshapecube.h"
7 #include "tpzgeoblend.h"
8 #include "tpzgeoelmapped.h"
9 
10 #include "pzgeoelrefless.h.h"
11 #include "tpzgeoelrefpattern.h.h"
12 #include "pznoderep.h.h"
13 
14 #include "tpzgeomid.h"
15 
16 #include "pzlog.h"
17 
18 #include "tpzchangeel.h"
19 
20 #ifdef LOG4CXX
21 static LoggerPtr logger(Logger::getLogger("pz.specialmaps.quadraticcube"));
22 #endif
23 
24 #ifdef _AUTODIFF
25 #include "fad.h"
26 #endif
27 
28 using namespace pzshape;
29 using namespace pzgeom;
30 using namespace pztopology;
31 
32 namespace pzgeom
33 {
34 
35 template<class T>
36 void TPZQuadraticCube::TShape(const TPZVec<T> &par,TPZFMatrix<T> &phi,TPZFMatrix<T> &dphi) {
37  T qsi = par[0], eta = par[1], zeta = par[2];
38 
39  phi(0,0) = 1./8.*((-1. + eta)*(-1. + qsi)*(-1. + zeta)*(2. + eta + qsi + zeta));
40  phi(1,0) = -1./8.*((-1. + eta)*(1. + qsi)*(-1. + zeta)*(2. + eta - qsi + zeta));
41  phi(2,0) = -1./8.*((1. + eta)*(1. + qsi)*(-2. + eta + qsi - zeta)*(-1. + zeta));
42  phi(3,0) = 1./8.*((1. + eta)*(-1. + qsi)*(-2. + eta - qsi - zeta)*(-1. + zeta));
43 
44  phi(4,0) = -1./8.*((-1. + eta)*(-1. + qsi)*(2. + eta + qsi - zeta)*(1. + zeta));
45  phi(5,0) = 1./8.*((-1. + eta)*(1. + qsi)*(2. + eta - qsi - zeta)*(1. + zeta));
46  phi(6,0) = 1./8.*((1. + eta)*(1. + qsi)*(1. + zeta)*(-2. + eta + qsi + zeta));
47  phi(7,0) = -1./8.*((1. + eta)*(-1. + qsi)*(1. + zeta)*(-2. + eta - qsi + zeta));
48 
49  phi(8,0) = -1./4.*((-1. + eta)*(-1. + qsi*qsi)*(-1. + zeta));
50  phi(9,0) = 1./4.*((-1. + eta*eta)*(1. + qsi)*(-1. + zeta));
51  phi(10,0) = 1./4.*((1. + eta)*(-1. + qsi*qsi)*(-1. + zeta));
52  phi(11,0) = -1./4.*((-1. + eta*eta)*(-1. + qsi)*(-1. + zeta));
53 
54  phi(12,0) = -1./4.*((-1. + eta)*(-1. + qsi)*(-1. + zeta*zeta));
55  phi(13,0) = 1./4.*((-1. + eta)*(1. + qsi)*(-1. + zeta*zeta));
56  phi(14,0) = -1./4.*((1. + eta)*(1. + qsi)*(-1. + zeta*zeta));
57  phi(15,0) = 1./4.*((1. + eta)*(-1. + qsi)*(-1. + zeta*zeta));
58 
59  phi(16,0) = 1./4.*((-1. + eta)*(-1. + qsi*qsi)*(1. + zeta));
60  phi(17,0) = -1./4.*((-1. + eta*eta)*(1. + qsi)*(1. + zeta));
61  phi(18,0) = -1./4.*((1. + eta)*(-1. + qsi*qsi)*(1. + zeta));
62  phi(19,0) = 1./4.*((-1. + eta*eta)*(-1. + qsi)*(1. + zeta));
63 
64 
65  dphi(0,0) = 1./8.*((-1. + eta)*(-1. + zeta)*(1. + eta + 2.*qsi + zeta));
66  dphi(1,0) = 1./8.*((-1. + qsi)*(-1. + zeta)*(1. + 2.*eta + qsi + zeta));
67  dphi(2,0) = 1./8.*((-1. + eta)*(-1. + qsi)*(1. + eta + qsi + 2.*zeta));
68 
69  dphi(0,1) = -1./8.*((-1. + eta)*(-1. + zeta)*(1. + eta - 2.*qsi + zeta));
70  dphi(1,1) = 1./8.*((1. + qsi)*(-1. - 2.*eta + qsi - zeta)*(-1. + zeta));
71  dphi(2,1) = -1./8.*((-1. + eta)*(1. + qsi)*(1. + eta - qsi + 2.*zeta));
72 
73  dphi(0,2) = 1./8.*((1. + eta)*(-1. + zeta)*(1. - eta - 2.*qsi + zeta));
74  dphi(1,2) = 1./8.*((1. + qsi)*(-1. + zeta)*(1. - 2.*eta - qsi + zeta));
75  dphi(2,2) = -1./8.*((1. + eta)*(1. + qsi)*(-1. + eta + qsi - 2.*zeta));
76 
77  dphi(0,3) = 1./8.*((1. + eta)*(-1. + eta - 2.*qsi - zeta)*(-1. + zeta));
78  dphi(1,3) = -1./8.*((-1. + qsi)*(-1. + zeta)*(1. - 2.*eta + qsi + zeta));
79  dphi(2,3) = 1./8.*((1. + eta)*(-1. + qsi)*(-1. + eta - qsi - 2.*zeta));
80 
81  dphi(0,4) = -1./8.*((-1. + eta)*(1. + eta + 2.*qsi - zeta)*(1. + zeta));
82  dphi(1,4) = -1./8.*((-1. + qsi)*(1. + 2.*eta + qsi - zeta)*(1. + zeta));
83  dphi(2,4) = -1./8.*((-1. + eta)*(-1. + qsi)*(1. + eta + qsi - 2.*zeta));
84 
85  dphi(0,5) = 1./8.*((-1. + eta)*(1. + eta - 2.*qsi - zeta)*(1. + zeta));
86  dphi(1,5) = -1./8.*((1. + qsi)*(1. + zeta)*(-1. - 2.*eta + qsi + zeta));
87  dphi(2,5) = 1./8.*((-1. + eta)*(1. + qsi)*(1. + eta - qsi - 2.*zeta));
88 
89  dphi(0,6) = 1./8.*((1. + eta)*(1. + zeta)*(-1. + eta + 2.*qsi + zeta));
90  dphi(1,6) = 1./8.*((1. + qsi)*(1. + zeta)*(-1. + 2.*eta + qsi + zeta));
91  dphi(2,6) = 1./8.*((1. + eta)*(1. + qsi)*(-1. + eta + qsi + 2.*zeta));
92 
93  dphi(0,7) = -1./8.*((1. + eta)*(1. + zeta)*(-1. + eta - 2.*qsi + zeta));
94  dphi(1,7) = 1./8.*((-1. + qsi)*(1. - 2.*eta + qsi - zeta)*(1. + zeta));
95  dphi(2,7) = 1./8.*((1. + eta)*(-1. + qsi)*(1. - eta + qsi - 2.*zeta));
96 
97  dphi(0,8) = -1./2.*((-1. + eta)*qsi*(-1. + zeta));
98  dphi(1,8) = -1./4.*((-1. + qsi*qsi)*(-1. + zeta));
99  dphi(2,8) = -1./4.*((-1. + eta)*(-1. + qsi*qsi));
100 
101  dphi(0,9) = 1./4.*((-1. + eta*eta)*(-1. + zeta));
102  dphi(1,9) = 1./2.*(eta*(1. + qsi)*(-1. + zeta));
103  dphi(2,9) = 1./4.*((-1. + eta*eta)*(1. + qsi));
104 
105  dphi(0,10) = 1./2.*((1. + eta)*qsi*(-1. + zeta));
106  dphi(1,10) = 1./4.*((-1. + qsi*qsi)*(-1. + zeta));
107  dphi(2,10) = 1./4.*((1. + eta)*(-1. + qsi*qsi));
108 
109  dphi(0,11) = -1./4.*((-1. + eta*eta)*(-1. + zeta));
110  dphi(1,11) = -1./2.*(eta*(-1. + qsi)*(-1. + zeta));
111  dphi(2,11) = -1./4.*((-1. + eta*eta)*(-1. + qsi));
112 
113  dphi(0,12) = -1./4.*((-1. + eta)*(-1. + zeta*zeta));
114  dphi(1,12) = -1./4.*((-1. + qsi)*(-1. + zeta*zeta));
115  dphi(2,12) = -1./2.*((-1. + eta)*(-1. + qsi)*zeta);
116 
117  dphi(0,13) = 1./4.*((-1. + eta)*(-1. + zeta*zeta));
118  dphi(1,13) = 1./4.*((1. + qsi)*(-1. + zeta*zeta));
119  dphi(2,13) = 1./2.*((-1. + eta)*(1. + qsi)*zeta);
120 
121  dphi(0,14) = -1./4.*((1. + eta)*(-1. + zeta*zeta));
122  dphi(1,14) = -1./4.*((1. + qsi)*(-1. + zeta*zeta));
123  dphi(2,14) = -1./2.*((1. + eta)*(1. + qsi)*zeta);
124 
125  dphi(0,15) = 1./4.*((1. + eta)*(-1. + zeta*zeta));
126  dphi(1,15) = 1./4.*((-1. + qsi)*(-1. + zeta*zeta));
127  dphi(2,15) = 1./2.*((1. + eta)*(-1. + qsi)*zeta);
128 
129  dphi(0,16) = 1./2.*((-1. + eta)*qsi*(1. + zeta));
130  dphi(1,16) = 1./4.*((-1. + qsi*qsi)*(1. + zeta));
131  dphi(2,16) = 1./4.*((-1. + eta)*(-1. + qsi*qsi));
132 
133  dphi(0,17) = -1./4.*((-1. + eta*eta)*(1. + zeta));
134  dphi(1,17) = -1./2.*(eta*(1. + qsi)*(1. + zeta));
135  dphi(2,17) = -1./4.*((-1. + eta*eta)*(1. + qsi));
136 
137  dphi(0,18) = -1./2.*((1. + eta)*qsi*(1. + zeta));
138  dphi(1,18) = -1./4.*((-1. + qsi*qsi)*(1. + zeta));
139  dphi(2,18) = -1./4.*((1. + eta)*(-1. + qsi*qsi));
140 
141  dphi(0,19) = 1./4.*((-1. + eta*eta)*(1. + zeta));
142  dphi(1,19) = 1./2.*(eta*(-1. + qsi)*(1. + zeta));
143  dphi(2,19) = 1./4.*((-1. + eta*eta)*(-1. + qsi));
144 }
145 
146 
147 template<class T>
148 void TPZQuadraticCube::X(const TPZFMatrix<REAL> &nodes,TPZVec<T> &loc,TPZVec<T> &x){
149 
150  TPZFNMatrix<20,T> phi(NNodes,1);
151  TPZFNMatrix<60,T> dphi(3,NNodes);
152  TShape(loc,phi,dphi);
153  int space = nodes.Rows();
154 
155  for(int i = 0; i < space; i++) {
156  x[i] = 0.0;
157  for(int j = 0; j < NNodes; j++) {
158  x[i] += phi(j,0)*nodes.GetVal(i,j);
159  }
160  }
161 
162 }
163 
164 template<class T>
165 void TPZQuadraticCube::GradX(const TPZFMatrix<REAL> &nodes,TPZVec<T> &loc, TPZFMatrix<T> &gradx){
166 
167  gradx.Resize(3,3);
168  gradx.Zero();
169  int nrow = nodes.Rows();
170  int ncol = nodes.Cols();
171 #ifdef PZDEBUG
172  if(nrow != 3 || ncol != 20){
173  std::cout << "Objects of incompatible lengths, gradient cannot be computed." << std::endl;
174  std::cout << "nodes matrix must be 3x20." << std::endl;
175  DebugStop();
176  }
177 
178 #endif
179  TPZFNMatrix<3,T> phi(NNodes,1);
180  TPZFNMatrix<6,T> dphi(3,NNodes);
181  TShape(loc,phi,dphi);
182  for(int i = 0; i < NNodes; i++)
183  {
184  for(int j = 0; j < 3; j++)
185  {
186  gradx(j,0) += nodes.GetVal(j,i)*dphi(0,i);
187  gradx(j,1) += nodes.GetVal(j,i)*dphi(1,i);
188  gradx(j,2) += nodes.GetVal(j,i)*dphi(2,i);
189  }
190  }
191 
192 }
193 
198 // TPZGeoEl *TPZQuadraticCube::CreateGeoElement(TPZGeoMesh &mesh, MElementType type,
199 // TPZVec<int64_t>& nodeindexes,
200 // int matid,
201 // int64_t& index)
202 // {
203 // return CreateGeoElementMapped(mesh,type,nodeindexes,matid,index);
204 // }
205 
206 // TPZGeoEl *TPZQuadraticCube::CreateBCGeoEl(TPZGeoEl *orig,int side,int bc)
207 // {
208 // int ns = orig->NSideNodes(side);
209 // TPZManVector<int64_t> nodeindices(ns);
210 // int in;
211 // for(in=0; in<ns; in++)
212 // {
213 // nodeindices[in] = orig->SideNodeIndex(side,in);
214 // }
215 // int64_t index;
216 
217 // TPZGeoMesh *mesh = orig->Mesh();
218 // MElementType type = orig->Type(side);
219 
220 // TPZGeoEl *newel = mesh->CreateGeoBlendElement(type, nodeindices, bc, index);
221 // TPZGeoElSide me(orig,side);
222 // TPZGeoElSide newelside(newel,newel->NSides()-1);
223 
224 // newelside.InsertConnectivity(me);
225 // newel->Initialize();
226 
227 // return newel;
228 // }
229 
231 /* @param gmesh mesh in which the element should be inserted
232  @param matid material id of the element
233  @param lowercorner (in/out) on input lower corner o the cube where the element should be created, on exit position of the next cube
234  @param size (in) size of space where the element should be created
235  */
236 #include "tpzchangeel.h"
237 
238 void TPZQuadraticCube::InsertExampleElement(TPZGeoMesh &gmesh, int matid, TPZVec<REAL> &lowercorner, TPZVec<REAL> &size)
239 {
240  TPZManVector<REAL,3> co(3),shift(3),scale(3);
241  TPZManVector<int64_t,4> nodeindexes(NCornerNodes);
242  for (int i=0; i<3; i++) {
243  scale[i] = size[i]/3.;
244  shift[i] = size[i]/2.+lowercorner[i];
245  }
246 
247  for (int i=0; i<NCornerNodes; i++) {
248  ParametricDomainNodeCoord(i, co);
249  co.Resize(3,0.);
250  for (int j=0; j<3; j++) {
251  co[j] = shift[j]+scale[j]*co[j]+(rand()*0.2/RAND_MAX)-0.1;
252  }
253  nodeindexes[i] = gmesh.NodeVec().AllocateNewElement();
254  gmesh.NodeVec()[nodeindexes[i]].Initialize(co, gmesh);
255  }
256  int64_t index;
257  gmesh.CreateGeoElement(ECube, nodeindexes, matid, index);
258  TPZGeoEl *gel = gmesh.Element(index);
259  int nsides = gel->NSides();
260  for (int is=0; is<nsides; is++) {
261  gel->SetSideDefined(is);
262  }
263  gel = TPZChangeEl::ChangeToQuadratic(&gmesh, index);
264  for (int node = gel->NCornerNodes(); node < gel->NNodes(); node++) {
266  gel->NodePtr(node)->GetCoordinates(co);
267  for (int i=0; i<3; i++) {
268  co[i] += (0.2*rand())/RAND_MAX - 0.1;
269  }
270  gel->NodePtr(node)->SetCoord(co);
271  }
272 }
273 //void TPZQuadraticCube::ParametricDomainNodeCoord(int node, TPZVec<REAL> &nodeCoord)
274 //{
275 // if(node > this->NNodes)
276 // {
277 // DebugStop();
278 // }
279 // nodeCoord.Resize(Dimension, 0.);
280 // switch (node) {
281 // case (0):
282 // {
283 // nodeCoord[0] = -1.;
284 // nodeCoord[1] = -1.;
285 // nodeCoord[2] = -1.;
286 // break;
287 // }
288 // case (1):
289 // {
290 // nodeCoord[0] = 1.;
291 // nodeCoord[1] = -1.;
292 // nodeCoord[2] = -1.;
293 // break;
294 // }
295 // case (2):
296 // {
297 // nodeCoord[0] = 1.;
298 // nodeCoord[1] = 1.;
299 // nodeCoord[2] = -1.;
300 // break;
301 // }
302 // case (3):
303 // {
304 // nodeCoord[0] = -1.;
305 // nodeCoord[1] = 1.;
306 // nodeCoord[2] = -1.;
307 // break;
308 // }
309 // case (4):
310 // {
311 // nodeCoord[0] = -1.;
312 // nodeCoord[1] = -1.;
313 // nodeCoord[2] = 1.;
314 // break;
315 // }
316 // case (5):
317 // {
318 // nodeCoord[0] = 1.;
319 // nodeCoord[1] = -1.;
320 // nodeCoord[2] = 1.;
321 // break;
322 // }
323 // case (6):
324 // {
325 // nodeCoord[0] = 1.;
326 // nodeCoord[1] = 1.;
327 // nodeCoord[2] = 1.;
328 // break;
329 // }
330 // case (7):
331 // {
332 // nodeCoord[0] = -1.;
333 // nodeCoord[1] = 1.;
334 // nodeCoord[2] = 1.;
335 // break;
336 // }
337 // case (8):
338 // {
339 // nodeCoord[0] = 0.;
340 // nodeCoord[1] = -1.;
341 // nodeCoord[2] = -1.;
342 // break;
343 // }
344 // case (9):
345 // {
346 // nodeCoord[0] = 1.;
347 // nodeCoord[1] = 0.;
348 // nodeCoord[2] = -1.;
349 // break;
350 // }
351 // case (10):
352 // {
353 // nodeCoord[0] = 0.;
354 // nodeCoord[1] = 1.;
355 // nodeCoord[2] = -1.;
356 // break;
357 // }
358 // case (11):
359 // {
360 // nodeCoord[0] = -1.;
361 // nodeCoord[1] = 0.;
362 // nodeCoord[2] = -1.;
363 // break;
364 // }
365 // case (12):
366 // {
367 // nodeCoord[0] = -1.;
368 // nodeCoord[1] = -1.;
369 // nodeCoord[2] = 0.;
370 // break;
371 // }
372 // case (13):
373 // {
374 // nodeCoord[0] = 1.;
375 // nodeCoord[1] = -1.;
376 // nodeCoord[2] = 0.;
377 // break;
378 // }
379 // case (14):
380 // {
381 // nodeCoord[0] = 1.;
382 // nodeCoord[1] = 1.;
383 // nodeCoord[2] = 0.;
384 // break;
385 // }
386 // case (15):
387 // {
388 // nodeCoord[0] = -1.;
389 // nodeCoord[1] = 1.;
390 // nodeCoord[2] = 0.;
391 // break;
392 // }
393 // case (16):
394 // {
395 // nodeCoord[0] = 0.;
396 // nodeCoord[1] = -1.;
397 // nodeCoord[2] = 1.;
398 // break;
399 // }
400 // case (17):
401 // {
402 // nodeCoord[0] = 1.;
403 // nodeCoord[1] = 0.;
404 // nodeCoord[2] = 1.;
405 // break;
406 // }
407 // case (18):
408 // {
409 // nodeCoord[0] = 0.;
410 // nodeCoord[1] = 1.;
411 // nodeCoord[2] = 1.;
412 // break;
413 // }
414 // case (19):
415 // {
416 // nodeCoord[0] = -1.;
417 // nodeCoord[1] = 0.;
418 // nodeCoord[2] = 1.;
419 // break;
420 // }
421 // default:
422 // {
423 // DebugStop();
424 // break;
425 // }
426 // }
427 //}
428 
429  int TPZQuadraticCube::ClassId() const{
430  return Hash("TPZQuadraticCube") ^ TPZNodeRep<20,pztopology::TPZCube>::ClassId() << 1;
431  }
432 };
433 
435 
436 /*@orlandini : I REALLY dont know why is this here, so I have commented the following lines.
437 If it breaks something, I am sorry.*/
438 //template class pzgeom::TPZNodeRep<20,pzgeom::TPZQuadraticCube>;
439 
440 namespace pzgeom {
441  template void TPZQuadraticCube::X(const TPZFMatrix<REAL>&, TPZVec<REAL>&, TPZVec<REAL>&);
442  template void TPZQuadraticCube::GradX(const TPZFMatrix<REAL> &nodes,TPZVec<REAL> &loc, TPZFMatrix<REAL> &gradx);
443 
444 #ifdef _AUTODIFF
445  template void TPZQuadraticCube::X(const TPZFMatrix<REAL>&, TPZVec<Fad<REAL> >&, TPZVec<Fad<REAL> >&);
446  template void TPZQuadraticCube::GradX(const TPZFMatrix<REAL> &nodes,TPZVec<Fad<REAL> > &loc, TPZFMatrix<Fad<REAL> > &gradx);
447 #endif
448 
449 }
int AllocateNewElement()
Makes more room for new elements.
Definition: pzadmchunk.h:184
void SetCoord(const TPZVec< REAL > &x)
Sets all coordinates into the current node. It gets the dim values from x.
Definition: pzgnode.cpp:60
TPZGeoNode * NodePtr(int i) const
Returns a pointer to the ith node of the element.
Definition: pzgeoel.cpp:2566
Contains the TPZChangeEl class. It is a special map.
Contains definitions to LOGPZ_DEBUG, LOGPZ_INFO, LOGPZ_WARN, LOGPZ_ERROR and LOGPZ_FATAL, and the implementation of the inline InitializePZLOG(string) function using log4cxx library or not. It must to be called out of "#ifdef LOG4CXX" scope.
virtual TPZGeoEl * CreateGeoElement(MElementType type, TPZVec< int64_t > &cornerindexes, int matid, int64_t &index, int reftype=1)
Generic method for creating a geometric element. Putting this method centrally facilitates the modifi...
Definition: pzgmesh.cpp:1296
groups all classes dedicated to the computation of shape functions
Definition: pzshapeextend.h:16
virtual int NCornerNodes() const =0
Returns the number of corner nodes of the element.
Definition: fad.h:54
This class implements a simple vector storage scheme for a templated class T. Utility.
Definition: pzgeopoint.h:19
virtual int NSides() const =0
Returns the number of connectivities of the element.
Contains declaration of TPZGeoElMapped class which implements a geometric element using its ancestral...
Contains TPZShapeCube class which implements the shape functions of a hexaedral element.
int Zero() override
Makes Zero all the elements.
Definition: pzfmatrix.h:651
Groups all classes defining the structure of the master element.
Definition: PrismExtend.cpp:15
static TPZGeoEl * ChangeToQuadratic(TPZGeoMesh *Mesh, int64_t ElemIndex)
Turns an linear geoelement to quadratic.
Defines the behaviour of all geometric elements. GeometryTPZGeoEl is the common denominator for all g...
Definition: pzgeoel.h:43
Contains the TPZGeoBlend class which implements a blending map from curved boundaries to the interior...
TPZGeoEl * Element(int64_t iel)
Definition: pzgmesh.h:139
#define DebugStop()
Returns a message to user put a breakpoint in.
Definition: pzerror.h:20
TPZAdmChunkVector< TPZGeoNode > & NodeVec()
Definition: pzgmesh.h:140
int64_t Rows() const
Returns number of rows.
Definition: pzmatrix.h:803
REAL co[8][3]
Coordinates of the eight nodes.
Implements ... Geometry Topology.
Definition: pznoderep.h:40
Contains the TPZQuadraticCube class which defines a cube geometric element with quadratic map...
int32_t Hash(std::string str)
Definition: TPZHash.cpp:10
virtual int NNodes() const =0
Returns the number of nodes of the element.
virtual void SetSideDefined(int side)=0
Flags the side as defined, this means no neighbouring element was found.
This class implements a geometric mesh for the pz environment. Geometry.
Definition: pzgmesh.h:48
Definition: pzeltype.h:61
Contains the implementation of the TPZNodeRep methods.
int64_t Cols() const
Returns number of cols.
Definition: pzmatrix.h:809
int Resize(const int64_t newRows, const int64_t wCols) override
Redimension a matrix, but maintain your elements.
Definition: pzfmatrix.cpp:1016
Contains the implementation of the TPZGeoElRefPattern methods.
void GetCoordinates(TPZVec< REAL > &co)
Fill the coordinates of the node.
Definition: pzgnode.cpp:83
Groups all classes which model the geometry.
Definition: pzgeopoint.cpp:18
const TVar & GetVal(const int64_t row, const int64_t col) const override
Get values without bounds checking This method is faster than "Get" if DEBUG is defined.
Definition: pzfmatrix.h:566
Implements an interface to register a class id and a restore function. Persistence.
Definition: TPZSavable.h:150
Non abstract class which implements full matrices with preallocated storage with (N+1) entries...
Definition: pzfmatrix.h:716