Compare commits

...
139 Commits
Author SHA1 Message Date
Vladimir Tomov 8f5e588554 Merge branch 'master' into matrix-free-FCT
Conflicts:
	examples/ex9.cpp
	fem/fe.cpp
2019-04-04 19:16:55 -07:00
Vladimir Tomov 5cec76ac01 Dropped exec_mode = 2. 2019-04-01 16:30:48 -07:00
Hennes Hajduk ef8a2147e6 format 2019-03-29 18:05:26 +01:00
Hennes Hajduk 390d72da77 some conditionals, moved stuff into LowOrderMethod and recomputation of subcell weights for every step in remap. 2019-03-29 18:04:50 +01:00
Hennes Hajduk f9e67b192d SubcellWeights and NbrDof are now DenseTensors (better indexing). Plus minor changes. 2019-03-29 10:37:49 +01:00
Hennes Hajduk 0d6dbc8ed7 Code cleanup. Two classes: Assembly (bdrs and subcells) and Dofs (topological). Low order stuff is combinded in a struct. Missing from my side: check for memory leaks and final check for correctness. 2019-03-28 18:16:49 +01:00
Hennes Hajduk e5a06168df Unified test cases, using non-periodic boundary domain as default now. 2019-03-28 09:17:07 +01:00
Hennes Hajduk a7f820d0a0 Minor. 2019-03-27 16:51:33 +01:00
Hennes Hajduk 9e3ca8676a Added mesh that is the same a periodic-square but with actual boundaries. 2019-03-27 12:07:48 +01:00
Hennes Hajduk 18781dbd56 Added important if's required for nbr search in case of non-periodic boundaries. Changed VolumeTerms velocity back (WIP). 2019-03-27 12:07:11 +01:00
Hennes Hajduk f786e373ee . 2019-03-26 19:16:05 +01:00
Hennes Hajduk 0f9765123e work in progress: Fixing subcell scheme. 2019-03-26 19:04:53 +01:00
Hennes Hajduk 03cc3d4d51 Renamed variables. ref_mesh is computed every step for exec_mode > 0. Using v_coef for VolumeTerms (which leads to Seg-fault). 2019-03-26 14:02:01 +01:00
Hennes Hajduk 22878d0fff Fixed bug in nbr computation. 2019-03-26 09:14:04 +01:00
Hennes Hajduk a95aa9ba20 Using a struct to make PDU work. 2019-03-25 16:24:10 +01:00
Hennes Hajduk d4acf8fd3d Changed discrete upwinding matrix to be the sum of K and D. 2019-03-25 12:05:09 +01:00
Hennes Hajduk 336a38f76c Moved divison by dt to a more natural place, according to paper. 2019-03-25 10:31:37 +01:00
Hennes Hajduk 7ad3fa9c66 Optimized min max computation to be on the fly. 2019-03-25 10:13:11 +01:00
Hennes Hajduk cd7abe7a41 Discrete upwinding works properly now for all modes. Still have to fix PDU and LED viaolation, then it might be a good stage to merge. 2019-03-22 17:49:42 +01:00
Hennes Hajduk 26ffe48ddb Made sure, that map_for_bounds only includes nonnegative element numbers. 2019-03-21 18:16:44 +01:00
Hennes Hajduk 77ebd14767 Fixed map_for_bounds for cubes and NbrDof for real (non-periodic) boundaries. 2019-03-21 17:34:49 +01:00
Hennes Hajduk 35300eb672 Cleanup, renaming. 2019-03-21 16:50:34 +01:00
Hennes Hajduk 1a6e436896 Moved assembly into Mult instead of low order solution. 2019-03-21 12:29:32 +01:00
Hennes Hajduk b4bd0ca81f Fixed flux lumping in 1D. 2019-03-21 12:10:50 +01:00
Hennes Hajduk 13414e8869 Removed kbdr, using LinearFluxLumping instead. 2019-03-21 10:00:37 +01:00
Hennes Hajduk 625b8153de Bugfix transport, corrected initialization of bdrInt 2019-03-21 08:41:05 +01:00
Hennes Hajduk 3f5e546d53 Assembly only once for transport. Right now with a bug. 2019-03-20 20:54:48 +01:00
Hennes Hajduk 3d9c207f7e Minor changes. 2019-03-20 20:02:33 +01:00
Hennes Hajduk bf1ca0cc49 New class for assembly: various changes. Plus renaming, appearance. 2019-03-20 19:53:53 +01:00
Hennes Hajduk 44ea87dca5 Style, renaming. 2019-03-20 12:14:18 +01:00
Hennes Hajduk 51a0d44070 Some renaming. 2019-03-20 11:27:05 +01:00
Hennes Hajduk 50c8bcbf92 Transformed Solution bounds to a class that is created in preprocessing and contains only dof information. FCT will have everything that is needed for assembly. 2019-03-19 17:45:16 +01:00
Hennes Hajduk a45c436c33 Started merging FCT and BNDS classes. 2019-03-19 16:13:38 +01:00
Hennes Hajduk bdd2d48c06 Added 1D neighborDof computation. Renamed and rearranged stuff. 2019-03-19 12:18:07 +01:00
Hennes Hajduk 5e6682f844 Comments, simplified neighborDof computation for 2D. 2019-03-19 11:50:15 +01:00
Hennes Hajduk c0d65652da comments 2019-03-19 11:18:11 +01:00
Hennes Hajduk 7173daf2e4 Removed alpha for now, min max computation for DU. 2019-03-19 10:45:38 +01:00
Hennes Hajduk 7310ecaaab Stored elementwise min max values. 2019-03-19 10:33:21 +01:00
Hennes Hajduk f24018dc2b Updated transport sample runs, to be as in paper. 2019-03-19 09:59:30 +01:00
Hennes Hajduk 992cc589eb Merge pull request #785 from mfem/matrix-free-remap
Remap execution modes [matrix-free-remap]
2019-03-18 16:18:46 +01:00
Tzanio e9836d3e19 make style 2019-03-11 20:08:34 -07:00
Vladimir Tomov df6d40fff6 Minor. 2019-03-11 17:07:34 -07:00
Vladimir Tomov 6a9ff9eeea Support for 3 execution modes, based on problem_id:
- standard transport
- standard remap
- Lagrangian step followed by mesh return / remap.
2019-03-11 16:39:05 -07:00
Vladimir Tomov 39fb641765 Added a variable remap_mode, other minor changes. 2019-03-08 18:38:00 -08:00
Vladimir Tomov e86493ad43 Minor. 2019-03-08 18:25:54 -08:00
Hennes Hajduk 6d34fa6e71 Enabled both grid transformation or grid to be constant. Basically RDS and FCT are working now, but there are some minor bugs. 2019-03-09 01:58:10 +01:00
Hennes Hajduk 70b27185cb rotation 2019-03-09 01:25:17 +01:00
Hennes Hajduk 5bd7b031d8 Bug fix 2019-03-09 01:20:49 +01:00
Hennes Hajduk 2a62a4be73 Bug fix 2019-03-09 01:06:19 +01:00
Hennes Hajduk 2c524f5bba Works now. 2019-03-09 00:58:27 +01:00
Hennes Hajduk 67de69b144 Changed velocity to work for remap with deformed mesh and updated boundary integrals to work for remap (not advection). 2019-03-09 00:46:24 +01:00
Hennes Hajduk ec01048ebb Changed integrators. 2019-03-08 23:42:01 +01:00
Hennes Hajduk 4a00fddf0c Merged. 2019-03-08 23:03:55 +01:00
Hennes Hajduk 40407112d5 Cleanup of boundary lumping 2019-03-08 19:40:04 +01:00
Vladimir Tomov 3809795c15 Added problem 6 that does the standard mode of remap (the mesh
evolves while the solution stays fixed).
2019-03-08 10:38:06 -08:00
Hennes Hajduk 05fa7fc353 Finished restructuring. 2019-03-08 18:34:22 +01:00
Hennes Hajduk bff4bd2b6d Moved routines, started splitting preprocessing of dof info and assembly of stuff for RD. 2019-03-08 17:41:42 +01:00
Hennes Hajduk f35a006b37 Removed PDU 2019-03-08 16:54:40 +01:00
Hennes Hajduk 963c40c938 Assembled lumpedM in every step. But using initial lumpedM to compute mass error in main. 2019-03-08 16:47:53 +01:00
Hennes Hajduk be3088c249 Stripped ex9.cpp of unnecessary routines and options. 2019-03-08 16:41:43 +01:00
Hennes Hajduk 7e69b96411 Replaced fct.lumpedM with adv.lumpedM. 2019-03-08 02:17:11 +01:00
Hennes Hajduk e6bfafd882 Added lumpedM as Bilinearform and Vector. 2019-03-08 02:16:27 +01:00
Hennes Hajduk b7a5d7e962 Computed D every time. Fixed skip-zeros. Moved routines. New matrix in FE_Evolution. 2019-03-08 01:53:22 +01:00
Hennes Hajduk e741a47a8f Clean up of discrete upwinding. Using kbdr. 2019-03-08 01:07:19 +01:00
Hennes Hajduk 98019d8fe8 Changed the sign for convection integrators. 2019-03-07 23:42:51 +01:00
Vladimir Tomov ffa9413579 Working remap code, but needs some corrections. 2019-03-07 13:54:08 -08:00
Vladimir Tomov e03dd471f7 Initial remap code. 2019-03-07 12:36:32 -08:00
Hennes Hajduk 7bf441fe3e . 2019-03-07 18:06:58 +01:00
Hennes Hajduk 1a80458747 Removed DGPositiveTraceIntegrator (again). 2019-03-07 17:49:47 +01:00
Hennes Hajduk b636af8f91 Merge branch 'matrix-free-FCT' of https://github.com/mfem/mfem into matrix-free-FCT 2019-03-07 17:45:48 +01:00
Hennes Hajduk 930b76816f Fixed neighbor identification in 2D and removed kbdr matrix. 2019-03-07 17:40:52 +01:00
Hennes Hajduk 4a597ead90 Fixed ExtractBdrDofs to be counter-clockwise oriented and a bug for 1D. 3D is NOT ordered properly. 2019-03-07 17:31:03 +01:00
Hennes Hajduk 0750c547f0 Fixed the possibility that nbr_id is zero. 2019-03-07 17:25:03 +01:00
Hennes Hajduk 1a50d12df2 Improved neighbor element search. 2019-03-05 19:52:22 +01:00
Hennes Hajduk 1647a05ff0 Using mfem routines for error computation. 2019-03-05 19:50:13 +01:00
Hennes Hajduk de08ef520d Added kbdr. 2019-03-05 19:49:05 +01:00
Hennes Hajduk 6f2f3d63c2 Cleanup, restructured schemeOpt modification. 2019-03-05 19:45:14 +01:00
Hennes Hajduk 99881aaa0d Cleanup, and renaming. 2019-03-05 19:40:58 +01:00
Hennes Hajduk 23f334c26b New class for 'lumped' boundary terms. WIP. 2019-03-05 19:28:59 +01:00
Hennes Hajduk 36d4fae3c5 Made sure DU works by disabling monolithic matrix-based limiter. 2019-02-19 16:56:52 +01:00
Hennes Hajduk 5fbfd4029e Implemented matrix-based monolithic limiter. It's not working great but seems to be doing everything as planned. Cleaned matrx-based schemes up. Put some stuff in own routines. Minor changes. At this stage I will just do more cleanup and everything else will be done after SIAM. 2019-02-15 17:46:21 +01:00
Hennes Hajduk 8f883f91f6 Some cleanup, renaming. Fixed Rusanov for subcells. Problem was wrong neighbor indices. It doesn't work as well as RDS. 2019-02-14 18:19:08 +01:00
Hennes Hajduk 91f544ebf0 Removed scale and changed configuration for SBR to be conforming to literature. Merged conflict 2019-02-11 20:26:27 +01:00
Hennes Hajduk 2a08c018db Added scale into error computation to be benchmark compatible. Output of errors to text file in comments. Minor changes. 2019-02-08 13:04:27 +01:00
Vladimir Tomov 9e1a30805a Fixed a comment. 2019-02-07 13:11:10 -08:00
Vladimir Tomov 5fb8bc0f2e Changes s.t. for 2D unstructured we don't hit mfem_abort. 2019-02-07 13:02:58 -08:00
Hennes Hajduk 0e29f24d1c Changed sbr benchmark to be consistent with literature. Added nodal bounds map computation and min/max computation based on that. Bounds are computed every RK step (which is essential). Changed preconditioned discrete upwinding back to mass matrix inversion because it didn't work well. Local mass matrix should be small anyways so inversion is okay. 2019-02-01 19:11:42 +01:00
Hennes Hajduk 26edf91e90 Replaced mass matrix inversion by Richardson iteration as in ex9.cpp 2019-01-28 16:33:14 +01:00
Hennes Hajduk 9962a7839c Minor changes. 2019-01-25 16:23:36 +01:00
Hennes Hajduk 43a9c5ee21 Renamed b to f. 2019-01-24 19:09:03 +01:00
Hennes Hajduk 214ec2a555 Changed sign of bdrInt. Removed bdrIntNeighbor and replaced it by bdrInt. Some cleanup. 2019-01-24 18:36:09 +01:00
Hennes Hajduk f5a22bd989 Some cleanup. Using matrix K for basic DU version. Neumann solve alsways used 20 iterations. New routine for error computation. Preliminary versions of limiting discrete time derivative. Included a fix for disc-nurbs with parameters -r 0 -o 1 in the comments. 2019-01-24 11:17:22 +01:00
Hennes Hajduk 29b43a6229 Mainly Rusanov for subcells with a bug that has to be fixed (WIP). 2019-01-18 16:15:03 +01:00
Hennes Hajduk b6901631a1 Bug fix: balls and jacks test. Full RD-limiting possible: change in limiting of convective volume terms (rho). Iterative solver. New methods for limiting of (M_L - M_C)u_dot, not yet working for high orders, due to pessimistic correction factors alphaDot (WIP). Alternative to RD scheme for flux terms and corresponding limiting. Some cleanup of code and new routines for stuff that's repeating. 2019-01-18 16:10:41 +01:00
Hennes Hajduk f43c722299 Changed Rusanov flux scheme to be FluxLumping as in RD scheme. 2019-01-10 16:47:41 +01:00
Hennes Hajduk c8bc0f2f24 Limiter for mass matrix working now. We compute the discrete time derivative from the inverted mass matrix with unlimited right hand side. Contrary to current formula in the report. 2019-01-09 17:39:25 +01:00
Hennes Hajduk e4194124e4 Limiter for RD according to section 4 implemented. Renamed isSubcell. Still a bug: correction factors all equal to 1 do not yield Galerkin solution. 2018-12-17 19:18:33 +01:00
Hennes Hajduk 74fd04f1bb Added jacks and balls test cases in 2 and 3D. Plus minor changes. 2018-12-17 16:30:39 +01:00
Hennes Hajduk 14c4a065b6 Limiter almost done. Started adding balls-and-jack test. Code cleanup on Monday. 2018-12-14 22:11:36 +01:00
Hennes Hajduk 6e1b207420 Bug fix in high order FCT scheme. Made sure xNeighbor exists if the domain has non-periodic boundaries. 2018-12-13 16:22:57 +01:00
Hennes Hajduk dd979ed87f Removed smoothnessIndicator stuff. Started implementing the limiter for RD and therefore restructured the low order scheme implementation. Plus minor changes. 2018-12-12 19:05:03 +01:00
Hennes Hajduk dcb84a44b5 Removed Kronecker product routine. 2018-12-12 11:09:00 +01:00
Hennes Hajduk b223ec837a Usage of preconditioned discrete upwinding together with flux lumping as for RD scheme. The latter is put into seperate routines. 2018-12-12 11:08:31 +01:00
Hennes Hajduk 67c48ed290 Preconditioned discrete upwinding integrator class 2018-12-12 11:03:24 +01:00
Tzanio 0d741f598f Small fixes 2018-12-10 09:22:41 -08:00
Tzanio 97d17e4f8b make style 2018-12-10 09:05:42 -08:00
Hennes Hajduk 6862b40479 Prefered implementation of subcell fluctuations in comments. Element transformations of the refined mesh are broken. 2018-12-10 09:16:58 +01:00
Hennes Hajduk 9f1fe18827 Removed FillSubcellsForNode, due to more efficient implementation where I add contributions for all nodes of a certain subcell. 2018-12-07 18:47:06 +01:00
Hennes Hajduk 8a8b98eeb2 Changed computation of subcell fluctuations, because the refined mesh does not have nodes. Now it's only working for structured grids (no curvature, elements of same size). Check for conservation added, minor changes. 2018-12-07 18:45:03 +01:00
Hennes Hajduk c860fa44cf Serial version of low order RD scheme: Working for segments and quads at the moment. Cubes to be included very soon. Work in progress, some TODOs remaining but relatively clean code. 2018-11-30 19:29:39 +01:00
Hennes Hajduk 81d13647ed It's no longer needed but prevously I employed the routine KroneckerProduct, maybe you want it... 2018-11-30 19:23:46 +01:00
Hennes Hajduk 847f8ad473 Added MixedConvectionIntegrator. 2018-11-30 19:19:46 +01:00
Hennes Hajduk 440fc80eb8 started removing alphaBeta scheme in favor of RD. Modification of deafult dt. 2018-11-15 10:46:00 +01:00
Hennes Hajduk 84f7fb5ebf optimized computation of lumped mass matrix, change in default scheme. 2018-11-15 10:25:55 +01:00
Hennes Hajduk d298f07063 Names of methods have changed. 2018-11-15 10:05:08 +01:00
Hennes Hajduk a36b28fa56 Changes in default setup. 2018-11-15 09:59:14 +01:00
Hennes Hajduk d9bfcd618c Renamed methods, optimized routine arguments and class members. Changed default configuration. 2018-11-15 09:56:33 +01:00
Hennes Hajduk c1977faea0 maxIter=200, renamed Rusanov scheme. Minor changes. 2018-11-15 09:52:46 +01:00
Hajduk 764532e725 Changed the way qOrdF is found to be more clean. Changes in description. 2018-08-29 08:49:37 -07:00
Hajduk bfe69bcdc7 Minor changes. 2018-08-28 15:48:08 -07:00
Hajduk 88dded6491 Fixed size of a DenseMatrix, adjusted tolerance in FCT to be cositstent, optimized FCT by getting rid of a loop. Minor changes. 2018-08-28 15:39:35 -07:00
Hajduk a25a18b94b Latest functionalities: algebraic scheme, alpha-beta, smoothness indicator, algebraic upwinding + Code cleanup and new FCT-class instead of putting everything in FE_Evolution. 2018-08-28 14:46:54 -07:00
Hajduk a89941e16c Additional computation of global neighbor map for smoothness indicator. 2018-08-28 14:36:59 -07:00
Hajduk 09446a282b Renamed and reordered enum-types. Plus minor changes. 2018-08-28 14:35:08 -07:00
Hajduk a35fee7d96 Minor changes. 2018-08-14 07:39:54 -07:00
Hajduk 96bb8d9e94 Adjusted quadrature order. Last sample run time step according to working CFL condition. 2018-08-10 14:30:49 -07:00
Hajduk bbd9243d0c Avoided memory leaks. 2018-08-08 14:13:39 -07:00
Hajduk ab1e06322b Solid body rotation benchmark added. Usage of localized stencils now possible with new enum type STENCIL. Extraction of bdrDofs happens as in PullRequest 573 and for each boundary of the reference element only once per simulation. Plus minor changes. 2018-08-08 10:22:33 -07:00
Hajduk d3712474d3 Changes as in branch extractBdrDofs, PullRequest 573. 2018-08-08 07:51:11 -07:00
Hajduk 13ecf3c60d Option to choose monotonicity type as argument for main. 2018-07-31 09:23:45 -07:00
Hajduk 2d0b0df980 Enum type for mono_type. Minor changes and Yohann's comments included. 2018-07-31 08:00:51 -07:00
Hajduk 2900c93a41 Prototype for high-order reconstruction scheme. 2018-07-30 11:01:52 -07:00
Hajduk 35d06858af Config as in master. 2018-07-19 13:51:07 -07:00
Hajduk bb4ae14c1d Monotonicity treatment options caught if not zero, one. 2018-07-19 12:42:34 -07:00
Hajduk 6dda385e2c Modification in scheme for face terms. Necessary for mass conservation. 2018-07-18 09:26:25 -07:00
Hajduk f528afa482 Low order scheme I fully implemented. BdrDof extraction happens in ex9.cpp and is not supported for triangles and tets yet. 2018-07-17 16:43:54 -07:00
Hajduk 14043a12a0 Framework for edge-based diffusion implemented, incomplete! Minor changes in element-based algorithm and default example. 2018-07-09 10:52:54 -07:00
Hajduk 084198e519 Changed implementation to happen only once per problem solve. 2018-07-05 16:59:10 -07:00
Hajduk 7bc77d89e1 First step in implementation of low order scheme I: diffusion for element contributions added to rhs. 2018-07-05 13:42:32 -07:00
7 changed files with 2390 additions and 39 deletions
+97
View File
@@ -0,0 +1,97 @@
MFEM mesh v1.0
#
# MFEM Geometry Types (see mesh/geom.hpp):
#
# POINT = 0
# SEGMENT = 1
# TRIANGLE = 2
# SQUARE = 3
# TETRAHEDRON = 4
# CUBE = 5
#
dimension
2
# format: <attribute> <geometry type> <vertex 0> <vertex 1> ...
elements
9
1 3 0 1 5 4
2 3 1 2 6 5
3 3 2 3 7 6
4 3 4 5 9 8
5 3 5 6 10 9
6 3 6 7 11 10
7 3 8 9 13 12
8 3 9 10 14 13
9 3 10 11 15 14
boundary
12
1 1 0 1
2 1 1 2
3 1 2 3
4 1 3 7
5 1 7 11
6 1 11 15
7 1 15 14
8 1 14 13
9 1 13 12
10 1 12 8
11 1 8 4
12 1 4 0
vertices
16
nodes
FiniteElementSpace
FiniteElementCollection: L2_T1_2D_P1
VDim: 2
Ordering: 1
0 0
0.333333333 0
0 0.333333333
0.333333333 0.333333333
0.333333333 0
0.666666667 0
0.333333333 0.333333333
0.666666667 0.333333333
0.666666667 0
1 0
0.666666667 0.333333333
1 0.333333333
0 0.333333333
0.333333333 0.333333333
0 0.666666667
0.333333333 0.666666667
0.333333333 0.333333333
0.666666667 0.333333333
0.333333333 0.666666667
0.666666667 0.666666667
0.666666667 0.333333333
1 0.333333333
0.666666667 0.666666667
1 0.666666667
0 0.666666667
0.333333333 0.666666667
0 1
0.333333333 1
0.333333333 0.666666667
0.666666667 0.666666667
0.333333333 1
0.666666667 1
0.666666667 0.666666667
1 0.666666667
0.666666667 1
1 1
+1776 -38
View File
File diff suppressed because it is too large Load Diff
+105
View File
@@ -900,6 +900,52 @@ void ConvectionIntegrator::AssembleElementMatrix(
}
void MixedConvectionIntegrator::AssembleElementMatrix2(
const FiniteElement &tr_el, const FiniteElement &te_el,
ElementTransformation &Trans, DenseMatrix &elmat)
{
int tr_nd = tr_el.GetDof();
int te_nd = te_el.GetDof();
int dim = te_el.GetDim(); // Using test geometry.
#ifdef MFEM_THREAD_SAFE
DenseMatrix dshape, adjJ, Q_ir;
Vector shape, vec2, BdFidxT;
#endif
elmat.SetSize(te_nd, tr_nd);
dshape.SetSize(tr_nd,dim);
adjJ.SetSize(dim);
shape.SetSize(te_nd);
vec2.SetSize(dim);
BdFidxT.SetSize(tr_nd);
Vector vec1;
// Using midpoint rule and test geometry.
const IntegrationRule *ir = &IntRules.Get(te_el.GetGeomType(), 1);
Q.Eval(Q_ir, Trans, *ir);
elmat = 0.0;
for (int i = 0; i < ir->GetNPoints(); i++)
{
const IntegrationPoint &ip = ir->IntPoint(i);
tr_el.CalcDShape(ip, dshape);
te_el.CalcShape(ip, shape);
Trans.SetIntPoint(&ip);
CalcAdjugate(Trans.Jacobian(), adjJ);
Q_ir.GetColumnReference(i, vec1);
vec1 *= alpha * ip.weight;
adjJ.Mult(vec1, vec2);
dshape.Mult(vec2, BdFidxT);
AddMultVWt(shape, BdFidxT, elmat);
}
}
void GroupConvectionIntegrator::AssembleElementMatrix(
const FiniteElement &el, ElementTransformation &Trans, DenseMatrix &elmat)
{
@@ -3428,4 +3474,63 @@ VectorInnerProductInterpolator::AssembleElementMatrix2(
ran_fe.Project(dom_shape_coeff, Trans, elmat_as_vec);
}
void PrecondConvectionIntegrator::AssembleElementMatrix(
const FiniteElement &el, ElementTransformation &Trans, DenseMatrix &elmat)
{
int i, nd = el.GetDof(), dim = el.GetDim();
#ifdef MFEM_THREAD_SAFE
DenseMatrix dshape, adjJ, Q_ir;
Vector shape, vec2, BdFidxT;
#endif
elmat.SetSize(nd);
dshape.SetSize(nd,dim);
adjJ.SetSize(dim);
shape.SetSize(nd);
vec2.SetSize(dim);
BdFidxT.SetSize(nd);
double w;
Vector vec1;
DenseMatrix mass(nd,nd), conv(nd,nd), lumpedM(nd,nd), tmp(nd,nd);
const IntegrationRule *ir = IntRule;
if (ir == NULL)
{
int order = Trans.OrderGrad(&el) + Trans.Order() + el.GetOrder();
order = max(order, 2 * el.GetOrder() + Trans.OrderW());
ir = &IntRules.Get(el.GetGeomType(), order);
}
Q.Eval(Q_ir, Trans, *ir);
conv = mass = 0.0;
for (i = 0; i < ir->GetNPoints(); i++)
{
const IntegrationPoint &ip = ir->IntPoint(i);
el.CalcDShape(ip, dshape);
el.CalcShape(ip, shape);
Trans.SetIntPoint(&ip);
CalcAdjugate(Trans.Jacobian(), adjJ);
Q_ir.GetColumnReference(i, vec1);
vec1 *= alpha * ip.weight;
adjJ.Mult(vec1, vec2);
dshape.Mult(vec2, BdFidxT);
AddMultVWt(shape, BdFidxT, conv);
w = Trans.Weight() * ip.weight;
AddMult_a_VVt(w, shape, mass);
}
lumpedM = mass;
lumpedM.Lump();
mass.Invert();
MultABt(mass, lumpedM, tmp);
MultAtB(tmp, conv, elmat); // using symmetry of mass matrix
}
}
+42
View File
@@ -1731,6 +1731,26 @@ public:
DenseMatrix &);
};
/// alpha (q . grad u, v)
class MixedConvectionIntegrator : public BilinearFormIntegrator
{
private:
#ifndef MFEM_THREAD_SAFE
DenseMatrix dshape, adjJ, Q_ir;
Vector shape, vec2, BdFidxT;
#endif
VectorCoefficient &Q;
double alpha;
public:
MixedConvectionIntegrator(VectorCoefficient &q, double a = 1.0)
: Q(q) { alpha = a; }
virtual void AssembleElementMatrix2(const FiniteElement &,
const FiniteElement &,
ElementTransformation &,
DenseMatrix &);
};
/// alpha (q . grad u, v) using the "group" FE discretization
class GroupConvectionIntegrator : public BilinearFormIntegrator
{
@@ -2494,6 +2514,28 @@ protected:
VectorCoefficient &VQ;
};
/** Class for local assembly of M_L M_C^-1 K, where M_L and M_C are
the lumped and consistent mass matrices and K is the convection
matrix. The spaces are assumed to be L2 conforming. */
class PrecondConvectionIntegrator: public BilinearFormIntegrator
{
private:
#ifndef MFEM_THREAD_SAFE
DenseMatrix dshape, adjJ, Q_ir;
Vector shape, vec2, BdFidxT;
#endif
VectorCoefficient &Q;
double alpha;
public:
PrecondConvectionIntegrator(VectorCoefficient &q, double a = 1.0)
: Q(q) { alpha = a; }
virtual void AssembleElementMatrix(const FiniteElement &,
ElementTransformation &,
DenseMatrix &);
};
}
#endif
+334
View File
@@ -203,6 +203,12 @@ void FiniteElement::CalcPhysDShape(ElementTransformation &Trans,
Mult(vshape, Trans.InverseJacobian(), dshape);
}
void FiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" FiniteElements!");
}
void ScalarFiniteElement::NodalLocalInterpolation (
ElementTransformation &Trans, DenseMatrix &I,
@@ -278,6 +284,12 @@ void ScalarFiniteElement::ScalarLocalInterpolation(
}
}
void ScalarFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" ScalarFiniteElements!");
}
void NodalFiniteElement::ProjectCurl_2D(
const FiniteElement &fe, ElementTransformation &Trans,
@@ -505,6 +517,12 @@ void NodalFiniteElement::ProjectDiv(
}
}
void NodalFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" NodalFiniteElements!");
}
void PositiveFiniteElement::Project(
Coefficient &coeff, ElementTransformation &Trans, Vector &dofs) const
@@ -561,6 +579,11 @@ void PositiveFiniteElement::Project(
}
}
void PositiveFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" PositiveFiniteElements!");
}
void VectorFiniteElement::CalcShape (
const IntegrationPoint &ip, Vector &shape ) const
@@ -1002,6 +1025,12 @@ void VectorFiniteElement::LocalInterpolation_ND(
}
}
void VectorFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" VectorFiniteElements!");
}
void VectorFiniteElement::LocalRestriction_RT(
const double *nk, const Array<int> &d2n, ElementTransformation &Trans,
DenseMatrix &R) const
@@ -1386,6 +1415,14 @@ Quad2DFiniteElement::Quad2DFiniteElement()
Nodes.IntPoint(5).y = 0.5;
}
void QuadPos1DFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
dofs.SetSize(1,2);
dofs(0,0) = 0;
dofs(0,1) = 1;
}
void Quad2DFiniteElement::CalcShape(const IntegrationPoint &ip,
Vector &shape) const
{
@@ -1819,6 +1856,15 @@ void BiQuadPos2DFiniteElement::Project (
}
}
void BiQuadPos2DFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
dofs.SetSize(3,4);
dofs(0,0) = 0; dofs(1,0) = 4; dofs(2,0) = 1;
dofs(0,1) = 1; dofs(1,1) = 5; dofs(2,1) = 2;
dofs(0,2) = 2; dofs(1,2) = 6; dofs(2,2) = 3;
dofs(0,3) = 3; dofs(1,3) = 7; dofs(2,3) = 0;
}
GaussBiQuad2DFiniteElement::GaussBiQuad2DFiniteElement()
: NodalFiniteElement(2, Geometry::SQUARE, 9, 2, FunctionSpace::Qk)
@@ -7071,6 +7117,12 @@ PositiveTensorFiniteElement::PositiveTensorFiniteElement(
dims > 1 ? FunctionSpace::Qk : FunctionSpace::Pk),
TensorBasisElement(dims, p, BasisType::Positive, dmtype) { }
void PositiveTensorFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" PositiveTensorFiniteElements!");
}
H1_SegmentElement::H1_SegmentElement(const int p, const int btype)
: NodalTensorFiniteElement(1, p, VerifyClosed(btype), H1_DOF_MAP)
@@ -7489,6 +7541,13 @@ void H1Pos_SegmentElement::ProjectDelta(int vertex, Vector &dofs) const
dofs[vertex] = 1.0;
}
void H1Pos_SegmentElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
dofs.SetSize(1,2);
dofs(0,0) = 0;
dofs(0,1) = 1;
}
H1Pos_QuadrilateralElement::H1Pos_QuadrilateralElement(const int p)
: PositiveTensorFiniteElement(2, p, H1_DOF_MAP)
@@ -7557,6 +7616,19 @@ void H1Pos_QuadrilateralElement::ProjectDelta(int vertex, Vector &dofs) const
dofs[vertex] = 1.0;
}
void H1Pos_QuadrilateralElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int p = Order;
dofs.SetSize(p+1,4);
for (int i = 0; i <= p; i++)
{
dofs(i,0) = i;
dofs(i,1) = i*(p+1) + p;
dofs(i,2) = (p+1)*(p+1) - 1 - i;
dofs(i,3) = (p-i)*(p+1);
}
}
H1Pos_HexahedronElement::H1Pos_HexahedronElement(const int p)
: PositiveTensorFiniteElement(3, p, H1_DOF_MAP)
@@ -7631,6 +7703,57 @@ void H1Pos_HexahedronElement::ProjectDelta(int vertex, Vector &dofs) const
dofs[vertex] = 1.0;
}
void H1Pos_HexahedronElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int p = Order;
dofs.SetSize((p+1)*(p+1), 6);
for (int bdrID = 0; bdrID < 6; bdrID++)
{
int o(0);
switch (bdrID)
{
case 0:
for (int i = 0; i < (p+1)*(p+1); i++)
{
dofs(o++,bdrID) = i;
}
break;
case 1:
for (int i = 0; i <= p*(p+1)*(p+1); i+=(p+1)*(p+1))
for (int j = 0; j < p+1; j++)
{
dofs(o++,bdrID) = i+j;
}
break;
case 2:
for (int i = p; i < (p+1)*(p+1)*(p+1); i+=p+1)
{
dofs(o++,bdrID) = i;
}
break;
case 3:
for (int i = 0; i <= p*(p+1)*(p+1); i+=(p+1)*(p+1))
for (int j = p*(p+1); j < (p+1)*(p+1); j++)
{
dofs(o++,bdrID) = i+j;
}
break;
case 4:
for (int i = 0; i <= (p+1)*((p+1)*(p+1)-1); i+=p+1)
{
dofs(o++,bdrID) = i;
}
break;
case 5:
for (int i = p*(p+1)*(p+1); i < (p+1)*(p+1)*(p+1); i++)
{
dofs(o++,bdrID) = i;
}
break;
}
}
}
H1_TriangleElement::H1_TriangleElement(const int p, const int btype)
: NodalFiniteElement(2, Geometry::TRIANGLE, ((p + 1)*(p + 2))/2, p,
@@ -8151,6 +8274,19 @@ void H1Pos_TriangleElement::CalcDShape(const IntegrationPoint &ip,
}
}
void H1Pos_TriangleElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int ctr = 0, p = Order;
dofs.SetSize(p+1, 3);
for (int i = 0; i <= p; i++)
{
dofs(i,0) = i;
dofs(i,1) = ctr + p;
dofs(i,2) = ctr + i;
ctr += p - i;
}
}
H1Pos_TetrahedronElement::H1Pos_TetrahedronElement(const int p)
: PositiveFiniteElement(3, Geometry::TETRAHEDRON,
@@ -8403,6 +8539,59 @@ void H1Pos_TetrahedronElement::CalcDShape(const IntegrationPoint &ip,
}
}
void H1Pos_TetrahedronElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int ctr, p = Order;
dofs.SetSize((p+1)*(p+2)/2, 4);
for (int bdrID = 0; bdrID < 4; bdrID++)
{
int o = 0;
switch (bdrID)
{
case 0:
ctr = p;
for (int i = 0; i <= p; i++)
{
for (int j = 0; j <= p - i; j++)
{
dofs(o++,bdrID) = ctr;
ctr += p - i - j;
}
ctr += p - i;
}
break;
case 1:
ctr = 0;
for (int i = 0; i <= p; i++)
{
for (int j = 0; j <= p - i; j++)
{
dofs(o++,bdrID) = ctr;
ctr += p + 1 - i - j;
}
}
break;
case 2:
ctr = 0;
for (int i = 0; i <= p; i++)
{
for (int j = 0; j <= p - i; j++)
{
dofs(o++,bdrID) = ctr++;
}
ctr += - p + i - 1 + (p-i+1)*(p-i+2)/2;
}
break;
case 3:
for (int i = 0; i < (p+1)*(p+2)/2; i++)
{
dofs(o++,bdrID) = i;
}
break;
}
}
}
H1_WedgeElement::H1_WedgeElement(const int p,
const int btype)
@@ -8793,6 +8982,13 @@ void L2Pos_SegmentElement::ProjectDelta(int vertex, Vector &dofs) const
dofs[vertex*Order] = 1.0;
}
void L2Pos_SegmentElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
dofs.SetSize(1,2);
dofs(0,0) = 0;
dofs(0,1) = Order;
}
L2_QuadrilateralElement::L2_QuadrilateralElement(const int p, const int btype)
: NodalTensorFiniteElement(2, p, VerifyOpen(btype), L2_DOF_MAP)
@@ -8978,6 +9174,19 @@ void L2Pos_QuadrilateralElement::ProjectDelta(int vertex, Vector &dofs) const
}
}
void L2Pos_QuadrilateralElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int p = Order;
dofs.SetSize(p+1,4);
for (int i = 0; i <= p; i++)
{
dofs(i,0) = i;
dofs(i,1) = i*(p+1) + p;
dofs(i,2) = (p+1)*(p+1) - 1 - i;
dofs(i,3) = (p-i)*(p+1);
}
}
L2_HexahedronElement::L2_HexahedronElement(const int p, const int btype)
: NodalTensorFiniteElement(3, p, VerifyOpen(btype), L2_DOF_MAP)
@@ -9221,6 +9430,57 @@ void L2Pos_HexahedronElement::ProjectDelta(int vertex, Vector &dofs) const
}
}
void L2Pos_HexahedronElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int p = Order;
dofs.SetSize((p+1)*(p+1), 6);
for (int bdrID = 0; bdrID < 6; bdrID++)
{
int o(0);
switch (bdrID)
{
case 0:
for (int i = 0; i < (p+1)*(p+1); i++)
{
dofs(o++,bdrID) = i;
}
break;
case 1:
for (int i = 0; i <= p*(p+1)*(p+1); i+=(p+1)*(p+1))
for (int j = 0; j < p+1; j++)
{
dofs(o++,bdrID) = i+j;
}
break;
case 2:
for (int i = p; i < (p+1)*(p+1)*(p+1); i+=p+1)
{
dofs(o++,bdrID) = i;
}
break;
case 3:
for (int i = 0; i <= p*(p+1)*(p+1); i+=(p+1)*(p+1))
for (int j = p*(p+1); j < (p+1)*(p+1); j++)
{
dofs(o++,bdrID) = i+j;
}
break;
case 4:
for (int i = 0; i <= (p+1)*((p+1)*(p+1)-1); i+=p+1)
{
dofs(o++,bdrID) = i;
}
break;
case 5:
for (int i = p*(p+1)*(p+1); i < (p+1)*(p+1)*(p+1); i++)
{
dofs(o++,bdrID) = i;
}
break;
}
}
}
L2_TriangleElement::L2_TriangleElement(const int p, const int btype)
: NodalFiniteElement(2, Geometry::TRIANGLE, ((p + 1)*(p + 2))/2, p,
@@ -9397,6 +9657,19 @@ void L2Pos_TriangleElement::ProjectDelta(int vertex, Vector &dofs) const
}
}
void L2Pos_TriangleElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int ctr = 0, p = Order;
dofs.SetSize(p+1, 3);
for (int i = 0; i <= p; i++)
{
dofs(i,0) = i;
dofs(i,1) = ctr + p;
dofs(i,2) = ctr + i;
ctr += p - i;
}
}
L2_TetrahedronElement::L2_TetrahedronElement(const int p, const int btype)
: NodalFiniteElement(3, Geometry::TETRAHEDRON, ((p + 1)*(p + 2)*(p + 3))/6,
@@ -9594,6 +9867,59 @@ void L2Pos_TetrahedronElement::ProjectDelta(int vertex, Vector &dofs) const
}
}
void L2Pos_TetrahedronElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
int ctr, p = Order;
dofs.SetSize((p+1)*(p+2)/2, 4);
for (int bdrID = 0; bdrID < 4; bdrID++)
{
int o = 0;
switch (bdrID)
{
case 0:
ctr = p;
for (int i = 0; i <= p; i++)
{
for (int j = 0; j <= p - i; j++)
{
dofs(o++,bdrID) = ctr;
ctr += p - i - j;
}
ctr += p - i;
}
break;
case 1:
ctr = 0;
for (int i = 0; i <= p; i++)
{
for (int j = 0; j <= p - i; j++)
{
dofs(o++,bdrID) = ctr;
ctr += p + 1 - i - j;
}
}
break;
case 2:
ctr = 0;
for (int i = 0; i <= p; i++)
{
for (int j = 0; j <= p - i; j++)
{
dofs(o++,bdrID) = ctr++;
}
ctr += - p + i - 1 + (p-i+1)*(p-i+2)/2;
}
break;
case 3:
for (int i = 0; i < (p+1)*(p+2)/2; i++)
{
dofs(o++,bdrID) = i;
}
break;
}
}
}
L2_WedgeElement::L2_WedgeElement(const int p, const int btype)
: NodalFiniteElement(3, Geometry::PRISM, ((p + 1)*(p + 1)*(p + 2))/2,
@@ -11644,6 +11970,14 @@ void ND_SegmentElement::CalcVShape(const IntegrationPoint &ip,
obasis1d.Eval(ip.x, vshape);
}
void NURBSFiniteElement::ExtractBdrDofs(DenseMatrix &dofs) const
{
mfem_error ("Error: Cannot use ExtractBdrDofs(...) function with\n"
" NURBSFiniteElements!");
}
void NURBS1DFiniteElement::SetOrder() const
{
Order = kv[0]->GetOrder();
+36
View File
@@ -448,6 +448,12 @@ public:
{
return BasisType::CheckNodal(b_type);
}
/** Routine that extracts the indices of all p-th order Bernstein basis functions
that are non-zero on each of the (dim-1)-dimensional boundaries of a finite
element. The columns of dofs hold the indices of basis functions corresponding
to one respective boundary defined according to the class Geometry. */
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
class ScalarFiniteElement : public FiniteElement
@@ -494,6 +500,9 @@ public:
void ScalarLocalInterpolation(ElementTransformation &Trans,
DenseMatrix &I,
const ScalarFiniteElement &fine_fe) const;
/// Overrides the ExtractBdrDofs function to print an error.
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
class NodalFiniteElement : public ScalarFiniteElement
@@ -540,6 +549,9 @@ public:
virtual void ProjectDiv(const FiniteElement &fe,
ElementTransformation &Trans,
DenseMatrix &div) const;
/// Overrides the ExtractBdrDofs function to print an error.
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -572,6 +584,9 @@ public:
virtual void Project(const FiniteElement &fe, ElementTransformation &Trans,
DenseMatrix &I) const;
/// Overrides the ExtractBdrDofs function to print an error.
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
class VectorFiniteElement : public FiniteElement
@@ -679,6 +694,9 @@ public:
FiniteElement(D, G, Do, O, F), Jinv(D)
{ RangeType = VECTOR; MapType = M; SetDerivMembers(); }
#endif
/// Overrides the ExtractBdrDofs function to print an error.
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
class PointFiniteElement : public NodalFiniteElement
@@ -821,6 +839,7 @@ public:
virtual void CalcShape(const IntegrationPoint &ip, Vector &shape) const;
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
/// Class for quadratic FE on triangle
@@ -900,6 +919,7 @@ public:
Vector &dofs) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const
{ dofs = 0.; dofs(vertex) = 1.; }
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
/// Bi-quadratic element on quad with nodes at the 9 Gaussian points
@@ -1758,6 +1778,9 @@ class PositiveTensorFiniteElement : public PositiveFiniteElement,
public:
PositiveTensorFiniteElement(const int dims, const int p,
const DofMapType dmtype);
/// Overrides the ExtractBdrDofs function to print an error.
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
class H1_SegmentElement : public NodalTensorFiniteElement
@@ -1826,6 +1849,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -1843,6 +1867,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -1860,6 +1885,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -1928,6 +1954,7 @@ public:
virtual void CalcShape(const IntegrationPoint &ip, Vector &shape) const;
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -1954,6 +1981,7 @@ public:
virtual void CalcShape(const IntegrationPoint &ip, Vector &shape) const;
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -2051,6 +2079,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -2088,6 +2117,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -2121,6 +2151,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -2160,6 +2191,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -2196,6 +2228,7 @@ public:
virtual void CalcDShape(const IntegrationPoint &ip,
DenseMatrix &dshape) const;
virtual void ProjectDelta(int vertex, Vector &dofs) const;
void ExtractBdrDofs(DenseMatrix &dofs) const;
};
@@ -2750,6 +2783,9 @@ public:
Vector &Weights () const { return weights; }
/// Update the NURBSFiniteElement according to the currently set knot vectors
virtual void SetOrder () const { }
/// Overrides the ExtractBdrDofs function to print an error.
virtual void ExtractBdrDofs(DenseMatrix &dofs) const;
};
class NURBS1DFiniteElement : public NURBSFiniteElement
-1
View File
@@ -3917,7 +3917,6 @@ void AddMult_a_VVt(const double a, const Vector &v, DenseMatrix &VVt)
}
}
void LUFactors::Factor(int m)
{
#ifdef MFEM_USE_LAPACK