Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d61e4807a | ||
|
|
29bf750349 | ||
|
|
97368ef77f | ||
|
|
2fbe31f57a | ||
|
|
d27ca5e40c | ||
|
|
fd9aa3afeb | ||
|
|
7b3e124613 | ||
|
|
c09d22b6c0 | ||
|
|
4b6ab370ca | ||
|
|
adb40b62f7 | ||
|
|
cfcbbfd6cf | ||
|
|
f36a7f40f2 | ||
|
|
0138d7fbd9 | ||
|
|
2ae20dde47 | ||
|
|
a360b53521 | ||
|
|
fb9a4d61d2 |
-17
@@ -45,8 +45,6 @@ examples/ex[1-9]
|
||||
examples/ex[1-9]p
|
||||
examples/ex1[04-9]
|
||||
examples/ex1[0-9]p
|
||||
examples/ex2[0-9]
|
||||
examples/ex2[0-9]p
|
||||
|
||||
examples/refined.mesh
|
||||
examples/displaced.mesh
|
||||
@@ -78,13 +76,6 @@ examples/vortex-?-init.*
|
||||
examples/vortex-?-final.*
|
||||
examples/deformation.*
|
||||
examples/pressure.*
|
||||
examples/ex20.dat
|
||||
examples/ex20p_?????.dat
|
||||
examples/gnuplot_ex20.inp
|
||||
examples/gnuplot_ex20p.inp
|
||||
examples/ex22*.mesh
|
||||
examples/ex22*.sol
|
||||
examples/ex22p_*.*
|
||||
|
||||
examples/sundials/ex9
|
||||
examples/sundials/ex1[06]
|
||||
@@ -142,20 +133,16 @@ miniapps/electromagnetics/Joule_*
|
||||
|
||||
miniapps/meshing/mobius-strip
|
||||
miniapps/meshing/klein-bottle
|
||||
miniapps/meshing/toroid
|
||||
miniapps/meshing/mesh-explorer
|
||||
miniapps/meshing/shaper
|
||||
miniapps/meshing/extruder
|
||||
miniapps/meshing/mesh-optimizer
|
||||
miniapps/meshing/pmesh-optimizer
|
||||
|
||||
miniapps/meshing/mobius-strip.mesh
|
||||
miniapps/meshing/klein-bottle.mesh
|
||||
miniapps/meshing/toroid-*.mesh
|
||||
miniapps/meshing/mesh-explorer.mesh
|
||||
miniapps/meshing/partitioning.txt
|
||||
miniapps/meshing/shaper.mesh
|
||||
miniapps/meshing/extruder.mesh
|
||||
miniapps/meshing/optimized*
|
||||
miniapps/meshing/perturbed*
|
||||
|
||||
@@ -178,7 +165,3 @@ miniapps/nurbs/mesh.*
|
||||
miniapps/nurbs/sol.*
|
||||
miniapps/nurbs/mode_*
|
||||
miniapps/nurbs/Example1*
|
||||
|
||||
# Unit test binary and outputs
|
||||
tests/unit/output_meshes
|
||||
tests/unit/unit_tests
|
||||
|
||||
@@ -10,111 +10,15 @@
|
||||
|
||||
Version 3.4.1 (development)
|
||||
===========================
|
||||
|
||||
Support for wedge elements and meshes with mixed element types
|
||||
--------------------------------------------------------------
|
||||
- Added support for wedge shaped mesh elements of arbitrary order (with Geometry
|
||||
type PRISM) which have two triangular faces and three quadrilateral faces.
|
||||
Several examples of such meshes can be found in the data/ directory.
|
||||
|
||||
- Added H1 and L2 finite elements of arbitrary order for Wedge elements.
|
||||
|
||||
- Added support for mixed meshes containing triangles and quadrilaterals in 2D
|
||||
or tetrahedra, wedges, and hexahedra in 3D. This includes support for uniform
|
||||
refinement of such meshes. Several examples of such meshes can be found in the
|
||||
data/ directory.
|
||||
|
||||
- Added support for reading and writing linear and quadratic meshes containing
|
||||
wedge elements in VTK mesh format. Several examples of such meshes can be
|
||||
found in the data/ directory.
|
||||
|
||||
Other meshing improvements
|
||||
--------------------------
|
||||
- Improved the uniform refinement of tetrahedral meshes (also part of the
|
||||
uniform refinement of mixed 3D meshes). The previous refinement algorithm is
|
||||
still available as an option in Mesh::UniformRefinement. Both can be used in
|
||||
the updated Mesh Explorer miniapp.
|
||||
|
||||
- The local tetrahedral mesh refinement algorithm in serial and in parallel now
|
||||
follows precisely the paper:
|
||||
|
||||
D. Arnold, A. Mukherjee, and L. Pouly, "Locally Adapted Tetrahedral Meshes
|
||||
Using Bisection", SIAM J. Sci. Comput., 22(2), 431–448.
|
||||
|
||||
This guarantees that the shape regularity of the elements will be preserved
|
||||
under refinement.
|
||||
|
||||
- Added support for parallel communication groups on non-conforming meshes.
|
||||
|
||||
- A boundary in a NURBS mesh can now be connected with another boundary. Such a
|
||||
periodic NURBS mesh is a simple way to impose periodic boundary conditions.
|
||||
|
||||
- Added support for reading linear and quadratic 2D quadrilateral and triangular
|
||||
Cubit meshes.
|
||||
|
||||
- The TMOP mesh optimization algorithms were extended to support user-defined
|
||||
space-dependent limiting terms. Improved the TMOP objective functions by
|
||||
more accurate normalization of the different terms.
|
||||
|
||||
Discretization improvements
|
||||
---------------------------
|
||||
- Added support for derefinement of vector (RT + ND) spaces.
|
||||
|
||||
- Added element flux, and flux energy computation in class ElasticityIntegrator,
|
||||
allowing for the use of Zienkiewicz-Zhu type error estimators with the
|
||||
integrator. For an illustration of this addition, see the new Example 22.
|
||||
|
||||
- Added a variety of coefficients which are sums or products of existing
|
||||
coefficients as well as grid function coefficients which return the
|
||||
divergence, gradient, or curl of their GridFunctions.
|
||||
|
||||
New and improved solvers and preconditioners
|
||||
--------------------------------------------
|
||||
- Added support for parallel ILU preconditioning via hypre's Euclid solver.
|
||||
|
||||
New and updated examples and miniapps
|
||||
-------------------------------------
|
||||
- Added a new meshing miniapp, Toroid, which can produce a variety of torus
|
||||
shaped meshes by twisting a stack of wedges or hexahedra.
|
||||
|
||||
- Added a new meshing miniapp, Extruder, that demonstrates the capability to
|
||||
produce 3D meshes by extruding 2D meshes.
|
||||
|
||||
- Added a new example, Example 20/20p, that solves a system of 1D ODEs derived
|
||||
from a Hamiltonian. The example demonstrates the use of the variable order,
|
||||
symplectic integration algorithm implemented in class SIAVSolver.
|
||||
|
||||
- Added a new example, Example 22/22p, that illustrates the use of AMR to solve
|
||||
a linear elasticity problem. This is an extension of Example 2/2p.
|
||||
|
||||
Miscellaneous
|
||||
-------------
|
||||
- Added unit tests based on the Catch++ library.
|
||||
|
||||
- Altered the way FGMRES counts its iterations so that it matches GMRES.
|
||||
|
||||
- Various other simplifications, extensions, and bugfixes in the code.
|
||||
|
||||
API changes
|
||||
-----------
|
||||
- In multiple places, use Geometry::Type instead of int, where appropriate.
|
||||
- In multiple places, use Element::Type instead of int, where appropriate.
|
||||
- The Mesh methods GetElementBaseGeometry and GetBdrElementBaseGeometry no
|
||||
longer have a default value for their parameter, they only work with an
|
||||
explicitly given index.
|
||||
- In class Mesh, added methods useful for queries regarding the types of
|
||||
elements present in the mesh: HasGeometry, GetNumGeometries, GetGeometries,
|
||||
and class Mesh::GeometryList.
|
||||
- The struct CoarseFineTransformations (returned by the Mesh method
|
||||
GetRefinementTransforms) now stores the embedding matrices separately for each
|
||||
Geometry::Type.
|
||||
- In class ParMesh, replaced the method GroupNFaces with two new methods:
|
||||
GroupNTriangles and GroupNQuadrilaterals. Also, replaced GroupFace with two
|
||||
methods: GroupTriangle and GroupQuadrilateral.
|
||||
- In class ParMesh, made the two RefineGroups methods protected.
|
||||
- Removed the virtual method Element::GetRefinementFlag, it is only used by the
|
||||
derived class Tetrahedron.
|
||||
- Added new methods: Array::CopyTo, Tetrahedron::Init.
|
||||
- The tetrahedral mesh refinement algorithm in serial and in parallel now
|
||||
follows precisely the paper:
|
||||
D. Arnold, A. Mukherjee, and L. Pouly, "Locally Adapted Tetrahedral Meshes
|
||||
Using Bisection", SIAM J. Sci. Comput., 22(2), 431–448.
|
||||
This guarantees that the shape regularity of the elements will be preserved
|
||||
under refinement.
|
||||
|
||||
|
||||
Version 3.4, released on May 29, 2018
|
||||
|
||||
+4
-13
@@ -312,6 +312,9 @@ message(STATUS "MFEM build type: CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
|
||||
message(STATUS "MFEM version: v${MFEM_VERSION_STRING}")
|
||||
message(STATUS "MFEM git string: ${MFEM_GIT_STRING}")
|
||||
|
||||
# Windows specific
|
||||
set(_USE_MATH_DEFINES ${WIN32})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Define and configure the MFEM library
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -385,9 +388,6 @@ endif()
|
||||
# Enable testing if required
|
||||
if (MFEM_ENABLE_TESTING)
|
||||
enable_testing()
|
||||
set(MFEM_ALL_TESTS_TARGET_NAME tests)
|
||||
add_mfem_target(${MFEM_ALL_TESTS_TARGET_NAME} OFF)
|
||||
add_subdirectory(tests EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
# Define a target that all examples and miniapps will depend on.
|
||||
@@ -407,9 +407,7 @@ add_subdirectory(miniapps EXCLUDE_FROM_ALL)
|
||||
# Target to build all executables, i.e. everything.
|
||||
add_custom_target(exec)
|
||||
add_dependencies(exec
|
||||
${MFEM_ALL_EXAMPLES_TARGET_NAME}
|
||||
${MFEM_ALL_MINIAPPS_TARGET_NAME}
|
||||
${MFEM_ALL_TESTS_TARGET_NAME})
|
||||
${MFEM_ALL_EXAMPLES_TARGET_NAME} ${MFEM_ALL_MINIAPPS_TARGET_NAME})
|
||||
# Here, we want to "add_dependencies(test exec)". However, dependencies for
|
||||
# 'test' (and other built-in targets) can not be added with add_dependencies():
|
||||
# - https://gitlab.kitware.com/cmake/cmake/issues/8438
|
||||
@@ -545,10 +543,3 @@ install(FILES
|
||||
# Install the export set for use with the install-tree
|
||||
install(EXPORT ${PROJECT_NAME_UC}Targets
|
||||
DESTINATION ${INSTALL_CMAKE_DIR})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Create 'config.mk' from 'config.mk.in' for the build and install locations and
|
||||
# define install rules for 'config.mk' and 'test.mk'
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
mfem_export_mk_files()
|
||||
|
||||
+11
-18
@@ -90,18 +90,13 @@ Origin](#developers-certificate-of-origin-11) at the end of this file.*
|
||||
├── general
|
||||
├── linalg
|
||||
├── mesh
|
||||
├── miniapps
|
||||
│ ├── common
|
||||
│ ├── electromagnetics
|
||||
│ ├── meshing
|
||||
│ ├── nurbs
|
||||
│ ├── performance
|
||||
│ └── tools
|
||||
└── tests
|
||||
├── unit
|
||||
│ ├── ...
|
||||
└── ...
|
||||
|
||||
└── miniapps
|
||||
├── common
|
||||
├── electromagnetics
|
||||
├── meshing
|
||||
├── nurbs
|
||||
├── performance
|
||||
└── tools
|
||||
```
|
||||
|
||||
- The main directories are `fem/`, `mesh/` and `linalg/` containing the C++
|
||||
@@ -156,9 +151,6 @@ Origin](#developers-certificate-of-origin-11) at the end of this file.*
|
||||
in the simple example codes and more fully-featured mini applications in the
|
||||
`examples/` and `miniapps/` directories.
|
||||
|
||||
- The `tests/` directory contains a unit test suite and will later contain more
|
||||
tests that run example codes.
|
||||
|
||||
- See also the [code overview](http://mfem.org/code-overview/) section on the
|
||||
MFEM website.
|
||||
|
||||
@@ -324,9 +316,9 @@ Before a PR can be merged, it should satisfy the following:
|
||||
- [ ] Is this a new feature users need to be aware of? New or updated example or miniapp?
|
||||
- [ ] Does it make sense to create a new section in the `CHANGELOG` to group with other related features?
|
||||
- [ ] Update `INSTALL`:
|
||||
- [ ] Had a new optional library been added? (*Make sure the external library is licensed under LGPL, not GPL!*)
|
||||
- [ ] Has a new optional library been added? (*Make sure the external library is licensed under LGPL, not GPL!*)
|
||||
- [ ] Does `make` or `cmake` have a new target?
|
||||
- [ ] Did the requirements or the installation process change? *(rare)*
|
||||
- [ ] Did the requirements or the installation process change? *(rare)*.
|
||||
- [ ] Update `.gitignore`:
|
||||
- [ ] Check if `make distclean; git status` shows any files that are generated from the source but we don't want to track in the repository.
|
||||
- [ ] Add new patterns (just for the new files above) and re-run the above test.
|
||||
@@ -366,10 +358,10 @@ Before a PR can be merged, it should satisfy the following:
|
||||
- [ ] If this is a major new feature, consider mentioning in the short summary inside `README` *(rare)*.
|
||||
- [ ] List major new classes in `doc/CodeDocumentation.dox` *(rare)*.
|
||||
- [ ] Update this checklist, if the new pull request affects it.
|
||||
- [ ] Run the unit tests and make sure they all pass `make unittest`.
|
||||
- [ ] (LLNL only) Clone the `tests` repository and run the following tests, see `mfem/tests/README.md`:
|
||||
- [ ] `compilers`
|
||||
- [ ] `memcheck`
|
||||
- [ ] `unit-test`
|
||||
- [ ] `documentation`
|
||||
- [ ] (LLNL only) After merging:
|
||||
- [ ] Regenerate `README.html` files from companion documentation pull requests.
|
||||
@@ -480,6 +472,7 @@ MFEM uses a `master`/`next`-branch workflow as described below:
|
||||
- `mfem:gh-next` -- Bleeding-edge development version, may be broken, use at
|
||||
your own risk.
|
||||
|
||||
|
||||
## Automated Testing
|
||||
|
||||
MFEM has several levels of automated testing running on GitHub, as well as on
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
@@ -10,7 +10,7 @@
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
@@ -112,7 +112,7 @@ modification follow. Pay close attention to the difference between a
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
@@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
@@ -432,7 +432,7 @@ decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
@@ -455,7 +455,7 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
@@ -485,8 +485,7 @@ convey the exclusion of warranty; and each file should have at least the
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
@@ -495,10 +494,11 @@ school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random
|
||||
Hacker.
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
|
||||
@@ -180,75 +180,3 @@ IF (USE_XSDK_DEFAULTS)
|
||||
ENDIF()
|
||||
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_MPI)
|
||||
SET(MFEM_USE_MPI ${TPL_ENABLE_MPI} CACHE BOOL "Enable MPI parallel build" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_METIS)
|
||||
SET(MFEM_USE_METIS ${TPL_ENABLE_METIS} CACHE BOOL "Enable METIS usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_GZSTREAM)
|
||||
SET(MFEM_USE_GZSTREAM ${TPL_ENABLE_GZSTREAM} CACHE BOOL "Enable gzstream for compressed data streams." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_LIBUNWIND)
|
||||
SET(MFEM_USE_LIBUNWIND ${TPL_ENABLE_LIBUNWIND} CACHE BOOL "Enable backtrace for errors." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_LAPACK)
|
||||
SET(MFEM_USE_LAPACK ${TPL_ENABLE_LAPACK} CACHE BOOL "Enable LAPACK usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SUNDIALS)
|
||||
SET(MFEM_USE_SUNDIALS ${TPL_ENABLE_SUNDIALS} CACHE BOOL "Enable SUNDIALS usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_MESQUITE)
|
||||
SET(MFEM_USE_MESQUITE ${TPL_ENABLE_MESQUITE} CACHE BOOL "Enable MESQUITE usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SUITESPARSE)
|
||||
SET(MFEM_USE_SUITESPARSE ${TPL_ENABLE_SUITESPARSE} CACHE BOOL "Enable SuiteSparse usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SUPERLU)
|
||||
SET(MFEM_USE_SUPERLU ${TPL_ENABLE_SUPERLU} CACHE BOOL "Enable SuperLU_DIST usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_STRUMPACK)
|
||||
SET(MFEM_USE_STRUMPACK ${TPL_ENABLE_STRUMPACK} CACHE BOOL "Enable STRUMPACK usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_GECKO)
|
||||
SET(MFEM_USE_GECKO ${TPL_ENABLE_GECKO} CACHE BOOL "Enable GECKO usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_GNUTLS)
|
||||
SET(MFEM_USE_GNUTLS ${TPL_ENABLE_GNUTLS} CACHE BOOL "Enable GNUTLS usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_NETCDF)
|
||||
SET(MFEM_USE_NETCDF ${TPL_ENABLE_NETCDF} CACHE BOOL "Enable NETCDF usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_PETSC)
|
||||
SET(MFEM_USE_PETSC ${TPL_ENABLE_PETSC} CACHE BOOL "Enable PETSc support." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_MPFR)
|
||||
SET(MFEM_USE_MPFR ${TPL_ENABLE_MPFR} CACHE BOOL "Enable MPFR usage." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SIDRE)
|
||||
SET(MFEM_USE_SIDRE ${TPL_ENABLE_SIDRE} CACHE BOOL "Enable Axom/Sidre usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_CONDUIT)
|
||||
SET(MFEM_USE_CONDUIT ${TPL_ENABLE_CONDUIT} CACHE BOOL "Enable Conduit usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_PUMI)
|
||||
SET(MFEM_USE_PUMI ${TPL_ENABLE_PUMI} CACHE BOOL "Enable PUMI" FORCE)
|
||||
ENDIF()
|
||||
|
||||
@@ -109,6 +109,10 @@
|
||||
// Enable MFEM functionality based on the SUNDIALS libraries.
|
||||
#cmakedefine MFEM_USE_SUNDIALS
|
||||
|
||||
// Windows specific options
|
||||
// Macro needed to get defines like M_PI from <cmath>. (Visual Studio C++ only?)
|
||||
#cmakedefine _USE_MATH_DEFINES
|
||||
|
||||
// Version of HYPRE used for building MFEM.
|
||||
#cmakedefine MFEM_HYPRE_VERSION @MFEM_HYPRE_VERSION@
|
||||
|
||||
|
||||
@@ -229,15 +229,6 @@ endfunction(mfem_find_component)
|
||||
function(mfem_find_package Name Prefix DirVar IncSuffixes Header LibSuffixes
|
||||
Lib IncDoc LibDoc)
|
||||
|
||||
# If we have the TPL_ versions of _INCLUDE_DIRS and _LIBRARIES then set the
|
||||
# standard ${Prefix} versions
|
||||
if (TPL_${Prefix}_INCLUDE_DIRS)
|
||||
set(${Prefix}_INCLUDE_DIRS ${TPL_${Prefix}_INCLUDE_DIRS} CACHE STRING "TPL_${Prefix}_INCLUDE_DIRS was found." FORCE)
|
||||
endif()
|
||||
if (TPL_${Prefix}_LIBRARIES)
|
||||
set(${Prefix}_LIBRARIES ${TPL_${Prefix}_LIBRARIES} CACHE STRING "TPL_${Prefix}_LIBRARIES was found." FORCE)
|
||||
endif()
|
||||
|
||||
# Quick return
|
||||
if (${Prefix}_FOUND)
|
||||
return()
|
||||
@@ -694,162 +685,3 @@ function(mfem_find_library Name Prefix Lib LibDoc CheckVar CheckSrc)
|
||||
endif()
|
||||
|
||||
endfunction(mfem_find_library)
|
||||
|
||||
|
||||
#
|
||||
# Function that creates 'config.mk' from 'config.mk.in' for the both the
|
||||
# build- and the install-locations and define install rules for 'config.mk'
|
||||
# and 'test.mk'.
|
||||
#
|
||||
function(mfem_export_mk_files)
|
||||
|
||||
# Define a few auxiliary variables (not written to 'config.mk')
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
|
||||
# CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG -> '-Wl,-rpath,'
|
||||
set(shared_link_flag ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG})
|
||||
if (NOT shared_link_flag)
|
||||
set(shared_link_flag "-Wl,-rpath,")
|
||||
endif()
|
||||
|
||||
# Convert Boolean vars to YES/NO without writting the values to cache
|
||||
set(CONFIG_MK_BOOL_VARS MFEM_USE_MPI MFEM_USE_METIS MFEM_USE_METIS_5
|
||||
MFEM_DEBUG MFEM_USE_EXCEPTIONS MFEM_USE_GZSTREAM MFEM_USE_LIBUNWIND
|
||||
MFEM_USE_LAPACK MFEM_THREAD_SAFE MFEM_USE_OPENMP MFEM_USE_MEMALLOC
|
||||
MFEM_USE_SUNDIALS MFEM_USE_MESQUITE MFEM_USE_SUITESPARSE MFEM_USE_SUPERLU
|
||||
MFEM_USE_STRUMPACK MFEM_USE_GECKO MFEM_USE_GNUTLS MFEM_USE_NETCDF
|
||||
MFEM_USE_PETSC MFEM_USE_MPFR MFEM_USE_SIDRE MFEM_USE_CONDUIT
|
||||
MFEM_USE_PUMI)
|
||||
foreach(var ${CONFIG_MK_BOOL_VARS})
|
||||
if (${var})
|
||||
set(${var} YES)
|
||||
else()
|
||||
set(${var} NO)
|
||||
endif()
|
||||
endforeach()
|
||||
set(MFEM_CXX ${CMAKE_CXX_COMPILER})
|
||||
set(MFEM_CPPFLAGS "")
|
||||
string(STRIP "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${CMAKE_CXX_FLAGS}"
|
||||
MFEM_CXXFLAGS)
|
||||
set(MFEM_TPLFLAGS "")
|
||||
foreach(dir ${MFEM_TPL_INCLUDE_DIRS})
|
||||
set(MFEM_TPLFLAGS "${MFEM_TPLFLAGS} -I${dir}")
|
||||
endforeach()
|
||||
# TODO: MFEM_TPLFLAGS: add other TPL flags, in addition to the -I flags.
|
||||
set(MFEM_INCFLAGS "-I\$(MFEM_INC_DIR) \$(MFEM_TPLFLAGS)")
|
||||
set(MFEM_PICFLAG "")
|
||||
if (BUILD_SHARED_LIBS)
|
||||
set(MFEM_PICFLAG "${CMAKE_SHARED_LIBRARY_CXX_FLAGS}")
|
||||
endif()
|
||||
set(MFEM_FLAGS "\$(MFEM_CPPFLAGS) \$(MFEM_CXXFLAGS) \$(MFEM_INCFLAGS)")
|
||||
# TPL link flags: set below
|
||||
set(MFEM_EXT_LIBS "")
|
||||
if (BUILD_SHARED_LIBS)
|
||||
set(MFEM_LIBS "${shared_link_flag}\$(MFEM_LIB_DIR) -L\$(MFEM_LIB_DIR)")
|
||||
set(MFEM_LIBS "${MFEM_LIBS} -lmfem \$(MFEM_EXT_LIBS)")
|
||||
if (APPLE)
|
||||
set(SO_VER ".${mfem_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
else()
|
||||
set(SO_VER "${CMAKE_SHARED_LIBRARY_SUFFIX}.${mfem_VERSION}")
|
||||
endif()
|
||||
set(MFEM_LIB_FILE "\$(MFEM_LIB_DIR)/libmfem${SO_VER}")
|
||||
set(MFEM_SHARED YES)
|
||||
set(MFEM_STATIC NO)
|
||||
else()
|
||||
set(MFEM_LIBS "-L\$(MFEM_LIB_DIR) -lmfem \$(MFEM_EXT_LIBS)")
|
||||
set(MFEM_LIB_FILE "\$(MFEM_LIB_DIR)/libmfem.a")
|
||||
set(MFEM_SHARED NO)
|
||||
set(MFEM_STATIC YES)
|
||||
endif()
|
||||
set(MFEM_BUILD_TAG "${CMAKE_SYSTEM}")
|
||||
set(MFEM_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||
# For the next 4 variable, these are the values for the build-tree version of
|
||||
# 'config.mk'
|
||||
set(MFEM_INC_DIR "${PROJECT_BINARY_DIR}")
|
||||
set(MFEM_LIB_DIR "${PROJECT_BINARY_DIR}")
|
||||
set(MFEM_TEST_MK "${PROJECT_SOURCE_DIR}/config/test.mk")
|
||||
set(MFEM_CONFIG_EXTRA "MFEM_BUILD_DIR ?= ${PROJECT_BINARY_DIR}")
|
||||
set(MFEM_MPIEXEC ${MPIEXEC})
|
||||
if (NOT MFEM_MPIEXEC)
|
||||
set(MFEM_MPIEXEC "mpirun")
|
||||
endif()
|
||||
set(MFEM_MPIEXEC_NP ${MPIEXEC_NUMPROC_FLAG})
|
||||
if (NOT MFEM_MPIEXEC_NP)
|
||||
set(MFEM_MPIEXEC_NP "-np")
|
||||
endif()
|
||||
# MFEM_MPI_NP is already set
|
||||
# Define the variable 'MFEM_EXT_LIBS': handle PUMI libs
|
||||
if ("${MFEM_USE_PUMI}" STREQUAL "YES")
|
||||
message(STATUS "simmodsuite_dir = '${SIMMODSUITE_DIR}'")
|
||||
get_target_property(liblist ${PUMI_LIBRARIES} INTERFACE_LINK_LIBRARIES)
|
||||
set(pumi_dep_libs "${liblist}")
|
||||
foreach(pumilib ${liblist})
|
||||
get_target_property(libdeps ${pumilib} INTERFACE_LINK_LIBRARIES)
|
||||
if (NOT "${libdeps}" MATCHES "libdeps-NOTFOUND")
|
||||
list(APPEND pumi_dep_libs ${libdeps})
|
||||
endif()
|
||||
endforeach()
|
||||
list(REMOVE_DUPLICATES pumi_dep_libs)
|
||||
foreach(pumilib ${pumi_dep_libs})
|
||||
unset(lib CACHE)
|
||||
string(REGEX REPLACE "^SCOREC::" "" libname ${pumilib})
|
||||
string(FIND "${pumilib}" ".a" staticlib)
|
||||
string(FIND "${pumilib}" ".so" sharedlib)
|
||||
find_library(lib ${libname} PATHS ${PUMI_DIR}/lib NO_DEFUALT_PATH)
|
||||
if (NOT "${sharedlib}" MATCHES "-1" OR
|
||||
NOT "${staticlib}" MATCHES "-1" )
|
||||
set(MFEM_EXT_LIBS "${pumilib} ${MFEM_EXT_LIBS}")
|
||||
elseif (NOT "${lib}" MATCHES "lib-NOTFOUND")
|
||||
set(MFEM_EXT_LIBS "${lib} ${MFEM_EXT_LIBS}")
|
||||
elseif ("${lib}" MATCHES "lib-NOTFOUND" AND
|
||||
NOT "${libname}" MATCHES "can" AND
|
||||
NOT "${libname}" MATCHES "pthread")
|
||||
message(FATAL_ERROR "SCOREC lib ${libname} not found")
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
# Define the variable 'MFEM_EXT_LIBS': handle other (not PUMI) libs
|
||||
foreach(lib ${TPL_LIBRARIES})
|
||||
get_filename_component(suffix ${lib} EXT)
|
||||
# handle interfaces (e.g., SCOREC::apf)
|
||||
if ("${lib}" MATCHES "SCOREC::.*")
|
||||
elseif (NOT "${lib}" MATCHES "SCOREC::.*" AND "${lib}" MATCHES ".*::.*")
|
||||
message(FATAL_ERROR "***** interface lib found ... exiting *****")
|
||||
# handle static and shared libs
|
||||
elseif ("${suffix}" STREQUAL "${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
get_filename_component(dir ${lib} DIRECTORY)
|
||||
get_filename_component(fullLibName ${lib} NAME_WE)
|
||||
string(REGEX REPLACE "^lib" "" libname ${fullLibName})
|
||||
set(MFEM_EXT_LIBS
|
||||
"${MFEM_EXT_LIBS} ${shared_link_flag}${dir} -L${dir} -l${libname}")
|
||||
else()
|
||||
set(MFEM_EXT_LIBS "${MFEM_EXT_LIBS} ${lib}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Create the build-tree version of 'config.mk'
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/config/config.mk.in"
|
||||
"${PROJECT_BINARY_DIR}/config/config.mk")
|
||||
# Copy 'test.mk' from the source-tree to the build-tree
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/config/test.mk"
|
||||
"${PROJECT_BINARY_DIR}/config/test.mk" COPYONLY)
|
||||
|
||||
# Update variables for the install-tree version of 'config.mk'
|
||||
set(MFEM_INC_DIR "${CMAKE_INSTALL_PREFIX}/include")
|
||||
set(MFEM_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
|
||||
set(MFEM_TEST_MK "${CMAKE_INSTALL_PREFIX}/share/mfem/test.mk")
|
||||
set(MFEM_CONFIG_EXTRA "")
|
||||
|
||||
# Create the install-tree version of 'config.mk'
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/config/config.mk.in"
|
||||
"${PROJECT_BINARY_DIR}/config/config-install.mk")
|
||||
|
||||
# Install rules for 'config.mk' and 'test.mk'
|
||||
install(FILES ${PROJECT_SOURCE_DIR}/config/test.mk
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mfem/)
|
||||
install(FILES ${PROJECT_BINARY_DIR}/config/config-install.mk
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mfem/ RENAME config.mk)
|
||||
|
||||
endfunction()
|
||||
|
||||
@@ -23,18 +23,6 @@
|
||||
#include "_config.hpp"
|
||||
#endif
|
||||
|
||||
// Common configuration macros
|
||||
|
||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__)
|
||||
#define MFEM_HAVE_GCC_PRAGMA_DIAGNOSTIC
|
||||
#endif
|
||||
|
||||
// Windows specific options
|
||||
#ifdef _WIN32
|
||||
// Macro needed to get defines like M_PI from <cmath>. (Visual Studio C++ only?)
|
||||
#define _USE_MATH_DEFINES
|
||||
#endif
|
||||
|
||||
// Check dependencies:
|
||||
|
||||
// Options that require MPI
|
||||
|
||||
@@ -112,6 +112,12 @@
|
||||
// Enable MFEM functionality based on the PUMI library
|
||||
// #define MFEM_USE_PUMI
|
||||
|
||||
// Windows specific options
|
||||
#ifdef _WIN32
|
||||
// Macro needed to get defines like M_PI from <cmath>. (Visual Studio C++ only?)
|
||||
#define _USE_MATH_DEFINES
|
||||
#endif
|
||||
|
||||
// Version of HYPRE used for building MFEM.
|
||||
// #define MFEM_HYPRE_VERSION @MFEM_HYPRE_VERSION@
|
||||
|
||||
|
||||
@@ -42,8 +42,6 @@ option(MFEM_USE_SIDRE "Enable Axom/Sidre usage" OFF)
|
||||
option(MFEM_USE_CONDUIT "Enable Conduit usage" OFF)
|
||||
option(MFEM_USE_PUMI "Enable PUMI" OFF)
|
||||
|
||||
set(MFEM_MPI_NP 4 CACHE STRING "Number of processes used for MPI tests")
|
||||
|
||||
# Allow a user to disable testing, examples, and/or miniapps at CONFIGURE TIME
|
||||
# if they don't want/need them (e.g. if MFEM is "just a dependency" and all they
|
||||
# need is the library, building all that stuff adds unnecessary overhead). Note
|
||||
|
||||
+7
-16
@@ -30,7 +30,7 @@ groups_serial=(
|
||||
'"examples"
|
||||
"Examples:"
|
||||
"examples"
|
||||
"ex{,1,2}[0-9].cpp"'
|
||||
"ex{,1}[0-9].cpp"'
|
||||
# "ex1.cpp"'
|
||||
'"sundials"
|
||||
"SUNDIALS examples:"
|
||||
@@ -44,15 +44,14 @@ groups_serial=(
|
||||
'"meshing"
|
||||
"Meshing miniapps:"
|
||||
"miniapps/meshing"
|
||||
"mobius-strip.cpp klein-bottle.cpp extruder.cpp toroid.cpp
|
||||
mesh-optimizer.cpp"'
|
||||
"mobius-strip.cpp klein-bottle.cpp mesh-optimizer.cpp"'
|
||||
)
|
||||
# Parallel groups
|
||||
groups_parallel=(
|
||||
'"examples"
|
||||
"Examples:"
|
||||
"examples"
|
||||
"ex{,1,2}[0-9]p.cpp"'
|
||||
"ex{,1}[0-9]p.cpp"'
|
||||
# "ex1p.cpp"'
|
||||
'"sundials"
|
||||
"SUNDIALS examples:"
|
||||
@@ -82,7 +81,7 @@ groups_all=(
|
||||
'"examples"
|
||||
"Examples:"
|
||||
"examples"
|
||||
"ex\"{,1,2}[0-9]\"{,p}.cpp"'
|
||||
"ex\"{,1}[0-9]\"{,p}.cpp"'
|
||||
'"sundials"
|
||||
"SUNDIALS examples:"
|
||||
"examples/sundials"
|
||||
@@ -98,8 +97,7 @@ groups_all=(
|
||||
'"meshing"
|
||||
"Meshing miniapps:"
|
||||
"miniapps/meshing"
|
||||
"mobius-strip.cpp klein-bottle.cpp extruder.cpp toroid.cpp
|
||||
{,p}mesh-optimizer.cpp"'
|
||||
"mobius-strip.cpp klein-bottle.cpp {,p}mesh-optimizer.cpp"'
|
||||
'"electromagnetics"
|
||||
"Electromagnetics miniapps:"
|
||||
"miniapps/electromagnetics"
|
||||
@@ -172,9 +170,6 @@ function help_message()
|
||||
-v Enable valgrind
|
||||
-o <dir> [${output_dir:-"<empty>: output goes to stdout"}]
|
||||
If not empty, save output to files inside <dir>
|
||||
-d <dir> [${mfem_build_dir}]
|
||||
If <dir> is different from <mfem_dir> then use an
|
||||
out-of-source build in <dir>
|
||||
-j <np> [${make_j}] Specify the number of jobs to use for building
|
||||
-c|-color Always use colors for the status messages: OK, FAILED, etc
|
||||
-b|-built Do NOT rebuild the library and the executables
|
||||
@@ -201,8 +196,8 @@ function help_message()
|
||||
Their values can also set using the respective uppercase environment
|
||||
variable
|
||||
mfem_build_dir [${mfem_build_dir}]
|
||||
Same as '-d': set this variable to something different from <mfem_dir>
|
||||
to use an out-of-source build
|
||||
Set this variable to something different from <mfem_dir> to use an
|
||||
out-of-source build
|
||||
|
||||
For other valid variables, see the script source.
|
||||
|
||||
@@ -271,10 +266,6 @@ case "$1" in
|
||||
shift
|
||||
output_dir="$1"
|
||||
;;
|
||||
-d)
|
||||
shift
|
||||
mfem_build_dir="$1"
|
||||
;;
|
||||
-j)
|
||||
shift
|
||||
make_j="-j $1"
|
||||
|
||||
+2
-3
@@ -38,7 +38,7 @@ export TIME='%es %MkB %x'; \
|
||||
set -- $$($(1) $(SHELL) -c "$(2)" 2>&1); while [ "$$#" -gt 3 ]; do shift; done
|
||||
endef
|
||||
define TIMECMD.NOTGNU
|
||||
set -- $$($(1) -l $(SHELL) -c "{ $(2); } > /dev/null 2>&1" 2>&1; echo $$?); \
|
||||
set -- $$($(1) -l $(SHELL) -c "$(2)" 2>&1; echo $$?); \
|
||||
set -- "$$1"s "$$(($$7/1024))"kB "$${60}"
|
||||
endef
|
||||
define TIMECMD.BASH
|
||||
@@ -60,8 +60,7 @@ endif
|
||||
# Test runs of the examples/miniapps with parameters - check exit code
|
||||
mfem-test = \
|
||||
printf " $(3) [$(2) $(1) ... ]: "; \
|
||||
$(call $(TIMEFUN),$(TIMECMD),$(2) ./$(1) $(if $(5),,-no-vis )$(4) \
|
||||
> $(1).stderr 2>&1); \
|
||||
$(call $(TIMEFUN),$(TIMECMD),$(2) ./$(1) -no-vis $(4) > $(1).stderr 2>&1); \
|
||||
if [ "$$3" = 0 ]; \
|
||||
then $(PRINT_OK); else $(PRINT_FAILED); cat $(1).stderr; fi; \
|
||||
rm -f $(1).stderr; exit $$3
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
8
|
||||
1 6 0 9 18 1 10 19
|
||||
1 6 1 10 19 2 11 20
|
||||
1 6 2 11 20 3 12 21
|
||||
1 6 3 12 21 4 13 22
|
||||
2 6 4 13 22 5 14 23
|
||||
2 6 5 14 23 6 15 24
|
||||
2 6 6 15 24 7 16 25
|
||||
2 6 7 16 25 8 17 26
|
||||
|
||||
boundary
|
||||
26
|
||||
1 2 0 18 9
|
||||
2 2 8 17 26
|
||||
3 3 0 9 10 1
|
||||
3 3 1 10 11 2
|
||||
3 3 2 11 12 3
|
||||
3 3 3 12 13 4
|
||||
3 3 4 13 14 5
|
||||
3 3 5 14 15 6
|
||||
3 3 6 15 16 7
|
||||
3 3 7 16 17 8
|
||||
3 3 18 0 1 19
|
||||
3 3 19 1 2 20
|
||||
3 3 20 2 3 21
|
||||
3 3 21 3 4 22
|
||||
3 3 22 4 5 23
|
||||
3 3 23 5 6 24
|
||||
3 3 24 6 7 25
|
||||
3 3 25 7 8 26
|
||||
3 3 9 18 19 10
|
||||
3 3 10 19 20 11
|
||||
3 3 11 20 21 12
|
||||
3 3 12 21 22 13
|
||||
3 3 13 22 23 14
|
||||
3 3 14 23 24 15
|
||||
3 3 15 24 25 16
|
||||
3 3 16 25 26 17
|
||||
|
||||
vertices
|
||||
27
|
||||
3
|
||||
0 0 0
|
||||
1 0 0
|
||||
2 0 0
|
||||
3 0 0
|
||||
4 0 0
|
||||
5 0 0
|
||||
6 0 0
|
||||
7 0 0
|
||||
8 0 0
|
||||
0 1 0
|
||||
1 1 0
|
||||
2 1 0
|
||||
3 1 0
|
||||
4 1 0
|
||||
5 1 0
|
||||
6 1 0
|
||||
7 1 0
|
||||
8 1 0
|
||||
0 0.5 1
|
||||
1 0.5 1
|
||||
2 0.5 1
|
||||
3 0.5 1
|
||||
4 0.5 1
|
||||
5 0.5 1
|
||||
6 0.5 1
|
||||
7 0.5 1
|
||||
8 0.5 1
|
||||
@@ -1,61 +0,0 @@
|
||||
# vtk DataFile Version 3.0
|
||||
Generated by MFEM
|
||||
ASCII
|
||||
DATASET UNSTRUCTURED_GRID
|
||||
POINTS 27 double
|
||||
0 0 0
|
||||
1 0 0
|
||||
2 0 0
|
||||
3 0 0
|
||||
4 0 0
|
||||
5 0 0
|
||||
6 0 0
|
||||
7 0 0
|
||||
8 0 0
|
||||
0 1 0
|
||||
1 1 0
|
||||
2 1 0
|
||||
3 1 0
|
||||
4 1 0
|
||||
5 1 0
|
||||
6 1 0
|
||||
7 1 0
|
||||
8 1 0
|
||||
0 0.5 1
|
||||
1 0.5 1
|
||||
2 0.5 1
|
||||
3 0.5 1
|
||||
4 0.5 1
|
||||
5 0.5 1
|
||||
6 0.5 1
|
||||
7 0.5 1
|
||||
8 0.5 1
|
||||
CELLS 8 56
|
||||
6 0 9 18 1 10 19
|
||||
6 1 10 19 2 11 20
|
||||
6 2 11 20 3 12 21
|
||||
6 3 12 21 4 13 22
|
||||
6 4 13 22 5 14 23
|
||||
6 5 14 23 6 15 24
|
||||
6 6 15 24 7 16 25
|
||||
6 7 16 25 8 17 26
|
||||
CELL_TYPES 8
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
CELL_DATA 8
|
||||
SCALARS material int
|
||||
LOOKUP_TABLE default
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
@@ -1,192 +0,0 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
14
|
||||
1 4 13 15 21 25
|
||||
1 4 15 13 21 12
|
||||
1 4 21 13 25 22
|
||||
1 4 15 21 25 24
|
||||
1 4 13 15 25 16
|
||||
1 5 0 1 4 3 9 10 13 12
|
||||
1 5 8 9 12 11 17 18 21 20
|
||||
1 5 2 3 6 5 11 12 15 14
|
||||
1 6 3 4 6 12 13 15
|
||||
1 6 4 7 6 13 16 15
|
||||
1 6 12 13 21 9 10 18
|
||||
1 6 13 22 21 10 19 18
|
||||
1 6 11 14 20 12 15 21
|
||||
1 6 15 21 24 14 20 23
|
||||
|
||||
boundary
|
||||
30
|
||||
1 3 5 6 3 2
|
||||
2 2 6 4 3
|
||||
2 2 4 6 7
|
||||
3 3 3 4 1 0
|
||||
4 3 11 12 9 8
|
||||
5 3 2 3 12 11
|
||||
6 3 0 1 10 9
|
||||
7 2 10 18 9
|
||||
7 2 18 10 19
|
||||
8 3 8 9 18 17
|
||||
9 3 1 4 13 10
|
||||
10 3 4 7 16 13
|
||||
11 2 25 13 16
|
||||
11 2 13 25 22
|
||||
12 3 10 13 22 19
|
||||
13 3 7 6 15 16
|
||||
14 3 6 5 14 15
|
||||
15 3 15 14 23 24
|
||||
16 2 15 25 16
|
||||
16 2 25 15 24
|
||||
17 3 5 2 11 14
|
||||
18 3 3 0 9 12
|
||||
19 3 11 8 17 20
|
||||
20 2 20 14 11
|
||||
20 2 14 20 23
|
||||
21 3 17 18 21 20
|
||||
22 3 18 19 22 21
|
||||
23 2 25 21 22
|
||||
23 2 21 25 24
|
||||
24 3 20 21 24 23
|
||||
|
||||
vertices
|
||||
26
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_3D_P2
|
||||
VDim: 3
|
||||
Ordering: 1
|
||||
|
||||
0.028213666146621 -1.0129124616273 -1.0197422793601
|
||||
0.99151103207842 -0.97408353323117 -1.0219424221199
|
||||
-0.98628834960982 -0.048291393648833 -1.0334530425724
|
||||
-0.045286384224892 -0.028259630873799 -0.95961592583917
|
||||
1.0351351283956 0.016103611653671 -1.0465984194074
|
||||
-0.97963495329022 0.975340601895 -0.95050375238061
|
||||
-0.016565482225269 0.98394050155766 -1.0119900547434
|
||||
0.98232264800655 1.0061312792241 -0.97468885016611
|
||||
-1.0111163694877 -1.0328216757625 -0.033904406474903
|
||||
-0.031359497737139 -0.95907832225785 -0.02936147605069
|
||||
1.0216721775476 -0.95571139678359 -0.041445003869012
|
||||
-0.96617995956913 0.013420177670196 -0.047073400672525
|
||||
0.03735491973348 0.024136644229293 -0.035419858060777
|
||||
0.99844568660483 -0.023344853520393 0.043047091318294
|
||||
-1.0075354852248 0.95110015915707 0.040374961402267
|
||||
-0.018023004801944 0.98735854397528 0.035048884851858
|
||||
0.96496833880778 0.98624407089765 0.029059857856424
|
||||
-0.95618249163963 -0.95913625303656 0.99699592567049
|
||||
0.010523111699149 -1.0380611987319 1.0054330066312
|
||||
1.0131589291349 -0.99133288586241 1.0510169859154
|
||||
-0.9992929702159 -0.016950021823868 1.0209834648762
|
||||
-0.030905270343646 -0.024878516234457 0.96677784407511
|
||||
1.0369556044533 0.036727200814101 0.97476146325791
|
||||
-1.0268666699025 0.99100244478387 0.95557046163574
|
||||
0.032850918109418 0.9761234538078 0.99340013005027
|
||||
0.96517252528448 1.018590816239 0.96241486393546
|
||||
0.52641251369336 0.53453492783232 -0.046831832639522
|
||||
0.54842095679127 0.012466884090474 0.52264325135947
|
||||
1.0546647359835 0.51503200008771 0.47661895657821
|
||||
0.008193729444779 0.46320342579585 0.51330736048101
|
||||
0.48446121998846 1.0366433051979 0.46910527980021
|
||||
0.50338134740858 0.53372671722279 1.0016026703109
|
||||
-0.0026805294677615 0.54834160562605 -0.022633473388851
|
||||
0.4992129677441 -0.027650739811361 -0.025983834639192
|
||||
-0.010308592952788 0.043478553090245 0.54404251929373
|
||||
0.52373361142037 0.017260625417003 1.0190168930687
|
||||
0.95156254112601 0.024917951411289 0.48927665714905
|
||||
1.0114961385777 0.53988309084877 0.98077339629239
|
||||
0.01429600397056 1.0255897320394 0.44945099394948
|
||||
-0.0037663174125072 0.46114195337251 0.98693741812483
|
||||
0.53955416269275 0.95254191223583 0.99345054396648
|
||||
1.0344137934711 0.51549308419917 0.0019079259000746
|
||||
0.4635900873147 1.0074141174823 -0.025796540646941
|
||||
1.0393698821347 0.99823230649269 0.53561992818844
|
||||
0.54910938213579 -1.0186136680655 -1.0399189315271
|
||||
0.98251790353097 -0.52159510049969 -1.0488538759761
|
||||
0.51290647936985 0.019199261348695 -1.0180139709264
|
||||
0.039190890220925 -0.51870735888369 -1.0145805133507
|
||||
0.54531239252537 -1.0346180800814 -0.026071808021516
|
||||
1.0111227696296 -0.45961035727523 0.028725982550532
|
||||
-0.0024106570985168 -0.51591348233633 0.042102640075609
|
||||
0.019072471559048 -1.0489699664991 -0.53822694290429
|
||||
1.0197706996463 -1.0138504981995 -0.48532295548357
|
||||
0.97708769380115 0.012869927892461 -0.49512141938321
|
||||
-0.0056951441802084 -0.018287890031934 -0.46456751856022
|
||||
-0.48628377295099 -0.97137148869224 -0.040609835088253
|
||||
-0.52949825478718 0.022831952339038 0.036623532185331
|
||||
-0.9682938832324 -0.51529484749772 0.039498377451673
|
||||
-0.45076946932822 -0.98247022288851 1.0229644412175
|
||||
-0.036635886738077 -0.53934830226935 0.97308384231292
|
||||
-0.47986206617206 -0.041745604947209 0.98161771683954
|
||||
-0.95103283049539 -0.5087813614402 1.0116585971788
|
||||
-0.95395673410967 -0.95082942959853 0.50977751370519
|
||||
0.030673310998827 -0.97366141136736 0.47265974627808
|
||||
-1.0076441270299 0.025157339498401 0.51940553779714
|
||||
-0.45112570035271 0.030354945734143 -1.0244264173787
|
||||
-0.034796683816239 0.47213521944359 -1.0233666383661
|
||||
-0.52309081116691 1.0127369282767 -1.030445962213
|
||||
-1.0052867605351 0.54541603662074 -0.99267176855355
|
||||
-0.53441363093443 1.0101050069556 0.034852372528985
|
||||
-1.0361742412671 0.51952713127248 -0.0075041593052447
|
||||
-1.0224051106721 0.037305149668828 -0.51234883274883
|
||||
-0.0468317149207 0.99936735257506 -0.53290488454513
|
||||
-1.0323944162577 1.0470460939221 -0.49629869163036
|
||||
0.50827771586097 0.51091354087276 -0.96143114171132
|
||||
0.97860428203942 0.53881222049291 -1.0227558970328
|
||||
0.54899092558423 1.0449853148062 -1.0290394971016
|
||||
0.98149990118493 1.0265442789565 -0.45402792714566
|
||||
0.47938502309767 -0.95321110021154 0.46438798044786
|
||||
0.98893120098231 -1.0252040218394 0.52866776747387
|
||||
0.46061993861414 -0.973998097143 0.95264651015888
|
||||
0.98858339184873 -0.49578777734639 0.97955980177082
|
||||
-0.95322811676761 0.49312524158842 0.46350421594559
|
||||
-0.9670648949319 0.52720408663568 1.0147400701319
|
||||
-0.95970724064157 0.9966338243727 0.47198853459547
|
||||
-0.55076990539437 0.95548113087191 1.0002298586837
|
||||
0.48237521727569 -0.51972299404442 -0.98436066769063
|
||||
0.45025863721967 -1.0030842470471 -0.53693975312635
|
||||
0.95356930759735 -0.4606471833773 -0.49721032292582
|
||||
0.48610299886204 0.033102156873792 -0.45204877182841
|
||||
0.016292646434158 -0.4694908623118 -0.53292224425822
|
||||
0.47584088565782 -0.54223454683088 -0.036028525792062
|
||||
-0.53143287785351 -0.4923779387027 0.0039846746250987
|
||||
-0.52957315347157 -1.0359902368858 0.51208876920864
|
||||
-0.024055424472317 -0.49951890320517 0.48579422575422
|
||||
-0.45644746879116 -0.012607240816578 0.51010388839059
|
||||
-0.98394734906033 -0.50309513998218 0.47998268660158
|
||||
-0.53098605261184 -0.48258609846234 0.97544367099181
|
||||
-0.51822144156322 0.45223189569078 -1.0385291075334
|
||||
-0.45871022404172 -0.042734754644334 -0.54302125046961
|
||||
0.041843411838636 0.46222349074669 -0.5097909247037
|
||||
-0.45607118047774 1.0116704457439 -0.45481789885089
|
||||
-1.0244252419565 0.4849586374592 -0.50017994958907
|
||||
-0.52441235366277 0.50157218999229 0.023797604069114
|
||||
0.46467856940869 0.54693057615002 -0.46251054922067
|
||||
0.98669286111723 0.51824862516758 -0.45168929326637
|
||||
0.54790127868275 0.98589193659248 -0.51421705686245
|
||||
0.54233705943277 -0.4508773840935 0.45025142266283
|
||||
1.0203662623874 -0.5304726794563 0.52365051237419
|
||||
0.48446453821555 -0.47976663671026 1.043945324572
|
||||
-0.48793381256969 0.50247088679532 0.48323828733422
|
||||
-0.52670996575095 0.50194146344506 1.0026980744777
|
||||
-0.47523256142428 0.97748358070477 0.48234451559035
|
||||
0.45616661459208 -0.50770850274712 -0.4568053398747
|
||||
-0.52734654471278 -0.51337681044824 0.47594708297402
|
||||
-0.45737625267357 0.47732204026543 -0.54846904515289
|
||||
@@ -1,168 +0,0 @@
|
||||
# vtk DataFile Version 3.0
|
||||
Generated by MFEM
|
||||
ASCII
|
||||
DATASET UNSTRUCTURED_GRID
|
||||
POINTS 116 double
|
||||
0.028213666146621 -1.0129124616273 -1.0197422793601
|
||||
0.99151103207842 -0.97408353323117 -1.0219424221199
|
||||
-0.98628834960982 -0.048291393648833 -1.0334530425724
|
||||
-0.045286384224892 -0.028259630873799 -0.95961592583917
|
||||
1.0351351283956 0.016103611653671 -1.0465984194074
|
||||
-0.97963495329022 0.975340601895 -0.95050375238061
|
||||
-0.016565482225269 0.98394050155766 -1.0119900547434
|
||||
0.98232264800655 1.0061312792241 -0.97468885016611
|
||||
-1.0111163694877 -1.0328216757625 -0.033904406474903
|
||||
-0.031359497737139 -0.95907832225785 -0.02936147605069
|
||||
1.0216721775476 -0.95571139678359 -0.041445003869012
|
||||
-0.96617995956913 0.013420177670196 -0.047073400672525
|
||||
0.03735491973348 0.024136644229293 -0.035419858060777
|
||||
0.99844568660483 -0.023344853520393 0.043047091318294
|
||||
-1.0075354852248 0.95110015915707 0.040374961402267
|
||||
-0.018023004801944 0.98735854397528 0.035048884851858
|
||||
0.96496833880778 0.98624407089765 0.029059857856424
|
||||
-0.95618249163963 -0.95913625303656 0.99699592567049
|
||||
0.010523111699149 -1.0380611987319 1.0054330066312
|
||||
1.0131589291349 -0.99133288586241 1.0510169859154
|
||||
-0.9992929702159 -0.016950021823868 1.0209834648762
|
||||
-0.030905270343646 -0.024878516234457 0.96677784407511
|
||||
1.0369556044533 0.036727200814101 0.97476146325791
|
||||
-1.0268666699025 0.99100244478387 0.95557046163574
|
||||
0.032850918109418 0.9761234538078 0.99340013005027
|
||||
0.96517252528448 1.018590816239 0.96241486393546
|
||||
0.50338134740858 0.53372671722279 1.0016026703109
|
||||
0.54842095679127 0.012466884090474 0.52264325135947
|
||||
0.008193729444779 0.46320342579585 0.51330736048101
|
||||
1.0546647359835 0.51503200008771 0.47661895657821
|
||||
0.48446121998846 1.0366433051979 0.46910527980021
|
||||
0.52641251369336 0.53453492783232 -0.046831832639522
|
||||
-0.0026805294677615 0.54834160562605 -0.022633473388851
|
||||
0.4992129677441 -0.027650739811361 -0.025983834639192
|
||||
-0.010308592952788 0.043478553090245 0.54404251929373
|
||||
1.0114961385777 0.53988309084877 0.98077339629239
|
||||
0.52373361142037 0.017260625417003 1.0190168930687
|
||||
0.95156254112601 0.024917951411289 0.48927665714905
|
||||
-0.0037663174125072 0.46114195337251 0.98693741812483
|
||||
0.53955416269275 0.95254191223583 0.99345054396648
|
||||
0.01429600397056 1.0255897320394 0.44945099394948
|
||||
1.0344137934711 0.51549308419917 0.0019079259000746
|
||||
0.4635900873147 1.0074141174823 -0.025796540646941
|
||||
1.0393698821347 0.99823230649269 0.53561992818844
|
||||
0.54910938213579 -1.0186136680655 -1.0399189315271
|
||||
0.98251790353097 -0.52159510049969 -1.0488538759761
|
||||
0.51290647936985 0.019199261348695 -1.0180139709264
|
||||
0.039190890220925 -0.51870735888369 -1.0145805133507
|
||||
0.54531239252537 -1.0346180800814 -0.026071808021516
|
||||
1.0111227696296 -0.45961035727523 0.028725982550532
|
||||
-0.0024106570985168 -0.51591348233633 0.042102640075609
|
||||
0.019072471559048 -1.0489699664991 -0.53822694290429
|
||||
1.0197706996463 -1.0138504981995 -0.48532295548357
|
||||
0.97708769380115 0.012869927892461 -0.49512141938321
|
||||
-0.0056951441802084 -0.018287890031934 -0.46456751856022
|
||||
-0.48628377295099 -0.97137148869224 -0.040609835088253
|
||||
-0.52949825478718 0.022831952339038 0.036623532185331
|
||||
-0.9682938832324 -0.51529484749772 0.039498377451673
|
||||
-0.45076946932822 -0.98247022288851 1.0229644412175
|
||||
-0.036635886738077 -0.53934830226935 0.97308384231292
|
||||
-0.47986206617206 -0.041745604947209 0.98161771683954
|
||||
-0.95103283049539 -0.5087813614402 1.0116585971788
|
||||
-0.95395673410967 -0.95082942959853 0.50977751370519
|
||||
0.030673310998827 -0.97366141136736 0.47265974627808
|
||||
-1.0076441270299 0.025157339498401 0.51940553779714
|
||||
-0.45112570035271 0.030354945734143 -1.0244264173787
|
||||
-0.034796683816239 0.47213521944359 -1.0233666383661
|
||||
-0.52309081116691 1.0127369282767 -1.030445962213
|
||||
-1.0052867605351 0.54541603662074 -0.99267176855355
|
||||
-0.53441363093443 1.0101050069556 0.034852372528985
|
||||
-1.0361742412671 0.51952713127248 -0.0075041593052447
|
||||
-1.0224051106721 0.037305149668828 -0.51234883274883
|
||||
-0.0468317149207 0.99936735257506 -0.53290488454513
|
||||
-1.0323944162577 1.0470460939221 -0.49629869163036
|
||||
0.50827771586097 0.51091354087276 -0.96143114171132
|
||||
0.97860428203942 0.53881222049291 -1.0227558970328
|
||||
0.54899092558423 1.0449853148062 -1.0290394971016
|
||||
0.98149990118493 1.0265442789565 -0.45402792714566
|
||||
0.47938502309767 -0.95321110021154 0.46438798044786
|
||||
0.98893120098231 -1.0252040218394 0.52866776747387
|
||||
0.46061993861414 -0.973998097143 0.95264651015888
|
||||
0.98858339184873 -0.49578777734639 0.97955980177082
|
||||
-0.95322811676761 0.49312524158842 0.46350421594559
|
||||
-0.9670648949319 0.52720408663568 1.0147400701319
|
||||
-0.95970724064157 0.9966338243727 0.47198853459547
|
||||
-0.55076990539437 0.95548113087191 1.0002298586837
|
||||
0.48237521727569 -0.51972299404442 -0.98436066769063
|
||||
0.45025863721967 -1.0030842470471 -0.53693975312635
|
||||
0.95356930759735 -0.4606471833773 -0.49721032292582
|
||||
0.48610299886204 0.033102156873792 -0.45204877182841
|
||||
0.016292646434158 -0.4694908623118 -0.53292224425822
|
||||
0.47584088565782 -0.54223454683088 -0.036028525792062
|
||||
-0.53143287785351 -0.4923779387027 0.0039846746250987
|
||||
-0.52957315347157 -1.0359902368858 0.51208876920864
|
||||
-0.024055424472317 -0.49951890320517 0.48579422575422
|
||||
-0.45644746879116 -0.012607240816578 0.51010388839059
|
||||
-0.98394734906033 -0.50309513998218 0.47998268660158
|
||||
-0.53098605261184 -0.48258609846234 0.97544367099181
|
||||
-0.51822144156322 0.45223189569078 -1.0385291075334
|
||||
-0.45871022404172 -0.042734754644334 -0.54302125046961
|
||||
0.041843411838636 0.46222349074669 -0.5097909247037
|
||||
-0.45607118047774 1.0116704457439 -0.45481789885089
|
||||
-1.0244252419565 0.4849586374592 -0.50017994958907
|
||||
-0.52441235366277 0.50157218999229 0.023797604069114
|
||||
0.46467856940869 0.54693057615002 -0.46251054922067
|
||||
0.98669286111723 0.51824862516758 -0.45168929326637
|
||||
0.54790127868275 0.98589193659248 -0.51421705686245
|
||||
0.54233705943277 -0.4508773840935 0.45025142266283
|
||||
1.0203662623874 -0.5304726794563 0.52365051237419
|
||||
0.48446453821555 -0.47976663671026 1.043945324572
|
||||
-0.48793381256969 0.50247088679532 0.48323828733422
|
||||
-0.52670996575095 0.50194146344506 1.0026980744777
|
||||
-0.47523256142428 0.97748358070477 0.48234451559035
|
||||
0.45616661459208 -0.50770850274712 -0.4568053398747
|
||||
-0.52734654471278 -0.51337681044824 0.47594708297402
|
||||
-0.45737625267357 0.47732204026543 -0.54846904515289
|
||||
CELLS 14 253
|
||||
10 21 25 13 15 26 29 27 28 30 31
|
||||
10 15 13 21 12 31 27 28 32 33 34
|
||||
10 25 21 13 22 26 27 29 35 36 37
|
||||
10 21 25 15 24 26 30 28 38 39 40
|
||||
10 13 15 25 16 31 30 29 41 42 43
|
||||
27 0 1 4 3 9 10 13 12 44 45 46 47 48 49 33 50 51 52 53 54 90 88 87 89 86 91 113
|
||||
27 8 9 12 11 17 18 21 20 55 50 56 57 58 59 60 61 62 63 34 64 96 94 93 95 92 97 114
|
||||
27 2 3 6 5 11 12 15 14 65 66 67 68 56 32 69 70 71 54 72 73 102 100 99 101 98 103 115
|
||||
18 3 6 4 12 15 13 66 74 46 32 31 33 54 72 53 100 104 89
|
||||
18 4 6 7 13 15 16 74 76 75 31 42 41 53 72 77 104 106 105
|
||||
18 12 21 13 9 18 10 34 27 33 63 78 48 50 59 49 94 107 91
|
||||
18 13 21 22 10 18 19 27 36 37 78 80 79 49 59 81 107 109 108
|
||||
18 11 20 14 12 21 15 64 82 70 34 28 32 56 60 69 95 110 103
|
||||
18 15 24 21 14 23 20 40 38 28 84 83 82 69 85 60 112 111 110
|
||||
CELL_TYPES 14
|
||||
24
|
||||
24
|
||||
24
|
||||
24
|
||||
24
|
||||
29
|
||||
29
|
||||
29
|
||||
32
|
||||
32
|
||||
32
|
||||
32
|
||||
32
|
||||
32
|
||||
CELL_DATA 14
|
||||
SCALARS material int
|
||||
LOOKUP_TABLE default
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@@ -1,96 +0,0 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
14
|
||||
1 4 13 15 21 25
|
||||
1 4 12 13 15 21
|
||||
1 4 13 21 22 25
|
||||
1 4 15 24 21 25
|
||||
1 4 13 15 25 16
|
||||
1 5 0 1 4 3 9 10 13 12
|
||||
1 5 8 9 12 11 17 18 21 20
|
||||
1 5 2 3 6 5 11 12 15 14
|
||||
1 6 3 4 6 12 13 15
|
||||
1 6 4 7 6 13 16 15
|
||||
1 6 12 13 21 9 10 18
|
||||
1 6 13 22 21 10 19 18
|
||||
1 6 11 14 20 12 15 21
|
||||
1 6 15 21 24 14 20 23
|
||||
|
||||
boundary
|
||||
30
|
||||
1 3 5 6 3 2
|
||||
2 2 3 6 4
|
||||
2 2 4 6 7
|
||||
3 3 3 4 1 0
|
||||
4 3 11 12 9 8
|
||||
5 3 2 3 12 11
|
||||
6 3 0 1 10 9
|
||||
7 2 9 10 18
|
||||
7 2 10 19 18
|
||||
8 3 8 9 18 17
|
||||
9 3 1 4 13 10
|
||||
10 3 4 7 16 13
|
||||
11 2 13 16 25
|
||||
11 2 13 25 22
|
||||
12 3 10 13 22 19
|
||||
13 3 7 6 15 16
|
||||
14 3 6 5 14 15
|
||||
15 3 15 14 23 24
|
||||
16 2 16 15 25
|
||||
16 2 15 24 25
|
||||
17 3 5 2 11 14
|
||||
18 3 3 0 9 12
|
||||
19 3 11 8 17 20
|
||||
20 2 11 20 14
|
||||
20 2 14 20 23
|
||||
21 3 17 18 21 20
|
||||
22 3 18 19 22 21
|
||||
23 2 21 22 25
|
||||
23 2 21 25 24
|
||||
24 3 20 21 24 23
|
||||
|
||||
vertices
|
||||
26
|
||||
3
|
||||
0 -1 -1
|
||||
1 -1 -1
|
||||
-1 0 -1
|
||||
0 0 -1
|
||||
1 0 -1
|
||||
-1 1 -1
|
||||
0 1 -1
|
||||
1 1 -1
|
||||
-1 -1 0
|
||||
0 -1 0
|
||||
1 -1 0
|
||||
-1 0 0
|
||||
0 0 0
|
||||
1 0 0
|
||||
-1 1 0
|
||||
0 1 0
|
||||
1 1 0
|
||||
-1 -1 1
|
||||
0 -1 1
|
||||
1 -1 1
|
||||
-1 0 1
|
||||
0 0 1
|
||||
1 0 1
|
||||
-1 1 1
|
||||
0 1 1
|
||||
1 1 1
|
||||
@@ -1,9 +0,0 @@
|
||||
MFEM INLINE mesh v1.0
|
||||
|
||||
type = wedge
|
||||
nx = 4
|
||||
ny = 4
|
||||
nz = 4
|
||||
sx = 1.0
|
||||
sy = 1.0
|
||||
sz = 1.0
|
||||
@@ -0,0 +1,218 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
74
|
||||
2 3 0 1 2 3
|
||||
2 3 1 5 6 2
|
||||
2 3 5 8 9 6
|
||||
2 3 8 11 12 9
|
||||
2 3 11 14 15 12
|
||||
2 3 14 17 18 15
|
||||
2 3 17 20 21 18
|
||||
2 3 20 23 24 21
|
||||
2 3 23 26 27 24
|
||||
2 3 26 29 30 27
|
||||
2 3 29 32 33 30
|
||||
2 3 32 35 36 33
|
||||
2 3 35 38 39 36
|
||||
2 3 38 41 42 39
|
||||
2 3 41 44 45 42
|
||||
2 3 44 47 48 45
|
||||
2 3 47 50 51 48
|
||||
2 3 50 53 54 51
|
||||
2 3 53 56 57 54
|
||||
2 3 56 59 60 57
|
||||
2 3 59 62 63 60
|
||||
2 3 62 65 66 63
|
||||
2 3 65 68 69 66
|
||||
2 3 68 71 72 69
|
||||
2 3 71 74 75 72
|
||||
1 2 2 3 4
|
||||
1 2 6 2 7
|
||||
1 2 9 6 10
|
||||
1 2 12 9 13
|
||||
1 2 15 12 16
|
||||
1 2 18 15 19
|
||||
1 2 21 18 22
|
||||
1 2 24 21 25
|
||||
1 2 27 24 28
|
||||
1 2 30 27 31
|
||||
1 2 33 30 34
|
||||
1 2 36 33 37
|
||||
1 2 39 36 40
|
||||
1 2 42 39 43
|
||||
1 2 45 42 46
|
||||
1 2 48 45 49
|
||||
1 2 51 48 52
|
||||
1 2 54 51 55
|
||||
1 2 57 54 58
|
||||
1 2 60 57 61
|
||||
1 2 63 60 64
|
||||
1 2 66 63 67
|
||||
1 2 69 66 70
|
||||
1 2 72 69 73
|
||||
1 2 75 72 76
|
||||
1 2 2 4 7
|
||||
1 2 6 7 10
|
||||
1 2 9 10 13
|
||||
1 2 12 13 16
|
||||
1 2 15 16 19
|
||||
1 2 18 19 22
|
||||
1 2 21 22 25
|
||||
1 2 24 25 28
|
||||
1 2 27 28 31
|
||||
1 2 30 31 34
|
||||
1 2 33 34 37
|
||||
1 2 36 37 40
|
||||
1 2 39 40 43
|
||||
1 2 42 43 46
|
||||
1 2 45 46 49
|
||||
1 2 48 49 52
|
||||
1 2 51 52 55
|
||||
1 2 54 55 58
|
||||
1 2 57 58 61
|
||||
1 2 60 61 64
|
||||
1 2 63 64 67
|
||||
1 2 66 67 70
|
||||
1 2 69 70 73
|
||||
1 2 72 73 76
|
||||
|
||||
boundary
|
||||
53
|
||||
1 1 0 1
|
||||
1 1 1 5
|
||||
1 1 5 8
|
||||
1 1 8 11
|
||||
1 1 11 14
|
||||
1 1 14 17
|
||||
1 1 17 20
|
||||
1 1 20 23
|
||||
1 1 23 26
|
||||
1 1 26 29
|
||||
1 1 29 32
|
||||
1 1 32 35
|
||||
1 1 35 38
|
||||
1 1 38 41
|
||||
1 1 41 44
|
||||
1 1 44 47
|
||||
1 1 47 50
|
||||
1 1 50 53
|
||||
1 1 53 56
|
||||
1 1 56 59
|
||||
1 1 59 62
|
||||
1 1 62 65
|
||||
1 1 65 68
|
||||
1 1 68 71
|
||||
1 1 71 74
|
||||
1 1 74 75
|
||||
1 1 75 76
|
||||
1 1 76 73
|
||||
1 1 73 70
|
||||
1 1 70 67
|
||||
1 1 67 64
|
||||
1 1 64 61
|
||||
1 1 61 58
|
||||
1 1 58 55
|
||||
1 1 55 52
|
||||
1 1 52 49
|
||||
1 1 49 46
|
||||
1 1 46 43
|
||||
1 1 43 40
|
||||
1 1 40 37
|
||||
1 1 37 34
|
||||
1 1 34 31
|
||||
1 1 31 28
|
||||
1 1 28 25
|
||||
1 1 25 22
|
||||
1 1 22 19
|
||||
1 1 19 16
|
||||
1 1 16 13
|
||||
1 1 13 10
|
||||
1 1 10 7
|
||||
1 1 7 4
|
||||
1 1 4 3
|
||||
1 1 3 0
|
||||
|
||||
vertices
|
||||
77
|
||||
2
|
||||
3.9788735773 0.0
|
||||
3.84329674785 1.02980825986
|
||||
2.88247256089 0.772356194895
|
||||
2.98415518297 0.0
|
||||
1.97241688113 0.259673608685
|
||||
3.44580559639 1.98943678865
|
||||
2.58435419729 1.49207759149
|
||||
1.83799993026 0.761324498753
|
||||
2.81348848799 2.81348848799
|
||||
2.11011636599 2.11011636599
|
||||
1.57832632157 1.21109238238
|
||||
1.98943678865 3.44580559639
|
||||
1.49207759149 2.58435419729
|
||||
1.21109238238 1.57832632157
|
||||
1.02980825986 3.84329674785
|
||||
0.772356194895 2.88247256089
|
||||
0.761324498753 1.83799993026
|
||||
2.43635739532e-16 3.9788735773
|
||||
1.82726804649e-16 2.98415518297
|
||||
0.259673608685 1.97241688113
|
||||
-1.02980825986 3.84329674785
|
||||
-0.772356194895 2.88247256089
|
||||
-0.259673608685 1.97241688113
|
||||
-1.98943678865 3.44580559639
|
||||
-1.49207759149 2.58435419729
|
||||
-0.761324498753 1.83799993026
|
||||
-2.81348848799 2.81348848799
|
||||
-2.11011636599 2.11011636599
|
||||
-1.21109238238 1.57832632157
|
||||
-3.44580559639 1.98943678865
|
||||
-2.58435419729 1.49207759149
|
||||
-1.57832632157 1.21109238238
|
||||
-3.84329674785 1.02980825986
|
||||
-2.88247256089 0.772356194895
|
||||
-1.83799993026 0.761324498753
|
||||
-3.9788735773 4.87271479065e-16
|
||||
-2.98415518297 3.65453609299e-16
|
||||
-1.97241688113 0.259673608685
|
||||
-3.84329674785 -1.02980825986
|
||||
-2.88247256089 -0.772356194895
|
||||
-1.97241688113 -0.259673608685
|
||||
-3.44580559639 -1.98943678865
|
||||
-2.58435419729 -1.49207759149
|
||||
-1.83799993026 -0.761324498753
|
||||
-2.81348848799 -2.81348848799
|
||||
-2.11011636599 -2.11011636599
|
||||
-1.57832632157 -1.21109238238
|
||||
-1.98943678865 -3.44580559639
|
||||
-1.49207759149 -2.58435419729
|
||||
-1.21109238238 -1.57832632157
|
||||
-1.02980825986 -3.84329674785
|
||||
-0.772356194895 -2.88247256089
|
||||
-0.761324498753 -1.83799993026
|
||||
-7.30907218597e-16 -3.9788735773
|
||||
-5.48180413948e-16 -2.98415518297
|
||||
-0.259673608685 -1.97241688113
|
||||
1.02980825986 -3.84329674785
|
||||
0.772356194895 -2.88247256089
|
||||
0.259673608685 -1.97241688113
|
||||
1.98943678865 -3.44580559639
|
||||
1.49207759149 -2.58435419729
|
||||
0.761324498753 -1.83799993026
|
||||
2.81348848799 -2.81348848799
|
||||
2.11011636599 -2.11011636599
|
||||
1.21109238238 -1.57832632157
|
||||
3.44580559639 -1.98943678865
|
||||
2.58435419729 -1.49207759149
|
||||
1.57832632157 -1.21109238238
|
||||
3.84329674785 -1.02980825986
|
||||
2.88247256089 -0.772356194895
|
||||
1.83799993026 -0.761324498753
|
||||
3.9788735773 -9.7454295813e-16
|
||||
2.98415518297 -7.30907218597e-16
|
||||
1.97241688113 -0.259673608685
|
||||
3.84329674785 1.02980825986
|
||||
2.88247256089 0.772356194895
|
||||
1.97241688113 0.259673608685
|
||||
@@ -0,0 +1,74 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
20
|
||||
2 3 0 1 2 3
|
||||
2 3 1 5 6 2
|
||||
2 3 5 8 9 6
|
||||
2 3 8 11 12 9
|
||||
2 3 11 14 15 12
|
||||
2 3 14 17 18 15
|
||||
2 3 17 20 21 18
|
||||
1 2 2 3 4
|
||||
1 2 6 2 7
|
||||
1 2 9 6 10
|
||||
1 2 12 9 13
|
||||
1 2 15 12 16
|
||||
1 2 18 15 19
|
||||
1 2 21 18 22
|
||||
1 2 2 4 7
|
||||
1 2 6 7 10
|
||||
1 2 9 10 13
|
||||
1 2 12 13 16
|
||||
1 2 15 16 19
|
||||
1 2 18 19 22
|
||||
|
||||
boundary
|
||||
17
|
||||
1 1 0 1
|
||||
1 1 1 5
|
||||
1 1 5 8
|
||||
1 1 8 11
|
||||
1 1 11 14
|
||||
1 1 14 17
|
||||
1 1 17 20
|
||||
1 1 20 21
|
||||
1 1 21 22
|
||||
1 1 22 19
|
||||
1 1 19 16
|
||||
1 1 16 13
|
||||
1 1 13 10
|
||||
1 1 10 7
|
||||
1 1 7 4
|
||||
1 1 4 3
|
||||
1 1 3 0
|
||||
|
||||
vertices
|
||||
23
|
||||
2
|
||||
1.11408460164 0.0
|
||||
0.557042300822 0.964825566988
|
||||
0.417781725616 0.723619175241
|
||||
0.835563451232 0.0
|
||||
0.482412783494 0.278521150411
|
||||
-0.557042300822 0.964825566988
|
||||
-0.417781725616 0.723619175241
|
||||
3.41090035345e-17 0.557042300822
|
||||
-1.11408460164 1.36436014138e-16
|
||||
-0.835563451232 1.02327010604e-16
|
||||
-0.482412783494 0.278521150411
|
||||
-0.557042300822 -0.964825566988
|
||||
-0.417781725616 -0.723619175241
|
||||
-0.482412783494 -0.278521150411
|
||||
0.557042300822 -0.964825566988
|
||||
0.417781725616 -0.723619175241
|
||||
-1.02327010604e-16 -0.557042300822
|
||||
1.11408460164 -2.72872028276e-16
|
||||
0.835563451232 -2.04654021207e-16
|
||||
0.482412783494 -0.278521150411
|
||||
0.557042300822 0.964825566988
|
||||
0.417781725616 0.723619175241
|
||||
0.482412783494 0.278521150411
|
||||
@@ -0,0 +1,924 @@
|
||||
#Title:circInSquare.py
|
||||
#Author:T. M. McManus
|
||||
#Date:10-7-18
|
||||
#Purpose: Fill a circular sector with triangles and a bounding region,
|
||||
#defined by 3 nodes, with quads. Then reflect/preserve QuadI twice to
|
||||
#create a complete disc bounded in a square.
|
||||
|
||||
import scipy as sp
|
||||
import argparse
|
||||
import sys
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
parser=argparse.ArgumentParser(description='Fill a circular sector with triangles and a bounding region,\
|
||||
defined by 3 nodes, with quads. Then reflect/preserve QuadI twice to create a complete disc bounded in a square.'
|
||||
,epilog='Sample run: python circInSquare.py -r 1 -e 2 -n 8 -g ../../../glvis/glvis')
|
||||
|
||||
parser.add_argument('-r','--circRad', nargs='?',const=1, default = 1.0, type=float, help='Radius of circle')
|
||||
parser.add_argument('-e','--edgeLength', nargs='?',const=1,default=2.0,type=float,help='Edge-length of bounding square')
|
||||
parser.add_argument('-n','--numEdges',nargs='?',const=1,default=6,type=int,help='n-gon approximation of internal circle')
|
||||
parser.add_argument('-o','--outputFile',nargs='?',const=1,default='circInSquare', help='Output file name.')
|
||||
parser.add_argument('-g','--glvis',nargs='?',const=1,default='',type=str,help='Abs. or rel. path of glvis binary.')
|
||||
args=parser.parse_args()
|
||||
|
||||
r=args.circRad
|
||||
edgeLength=args.edgeLength
|
||||
numEdges=args.numEdges
|
||||
outputName=args.outputFile
|
||||
glvis=args.glvis
|
||||
|
||||
visMesh=False;
|
||||
|
||||
if glvis!='':
|
||||
visMesh=True
|
||||
|
||||
if r >= edgeLength:
|
||||
print("Circle radius must be less than bounding square edge length")
|
||||
sys.exit(1)
|
||||
|
||||
if sp.mod(numEdges,2) != 0:
|
||||
print("Currently this mixed element generator only supports an even numbers of edges.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
#The basic idea:
|
||||
#1. Construct topology for regions
|
||||
#2. Combine topologies
|
||||
#3. Construct boundary
|
||||
#4. Construct geometry for regions
|
||||
#5. Combine geometries
|
||||
#6. Output
|
||||
|
||||
def eleMatCirc(numEdges):
|
||||
|
||||
nNodesSeq=sp.zeros([numEdges])
|
||||
nNodesSeq[0]=3
|
||||
if numEdges != 1:
|
||||
for n in range(1,numEdges):
|
||||
nNodesSeq[n]=nNodesSeq[n-1]+(2+n)
|
||||
|
||||
numCircNodesTot =int(((numEdges+1)*(numEdges+2))/2)
|
||||
|
||||
b=range(numCircNodesTot)
|
||||
row_size=1
|
||||
A=sp.zeros([numEdges+1,numEdges+1])
|
||||
start=0;stop=1;
|
||||
for m in range(numEdges+1):
|
||||
if m==0:
|
||||
A[m,range(m+1)]=b[0:1]
|
||||
start=0
|
||||
stop=1
|
||||
else:
|
||||
start=stop
|
||||
stop=stop+m+1
|
||||
A[m,range(m+1)]=b[start:stop]
|
||||
|
||||
M=sp.ones([numEdges**2,5])
|
||||
m_row=0
|
||||
for m in range(numEdges):
|
||||
if m==0:
|
||||
M[0,:]=[1,2,0,1,2]
|
||||
m_row+=1
|
||||
else:
|
||||
holder=sp.size(sp.nonzero(A[m,:]))
|
||||
for n in range(holder):
|
||||
if n!=holder-1:
|
||||
M[m_row,:]=[1,2,A[m,n],A[m,n+1],A[m+1,n+1]]
|
||||
m_row+=1
|
||||
M[m_row,:]=[1,2,A[m,n],A[m+1,n],A[m+1,n+1]]
|
||||
m_row+=1
|
||||
else:
|
||||
M[m_row,:]=[1,2,A[m,n],A[m+1,n],A[m+1,n+1]]
|
||||
m_row+=1
|
||||
|
||||
return M.astype(int),numCircNodesTot
|
||||
|
||||
def eleMatQuad(numEdges):
|
||||
S0=numEdges*(numEdges+1)/(2.0)
|
||||
A=sp.linspace(S0,(S0+(numEdges+1)**2)-1,(numEdges+1)**2)
|
||||
A=A.reshape([numEdges+1,numEdges+1])
|
||||
quadNode=sp.delete(A,-1,1)
|
||||
quadNode=sp.delete(quadNode,-1,0)
|
||||
quadNode=quadNode.flatten()
|
||||
M=sp.zeros([numEdges**2,6])
|
||||
for n in range(numEdges**2):
|
||||
M[n,:]=[2,3,quadNode[n],quadNode[n]+1,quadNode[n]+numEdges+2,quadNode[n]+numEdges+1]
|
||||
return M.astype(int)
|
||||
|
||||
def boundMatTot(numEdges):
|
||||
triS1=sp.zeros(numEdges+1)
|
||||
triS3=sp.zeros(numEdges+1)
|
||||
quadS1=sp.zeros(numEdges)
|
||||
quadS2=sp.zeros(numEdges-1)
|
||||
quadS3=sp.zeros(numEdges)
|
||||
|
||||
triS1[0]=0;
|
||||
triS3[0]=0;
|
||||
for n in range(1,numEdges+1):
|
||||
triS1[n]=triS1[n-1]+n
|
||||
triS3[n]=triS1[n]+n
|
||||
ref1=triS3
|
||||
|
||||
triS3=sp.flipud(triS3)
|
||||
quadS1[0]=triS1[-1]+numEdges+1
|
||||
quadS3[0]=triS1[-1]+2*numEdges+1
|
||||
|
||||
for n in range(1,numEdges):
|
||||
quadS1[n]=quadS1[n-1]+(numEdges+1)
|
||||
quadS3[n]=quadS3[n-1]+(numEdges+1)
|
||||
ref2=quadS3
|
||||
xAxisRootRef=sp.concatenate([triS1.copy(),quadS1],axis=0)
|
||||
quadS3=sp.flipud(quadS3)
|
||||
quadS2=range(int(quadS1[-1]+1),int(quadS3[0]),1)
|
||||
STOT=sp.concatenate([triS1,quadS1,quadS2,quadS3,triS3],axis=0)
|
||||
|
||||
filler=sp.zeros(1)
|
||||
filler[0]=quadS3[0]
|
||||
fillerFirst=sp.zeros(1)
|
||||
fillerFirst[0]=quadS1[-1]
|
||||
sTotRef=sp.concatenate([triS1,quadS1,quadS2,filler],axis=0)
|
||||
newsTotRef=sp.concatenate([fillerFirst,quadS2,filler],axis=0)
|
||||
boundMat=sp.zeros([STOT.size-1,4])
|
||||
boundMatRef=sp.zeros([sTotRef.size-1,4])
|
||||
new_boundMat_ref=sp.zeros([newsTotRef.size-1,4])
|
||||
|
||||
for n in range(STOT.size-1):
|
||||
boundMat[n,:]=[1,1,STOT[n],STOT[n+1]]
|
||||
for n in range(sTotRef.size-1):
|
||||
boundMatRef[n,:]=[1,1,sTotRef[n],sTotRef[n+1]]
|
||||
for n in range(newsTotRef.size-1):
|
||||
new_boundMat_ref[n,:]=[1,1,newsTotRef[n],newsTotRef[n+1]]
|
||||
|
||||
ref=sp.concatenate([ref1,ref2],axis=0).astype(int)
|
||||
return boundMat.astype(int),ref,boundMatRef.astype(int),xAxisRootRef.astype(int),new_boundMat_ref.astype(int)
|
||||
|
||||
def vertMatCirc(numEdges):
|
||||
r_o=sp.linspace(0,r,numEdges+1)
|
||||
counter=0
|
||||
vertMat=sp.zeros([numCircNodesTot,2])
|
||||
for m in range(numEdges+1):
|
||||
theta=sp.linspace(0,sp.pi/2.0,m+1)
|
||||
for n in range(sp.size(theta)):
|
||||
vertMat[counter,:]=[r_o[m]*sp.cos(theta[n]),r_o[m]*sp.sin(theta[n])]
|
||||
counter+=1
|
||||
return vertMat
|
||||
|
||||
def vertMatQuad(numEdges):
|
||||
|
||||
theta=sp.linspace(0,sp.pi/2.0,numEdges+1)
|
||||
AX=sp.zeros([numEdges+1,numEdges+1])
|
||||
AY=sp.zeros([numEdges+1,numEdges+1])
|
||||
AX[0,:]=r*sp.cos(theta)
|
||||
AY[0,:]=r*sp.sin(theta)
|
||||
|
||||
vertLinSpace=sp.linspace(0,edgeLength,(numEdges/2)+1)
|
||||
horzLineSpace=sp.linspace(edgeLength,0,(numEdges/2)+1)
|
||||
|
||||
#Assigning node locations along the boundary
|
||||
vertCount=0
|
||||
horzCount=1
|
||||
for n in range(numEdges+1):
|
||||
if n < (numEdges/2):
|
||||
AX[-1,n]=edgeLength
|
||||
AY[-1,n]=vertLinSpace[vertCount]
|
||||
vertCount+=1
|
||||
elif n == int(numEdges/2):
|
||||
AX[-1,n]=edgeLength
|
||||
AY[-1,n]=edgeLength
|
||||
else:
|
||||
AX[-1,n]=horzLineSpace[horzCount]
|
||||
AY[-1,n]=edgeLength
|
||||
horzCount+=1
|
||||
|
||||
#Linearly spacing nodes between the inner/outer boundaries
|
||||
#One could then smooth this via r-based adaptivity
|
||||
for col in range(numEdges+1):
|
||||
for row in range(1,numEdges):
|
||||
AX[row,col]=sp.linspace(AX[0,col],AX[-1,col],numEdges+1)[row]
|
||||
AY[row,col]=sp.linspace(AY[0,col],AY[-1,col],numEdges+1)[row]
|
||||
|
||||
AX=sp.delete(AX,0,0)
|
||||
AY=sp.delete(AY,0,0)
|
||||
AX=AX.flatten()
|
||||
AY=AY.flatten()
|
||||
AX_reshape = AX.flatten()
|
||||
|
||||
numQuadNodesTot=numEdges*(numEdges+1)
|
||||
vertMat=sp.zeros([numQuadNodesTot,2])
|
||||
for n in range(numQuadNodesTot):
|
||||
vertMat[n,:]=[AX[n],AY[n]]
|
||||
return vertMat
|
||||
|
||||
def orient(A):
|
||||
aOrient=sp.zeros([A.shape[0],A.shape[1]])
|
||||
triCounter=0
|
||||
quadCounter=0
|
||||
#Determine the number of triangle and quad elments in the given element matrix
|
||||
for n in range(A.shape[0]):
|
||||
if A[n,1]==2:
|
||||
triCounter+=1
|
||||
else:
|
||||
quadCounter+=1
|
||||
edgeMatTotal=sp.zeros([3*triCounter+4*quadCounter,2])
|
||||
counter=0
|
||||
for n in range(A.shape[0]):
|
||||
detected=0
|
||||
if A[n,1]==2:
|
||||
for m in range(edgeMatTotal.shape[0]):
|
||||
if detected != 1:
|
||||
if edgeMatTotal[m,0]==A[n,2] and edgeMatTotal[m,1]==A[n,3]:
|
||||
aOrient[n,:]=[1,2,A[n,2],A[n,4],A[n,3],0]
|
||||
detected=1
|
||||
#print("reorder:[{} {} {}] to [{} {} {}]".format(A[n,2],A[n,3],A[n,4],int(aOrient[n,2]),int(aOrient[n,3]),int(aOrient[n,4])))
|
||||
elif edgeMatTotal[m,0]==A[n,4] and edgeMatTotal[m,1]==A[n,2]:
|
||||
aOrient[n,:]=[1,2,A[n,2],A[n,4],A[n,3],0]
|
||||
detected=1
|
||||
else:
|
||||
aOrient[n,:]=A[n,:]
|
||||
|
||||
edgeMatTotal[counter,:]=[aOrient[n,2],aOrient[n,3]]
|
||||
counter+=1
|
||||
edgeMatTotal[counter,:]=[aOrient[n,3],aOrient[n,4]]
|
||||
counter+=1
|
||||
edgeMatTotal[counter,:]=[aOrient[n,4],aOrient[n,2]]
|
||||
counter+=1
|
||||
else:
|
||||
for m in range(edgeMatTotal.shape[0]):
|
||||
if detected != 1:
|
||||
if edgeMatTotal[m,0]==A[n,2] and edgeMatTotal[m,1]==A[n,3]:
|
||||
aOrient[n,:]=[2,3,A[n,2],A[n,5],A[n,4],A[n,3]]
|
||||
detected=1
|
||||
#print("reorder:[{} {} {} {}] to [{} {} {} {}]".format(A[n,2],A[n,3],A[n,4],A[n,5],int(aOrient[n,2]),int(aOrient[n,3]),int(aOrient[n,4]),int(aOrient[n,5])))
|
||||
elif edgeMatTotal[m,0]==A[n,5] and edgeMatTotal[m,1]==A[n,2]:
|
||||
aOrient[n,:]=[2,3,A[n,2],A[n,5],A[n,4],A[n,3]]
|
||||
detected=1
|
||||
else:
|
||||
aOrient[n,:]=A[n,:]
|
||||
edgeMatTotal[counter,:]=[aOrient[n,2],aOrient[n,3]]
|
||||
counter+=1
|
||||
edgeMatTotal[counter,:]=[aOrient[n,3],aOrient[n,4]]
|
||||
counter+=1
|
||||
edgeMatTotal[counter,:]=[aOrient[n,4],aOrient[n,5]]
|
||||
counter+=1
|
||||
edgeMatTotal[counter,:]=[aOrient[n,5],aOrient[n,2]]
|
||||
counter+=1
|
||||
return aOrient.astype(int)
|
||||
|
||||
def gVis(_glvis,_meshFile):
|
||||
|
||||
if(_glvis==''):
|
||||
print("Failure: Set glvis location via -g switch")
|
||||
sys.exit(1)
|
||||
|
||||
colFuncFileName=_meshFile.replace('.mesh','.gf')
|
||||
glvsScriptFileName=_meshFile.replace('.mesh','.glvs')
|
||||
imageFileName=_meshFile.replace('.mesh','.png')
|
||||
|
||||
#Create Coloring Function for mesh
|
||||
_colFuncCommand=_glvis+ ' -m '+ _meshFile +' -sc -k q'
|
||||
args=_colFuncCommand.split()
|
||||
p=subprocess.Popen(args)#Create 'GLVis_coloring.gf'
|
||||
|
||||
_renameCommand='mv GLVis_coloring.gf {}'.format(colFuncFileName)
|
||||
args=_renameCommand.split()
|
||||
p=subprocess.Popen(args)
|
||||
|
||||
#Glvis script template
|
||||
f=open(glvsScriptFileName,'w')
|
||||
f.write('window 0 0 800 800\n'+'\n')
|
||||
f.write('solution {} {}\n'.format(_meshFile,colFuncFileName)+'\n')
|
||||
f.write('{\n'+'perspective off\n'+'zoom 1.5\n'+'keys gAeeRM\n'+'solution {} {} screenshot {}\n'.format(_meshFile,colFuncFileName,imageFileName)+'keys q\n'+'}\n')
|
||||
f.close()
|
||||
|
||||
_runGlvisCommand=_glvis+' -run {}'.format(glvsScriptFileName)
|
||||
args=_runGlvisCommand.split()
|
||||
p=subprocess.Popen(args)
|
||||
p.wait()
|
||||
|
||||
return 0
|
||||
def quadInterDof(_edge,_linEleMat,_linVertMatRound):
|
||||
_state=False
|
||||
for n in range(_linEleMat.shape[0]):
|
||||
if _linEleMat[n,1]==3:
|
||||
if sp.any(_edge[0]==_linEleMat[n,2:6]) and sp.any(_edge[1]==_linEleMat[n,2:6]):
|
||||
print("{} is possibly in {}".format(_edge,_linEleMat[n,2:6]))
|
||||
_n1Loc=sp.where(_edge[0]==_linEleMat[n,2:6])[0][0]
|
||||
_n2Loc=sp.where(_edge[1]==_linEleMat[n,2:6])[0][0]
|
||||
if _n1Loc==sp.mod(_n2Loc+1,4) or _n1Loc==sp.mod(_n2Loc-1,4):
|
||||
_state=True
|
||||
xcent=(_linVertMatRound[_linEleMat[n,2],0]+_linVertMatRound[_linEleMat[n,3],0]+_linVertMatRound[_linEleMat[n,4],0]+_linVertMatRound[_linEleMat[n,5],0])/4.0
|
||||
ycent=(_linVertMatRound[_linEleMat[n,2],1]+_linVertMatRound[_linEleMat[n,3],1]+_linVertMatRound[_linEleMat[n,4],1]+_linVertMatRound[_linEleMat[n,5],1])/4.0
|
||||
_interDof=sp.zeros(2)
|
||||
_interDof[0]=sp.round_((_linVertMatRound[_edge[0],0]+_linVertMatRound[_edge[1],0]+xcent)/3.0,5)
|
||||
_interDof[1]=sp.round_((_linVertMatRound[_edge[0],1]+_linVertMatRound[_edge[1],1]+ycent)/3.0,5)
|
||||
print("dof loc is {},{}".format(_interDof[0],_interDof[1]))
|
||||
return(_state,_interDof[0],_interDof[1])
|
||||
|
||||
return(_state,0,0)
|
||||
|
||||
[eleMatTriHolder,numCircNodesTot]=eleMatCirc(numEdges) #Construct tri element matrix for the region inside circular sector
|
||||
eleMatQuadHolder=eleMatQuad(numEdges) #Construct quad element matrix for region outside the circular sector
|
||||
|
||||
#Combining eleMatTriHolder and eleMatQuadHolder
|
||||
linEleMat=sp.zeros([eleMatTriHolder.shape[0]+eleMatQuadHolder.shape[0],6])
|
||||
counter=0
|
||||
for n in range(eleMatTriHolder.shape[0]):
|
||||
linEleMat[n,[0,1,2,3,4]]=eleMatTriHolder[n,:]
|
||||
counter+=1
|
||||
for n in range(eleMatQuadHolder.shape[0]):
|
||||
linEleMat[counter+n,:]=eleMatQuadHolder[n,:]
|
||||
|
||||
linEleMat=linEleMat.astype(int)
|
||||
linBoundMat=boundMatTot(numEdges)[0] #Construct the boundary
|
||||
vertMatCircHolder = vertMatCirc(numEdges) #Construct vertex matrix for triang region
|
||||
vertMatQuadHolder = vertMatQuad(numEdges) #Construct vertex matrix for the quad region
|
||||
|
||||
|
||||
#Combining the two vertex matrices in Quadrant I (q1)
|
||||
linVertMat=sp.zeros([vertMatCircHolder.shape[0]+vertMatQuadHolder.shape[0],2])
|
||||
counter=0
|
||||
for n in range(vertMatCircHolder.shape[0]):
|
||||
linVertMat[n,:]=vertMatCircHolder[n,:]
|
||||
counter+=1
|
||||
for n in range(vertMatQuadHolder.shape[0]):
|
||||
linVertMat[counter+n,:]=vertMatQuadHolder[n,:]
|
||||
|
||||
#Outputting P1/Q1 mesh to a .mesh file
|
||||
g=open(outputName+'Lin.mesh','w')
|
||||
g.write('MFEM mesh v1.0\n'+'\n')
|
||||
g.write('dimension\n'+'2\n'+'\n')
|
||||
g.write('elements\n'+'{}\n'.format(linEleMat.shape[0]))
|
||||
for n in range(linEleMat.shape[0]):
|
||||
if linEleMat[n,1]==2:
|
||||
g.write('{} {} {} {} {}\n'.format(linEleMat[n,0],linEleMat[n,1],linEleMat[n,2],linEleMat[n,3],linEleMat[n,4]))
|
||||
else:
|
||||
g.write('{} {} {} {} {} {}\n'.format(linEleMat[n,0],linEleMat[n,1],linEleMat[n,2],linEleMat[n,3],linEleMat[n,4],linEleMat[n,5]))
|
||||
g.write('\n'+'boundary\n'+'{}\n'.format(linBoundMat.shape[0]))
|
||||
for n in range(linBoundMat.shape[0]):
|
||||
g.write('{} {} {} {}\n'.format(linBoundMat[n,0],linBoundMat[n,1],linBoundMat[n,2],linBoundMat[n,3]))
|
||||
g.write('\n'+'vertices\n'+'{}\n'.format(linVertMat.shape[0])+'2\n')
|
||||
for n in range(linVertMat.shape[0]):
|
||||
g.write('{} {}\n'.format(linVertMat[n,0],linVertMat[n,1]))
|
||||
g.close()
|
||||
|
||||
if(visMesh==True):
|
||||
gVis(glvis,outputName+'Lin.mesh')
|
||||
|
||||
#Quadratic (P2/Q2) Element Generation
|
||||
|
||||
#1.)Create Edge list from previously generated linear elements
|
||||
edgeMat=sp.zeros([3*eleMatTriHolder.shape[0]+4*eleMatQuadHolder.shape[0],2])
|
||||
linEleMat=orient(linEleMat)#Make sure that element orientation is in agreement with MFEM requirements
|
||||
|
||||
counter=0
|
||||
for n in range(linEleMat.shape[0]):
|
||||
if linEleMat[n,1]==2:
|
||||
edgeMat[counter,:]=[linEleMat[n,2],linEleMat[n,3]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[linEleMat[n,3],linEleMat[n,4]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[linEleMat[n,4],linEleMat[n,2]]
|
||||
counter+=1
|
||||
else:
|
||||
edgeMat[counter,:]=[linEleMat[n,2],linEleMat[n,3]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[linEleMat[n,3],linEleMat[n,4]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[linEleMat[n,4],linEleMat[n,5]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[linEleMat[n,5],linEleMat[n,2]]
|
||||
counter+=1
|
||||
|
||||
#Remove duplicates
|
||||
holder=[]
|
||||
for n in range(edgeMat.shape[0]):
|
||||
counter=0
|
||||
for m in range(edgeMat.shape[0]):
|
||||
if edgeMat[n,0]==edgeMat[m,0] and edgeMat[n,1]==edgeMat[m,1] and m!=n:
|
||||
holder.append([n,m])
|
||||
elif edgeMat[n,1]==edgeMat[m,0] and edgeMat[n,0]==edgeMat[m,1] and m!=n:
|
||||
holder.append([n,m])
|
||||
|
||||
removeIndices=sp.zeros(len(holder))
|
||||
for n in range(len(holder)):
|
||||
if holder[n][0]>holder[n][1]:
|
||||
removeIndices[n]=holder[n][0]
|
||||
else:
|
||||
removeIndices[n]=holder[n][1]
|
||||
removeIndices=sp.unique(removeIndices).astype(int)
|
||||
edgeMat=sp.delete(edgeMat,removeIndices,0)
|
||||
edgeMat=edgeMat.astype(int)
|
||||
|
||||
edgeDofMat=sp.zeros([edgeMat.shape[0],2])#These will be the new DoFs that appear after the Element Vertices within the .mesh file
|
||||
linVertMatRound=sp.round_(linVertMat,5)
|
||||
|
||||
counter=0
|
||||
|
||||
for n in edgeMat:
|
||||
if linVertMatRound[n[0],1] == linVertMatRound[n[1],1]:
|
||||
xmid=(linVertMatRound[n[0],0]+linVertMatRound[n[1],0])/2.0
|
||||
ymid=linVertMatRound[n[0],1]
|
||||
edgeDofMat[counter,:]=[xmid,ymid]
|
||||
elif linVertMatRound[n[0],0] == linVertMatRound[n[1],0]:
|
||||
xmid=linVertMatRound[n[0],0]
|
||||
ymid=(linVertMatRound[n[0],1]+linVertMatRound[n[1],1])/2.0
|
||||
edgeDofMat[counter,:]=[xmid,ymid]
|
||||
else:
|
||||
r0=sp.sqrt(linVertMatRound[n[0],0]**2+linVertMatRound[n[0],1]**2)
|
||||
r1=sp.sqrt(linVertMatRound[n[1],0]**2+linVertMatRound[n[1],1]**2)
|
||||
rmid = (r0+r1)/2.0 #should not be needed
|
||||
xmidOld=(linVertMatRound[n[0],0]+linVertMatRound[n[1],0])/2.0
|
||||
ymidOld=(linVertMatRound[n[0],1]+linVertMatRound[n[1],1])/2.0
|
||||
midtheta=sp.arctan(ymidOld/xmidOld)
|
||||
xmid=rmid*sp.cos(midtheta)
|
||||
ymid=rmid*sp.sin(midtheta)
|
||||
edgeDofMat[counter,:]=[xmid,ymid]
|
||||
counter+=1
|
||||
edgeDofMat = sp.round_(edgeDofMat,5)
|
||||
|
||||
#Determine midpoints of all Q1 elements:
|
||||
quadCentroidLoc=sp.zeros([eleMatQuadHolder.shape[0],2])
|
||||
for n in range(eleMatQuadHolder.shape[0]):
|
||||
quadCentroidLoc[n,0]=(linVertMatRound[eleMatQuadHolder[n,2],0]+linVertMatRound[eleMatQuadHolder[n,3],0]+linVertMatRound[eleMatQuadHolder[n,4],0]+linVertMatRound[eleMatQuadHolder[n,5],0])/4.0
|
||||
quadCentroidLoc[n,1]=(linVertMatRound[eleMatQuadHolder[n,2],1]+linVertMatRound[eleMatQuadHolder[n,3],1]+linVertMatRound[eleMatQuadHolder[n,4],1]+linVertMatRound[eleMatQuadHolder[n,5],1])/4.0
|
||||
|
||||
quadCentroidLoc = sp.round_(quadCentroidLoc,5)
|
||||
|
||||
#3.)Populate nodes section
|
||||
g=open(outputName+'Quad.mesh','w')
|
||||
g.write('MFEM mesh v1.0\n'+'\n')
|
||||
g.write('dimension\n'+'2\n'+'\n')
|
||||
g.write('elements\n'+'{}\n'.format(linEleMat.shape[0]))
|
||||
for n in range(linEleMat.shape[0]):
|
||||
if linEleMat[n,1]==2:
|
||||
g.write('{} {} {} {} {}\n'.format(linEleMat[n,0],linEleMat[n,1],linEleMat[n,2],linEleMat[n,3],linEleMat[n,4]))
|
||||
else:
|
||||
g.write('{} {} {} {} {} {}\n'.format(linEleMat[n,0],linEleMat[n,1],linEleMat[n,2],linEleMat[n,3],linEleMat[n,4],linEleMat[n,5]))
|
||||
g.write('\n'+'boundary\n'+'{}\n'.format(linBoundMat.shape[0]))
|
||||
for n in range(linBoundMat.shape[0]):
|
||||
g.write('{} {} {} {}\n'.format(linBoundMat[n,0],linBoundMat[n,1],linBoundMat[n,2],linBoundMat[n,3]))
|
||||
g.write('\n'+'vertices\n'+'{}\n'.format(linVertMat.shape[0]))
|
||||
g.write('\n'+'nodes'+'\n'+'FiniteElementSpace'+'\n'+'FiniteElementCollection: H1_2D_P2'+'\n'+'VDim: 2'+'\n'+'Ordering: 1' +'\n\n')
|
||||
for n in range(linVertMatRound.shape[0]):
|
||||
g.write('{} {}\n'.format(linVertMatRound[n,0],linVertMatRound[n,1]))
|
||||
for n in range(edgeDofMat.shape[0]):
|
||||
g.write('{} {}\n'.format(edgeDofMat[n,0],edgeDofMat[n,1]))
|
||||
for n in range(quadCentroidLoc.shape[0]):
|
||||
g.write('{} {}\n'.format(quadCentroidLoc[n,0],quadCentroidLoc[n,1]))
|
||||
g.close()
|
||||
|
||||
if(visMesh==True):
|
||||
gVis(glvis,outputName+'Quad.mesh')
|
||||
|
||||
#Cubic (P3/Q3) Element Generation
|
||||
|
||||
cubeDofMat=sp.zeros([2*edgeMat.shape[0],2])#These will be the new DoFs that appear after the Element Vertices within the .mesh file
|
||||
|
||||
counter=0
|
||||
for n in edgeMat: #Here DoF ordering matters.
|
||||
if linVertMatRound[n[0],1] == linVertMatRound[n[1],1]:
|
||||
xmid=(linVertMatRound[n[0],0]+linVertMatRound[n[1],0])/2.0
|
||||
ymid=linVertMatRound[n[0],1]
|
||||
xmid1=(linVertMatRound[n[0],0]+xmid)/2.0
|
||||
ymid1=linVertMatRound[n[0],1]
|
||||
xmid2=(linVertMatRound[n[1],0]+xmid)/2.0
|
||||
ymid2=linVertMatRound[n[0],1]
|
||||
if n[0] > n[1]:
|
||||
cubeDofMat[counter,:]=[xmid2,ymid2]
|
||||
counter+=1
|
||||
cubeDofMat[counter,:]=[xmid1,ymid1]
|
||||
counter+=1
|
||||
else:
|
||||
cubeDofMat[counter,:]=[xmid1,ymid1]
|
||||
counter+=1
|
||||
cubeDofMat[counter,:]=[xmid2,ymid2]
|
||||
counter+=1
|
||||
|
||||
elif linVertMatRound[n[0],0] == linVertMatRound[n[1],0]:
|
||||
xmid=linVertMatRound[n[0],0]
|
||||
ymid=(linVertMatRound[n[0],1]+linVertMatRound[n[1],1])/2.0
|
||||
xmid1=linVertMatRound[n[0],0]
|
||||
ymid1=(linVertMatRound[n[0],1]+ymid)/2.0
|
||||
xmid2=linVertMatRound[n[0],0]
|
||||
ymid2=(linVertMatRound[n[1],1]+ymid)/2.0
|
||||
if n[0] > n[1]:
|
||||
cubeDofMat[counter,:]=[xmid2,ymid2]
|
||||
counter+=1
|
||||
cubeDofMat[counter,:]=[xmid1,ymid1]
|
||||
counter+=1
|
||||
else:
|
||||
cubeDofMat[counter,:]=[xmid1,ymid1]
|
||||
counter+=1
|
||||
cubeDofMat[counter,:]=[xmid2,ymid2]
|
||||
counter+=1
|
||||
else:
|
||||
r0=sp.sqrt(linVertMatRound[n[0],0]**2+linVertMatRound[n[0],1]**2)
|
||||
r1=sp.sqrt(linVertMatRound[n[1],0]**2+linVertMatRound[n[1],1]**2)
|
||||
rmid = (r0+r1)/2.0 #should not be needed
|
||||
xmidOld=(linVertMatRound[n[0],0]+linVertMatRound[n[1],0])/2.0
|
||||
ymidOld=(linVertMatRound[n[0],1]+linVertMatRound[n[1],1])/2.0
|
||||
midtheta=sp.arctan(ymidOld/xmidOld)
|
||||
xmid=rmid*sp.cos(midtheta)
|
||||
ymid=rmid*sp.sin(midtheta)
|
||||
xmid1=(linVertMatRound[n[0],0]+xmid)/2.0
|
||||
ymid1=(linVertMatRound[n[0],1]+ymid)/2.0
|
||||
xmid2=(linVertMatRound[n[1],0]+xmid)/2.0
|
||||
ymid2=(linVertMatRound[n[1],1]+ymid)/2.0
|
||||
if n[0] > n[1]:
|
||||
cubeDofMat[counter,:]=[xmid2,ymid2]
|
||||
counter+=1
|
||||
cubeDofMat[counter,:]=[xmid1,ymid1]
|
||||
counter+=1
|
||||
else:
|
||||
cubeDofMat[counter,:]=[xmid1,ymid1]
|
||||
counter+=1
|
||||
cubeDofMat[counter,:]=[xmid2,ymid2]
|
||||
counter+=1
|
||||
|
||||
cubeDofMat = sp.round_(cubeDofMat,5)
|
||||
|
||||
triCentroidLoc=sp.zeros([eleMatTriHolder.shape[0],2])
|
||||
|
||||
for n in range(eleMatTriHolder.shape[0]):
|
||||
triCentroidLoc[n,0]=(linVertMatRound[eleMatTriHolder[n,2],0]+linVertMatRound[eleMatTriHolder[n,3],0]+linVertMatRound[eleMatTriHolder[n,4],0])/3.0
|
||||
triCentroidLoc[n,1]=(linVertMatRound[eleMatTriHolder[n,2],1]+linVertMatRound[eleMatTriHolder[n,3],1]+linVertMatRound[eleMatTriHolder[n,4],1])/3.0
|
||||
|
||||
quadCentroidLocCubic=sp.zeros([4*eleMatQuadHolder.shape[0],2])
|
||||
|
||||
counter=0
|
||||
for n in range(eleMatQuadHolder.shape[0]):
|
||||
xcent=quadCentroidLoc[n,0];ycent=quadCentroidLoc[n,1]
|
||||
a=eleMatQuadHolder[n,2:6]
|
||||
aMinIndex=sp.where(a[:]==a.min())[0][0]
|
||||
dof0=0.5*sp.array([xcent+linVertMatRound[a[aMinIndex],0],ycent+linVertMatRound[a[aMinIndex],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof0
|
||||
counter+=1
|
||||
if aMinIndex==0:
|
||||
aLeft=-1
|
||||
aRight=1
|
||||
aLast=2
|
||||
else:
|
||||
aLeft=aMinIndex-1
|
||||
aRight=aMinIndex+1
|
||||
aLast=sp.delete(a,[aMinIndex,aLeft,aRight])[0]
|
||||
edge1=[a[aMinIndex], a[aLeft]]
|
||||
edge2=[a[aMinIndex], a[aRight]]
|
||||
edge1Index=0
|
||||
edge2Index=0
|
||||
edgeCounter=0
|
||||
for edge in edgeMat:
|
||||
if(edge[0]==edge1[0] and edge[1]==edge1[1]) or (edge[1]==edge1[0] and edge[0]==edge1[1]):
|
||||
edge1Index=edgeCounter
|
||||
if(edge[0]==edge2[0] and edge[1]==edge2[1]) or (edge[1]==edge2[0] and edge[0]==edge2[1]):
|
||||
edge2Index=edgeCounter
|
||||
edgeCounter+=1
|
||||
|
||||
if (edge1Index > edge2Index):
|
||||
dof1=0.5*sp.array([xcent+linVertMatRound[a[aLeft],0],ycent+linVertMatRound[a[aLeft],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof1
|
||||
counter+=1
|
||||
dof2=0.5*sp.array([xcent+linVertMatRound[a[aRight],0],ycent+linVertMatRound[a[aRight],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof2
|
||||
counter+=1
|
||||
dof3=0.5*sp.array([xcent+linVertMatRound[a[aLast],0],ycent+linVertMatRound[a[aLast],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof3
|
||||
counter+=1
|
||||
else:
|
||||
dof1=0.5*sp.array([xcent+linVertMatRound[a[aRight],0],ycent+linVertMatRound[a[aRight],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof1
|
||||
counter+=1
|
||||
dof2=0.5*sp.array([xcent+linVertMatRound[a[aLeft],0],ycent+linVertMatRound[a[aLeft],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof2
|
||||
counter+=1
|
||||
dof3=0.5*sp.array([xcent+linVertMatRound[a[aLast],0],ycent+linVertMatRound[a[aLast],1]])
|
||||
quadCentroidLocCubic[counter,:]=dof3
|
||||
counter+=1
|
||||
|
||||
truCentroidLoc=sp.round_(triCentroidLoc,5)
|
||||
|
||||
#3.)Populate nodes section
|
||||
g=open(outputName+'Cub.mesh','w')
|
||||
g.write('MFEM mesh v1.0\n'+'\n')
|
||||
g.write('dimension\n'+'2\n'+'\n')
|
||||
g.write('elements\n'+'{}\n'.format(linEleMat.shape[0]))
|
||||
for n in range(linEleMat.shape[0]):
|
||||
if linEleMat[n,1]==2:
|
||||
g.write('{} {} {} {} {}\n'.format(linEleMat[n,0],linEleMat[n,1],linEleMat[n,2],linEleMat[n,3],linEleMat[n,4]))
|
||||
else:
|
||||
g.write('{} {} {} {} {} {}\n'.format(linEleMat[n,0],linEleMat[n,1],linEleMat[n,2],linEleMat[n,3],linEleMat[n,4],linEleMat[n,5]))
|
||||
g.write('\n'+'boundary\n'+'{}\n'.format(linBoundMat.shape[0]))
|
||||
for n in range(linBoundMat.shape[0]):
|
||||
g.write('{} {} {} {}\n'.format(linBoundMat[n,0],linBoundMat[n,1],linBoundMat[n,2],linBoundMat[n,3]))
|
||||
g.write('\n'+'vertices\n'+'{}\n'.format(linVertMat.shape[0]))
|
||||
g.write('\n'+'nodes'+'\n'+'FiniteElementSpace'+'\n'+'FiniteElementCollection: H1_2D_P3'+'\n'+'VDim: 2'+'\n'+'Ordering: 1' +'\n\n')
|
||||
for n in range(linVertMatRound.shape[0]):
|
||||
g.write('{} {}\n'.format(linVertMatRound[n,0],linVertMatRound[n,1]))
|
||||
for n in range(cubeDofMat.shape[0]):
|
||||
g.write('{} {}\n'.format(cubeDofMat[n,0],cubeDofMat[n,1]))
|
||||
for n in range(triCentroidLoc.shape[0]):
|
||||
g.write('{} {}\n'.format(triCentroidLoc[n,0],triCentroidLoc[n,1]))
|
||||
for n in range(quadCentroidLocCubic.shape[0]):
|
||||
g.write('{} {}\n'.format(quadCentroidLocCubic[n,0],quadCentroidLocCubic[n,1]))
|
||||
g.close()
|
||||
|
||||
if(visMesh==True):
|
||||
gVis(glvis,outputName+'Cub.mesh')
|
||||
#raw_input()
|
||||
#'Reflecting' topology about one of its edges and append it to itself
|
||||
upperPlaneEleMat = sp.zeros([2*linEleMat.shape[0],6])
|
||||
for n in range(linEleMat.shape[0]):
|
||||
upperPlaneEleMat[n,:]=linEleMat[n,:]
|
||||
|
||||
#Create ele_mat_holder.shape[0]x2 matrix for mapping
|
||||
refEdge=boundMatTot(numEdges)[1]
|
||||
q1NumNodes=linVertMat.shape[0]
|
||||
|
||||
mapping = sp.zeros([q1NumNodes])
|
||||
counter=0
|
||||
for n in range(q1NumNodes):
|
||||
if (sp.any(refEdge == n)):
|
||||
mapping[n]=n
|
||||
else:
|
||||
mapping[n]=counter+q1NumNodes
|
||||
counter+=1
|
||||
|
||||
mapping=mapping.astype(int)
|
||||
#Implement mapping
|
||||
|
||||
counter=0
|
||||
for n in range(linEleMat.shape[0],2*linEleMat.shape[0]):
|
||||
upperPlaneEleMat[n,0]=linEleMat[counter,0]
|
||||
upperPlaneEleMat[n,1]=linEleMat[counter,1]
|
||||
upperPlaneEleMat[n,2]=mapping[linEleMat[counter,2]]
|
||||
upperPlaneEleMat[n,3]=mapping[linEleMat[counter,3]]
|
||||
upperPlaneEleMat[n,4]=mapping[linEleMat[counter,4]]
|
||||
upperPlaneEleMat[n,5]=mapping[linEleMat[counter,5]]
|
||||
counter+=1
|
||||
|
||||
upperPlaneEleMat = upperPlaneEleMat.astype(int)
|
||||
|
||||
#Reflecting boundary matrix
|
||||
origBound=boundMatTot(numEdges)[2]
|
||||
upperPlaneBoundMat=sp.zeros([2*origBound.shape[0],4])
|
||||
for n in range(origBound.shape[0]):
|
||||
upperPlaneBoundMat[n,:]=origBound[n,:]
|
||||
counter=0
|
||||
newOrigBound=origBound.copy()
|
||||
newOrigBound[:,2]=sp.flipud(origBound[:,3])
|
||||
newOrigBound[:,3]=sp.flipud(origBound[:,2])
|
||||
for n in range(newOrigBound.shape[0],upperPlaneBoundMat.shape[0]):
|
||||
upperPlaneBoundMat[n,0]=newOrigBound[counter,0]
|
||||
upperPlaneBoundMat[n,1]=newOrigBound[counter,1]
|
||||
upperPlaneBoundMat[n,2]=mapping[newOrigBound[counter,2]]
|
||||
upperPlaneBoundMat[n,3]=mapping[newOrigBound[counter,3]]
|
||||
counter+=1
|
||||
upperPlaneBoundMat=upperPlaneBoundMat.astype(int)
|
||||
|
||||
#Reflecting vertex matrix about the y-axis and appending it to itself
|
||||
upperPlaneNumNodes=q1NumNodes+(q1NumNodes-refEdge.shape[0])
|
||||
upperPlaneVertMat = sp.zeros([upperPlaneNumNodes,2])
|
||||
for n in range(linVertMat.shape[0]):
|
||||
upperPlaneVertMat[n,:]=linVertMat[n,:]
|
||||
counter=0
|
||||
for n in range(linVertMat.shape[0],upperPlaneNumNodes):
|
||||
upperPlaneVertMat[n,0]=-1.0*linVertMat[sp.where(mapping==n)[0][0],0]
|
||||
upperPlaneVertMat[n,1]=linVertMat[sp.where(mapping==n)[0][0],1]
|
||||
counter+=1
|
||||
|
||||
upperPlaneEleMat=orient(upperPlaneEleMat)
|
||||
g=open(outputName+'UpperPlaneLin.mesh','w')
|
||||
g.write('MFEM mesh v1.0\n'+'\n')
|
||||
g.write('dimension\n'+'2\n'+'\n')
|
||||
g.write('elements\n'+'{}\n'.format(upperPlaneEleMat.shape[0]))
|
||||
for n in range(upperPlaneEleMat.shape[0]):
|
||||
if upperPlaneEleMat[n,1]==2:
|
||||
g.write('{} {} {} {} {}\n'.format(upperPlaneEleMat[n,0],upperPlaneEleMat[n,1],upperPlaneEleMat[n,2],upperPlaneEleMat[n,3],upperPlaneEleMat[n,4]))
|
||||
else:
|
||||
g.write('{} {} {} {} {} {}\n'.format(upperPlaneEleMat[n,0],upperPlaneEleMat[n,1],upperPlaneEleMat[n,2],upperPlaneEleMat[n,3],upperPlaneEleMat[n,4],upperPlaneEleMat[n,5]))
|
||||
g.write('\n'+'boundary\n'+'{}\n'.format(upperPlaneBoundMat.shape[0]))
|
||||
for n in range(upperPlaneBoundMat.shape[0]):
|
||||
g.write('{} {} {} {}\n'.format(upperPlaneBoundMat[n,0],upperPlaneBoundMat[n,1],upperPlaneBoundMat[n,2],upperPlaneBoundMat[n,3]))
|
||||
g.write('\n'+'vertices\n'+'{}\n'.format(upperPlaneVertMat.shape[0])+'2\n')
|
||||
for n in range(upperPlaneVertMat.shape[0]):
|
||||
g.write('{} {}\n'.format(upperPlaneVertMat[n,0],upperPlaneVertMat[n,1]))
|
||||
g.close()
|
||||
|
||||
if(visMesh==True):
|
||||
gVis(glvis,outputName+'UpperPlaneLin.mesh')
|
||||
|
||||
#'Reflecting' topology about one of its edges and append it to itself
|
||||
wholePlaneEleMat = sp.zeros([2*upperPlaneEleMat.shape[0],6])
|
||||
for n in range(upperPlaneEleMat.shape[0]):
|
||||
wholePlaneEleMat[n,:]=upperPlaneEleMat[n,:]
|
||||
|
||||
quad1Edge=boundMatTot(numEdges)[3]
|
||||
newRefEdge=sp.zeros(2*quad1Edge.shape[0]-1)
|
||||
for n in range(quad1Edge.shape[0]):
|
||||
newRefEdge[n]=quad1Edge[n]
|
||||
counter=0
|
||||
for n in range(quad1Edge.shape[0],newRefEdge.shape[0]):
|
||||
newRefEdge[n]=mapping[quad1Edge[counter]]
|
||||
counter+=1
|
||||
newRefEdge=sp.unique(newRefEdge)
|
||||
newRefEdge=newRefEdge.astype(int)
|
||||
newTotNumNodes=upperPlaneVertMat.shape[0]
|
||||
|
||||
newMapping=sp.zeros([newTotNumNodes])
|
||||
counter=0
|
||||
for n in range(newTotNumNodes):
|
||||
if (sp.any(newRefEdge == n)):
|
||||
newMapping[n]=n
|
||||
else:
|
||||
newMapping[n]=counter+newTotNumNodes
|
||||
counter+=1
|
||||
newMapping=newMapping.astype(int)
|
||||
|
||||
counter=0
|
||||
for n in range(upperPlaneEleMat.shape[0],2*upperPlaneEleMat.shape[0]):
|
||||
wholePlaneEleMat[n,0]=upperPlaneEleMat[counter,0]
|
||||
wholePlaneEleMat[n,1]=upperPlaneEleMat[counter,1]
|
||||
wholePlaneEleMat[n,2]=newMapping[upperPlaneEleMat[counter,2]]
|
||||
wholePlaneEleMat[n,3]=newMapping[upperPlaneEleMat[counter,3]]
|
||||
wholePlaneEleMat[n,4]=newMapping[upperPlaneEleMat[counter,4]]
|
||||
wholePlaneEleMat[n,5]=newMapping[upperPlaneEleMat[counter,5]]
|
||||
counter+=1
|
||||
|
||||
wholePlaneEleMat=wholePlaneEleMat.astype(int)
|
||||
|
||||
#Reflecting boundary matrix
|
||||
newOrigBoundQuad1=boundMatTot(numEdges)[4]
|
||||
newFirstBoundMatHolder=sp.zeros([2*newOrigBoundQuad1.shape[0],4])
|
||||
for n in range(newOrigBoundQuad1.shape[0]):
|
||||
newFirstBoundMatHolder[n,:]=newOrigBoundQuad1[n,:]
|
||||
|
||||
newNewOrigBoundQuad1=newOrigBoundQuad1.copy()
|
||||
newNewOrigBoundQuad1[:,2]=sp.flipud(newOrigBoundQuad1[:,3])
|
||||
newNewOrigBoundQuad1[:,3]=sp.flipud(newOrigBoundQuad1[:,2])
|
||||
counter=0
|
||||
for n in range(newOrigBoundQuad1.shape[0],newFirstBoundMatHolder.shape[0]):
|
||||
newFirstBoundMatHolder[n,0]=newNewOrigBoundQuad1[counter,0]
|
||||
newFirstBoundMatHolder[n,1]=newNewOrigBoundQuad1[counter,1]
|
||||
newFirstBoundMatHolder[n,2]=mapping[newNewOrigBoundQuad1[counter,2]]
|
||||
newFirstBoundMatHolder[n,3]=mapping[newNewOrigBoundQuad1[counter,3]]
|
||||
counter+=1
|
||||
|
||||
upperQuadMat=newFirstBoundMatHolder.copy()
|
||||
wholePlaneBoundMat=sp.zeros([2*upperQuadMat.shape[0],4])
|
||||
for n in range(upperQuadMat.shape[0]):
|
||||
wholePlaneBoundMat[n,:]=upperQuadMat[n,:]
|
||||
|
||||
counter=0
|
||||
newNewOrigBound=upperQuadMat.copy()
|
||||
newNewOrigBound[:,2]=sp.flipud(upperQuadMat[:,3])
|
||||
newNewOrigBound[:,3]=sp.flipud(upperQuadMat[:,2])
|
||||
newNewOrigBound=newNewOrigBound.astype(int)
|
||||
for n in range(newNewOrigBound.shape[0],wholePlaneBoundMat.shape[0]):
|
||||
wholePlaneBoundMat[n,0]=newNewOrigBound[counter,0]
|
||||
wholePlaneBoundMat[n,1]=newNewOrigBound[counter,1]
|
||||
wholePlaneBoundMat[n,2]=newMapping[newNewOrigBound[counter,2]]
|
||||
wholePlaneBoundMat[n,3]=newMapping[newNewOrigBound[counter,3]]
|
||||
counter+=1
|
||||
wholePlaneBoundMat=wholePlaneBoundMat.astype(int)
|
||||
|
||||
wholePlaneNumNodes=newTotNumNodes+(newTotNumNodes-newRefEdge.shape[0])
|
||||
wholePlaneVertMat = sp.zeros([wholePlaneNumNodes,2])
|
||||
for n in range(upperPlaneVertMat.shape[0]):
|
||||
wholePlaneVertMat[n,:]=upperPlaneVertMat[n,:]
|
||||
counter=0
|
||||
for n in range(upperPlaneVertMat.shape[0],wholePlaneNumNodes):
|
||||
wholePlaneVertMat[n,0]=upperPlaneVertMat[sp.where(newMapping==n)[0][0],0]
|
||||
wholePlaneVertMat[n,1]=-1.0*upperPlaneVertMat[sp.where(newMapping==n)[0][0],1]
|
||||
counter+=1
|
||||
|
||||
g=open(outputName+'WholePlaneLin.mesh','w')
|
||||
g.write('MFEM mesh v1.0\n'+'\n')
|
||||
g.write('dimension\n'+'2\n'+'\n')
|
||||
g.write('elements\n'+'{}\n'.format(wholePlaneEleMat.shape[0]))
|
||||
for n in range(wholePlaneEleMat.shape[0]):
|
||||
if wholePlaneEleMat[n,1]==2:
|
||||
g.write('{} {} {} {} {}\n'.format(wholePlaneEleMat[n,0],wholePlaneEleMat[n,1],wholePlaneEleMat[n,2],wholePlaneEleMat[n,3],wholePlaneEleMat[n,4]))
|
||||
else:
|
||||
g.write('{} {} {} {} {} {}\n'.format(wholePlaneEleMat[n,0],wholePlaneEleMat[n,1],wholePlaneEleMat[n,2],wholePlaneEleMat[n,3],wholePlaneEleMat[n,4],wholePlaneEleMat[n,5]))
|
||||
g.write('\n'+'boundary\n'+'{}\n'.format(wholePlaneBoundMat.shape[0]))
|
||||
for n in range(wholePlaneBoundMat.shape[0]):
|
||||
g.write('{} {} {} {}\n'.format(wholePlaneBoundMat[n,0],wholePlaneBoundMat[n,1],wholePlaneBoundMat[n,2],wholePlaneBoundMat[n,3]))
|
||||
g.write('\n'+'vertices\n'+'{}\n'.format(wholePlaneVertMat.shape[0])+'2\n')
|
||||
for n in range(wholePlaneVertMat.shape[0]):
|
||||
g.write('{} {}\n'.format(wholePlaneVertMat[n,0],wholePlaneVertMat[n,1]))
|
||||
g.close()
|
||||
|
||||
if(visMesh==True):
|
||||
gVis(glvis,outputName+'WholePlaneLin.mesh')
|
||||
|
||||
#1.)Create Edge list from elements
|
||||
wholePlaneEleMat=orient(wholePlaneEleMat)
|
||||
triCounter=0;quadCounter=0;
|
||||
for n in range(wholePlaneEleMat.shape[0]):
|
||||
if wholePlaneEleMat[n,1]==2:
|
||||
triCounter+=1
|
||||
else:
|
||||
quadCounter+=1
|
||||
edgeMat=sp.zeros([3*triCounter+4*quadCounter,2])
|
||||
counter=0
|
||||
for n in range(wholePlaneEleMat.shape[0]):
|
||||
if wholePlaneEleMat[n,1]==2:
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,2],wholePlaneEleMat[n,3]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,3],wholePlaneEleMat[n,4]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,4],wholePlaneEleMat[n,2]]
|
||||
counter+=1
|
||||
else:
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,2],wholePlaneEleMat[n,3]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,3],wholePlaneEleMat[n,4]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,4],wholePlaneEleMat[n,5]]
|
||||
counter+=1
|
||||
edgeMat[counter,:]=[wholePlaneEleMat[n,5],wholePlaneEleMat[n,2]]
|
||||
counter+=1
|
||||
|
||||
#Remove duplicates
|
||||
holder=[]
|
||||
for n in range(edgeMat.shape[0]):
|
||||
counter=0
|
||||
for m in range(edgeMat.shape[0]):
|
||||
if edgeMat[n,0]==edgeMat[m,0] and edgeMat[n,1]==edgeMat[m,1] and m!=n:
|
||||
holder.append([n,m])
|
||||
elif edgeMat[n,1]==edgeMat[m,0] and edgeMat[n,0]==edgeMat[m,1] and m!=n:
|
||||
holder.append([n,m])
|
||||
removeIndices=sp.zeros(len(holder))
|
||||
for n in range(len(holder)):
|
||||
if holder[n][0]>holder[n][1]:
|
||||
removeIndices[n]=holder[n][0]
|
||||
else:
|
||||
removeIndices[n]=holder[n][1]
|
||||
removeIndices=sp.unique(removeIndices).astype(int)
|
||||
edgeMat=sp.delete(edgeMat,removeIndices,0)
|
||||
edgeMat=edgeMat.astype(int)
|
||||
|
||||
edgeDofMat=sp.zeros([edgeMat.shape[0],2])
|
||||
|
||||
wholePlaneVertMatRound=sp.round_(wholePlaneVertMat,5)
|
||||
|
||||
counter=0
|
||||
for n in edgeMat:
|
||||
if wholePlaneVertMatRound[n[0],1] == wholePlaneVertMatRound[n[1],1]:
|
||||
xmid=(wholePlaneVertMatRound[n[0],0]+wholePlaneVertMatRound[n[1],0])/2.0
|
||||
ymid=wholePlaneVertMatRound[n[0],1]
|
||||
edgeDofMat[counter,:]=[xmid,ymid]
|
||||
elif wholePlaneVertMatRound[n[0],0] == wholePlaneVertMatRound[n[1],0]:
|
||||
xmid=wholePlaneVertMatRound[n[0],0]
|
||||
ymid=(wholePlaneVertMatRound[n[0],1]+wholePlaneVertMatRound[n[1],1])/2.0
|
||||
edgeDofMat[counter,:]=[xmid,ymid]
|
||||
else:
|
||||
r0=sp.sqrt(wholePlaneVertMatRound[n[0],0]**2+wholePlaneVertMatRound[n[0],1]**2)
|
||||
r1=sp.sqrt(wholePlaneVertMatRound[n[1],0]**2+wholePlaneVertMatRound[n[1],1]**2)
|
||||
rmid = (r0+r1)/2.0 #should not be needed
|
||||
xmidOld=(wholePlaneVertMatRound[n[0],0]+wholePlaneVertMatRound[n[1],0])/2.0
|
||||
ymidOld=(wholePlaneVertMatRound[n[0],1]+wholePlaneVertMatRound[n[1],1])/2.0
|
||||
midtheta=sp.arctan2(ymidOld,xmidOld)
|
||||
xmid=rmid*sp.cos(midtheta)
|
||||
ymid=rmid*sp.sin(midtheta)
|
||||
edgeDofMat[counter,:]=[xmid,ymid]
|
||||
counter+=1
|
||||
edgeDofMat = sp.round_(edgeDofMat,5)
|
||||
|
||||
#2.)Create correct dof locations
|
||||
#Determine midpoints of all quads:
|
||||
quadCentroidLoc=sp.zeros([quadCounter,2])
|
||||
counter=0
|
||||
for n in range(wholePlaneEleMat.shape[0]):
|
||||
if wholePlaneEleMat[n,1]==3:
|
||||
quadCentroidLoc[counter,0]=(wholePlaneVertMatRound[wholePlaneEleMat[n,2],0]+wholePlaneVertMatRound[wholePlaneEleMat[n,3],0]+wholePlaneVertMatRound[wholePlaneEleMat[n,4],0]+wholePlaneVertMatRound[wholePlaneEleMat[n,5],0])/4.0
|
||||
quadCentroidLoc[counter,1]=(wholePlaneVertMatRound[wholePlaneEleMat[n,2],1]+wholePlaneVertMatRound[wholePlaneEleMat[n,3],1]+wholePlaneVertMatRound[wholePlaneEleMat[n,4],1]+wholePlaneVertMatRound[wholePlaneEleMat[n,5],1])/4.0
|
||||
counter+=1
|
||||
|
||||
quadCentroidLoc = sp.round_(quadCentroidLoc,5)
|
||||
|
||||
#3.)Populate nodes section
|
||||
g=open(outputName+'WholePlaneQuad.mesh','w')
|
||||
g.write('MFEM mesh v1.0\n'+'\n')
|
||||
g.write('dimension\n'+'2\n'+'\n')
|
||||
g.write('elements\n'+'{}\n'.format(wholePlaneEleMat.shape[0]))
|
||||
for n in range(wholePlaneEleMat.shape[0]):
|
||||
if wholePlaneEleMat[n,1]==2:
|
||||
g.write('{} {} {} {} {}\n'.format(wholePlaneEleMat[n,0],wholePlaneEleMat[n,1],wholePlaneEleMat[n,2],wholePlaneEleMat[n,3],wholePlaneEleMat[n,4]))
|
||||
else:
|
||||
g.write('{} {} {} {} {} {}\n'.format(wholePlaneEleMat[n,0],wholePlaneEleMat[n,1],wholePlaneEleMat[n,2],wholePlaneEleMat[n,3],wholePlaneEleMat[n,4],wholePlaneEleMat[n,5]))
|
||||
g.write('\n'+'boundary\n'+'{}\n'.format(wholePlaneBoundMat.shape[0]))
|
||||
for n in range(wholePlaneBoundMat.shape[0]):
|
||||
g.write('{} {} {} {}\n'.format(wholePlaneBoundMat[n,0],wholePlaneBoundMat[n,1],wholePlaneBoundMat[n,2],wholePlaneBoundMat[n,3]))
|
||||
g.write('\n'+'vertices\n'+'{}\n'.format(wholePlaneVertMat.shape[0]))
|
||||
g.write('\n'+'nodes'+'\n'+'FiniteElementSpace'+'\n'+'FiniteElementCollection: H1_2D_P2'+'\n'+'VDim: 2'+'\n'+'Ordering: 1' +'\n\n')
|
||||
for n in range(wholePlaneVertMatRound.shape[0]):
|
||||
g.write('{} {}\n'.format(wholePlaneVertMatRound[n,0],wholePlaneVertMatRound[n,1]))
|
||||
for n in range(edgeDofMat.shape[0]):
|
||||
g.write('{} {}\n'.format(edgeDofMat[n,0],edgeDofMat[n,1]))
|
||||
for n in range(quadCentroidLoc.shape[0]):
|
||||
g.write('{} {}\n'.format(quadCentroidLoc[n,0],quadCentroidLoc[n,1]))
|
||||
g.close()
|
||||
|
||||
if(visMesh==True):
|
||||
gVis(glvis,outputName+'WholePlaneQuad.mesh')
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,264 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
128
|
||||
1 2 0 1 2
|
||||
1 2 1 2 4
|
||||
1 2 1 3 4
|
||||
1 2 2 4 5
|
||||
1 2 3 4 7
|
||||
1 2 3 6 7
|
||||
1 2 4 5 8
|
||||
1 2 4 7 8
|
||||
1 2 5 8 9
|
||||
1 2 6 7 11
|
||||
1 2 6 10 11
|
||||
1 2 7 8 12
|
||||
1 2 7 11 12
|
||||
1 2 8 9 13
|
||||
1 2 8 12 13
|
||||
1 2 9 13 14
|
||||
2 3 10 15 16 11
|
||||
2 3 11 16 17 12
|
||||
2 3 12 17 18 13
|
||||
2 3 13 18 19 14
|
||||
2 3 15 20 21 16
|
||||
2 3 16 21 22 17
|
||||
2 3 17 22 23 18
|
||||
2 3 18 23 24 19
|
||||
2 3 20 25 26 21
|
||||
2 3 21 26 27 22
|
||||
2 3 22 27 28 23
|
||||
2 3 23 28 29 24
|
||||
2 3 25 30 31 26
|
||||
2 3 26 31 32 27
|
||||
2 3 27 32 33 28
|
||||
2 3 28 33 34 29
|
||||
1 2 0 35 2
|
||||
1 2 35 2 37
|
||||
1 2 35 36 37
|
||||
1 2 2 37 5
|
||||
1 2 36 37 39
|
||||
1 2 36 38 39
|
||||
1 2 37 5 40
|
||||
1 2 37 39 40
|
||||
1 2 5 40 9
|
||||
1 2 38 39 42
|
||||
1 2 38 41 42
|
||||
1 2 39 40 43
|
||||
1 2 39 42 43
|
||||
1 2 40 9 44
|
||||
1 2 40 43 44
|
||||
1 2 9 44 14
|
||||
2 3 41 45 46 42
|
||||
2 3 42 46 47 43
|
||||
2 3 43 47 48 44
|
||||
2 3 44 48 19 14
|
||||
2 3 45 49 50 46
|
||||
2 3 46 50 51 47
|
||||
2 3 47 51 52 48
|
||||
2 3 48 52 24 19
|
||||
2 3 49 53 54 50
|
||||
2 3 50 54 55 51
|
||||
2 3 51 55 56 52
|
||||
2 3 52 56 29 24
|
||||
2 3 53 57 58 54
|
||||
2 3 54 58 59 55
|
||||
2 3 55 59 60 56
|
||||
2 3 56 60 34 29
|
||||
1 2 0 1 61
|
||||
1 2 1 61 62
|
||||
1 2 1 3 62
|
||||
1 2 61 62 63
|
||||
1 2 3 62 64
|
||||
1 2 3 6 64
|
||||
1 2 62 63 65
|
||||
1 2 62 64 65
|
||||
1 2 63 65 66
|
||||
1 2 6 64 67
|
||||
1 2 6 10 67
|
||||
1 2 64 65 68
|
||||
1 2 64 67 68
|
||||
1 2 65 66 69
|
||||
1 2 65 68 69
|
||||
1 2 66 69 70
|
||||
2 3 10 15 71 67
|
||||
2 3 67 71 72 68
|
||||
2 3 68 72 73 69
|
||||
2 3 69 73 74 70
|
||||
2 3 15 20 75 71
|
||||
2 3 71 75 76 72
|
||||
2 3 72 76 77 73
|
||||
2 3 73 77 78 74
|
||||
2 3 20 25 79 75
|
||||
2 3 75 79 80 76
|
||||
2 3 76 80 81 77
|
||||
2 3 77 81 82 78
|
||||
2 3 25 30 83 79
|
||||
2 3 79 83 84 80
|
||||
2 3 80 84 85 81
|
||||
2 3 81 85 86 82
|
||||
1 2 0 35 61
|
||||
1 2 35 61 87
|
||||
1 2 35 36 87
|
||||
1 2 61 87 63
|
||||
1 2 36 87 88
|
||||
1 2 36 38 88
|
||||
1 2 87 63 89
|
||||
1 2 87 88 89
|
||||
1 2 63 89 66
|
||||
1 2 38 88 90
|
||||
1 2 38 41 90
|
||||
1 2 88 89 91
|
||||
1 2 88 90 91
|
||||
1 2 89 66 92
|
||||
1 2 89 91 92
|
||||
1 2 66 92 70
|
||||
2 3 41 45 93 90
|
||||
2 3 90 93 94 91
|
||||
2 3 91 94 95 92
|
||||
2 3 92 95 74 70
|
||||
2 3 45 49 96 93
|
||||
2 3 93 96 97 94
|
||||
2 3 94 97 98 95
|
||||
2 3 95 98 78 74
|
||||
2 3 49 53 99 96
|
||||
2 3 96 99 100 97
|
||||
2 3 97 100 101 98
|
||||
2 3 98 101 82 78
|
||||
2 3 53 102 103 99
|
||||
2 3 99 103 104 100
|
||||
2 3 100 104 105 101
|
||||
2 3 101 105 86 82
|
||||
|
||||
boundary
|
||||
16
|
||||
1 1 30 31
|
||||
1 1 31 32
|
||||
1 1 32 33
|
||||
1 1 33 34
|
||||
1 1 34 60
|
||||
1 1 60 59
|
||||
1 1 59 58
|
||||
1 1 58 57
|
||||
1 1 102 103
|
||||
1 1 103 104
|
||||
1 1 104 105
|
||||
1 1 105 86
|
||||
1 1 86 85
|
||||
1 1 85 84
|
||||
1 1 84 83
|
||||
1 1 83 30
|
||||
|
||||
vertices
|
||||
106
|
||||
2
|
||||
0.0 0.0
|
||||
0.125 0.0
|
||||
7.65404249467e-18 0.125
|
||||
0.25 0.0
|
||||
0.176776695297 0.176776695297
|
||||
1.53080849893e-17 0.25
|
||||
0.375 0.0
|
||||
0.324759526419 0.1875
|
||||
0.1875 0.324759526419
|
||||
2.2962127484e-17 0.375
|
||||
0.5 0.0
|
||||
0.461939766256 0.191341716183
|
||||
0.353553390593 0.353553390593
|
||||
0.191341716183 0.461939766256
|
||||
3.06161699787e-17 0.5
|
||||
0.625 0.0
|
||||
0.596454824692 0.268506287137
|
||||
0.515165042945 0.515165042945
|
||||
0.268506287137 0.596454824692
|
||||
2.2962127484e-17 0.625
|
||||
0.75 0.0
|
||||
0.730969883128 0.345670858091
|
||||
0.676776695297 0.676776695297
|
||||
0.345670858091 0.730969883128
|
||||
1.53080849893e-17 0.75
|
||||
0.875 0.0
|
||||
0.865484941564 0.422835429046
|
||||
0.838388347648 0.838388347648
|
||||
0.422835429046 0.865484941564
|
||||
7.65404249467e-18 0.875
|
||||
1.0 0.0
|
||||
1.0 0.5
|
||||
1.0 1.0
|
||||
0.5 1.0
|
||||
0.0 1.0
|
||||
-0.125 0.0
|
||||
-0.25 0.0
|
||||
-0.176776695297 0.176776695297
|
||||
-0.375 0.0
|
||||
-0.324759526419 0.1875
|
||||
-0.1875 0.324759526419
|
||||
-0.5 0.0
|
||||
-0.461939766256 0.191341716183
|
||||
-0.353553390593 0.353553390593
|
||||
-0.191341716183 0.461939766256
|
||||
-0.625 0.0
|
||||
-0.596454824692 0.268506287137
|
||||
-0.515165042945 0.515165042945
|
||||
-0.268506287137 0.596454824692
|
||||
-0.75 0.0
|
||||
-0.730969883128 0.345670858091
|
||||
-0.676776695297 0.676776695297
|
||||
-0.345670858091 0.730969883128
|
||||
-0.875 0.0
|
||||
-0.865484941564 0.422835429046
|
||||
-0.838388347648 0.838388347648
|
||||
-0.422835429046 0.865484941564
|
||||
-1.0 0.0
|
||||
-1.0 0.5
|
||||
-1.0 1.0
|
||||
-0.5 1.0
|
||||
7.65404249467e-18 -0.125
|
||||
0.176776695297 -0.176776695297
|
||||
1.53080849893e-17 -0.25
|
||||
0.324759526419 -0.1875
|
||||
0.1875 -0.324759526419
|
||||
2.2962127484e-17 -0.375
|
||||
0.461939766256 -0.191341716183
|
||||
0.353553390593 -0.353553390593
|
||||
0.191341716183 -0.461939766256
|
||||
3.06161699787e-17 -0.5
|
||||
0.596454824692 -0.268506287137
|
||||
0.515165042945 -0.515165042945
|
||||
0.268506287137 -0.596454824692
|
||||
2.2962127484e-17 -0.625
|
||||
0.730969883128 -0.345670858091
|
||||
0.676776695297 -0.676776695297
|
||||
0.345670858091 -0.730969883128
|
||||
1.53080849893e-17 -0.75
|
||||
0.865484941564 -0.422835429046
|
||||
0.838388347648 -0.838388347648
|
||||
0.422835429046 -0.865484941564
|
||||
7.65404249467e-18 -0.875
|
||||
1.0 -0.5
|
||||
1.0 -1.0
|
||||
0.5 -1.0
|
||||
0.0 -1.0
|
||||
-0.176776695297 -0.176776695297
|
||||
-0.324759526419 -0.1875
|
||||
-0.1875 -0.324759526419
|
||||
-0.461939766256 -0.191341716183
|
||||
-0.353553390593 -0.353553390593
|
||||
-0.191341716183 -0.461939766256
|
||||
-0.596454824692 -0.268506287137
|
||||
-0.515165042945 -0.515165042945
|
||||
-0.268506287137 -0.596454824692
|
||||
-0.730969883128 -0.345670858091
|
||||
-0.676776695297 -0.676776695297
|
||||
-0.345670858091 -0.730969883128
|
||||
-0.865484941564 -0.422835429046
|
||||
-0.838388347648 -0.838388347648
|
||||
-0.422835429046 -0.865484941564
|
||||
-1.0 -0.0
|
||||
-1.0 -0.5
|
||||
-1.0 -1.0
|
||||
-0.5 -1.0
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,72 @@
|
||||
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
|
||||
|
||||
elements
|
||||
17
|
||||
1 2 0 1 2
|
||||
1 2 0 2 3
|
||||
1 2 0 3 4
|
||||
2 3 0 4 5 6
|
||||
2 3 0 6 7 1
|
||||
1 2 7 8 1
|
||||
1 2 1 8 9
|
||||
2 3 1 9 10 2
|
||||
1 2 2 10 11
|
||||
2 3 2 11 12 3
|
||||
1 2 3 12 13
|
||||
2 3 3 13 14 4
|
||||
1 2 4 14 15
|
||||
1 2 4 15 5
|
||||
1 2 5 16 6
|
||||
1 2 6 16 17
|
||||
1 2 6 17 7
|
||||
|
||||
boundary
|
||||
12
|
||||
1 1 7 8
|
||||
1 1 8 9
|
||||
1 1 9 10
|
||||
1 1 10 11
|
||||
1 1 11 12
|
||||
1 1 12 13
|
||||
1 1 13 14
|
||||
1 1 14 15
|
||||
1 1 15 5
|
||||
1 1 5 16
|
||||
1 1 16 17
|
||||
1 1 17 7
|
||||
|
||||
vertices
|
||||
18
|
||||
2
|
||||
0 0
|
||||
1 0
|
||||
0.5 0.866025
|
||||
-0.5 0.866025
|
||||
-1 0
|
||||
-1 -1
|
||||
0 -1
|
||||
1 -1
|
||||
1.866025 -0.5
|
||||
1.866025 0.5
|
||||
1.366025 1.366025
|
||||
0.5 1.866025
|
||||
-0.5 1.866025
|
||||
-1.366025 1.366025
|
||||
-1.866025 0.5
|
||||
-1.866025 -0.5
|
||||
-0.5 -1.866025
|
||||
0.5 -1.866025
|
||||
@@ -0,0 +1,362 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
154
|
||||
2 3 0 1 2 3
|
||||
2 3 1 5 6 2
|
||||
2 3 5 8 9 6
|
||||
2 3 8 11 12 9
|
||||
2 3 11 14 15 12
|
||||
2 3 14 17 18 15
|
||||
2 3 17 20 21 18
|
||||
2 3 20 23 24 21
|
||||
2 3 23 26 27 24
|
||||
2 3 26 29 30 27
|
||||
2 3 29 32 33 30
|
||||
2 3 32 35 36 33
|
||||
2 3 35 38 39 36
|
||||
2 3 38 41 42 39
|
||||
2 3 41 44 45 42
|
||||
2 3 44 47 48 45
|
||||
2 3 47 50 51 48
|
||||
2 3 50 53 54 51
|
||||
2 3 53 56 57 54
|
||||
2 3 56 59 60 57
|
||||
2 3 59 62 63 60
|
||||
2 3 62 65 66 63
|
||||
2 3 65 68 69 66
|
||||
2 3 68 71 72 69
|
||||
2 3 71 74 75 72
|
||||
2 3 74 77 78 75
|
||||
1 2 2 3 4
|
||||
1 2 6 2 7
|
||||
1 2 9 6 10
|
||||
1 2 12 9 13
|
||||
1 2 15 12 16
|
||||
1 2 18 15 19
|
||||
1 2 21 18 22
|
||||
1 2 24 21 25
|
||||
1 2 27 24 28
|
||||
1 2 30 27 31
|
||||
1 2 33 30 34
|
||||
1 2 36 33 37
|
||||
1 2 39 36 40
|
||||
1 2 42 39 43
|
||||
1 2 45 42 46
|
||||
1 2 48 45 49
|
||||
1 2 51 48 52
|
||||
1 2 54 51 55
|
||||
1 2 57 54 58
|
||||
1 2 60 57 61
|
||||
1 2 63 60 64
|
||||
1 2 66 63 67
|
||||
1 2 69 66 70
|
||||
1 2 72 69 73
|
||||
1 2 75 72 76
|
||||
1 2 78 75 79
|
||||
1 2 2 4 7
|
||||
1 2 6 7 10
|
||||
1 2 9 10 13
|
||||
1 2 12 13 16
|
||||
1 2 15 16 19
|
||||
1 2 18 19 22
|
||||
1 2 21 22 25
|
||||
1 2 24 25 28
|
||||
1 2 27 28 31
|
||||
1 2 30 31 34
|
||||
1 2 33 34 37
|
||||
1 2 36 37 40
|
||||
1 2 39 40 43
|
||||
1 2 42 43 46
|
||||
1 2 45 46 49
|
||||
1 2 48 49 52
|
||||
1 2 51 52 55
|
||||
1 2 54 55 58
|
||||
1 2 57 58 61
|
||||
1 2 60 61 64
|
||||
1 2 63 64 67
|
||||
1 2 66 67 70
|
||||
1 2 69 70 73
|
||||
1 2 72 73 76
|
||||
1 2 75 76 79
|
||||
2 3 80 81 82 83
|
||||
2 3 81 84 85 82
|
||||
2 3 84 86 87 85
|
||||
2 3 86 88 89 87
|
||||
2 3 88 90 91 89
|
||||
2 3 90 92 93 91
|
||||
2 3 92 94 95 93
|
||||
2 3 94 96 97 95
|
||||
2 3 96 98 99 97
|
||||
2 3 98 100 101 99
|
||||
2 3 100 102 103 101
|
||||
2 3 102 104 105 103
|
||||
2 3 104 106 107 105
|
||||
2 3 106 108 109 107
|
||||
2 3 108 110 111 109
|
||||
2 3 110 112 113 111
|
||||
2 3 112 114 115 113
|
||||
2 3 114 116 117 115
|
||||
2 3 116 118 119 117
|
||||
2 3 118 120 121 119
|
||||
2 3 120 122 123 121
|
||||
2 3 122 124 125 123
|
||||
2 3 124 126 127 125
|
||||
2 3 126 128 129 127
|
||||
2 3 128 130 131 129
|
||||
2 3 130 132 133 131
|
||||
1 2 82 83 4
|
||||
1 2 85 82 7
|
||||
1 2 87 85 10
|
||||
1 2 89 87 13
|
||||
1 2 91 89 16
|
||||
1 2 93 91 19
|
||||
1 2 95 93 22
|
||||
1 2 97 95 25
|
||||
1 2 99 97 28
|
||||
1 2 101 99 31
|
||||
1 2 103 101 34
|
||||
1 2 105 103 37
|
||||
1 2 107 105 40
|
||||
1 2 109 107 43
|
||||
1 2 111 109 46
|
||||
1 2 113 111 49
|
||||
1 2 115 113 52
|
||||
1 2 117 115 55
|
||||
1 2 119 117 58
|
||||
1 2 121 119 61
|
||||
1 2 123 121 64
|
||||
1 2 125 123 67
|
||||
1 2 127 125 70
|
||||
1 2 129 127 73
|
||||
1 2 131 129 76
|
||||
1 2 133 131 79
|
||||
1 2 82 4 7
|
||||
1 2 85 7 10
|
||||
1 2 87 10 13
|
||||
1 2 89 13 16
|
||||
1 2 91 16 19
|
||||
1 2 93 19 22
|
||||
1 2 95 22 25
|
||||
1 2 97 25 28
|
||||
1 2 99 28 31
|
||||
1 2 101 31 34
|
||||
1 2 103 34 37
|
||||
1 2 105 37 40
|
||||
1 2 107 40 43
|
||||
1 2 109 43 46
|
||||
1 2 111 46 49
|
||||
1 2 113 49 52
|
||||
1 2 115 52 55
|
||||
1 2 117 55 58
|
||||
1 2 119 58 61
|
||||
1 2 121 61 64
|
||||
1 2 123 64 67
|
||||
1 2 125 67 70
|
||||
1 2 127 70 73
|
||||
1 2 129 73 76
|
||||
1 2 131 76 79
|
||||
|
||||
boundary
|
||||
60
|
||||
1 1 0 1
|
||||
1 1 1 5
|
||||
1 1 5 8
|
||||
1 1 8 11
|
||||
1 1 11 14
|
||||
1 1 14 17
|
||||
1 1 17 20
|
||||
1 1 20 23
|
||||
1 1 23 26
|
||||
1 1 26 29
|
||||
1 1 29 32
|
||||
1 1 32 35
|
||||
1 1 35 38
|
||||
1 1 38 41
|
||||
1 1 41 44
|
||||
1 1 44 47
|
||||
1 1 47 50
|
||||
1 1 50 53
|
||||
1 1 53 56
|
||||
1 1 56 59
|
||||
1 1 59 62
|
||||
1 1 62 65
|
||||
1 1 65 68
|
||||
1 1 68 71
|
||||
1 1 71 74
|
||||
1 1 74 77
|
||||
1 1 77 78
|
||||
1 1 78 79
|
||||
1 1 79 133
|
||||
1 1 133 132
|
||||
1 1 132 130
|
||||
1 1 130 128
|
||||
1 1 128 126
|
||||
1 1 126 124
|
||||
1 1 124 122
|
||||
1 1 122 120
|
||||
1 1 120 118
|
||||
1 1 118 116
|
||||
1 1 116 114
|
||||
1 1 114 112
|
||||
1 1 112 110
|
||||
1 1 110 108
|
||||
1 1 108 106
|
||||
1 1 106 104
|
||||
1 1 104 102
|
||||
1 1 102 100
|
||||
1 1 100 98
|
||||
1 1 98 96
|
||||
1 1 96 94
|
||||
1 1 94 92
|
||||
1 1 92 90
|
||||
1 1 90 88
|
||||
1 1 88 86
|
||||
1 1 86 84
|
||||
1 1 84 81
|
||||
1 1 81 80
|
||||
1 1 80 83
|
||||
1 1 83 4
|
||||
1 1 4 3
|
||||
1 1 3 0
|
||||
|
||||
vertices
|
||||
134
|
||||
2
|
||||
0.0 0.0
|
||||
1.0 0.0
|
||||
1.0 1.0
|
||||
0.0 1.0
|
||||
0.5 1.86602540378
|
||||
2.0 0.0
|
||||
2.0 1.0
|
||||
1.5 1.86602540378
|
||||
3.0 0.0
|
||||
3.0 1.0
|
||||
2.5 1.86602540378
|
||||
4.0 0.0
|
||||
4.0 1.0
|
||||
3.5 1.86602540378
|
||||
5.0 0.0
|
||||
5.0 1.0
|
||||
4.5 1.86602540378
|
||||
6.0 0.0
|
||||
6.0 1.0
|
||||
5.5 1.86602540378
|
||||
7.0 0.0
|
||||
7.0 1.0
|
||||
6.5 1.86602540378
|
||||
8.0 0.0
|
||||
8.0 1.0
|
||||
7.5 1.86602540378
|
||||
9.0 0.0
|
||||
9.0 1.0
|
||||
8.5 1.86602540378
|
||||
10.0 0.0
|
||||
10.0 1.0
|
||||
9.5 1.86602540378
|
||||
11.0 0.0
|
||||
11.0 1.0
|
||||
10.5 1.86602540378
|
||||
12.0 0.0
|
||||
12.0 1.0
|
||||
11.5 1.86602540378
|
||||
13.0 0.0
|
||||
13.0 1.0
|
||||
12.5 1.86602540378
|
||||
14.0 0.0
|
||||
14.0 1.0
|
||||
13.5 1.86602540378
|
||||
15.0 0.0
|
||||
15.0 1.0
|
||||
14.5 1.86602540378
|
||||
16.0 0.0
|
||||
16.0 1.0
|
||||
15.5 1.86602540378
|
||||
17.0 0.0
|
||||
17.0 1.0
|
||||
16.5 1.86602540378
|
||||
18.0 0.0
|
||||
18.0 1.0
|
||||
17.5 1.86602540378
|
||||
19.0 0.0
|
||||
19.0 1.0
|
||||
18.5 1.86602540378
|
||||
20.0 0.0
|
||||
20.0 1.0
|
||||
19.5 1.86602540378
|
||||
21.0 0.0
|
||||
21.0 1.0
|
||||
20.5 1.86602540378
|
||||
22.0 0.0
|
||||
22.0 1.0
|
||||
21.5 1.86602540378
|
||||
23.0 0.0
|
||||
23.0 1.0
|
||||
22.5 1.86602540378
|
||||
24.0 0.0
|
||||
24.0 1.0
|
||||
23.5 1.86602540378
|
||||
25.0 0.0
|
||||
25.0 1.0
|
||||
24.5 1.86602540378
|
||||
26.0 0.0
|
||||
26.0 1.0
|
||||
25.5 1.86602540378
|
||||
0.0 3.73205080757
|
||||
1.0 3.73205080757
|
||||
1.0 2.73205080757
|
||||
0.0 2.73205080757
|
||||
2.0 3.73205080757
|
||||
2.0 2.73205080757
|
||||
3.0 3.73205080757
|
||||
3.0 2.73205080757
|
||||
4.0 3.73205080757
|
||||
4.0 2.73205080757
|
||||
5.0 3.73205080757
|
||||
5.0 2.73205080757
|
||||
6.0 3.73205080757
|
||||
6.0 2.73205080757
|
||||
7.0 3.73205080757
|
||||
7.0 2.73205080757
|
||||
8.0 3.73205080757
|
||||
8.0 2.73205080757
|
||||
9.0 3.73205080757
|
||||
9.0 2.73205080757
|
||||
10.0 3.73205080757
|
||||
10.0 2.73205080757
|
||||
11.0 3.73205080757
|
||||
11.0 2.73205080757
|
||||
12.0 3.73205080757
|
||||
12.0 2.73205080757
|
||||
13.0 3.73205080757
|
||||
13.0 2.73205080757
|
||||
14.0 3.73205080757
|
||||
14.0 2.73205080757
|
||||
15.0 3.73205080757
|
||||
15.0 2.73205080757
|
||||
16.0 3.73205080757
|
||||
16.0 2.73205080757
|
||||
17.0 3.73205080757
|
||||
17.0 2.73205080757
|
||||
18.0 3.73205080757
|
||||
18.0 2.73205080757
|
||||
19.0 3.73205080757
|
||||
19.0 2.73205080757
|
||||
20.0 3.73205080757
|
||||
20.0 2.73205080757
|
||||
21.0 3.73205080757
|
||||
21.0 2.73205080757
|
||||
22.0 3.73205080757
|
||||
22.0 2.73205080757
|
||||
23.0 3.73205080757
|
||||
23.0 2.73205080757
|
||||
24.0 3.73205080757
|
||||
24.0 2.73205080757
|
||||
25.0 3.73205080757
|
||||
25.0 2.73205080757
|
||||
26.0 3.73205080757
|
||||
26.0 2.73205080757
|
||||
@@ -0,0 +1,66 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
17
|
||||
2 3 0 1 2 3
|
||||
2 3 1 5 6 2
|
||||
2 3 5 8 9 6
|
||||
2 3 8 11 12 9
|
||||
2 3 11 14 15 12
|
||||
2 3 14 17 18 15
|
||||
1 2 2 3 4
|
||||
1 2 6 2 7
|
||||
1 2 9 6 10
|
||||
1 2 12 9 13
|
||||
1 2 15 12 16
|
||||
1 2 18 15 19
|
||||
1 2 2 4 7
|
||||
1 2 6 7 10
|
||||
1 2 9 10 13
|
||||
1 2 12 13 16
|
||||
1 2 15 16 19
|
||||
|
||||
boundary
|
||||
15
|
||||
1 1 0 1
|
||||
1 1 1 5
|
||||
1 1 5 8
|
||||
1 1 8 11
|
||||
1 1 11 14
|
||||
1 1 14 17
|
||||
1 1 17 18
|
||||
1 1 18 19
|
||||
1 1 19 16
|
||||
1 1 16 13
|
||||
1 1 13 10
|
||||
1 1 10 7
|
||||
1 1 7 4
|
||||
1 1 4 3
|
||||
1 1 3 0
|
||||
|
||||
vertices
|
||||
20
|
||||
2
|
||||
0.0 0.0
|
||||
1.0 0.0
|
||||
1.0 1.0
|
||||
0.0 1.0
|
||||
0.5 1.86602540378
|
||||
2.0 0.0
|
||||
2.0 1.0
|
||||
1.5 1.86602540378
|
||||
3.0 0.0
|
||||
3.0 1.0
|
||||
2.5 1.86602540378
|
||||
4.0 0.0
|
||||
4.0 1.0
|
||||
3.5 1.86602540378
|
||||
5.0 0.0
|
||||
5.0 1.0
|
||||
4.5 1.86602540378
|
||||
6.0 0.0
|
||||
6.0 1.0
|
||||
5.5 1.86602540378
|
||||
@@ -0,0 +1,45 @@
|
||||
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
|
||||
|
||||
elements
|
||||
5
|
||||
1 2 0 1 2
|
||||
1 2 0 2 3
|
||||
1 2 0 3 4
|
||||
2 3 0 4 5 6
|
||||
2 3 0 6 7 1
|
||||
|
||||
boundary
|
||||
7
|
||||
1 1 1 2
|
||||
1 1 2 3
|
||||
1 1 3 4
|
||||
1 1 4 5
|
||||
1 1 5 6
|
||||
1 1 6 7
|
||||
1 1 7 1
|
||||
|
||||
vertices
|
||||
8
|
||||
2
|
||||
0 0
|
||||
1 0
|
||||
0.5 0.866025
|
||||
-0.5 0.866025
|
||||
-1 0
|
||||
-1 -1
|
||||
0 -1
|
||||
1 -1
|
||||
@@ -0,0 +1,45 @@
|
||||
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
|
||||
|
||||
elements
|
||||
5
|
||||
1 2 0 1 2
|
||||
1 2 0 2 3
|
||||
1 2 0 5 6
|
||||
2 3 0 3 4 5
|
||||
2 3 0 6 7 1
|
||||
|
||||
boundary
|
||||
7
|
||||
1 1 1 2
|
||||
1 1 2 3
|
||||
1 1 3 4
|
||||
1 1 4 5
|
||||
1 1 5 6
|
||||
1 1 6 7
|
||||
1 1 7 1
|
||||
|
||||
vertices
|
||||
8
|
||||
2
|
||||
0 0
|
||||
0.866025 0.5
|
||||
0 1
|
||||
-0.866025 0.5
|
||||
-1.366025 -0.36602500
|
||||
-0.5 -0.866025
|
||||
0.5 -0.866025
|
||||
1.366025 -0.36602500
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,57 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
16
|
||||
1 2 0 1 2
|
||||
1 2 1 2 4
|
||||
1 2 1 3 4
|
||||
1 2 2 4 5
|
||||
1 2 3 4 7
|
||||
1 2 3 6 7
|
||||
1 2 4 5 8
|
||||
1 2 4 7 8
|
||||
1 2 5 8 9
|
||||
1 2 6 7 11
|
||||
1 2 6 10 11
|
||||
1 2 7 8 12
|
||||
1 2 7 11 12
|
||||
1 2 8 9 13
|
||||
1 2 8 12 13
|
||||
1 2 9 13 14
|
||||
|
||||
boundary
|
||||
12
|
||||
1 1 0 1
|
||||
1 1 1 3
|
||||
1 1 3 6
|
||||
1 1 6 10
|
||||
1 1 10 11
|
||||
1 1 11 12
|
||||
1 1 12 13
|
||||
1 1 13 14
|
||||
1 1 14 9
|
||||
1 1 9 5
|
||||
1 1 5 2
|
||||
1 1 2 0
|
||||
|
||||
vertices
|
||||
15
|
||||
2
|
||||
0.0 0.0
|
||||
0.25 0.0
|
||||
1.53080849893e-17 0.25
|
||||
0.5 0.0
|
||||
0.353553390593 0.353553390593
|
||||
3.06161699787e-17 0.5
|
||||
0.75 0.0
|
||||
0.649519052838 0.375
|
||||
0.375 0.649519052838
|
||||
4.5924254968e-17 0.75
|
||||
1.0 0.0
|
||||
0.923879532511 0.382683432365
|
||||
0.707106781187 0.707106781187
|
||||
0.382683432365 0.923879532511
|
||||
6.12323399574e-17 1.0
|
||||
@@ -0,0 +1,147 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
64
|
||||
1 2 0 1 2
|
||||
1 2 1 2 4
|
||||
1 2 1 3 4
|
||||
1 2 2 4 5
|
||||
1 2 3 4 7
|
||||
1 2 3 6 7
|
||||
1 2 4 5 8
|
||||
1 2 4 7 8
|
||||
1 2 5 8 9
|
||||
1 2 6 7 11
|
||||
1 2 6 10 11
|
||||
1 2 7 8 12
|
||||
1 2 7 11 12
|
||||
1 2 8 9 13
|
||||
1 2 8 12 13
|
||||
1 2 9 13 14
|
||||
1 2 10 11 16
|
||||
1 2 10 15 16
|
||||
1 2 11 12 17
|
||||
1 2 11 16 17
|
||||
1 2 12 13 18
|
||||
1 2 12 17 18
|
||||
1 2 13 14 19
|
||||
1 2 13 18 19
|
||||
1 2 14 19 20
|
||||
1 2 15 16 22
|
||||
1 2 15 21 22
|
||||
1 2 16 17 23
|
||||
1 2 16 22 23
|
||||
1 2 17 18 24
|
||||
1 2 17 23 24
|
||||
1 2 18 19 25
|
||||
1 2 18 24 25
|
||||
1 2 19 20 26
|
||||
1 2 19 25 26
|
||||
1 2 20 26 27
|
||||
1 2 21 22 29
|
||||
1 2 21 28 29
|
||||
1 2 22 23 30
|
||||
1 2 22 29 30
|
||||
1 2 23 24 31
|
||||
1 2 23 30 31
|
||||
1 2 24 25 32
|
||||
1 2 24 31 32
|
||||
1 2 25 26 33
|
||||
1 2 25 32 33
|
||||
1 2 26 27 34
|
||||
1 2 26 33 34
|
||||
1 2 27 34 35
|
||||
1 2 28 29 37
|
||||
1 2 28 36 37
|
||||
1 2 29 30 38
|
||||
1 2 29 37 38
|
||||
1 2 30 31 39
|
||||
1 2 30 38 39
|
||||
1 2 31 32 40
|
||||
1 2 31 39 40
|
||||
1 2 32 33 41
|
||||
1 2 32 40 41
|
||||
1 2 33 34 42
|
||||
1 2 33 41 42
|
||||
1 2 34 35 43
|
||||
1 2 34 42 43
|
||||
1 2 35 43 44
|
||||
|
||||
boundary
|
||||
24
|
||||
1 1 0 1
|
||||
1 1 1 3
|
||||
1 1 3 6
|
||||
1 1 6 10
|
||||
1 1 10 15
|
||||
1 1 15 21
|
||||
1 1 21 28
|
||||
1 1 28 36
|
||||
1 1 36 37
|
||||
1 1 37 38
|
||||
1 1 38 39
|
||||
1 1 39 40
|
||||
1 1 40 41
|
||||
1 1 41 42
|
||||
1 1 42 43
|
||||
1 1 43 44
|
||||
1 1 44 35
|
||||
1 1 35 27
|
||||
1 1 27 20
|
||||
1 1 20 14
|
||||
1 1 14 9
|
||||
1 1 9 5
|
||||
1 1 5 2
|
||||
1 1 2 0
|
||||
|
||||
vertices
|
||||
45
|
||||
2
|
||||
0.0 0.0
|
||||
0.125 0.0
|
||||
7.65404249467e-18 0.125
|
||||
0.25 0.0
|
||||
0.176776695297 0.176776695297
|
||||
1.53080849893e-17 0.25
|
||||
0.375 0.0
|
||||
0.324759526419 0.1875
|
||||
0.1875 0.324759526419
|
||||
2.2962127484e-17 0.375
|
||||
0.5 0.0
|
||||
0.461939766256 0.191341716183
|
||||
0.353553390593 0.353553390593
|
||||
0.191341716183 0.461939766256
|
||||
3.06161699787e-17 0.5
|
||||
0.625 0.0
|
||||
0.594410322684 0.193135621484
|
||||
0.505635621484 0.367365782683
|
||||
0.367365782683 0.505635621484
|
||||
0.193135621484 0.594410322684
|
||||
3.82702124734e-17 0.625
|
||||
0.75 0.0
|
||||
0.724444369717 0.194114283827
|
||||
0.649519052838 0.375
|
||||
0.53033008589 0.53033008589
|
||||
0.375 0.649519052838
|
||||
0.194114283827 0.724444369717
|
||||
4.5924254968e-17 0.75
|
||||
0.875 0.0
|
||||
0.853061923159 0.194705817212
|
||||
0.788347759415 0.379648271728
|
||||
0.68410254716 0.545553576626
|
||||
0.545553576626 0.68410254716
|
||||
0.379648271728 0.788347759415
|
||||
0.194705817212 0.853061923159
|
||||
5.35782974627e-17 0.875
|
||||
1.0 0.0
|
||||
0.980785280403 0.195090322016
|
||||
0.923879532511 0.382683432365
|
||||
0.831469612303 0.55557023302
|
||||
0.707106781187 0.707106781187
|
||||
0.55557023302 0.831469612303
|
||||
0.382683432365 0.923879532511
|
||||
0.195090322016 0.980785280403
|
||||
6.12323399574e-17 1.0
|
||||
@@ -0,0 +1,73 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
8
|
||||
1 2 0 1 2
|
||||
1 2 1 4 2
|
||||
1 2 1 3 4
|
||||
1 2 4 5 2
|
||||
2 3 3 6 7 4
|
||||
2 3 8 5 4 7
|
||||
2 3 6 9 10 7
|
||||
2 3 11 8 7 10
|
||||
|
||||
boundary
|
||||
10
|
||||
1 1 0 1
|
||||
1 1 1 3
|
||||
1 1 3 6
|
||||
1 1 6 9
|
||||
1 1 9 10
|
||||
1 1 10 11
|
||||
1 1 11 8
|
||||
1 1 8 5
|
||||
1 1 5 2
|
||||
1 1 2 0
|
||||
|
||||
vertices
|
||||
12
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: Quadratic
|
||||
VDim: 2
|
||||
Ordering: 1
|
||||
|
||||
0.0 0.0
|
||||
0.5 0.0
|
||||
0.0 0.5
|
||||
1.0 0.0
|
||||
0.70711 0.70711
|
||||
0.0 1.0
|
||||
1.5 0.0
|
||||
1.35355 1.35355
|
||||
0.0 1.5
|
||||
2.0 0.0
|
||||
2.0 2.0
|
||||
0.0 2.0
|
||||
0.25 0.0
|
||||
0.35355 0.35355
|
||||
0.0 0.25
|
||||
0.64714 0.37909
|
||||
0.37909 0.64714
|
||||
0.75 0.0
|
||||
0.92388 0.38269
|
||||
0.38269 0.92388
|
||||
0.0 0.75
|
||||
1.25 0.0
|
||||
1.54238 0.73161
|
||||
1.03033 1.03033
|
||||
0.0 1.25
|
||||
0.73161 1.54238
|
||||
1.75 0.0
|
||||
2.0 1.0
|
||||
1.67678 1.67678
|
||||
0.0 1.75
|
||||
1.0 2.0
|
||||
1.14017 0.51516
|
||||
0.51516 1.14017
|
||||
1.71339 0.83839
|
||||
0.83839 1.71339
|
||||
@@ -0,0 +1,567 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
128
|
||||
1 2 0 1 2
|
||||
1 2 1 4 2
|
||||
1 2 1 3 4
|
||||
1 2 2 4 5
|
||||
1 2 3 7 4
|
||||
1 2 3 6 7
|
||||
1 2 4 8 5
|
||||
1 2 4 7 8
|
||||
1 2 5 8 9
|
||||
1 2 6 11 7
|
||||
1 2 6 10 11
|
||||
1 2 7 12 8
|
||||
1 2 7 11 12
|
||||
1 2 8 13 9
|
||||
1 2 8 12 13
|
||||
1 2 9 13 14
|
||||
2 3 10 15 16 11
|
||||
2 3 11 16 17 12
|
||||
2 3 12 17 18 13
|
||||
2 3 13 18 19 14
|
||||
2 3 15 20 21 16
|
||||
2 3 16 21 22 17
|
||||
2 3 17 22 23 18
|
||||
2 3 18 23 24 19
|
||||
2 3 20 25 26 21
|
||||
2 3 21 26 27 22
|
||||
2 3 22 27 28 23
|
||||
2 3 23 28 29 24
|
||||
2 3 25 30 31 26
|
||||
2 3 26 31 32 27
|
||||
2 3 27 32 33 28
|
||||
2 3 28 33 34 29
|
||||
1 2 0 2 35
|
||||
1 2 35 2 37
|
||||
1 2 35 37 36
|
||||
1 2 2 5 37
|
||||
1 2 36 37 39
|
||||
1 2 36 39 38
|
||||
1 2 37 5 40
|
||||
1 2 37 40 39
|
||||
1 2 5 9 40
|
||||
1 2 38 39 42
|
||||
1 2 38 42 41
|
||||
1 2 39 40 43
|
||||
1 2 39 43 42
|
||||
1 2 40 9 44
|
||||
1 2 40 44 43
|
||||
1 2 9 14 44
|
||||
2 3 41 42 46 45
|
||||
2 3 42 43 47 46
|
||||
2 3 43 44 48 47
|
||||
2 3 44 14 19 48
|
||||
2 3 45 46 50 49
|
||||
2 3 46 47 51 50
|
||||
2 3 47 48 52 51
|
||||
2 3 48 19 24 52
|
||||
2 3 49 50 54 53
|
||||
2 3 50 51 55 54
|
||||
2 3 51 52 56 55
|
||||
2 3 52 24 29 56
|
||||
2 3 53 54 58 57
|
||||
2 3 54 55 59 58
|
||||
2 3 55 56 60 59
|
||||
2 3 56 29 34 60
|
||||
1 2 0 61 1
|
||||
1 2 1 61 62
|
||||
1 2 1 62 3
|
||||
1 2 61 63 62
|
||||
1 2 3 62 64
|
||||
1 2 3 64 6
|
||||
1 2 62 63 65
|
||||
1 2 62 65 64
|
||||
1 2 63 66 65
|
||||
1 2 6 64 67
|
||||
1 2 6 67 10
|
||||
1 2 64 65 68
|
||||
1 2 64 68 67
|
||||
1 2 65 66 69
|
||||
1 2 65 69 68
|
||||
1 2 66 70 69
|
||||
2 3 10 67 71 15
|
||||
2 3 67 68 72 71
|
||||
2 3 68 69 73 72
|
||||
2 3 69 70 74 73
|
||||
2 3 15 71 75 20
|
||||
2 3 71 72 76 75
|
||||
2 3 72 73 77 76
|
||||
2 3 73 74 78 77
|
||||
2 3 20 75 79 25
|
||||
2 3 75 76 80 79
|
||||
2 3 76 77 81 80
|
||||
2 3 77 78 82 81
|
||||
2 3 25 79 83 30
|
||||
2 3 79 80 84 83
|
||||
2 3 80 81 85 84
|
||||
2 3 81 82 86 85
|
||||
1 2 0 35 61
|
||||
1 2 35 87 61
|
||||
1 2 35 36 87
|
||||
1 2 61 87 63
|
||||
1 2 36 88 87
|
||||
1 2 36 38 88
|
||||
1 2 87 89 63
|
||||
1 2 87 88 89
|
||||
1 2 63 89 66
|
||||
1 2 38 90 88
|
||||
1 2 38 41 90
|
||||
1 2 88 91 89
|
||||
1 2 88 90 91
|
||||
1 2 89 92 66
|
||||
1 2 89 91 92
|
||||
1 2 66 92 70
|
||||
2 3 41 45 93 90
|
||||
2 3 90 93 94 91
|
||||
2 3 91 94 95 92
|
||||
2 3 92 95 74 70
|
||||
2 3 45 49 96 93
|
||||
2 3 93 96 97 94
|
||||
2 3 94 97 98 95
|
||||
2 3 95 98 78 74
|
||||
2 3 49 53 99 96
|
||||
2 3 96 99 100 97
|
||||
2 3 97 100 101 98
|
||||
2 3 98 101 82 78
|
||||
2 3 53 102 103 99
|
||||
2 3 99 103 104 100
|
||||
2 3 100 104 105 101
|
||||
2 3 101 105 86 82
|
||||
|
||||
boundary
|
||||
16
|
||||
1 1 30 31
|
||||
1 1 31 32
|
||||
1 1 32 33
|
||||
1 1 33 34
|
||||
1 1 34 60
|
||||
1 1 60 59
|
||||
1 1 59 58
|
||||
1 1 58 57
|
||||
1 1 102 103
|
||||
1 1 103 104
|
||||
1 1 104 105
|
||||
1 1 105 86
|
||||
1 1 86 85
|
||||
1 1 85 84
|
||||
1 1 84 83
|
||||
1 1 83 30
|
||||
|
||||
vertices
|
||||
106
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_2D_P2
|
||||
VDim: 2
|
||||
Ordering: 1
|
||||
|
||||
0.0 0.0
|
||||
0.25 0.0
|
||||
0.0 0.25
|
||||
0.5 0.0
|
||||
0.35355 0.35355
|
||||
0.0 0.5
|
||||
0.75 0.0
|
||||
0.64952 0.375
|
||||
0.375 0.64952
|
||||
0.0 0.75
|
||||
1.0 0.0
|
||||
0.92388 0.38268
|
||||
0.70711 0.70711
|
||||
0.38268 0.92388
|
||||
0.0 1.0
|
||||
1.25 0.0
|
||||
1.19291 0.53701
|
||||
1.03033 1.03033
|
||||
0.53701 1.19291
|
||||
0.0 1.25
|
||||
1.5 0.0
|
||||
1.46194 0.69134
|
||||
1.35355 1.35355
|
||||
0.69134 1.46194
|
||||
0.0 1.5
|
||||
1.75 0.0
|
||||
1.73097 0.84567
|
||||
1.67678 1.67678
|
||||
0.84567 1.73097
|
||||
0.0 1.75
|
||||
2.0 0.0
|
||||
2.0 1.0
|
||||
2.0 2.0
|
||||
1.0 2.0
|
||||
0.0 2.0
|
||||
-0.25 0.0
|
||||
-0.5 0.0
|
||||
-0.35355 0.35355
|
||||
-0.75 0.0
|
||||
-0.64952 0.375
|
||||
-0.375 0.64952
|
||||
-1.0 0.0
|
||||
-0.92388 0.38268
|
||||
-0.70711 0.70711
|
||||
-0.38268 0.92388
|
||||
-1.25 0.0
|
||||
-1.19291 0.53701
|
||||
-1.03033 1.03033
|
||||
-0.53701 1.19291
|
||||
-1.5 0.0
|
||||
-1.46194 0.69134
|
||||
-1.35355 1.35355
|
||||
-0.69134 1.46194
|
||||
-1.75 0.0
|
||||
-1.73097 0.84567
|
||||
-1.67678 1.67678
|
||||
-0.84567 1.73097
|
||||
-2.0 0.0
|
||||
-2.0 1.0
|
||||
-2.0 2.0
|
||||
-1.0 2.0
|
||||
0.0 -0.25
|
||||
0.35355 -0.35355
|
||||
0.0 -0.5
|
||||
0.64952 -0.375
|
||||
0.375 -0.64952
|
||||
0.0 -0.75
|
||||
0.92388 -0.38268
|
||||
0.70711 -0.70711
|
||||
0.38268 -0.92388
|
||||
0.0 -1.0
|
||||
1.19291 -0.53701
|
||||
1.03033 -1.03033
|
||||
0.53701 -1.19291
|
||||
0.0 -1.25
|
||||
1.46194 -0.69134
|
||||
1.35355 -1.35355
|
||||
0.69134 -1.46194
|
||||
0.0 -1.5
|
||||
1.73097 -0.84567
|
||||
1.67678 -1.67678
|
||||
0.84567 -1.73097
|
||||
0.0 -1.75
|
||||
2.0 -1.0
|
||||
2.0 -2.0
|
||||
1.0 -2.0
|
||||
0.0 -2.0
|
||||
-0.35355 -0.35355
|
||||
-0.64952 -0.375
|
||||
-0.375 -0.64952
|
||||
-0.92388 -0.38268
|
||||
-0.70711 -0.70711
|
||||
-0.38268 -0.92388
|
||||
-1.19291 -0.53701
|
||||
-1.03033 -1.03033
|
||||
-0.53701 -1.19291
|
||||
-1.46194 -0.69134
|
||||
-1.35355 -1.35355
|
||||
-0.69134 -1.46194
|
||||
-1.73097 -0.84567
|
||||
-1.67678 -1.67678
|
||||
-0.84567 -1.73097
|
||||
-2.0 -0.0
|
||||
-2.0 -1.0
|
||||
-2.0 -2.0
|
||||
-1.0 -2.0
|
||||
0.125 0.0
|
||||
0.17678 0.17678
|
||||
0.0 0.125
|
||||
0.32357 0.18954
|
||||
0.18954 0.32357
|
||||
0.375 0.0
|
||||
0.46194 0.19134
|
||||
0.19134 0.46194
|
||||
0.0 0.375
|
||||
0.59418 0.19384
|
||||
0.50569 0.36729
|
||||
0.625 0.0
|
||||
0.72444 0.19411
|
||||
0.36729 0.50569
|
||||
0.19384 0.59418
|
||||
0.53033 0.53033
|
||||
0.19411 0.72444
|
||||
0.0 0.625
|
||||
0.85299 0.19501
|
||||
0.78835 0.37964
|
||||
0.875 0.0
|
||||
0.98079 0.19509
|
||||
0.68405 0.54563
|
||||
0.54563 0.68405
|
||||
0.83147 0.55557
|
||||
0.37964 0.78835
|
||||
0.19501 0.85299
|
||||
0.55557 0.83147
|
||||
0.19509 0.98079
|
||||
0.0 0.875
|
||||
1.125 0.0
|
||||
1.24928 0.27462
|
||||
1.05851 0.4599
|
||||
1.13007 0.79668
|
||||
0.86872 0.86872
|
||||
0.79668 1.13007
|
||||
0.4599 1.05851
|
||||
0.27462 1.24928
|
||||
0.0 1.125
|
||||
1.375 0.0
|
||||
1.51779 0.35426
|
||||
1.32748 0.6142
|
||||
1.42864 1.03762
|
||||
1.19194 1.19194
|
||||
1.03762 1.42864
|
||||
0.6142 1.32748
|
||||
0.35426 1.51779
|
||||
0.0 1.375
|
||||
1.625 0.0
|
||||
1.78629 0.43396
|
||||
1.59649 0.76852
|
||||
1.72721 1.2785
|
||||
1.51516 1.51516
|
||||
1.2785 1.72721
|
||||
0.76852 1.59649
|
||||
0.43396 1.78629
|
||||
0.0 1.625
|
||||
1.875 0.0
|
||||
2.0 0.5
|
||||
1.8655 0.92284
|
||||
2.0 1.5
|
||||
1.83839 1.83839
|
||||
1.5 2.0
|
||||
0.92284 1.8655
|
||||
0.5 2.0
|
||||
0.0 1.875
|
||||
-0.17678 0.17678
|
||||
-0.125 0.0
|
||||
-0.18954 0.32357
|
||||
-0.32357 0.18954
|
||||
-0.46194 0.19134
|
||||
-0.375 0.0
|
||||
-0.19134 0.46194
|
||||
-0.50569 0.36729
|
||||
-0.59418 0.19384
|
||||
-0.72444 0.19411
|
||||
-0.625 0.0
|
||||
-0.19384 0.59418
|
||||
-0.36729 0.50569
|
||||
-0.53033 0.53033
|
||||
-0.19411 0.72444
|
||||
-0.78835 0.37964
|
||||
-0.85299 0.19501
|
||||
-0.98079 0.19509
|
||||
-0.875 0.0
|
||||
-0.54563 0.68405
|
||||
-0.68405 0.54563
|
||||
-0.83147 0.55557
|
||||
-0.19501 0.85299
|
||||
-0.37964 0.78835
|
||||
-0.55557 0.83147
|
||||
-0.19509 0.98079
|
||||
-1.05851 0.4599
|
||||
-1.24928 0.27462
|
||||
-1.125 0.0
|
||||
-0.86872 0.86872
|
||||
-1.13007 0.79668
|
||||
-0.4599 1.05851
|
||||
-0.79668 1.13007
|
||||
-0.27462 1.24928
|
||||
-1.32748 0.6142
|
||||
-1.51779 0.35426
|
||||
-1.375 0.0
|
||||
-1.19194 1.19194
|
||||
-1.42864 1.03762
|
||||
-0.6142 1.32748
|
||||
-1.03762 1.42864
|
||||
-0.35426 1.51779
|
||||
-1.59649 0.76852
|
||||
-1.78629 0.43396
|
||||
-1.625 0.0
|
||||
-1.51516 1.51516
|
||||
-1.72721 1.2785
|
||||
-0.76852 1.59649
|
||||
-1.2785 1.72721
|
||||
-0.43396 1.78629
|
||||
-1.8655 0.92284
|
||||
-2.0 0.5
|
||||
-1.875 0.0
|
||||
-1.83839 1.83839
|
||||
-2.0 1.5
|
||||
-0.92284 1.8655
|
||||
-1.5 2.0
|
||||
-0.5 2.0
|
||||
0.0 -0.125
|
||||
0.17678 -0.17678
|
||||
0.18954 -0.32357
|
||||
0.32357 -0.18954
|
||||
0.46194 -0.19134
|
||||
0.0 -0.375
|
||||
0.19134 -0.46194
|
||||
0.50569 -0.36729
|
||||
0.59418 -0.19384
|
||||
0.72444 -0.19411
|
||||
0.19384 -0.59418
|
||||
0.36729 -0.50569
|
||||
0.53033 -0.53033
|
||||
0.0 -0.625
|
||||
0.19411 -0.72444
|
||||
0.78835 -0.37964
|
||||
0.85299 -0.19501
|
||||
0.98079 -0.19509
|
||||
0.54563 -0.68405
|
||||
0.68405 -0.54563
|
||||
0.83147 -0.55557
|
||||
0.19501 -0.85299
|
||||
0.37964 -0.78835
|
||||
0.55557 -0.83147
|
||||
0.0 -0.875
|
||||
0.19509 -0.98079
|
||||
1.05851 -0.4599
|
||||
1.24928 -0.27462
|
||||
0.86872 -0.86872
|
||||
1.13007 -0.79668
|
||||
0.4599 -1.05851
|
||||
0.79668 -1.13007
|
||||
0.0 -1.125
|
||||
0.27462 -1.24928
|
||||
1.32748 -0.6142
|
||||
1.51779 -0.35426
|
||||
1.19194 -1.19194
|
||||
1.42864 -1.03762
|
||||
0.6142 -1.32748
|
||||
1.03762 -1.42864
|
||||
0.0 -1.375
|
||||
0.35426 -1.51779
|
||||
1.59649 -0.76852
|
||||
1.78629 -0.43396
|
||||
1.51516 -1.51516
|
||||
1.72721 -1.2785
|
||||
0.76852 -1.59649
|
||||
1.2785 -1.72721
|
||||
0.0 -1.625
|
||||
0.43396 -1.78629
|
||||
1.8655 -0.92284
|
||||
2.0 -0.5
|
||||
1.83839 -1.83839
|
||||
2.0 -1.5
|
||||
0.92284 -1.8655
|
||||
1.5 -2.0
|
||||
0.0 -1.875
|
||||
0.5 -2.0
|
||||
-0.17678 -0.17678
|
||||
-0.32357 -0.18954
|
||||
-0.18954 -0.32357
|
||||
-0.46194 -0.19134
|
||||
-0.19134 -0.46194
|
||||
-0.59418 -0.19384
|
||||
-0.50569 -0.36729
|
||||
-0.72444 -0.19411
|
||||
-0.36729 -0.50569
|
||||
-0.19384 -0.59418
|
||||
-0.53033 -0.53033
|
||||
-0.19411 -0.72444
|
||||
-0.85299 -0.19501
|
||||
-0.78835 -0.37964
|
||||
-0.98079 -0.19509
|
||||
-0.68405 -0.54563
|
||||
-0.54563 -0.68405
|
||||
-0.83147 -0.55557
|
||||
-0.37964 -0.78835
|
||||
-0.19501 -0.85299
|
||||
-0.55557 -0.83147
|
||||
-0.19509 -0.98079
|
||||
-1.24928 -0.27462
|
||||
-1.05851 -0.4599
|
||||
-1.13007 -0.79668
|
||||
-0.86872 -0.86872
|
||||
-0.79668 -1.13007
|
||||
-0.4599 -1.05851
|
||||
-0.27462 -1.24928
|
||||
-1.51779 -0.35426
|
||||
-1.32748 -0.6142
|
||||
-1.42864 -1.03762
|
||||
-1.19194 -1.19194
|
||||
-1.03762 -1.42864
|
||||
-0.6142 -1.32748
|
||||
-0.35426 -1.51779
|
||||
-1.78629 -0.43396
|
||||
-1.59649 -0.76852
|
||||
-1.72721 -1.2785
|
||||
-1.51516 -1.51516
|
||||
-1.2785 -1.72721
|
||||
-0.76852 -1.59649
|
||||
-0.43396 -1.78629
|
||||
-1.875 0.0
|
||||
-2.0 -0.5
|
||||
-1.8655 -0.92284
|
||||
-2.0 -1.5
|
||||
-1.83839 -1.83839
|
||||
-1.5 -2.0
|
||||
-0.92284 -1.8655
|
||||
-0.5 -2.0
|
||||
1.0917 0.22992
|
||||
0.96356 0.66428
|
||||
0.66428 0.96356
|
||||
0.22992 1.0917
|
||||
1.35121 0.30709
|
||||
1.25968 0.90306
|
||||
0.90306 1.25968
|
||||
0.30709 1.35121
|
||||
1.61073 0.38425
|
||||
1.55581 1.14184
|
||||
1.14184 1.55581
|
||||
0.38425 1.61073
|
||||
1.87024 0.46142
|
||||
1.85194 1.38061
|
||||
1.38061 1.85194
|
||||
0.46142 1.87024
|
||||
-1.0917 0.22992
|
||||
-0.96356 0.66428
|
||||
-0.66428 0.96356
|
||||
-0.22992 1.0917
|
||||
-1.35121 0.30709
|
||||
-1.25968 0.90306
|
||||
-0.90306 1.25968
|
||||
-0.30709 1.35121
|
||||
-1.61073 0.38425
|
||||
-1.55581 1.14184
|
||||
-1.14184 1.55581
|
||||
-0.38425 1.61073
|
||||
-1.87024 0.46142
|
||||
-1.85194 1.38061
|
||||
-1.38061 1.85194
|
||||
-0.46142 1.87024
|
||||
1.0917 -0.22992
|
||||
0.96356 -0.66428
|
||||
0.66428 -0.96356
|
||||
0.22992 -1.0917
|
||||
1.35121 -0.30709
|
||||
1.25968 -0.90306
|
||||
0.90306 -1.25968
|
||||
0.30709 -1.35121
|
||||
1.61073 -0.38425
|
||||
1.55581 -1.14184
|
||||
1.14184 -1.55581
|
||||
0.38425 -1.61073
|
||||
1.87024 -0.46142
|
||||
1.85194 -1.38061
|
||||
1.38061 -1.85194
|
||||
0.46142 -1.87024
|
||||
-1.0917 -0.22992
|
||||
-0.96356 -0.66428
|
||||
-0.66428 -0.96356
|
||||
-0.22992 -1.0917
|
||||
-1.35121 -0.30709
|
||||
-1.25968 -0.90306
|
||||
-0.90306 -1.25968
|
||||
-0.30709 -1.35121
|
||||
-1.61073 -0.38425
|
||||
-1.55581 -1.14184
|
||||
-1.14184 -1.55581
|
||||
-0.38425 -1.61073
|
||||
-1.87024 -0.46142
|
||||
-1.85194 -1.38061
|
||||
-1.38061 -1.85194
|
||||
-0.46142 -1.87024
|
||||
@@ -1,182 +0,0 @@
|
||||
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
|
||||
|
||||
elements
|
||||
30
|
||||
1 3 0 11 26 14
|
||||
1 3 0 14 27 17
|
||||
1 3 0 17 28 20
|
||||
1 3 0 20 29 23
|
||||
1 3 0 23 30 11
|
||||
1 2 1 26 11
|
||||
1 2 26 1 12
|
||||
1 3 26 12 3 13
|
||||
1 2 2 26 13
|
||||
1 2 26 2 14
|
||||
1 2 2 27 14
|
||||
1 2 27 2 15
|
||||
1 3 27 15 5 16
|
||||
1 2 4 27 16
|
||||
1 2 27 4 17
|
||||
1 2 4 28 17
|
||||
1 2 28 4 18
|
||||
1 3 28 18 7 19
|
||||
1 2 6 28 19
|
||||
1 2 28 6 20
|
||||
1 2 6 29 20
|
||||
1 2 29 6 21
|
||||
1 3 29 21 9 22
|
||||
1 2 8 29 22
|
||||
1 2 29 8 23
|
||||
1 2 8 30 23
|
||||
1 2 30 8 24
|
||||
1 3 30 24 10 25
|
||||
1 2 1 30 25
|
||||
1 2 30 1 11
|
||||
|
||||
boundary
|
||||
20
|
||||
1 1 13 2
|
||||
1 1 12 3
|
||||
1 1 16 4
|
||||
1 1 15 5
|
||||
1 1 19 6
|
||||
1 1 18 7
|
||||
1 1 22 8
|
||||
1 1 21 9
|
||||
1 1 25 1
|
||||
1 1 24 10
|
||||
1 1 3 13
|
||||
1 1 1 12
|
||||
1 1 5 16
|
||||
1 1 2 15
|
||||
1 1 7 19
|
||||
1 1 4 18
|
||||
1 1 9 22
|
||||
1 1 6 21
|
||||
1 1 10 25
|
||||
1 1 8 24
|
||||
|
||||
vertices
|
||||
31
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_2D_P2
|
||||
VDim: 2
|
||||
Ordering: 1
|
||||
|
||||
0.01350768617383 -0.0075500592639684
|
||||
1 0
|
||||
0.309017 0.951057
|
||||
1.30902 0.951057
|
||||
-0.809017 0.587785
|
||||
-0.5 1.53884
|
||||
-0.809017 -0.587785
|
||||
-1.61803 0
|
||||
0.309017 -0.951057
|
||||
-0.5 -1.53884
|
||||
1.30902 -0.951057
|
||||
0.4935497789318 -0.012882964767041
|
||||
1.15451 0.475529
|
||||
0.809019 0.951057
|
||||
0.17136163619581 0.48175756223348
|
||||
-0.0954915 1.24495
|
||||
-0.654508 1.06331
|
||||
-0.41734925397369 0.28726550311701
|
||||
-1.21352 0.293893
|
||||
-1.21352 -0.293892
|
||||
-0.39460365124056 -0.30156877530663
|
||||
-0.654508 -1.06331
|
||||
-0.0954915 -1.24495
|
||||
0.14399901886801 -0.48762042397771
|
||||
0.809019 -0.951057
|
||||
1.15451 -0.475529
|
||||
0.6498356311584 0.48434918539882
|
||||
-0.24288407581812 0.75594729997554
|
||||
-0.8152592767797 0.0028387384025541
|
||||
-0.22754482186326 -0.77540708661379
|
||||
0.672255499984 -0.48174474211839
|
||||
0.22829595615988 0.0021164169942289
|
||||
0.60101450815825 0.21860266792331
|
||||
0.41883194868682 0.47605389684094
|
||||
0.07343165966527 0.21396989328966
|
||||
-0.02571592547416 0.63942139993498
|
||||
-0.32229829912758 0.53827901417123
|
||||
-0.17873676879185 0.14412581843398
|
||||
-0.6182337454462 0.14256917811499
|
||||
-0.59596471744054 -0.16569961862581
|
||||
-0.19439899436461 -0.12390276596268
|
||||
-0.33986575323528 -0.53331120777067
|
||||
-0.064647379830725 -0.60235938684263
|
||||
0.091924539036435 -0.25440885597942
|
||||
0.40469418107844 -0.47549896605132
|
||||
0.59442400974309 -0.23815570080881
|
||||
0.83567929699787 0.25605757828544
|
||||
0.73491944894413 -0.013500778246483
|
||||
1.077255 0.2377645
|
||||
0.88696375569985 0.49133008726061
|
||||
1.231765 0.713293
|
||||
1.0590195 0.951057
|
||||
0.72725653289275 0.73104100472096
|
||||
0.50225974659165 0.6904536152084
|
||||
0.559018 0.951057
|
||||
0.23657516510421 0.69857072686934
|
||||
0.011561493903121 0.87524541641085
|
||||
0.10676275 1.0980035
|
||||
-0.17127243181091 0.99863326833074
|
||||
-0.29774575 1.391895
|
||||
-0.577254 1.301075
|
||||
-0.45323351407757 0.93490604288187
|
||||
-0.55200861955087 0.66792304985565
|
||||
-0.7317625 0.8255475
|
||||
-0.58327877079184 0.4240660861124
|
||||
-0.81465656906104 0.28713104760848
|
||||
-1.0112685 0.440839
|
||||
-0.99771272279525 0.1592736885552
|
||||
-1.415775 0.1469465
|
||||
-1.415775 -0.146946
|
||||
-1.0166887889241 -0.16866723370018
|
||||
-0.80412516287867 -0.29582734656
|
||||
-1.0112685 -0.4408385
|
||||
-0.6073309356422 -0.45826153759998
|
||||
-0.55501395481483 -0.68914767547246
|
||||
-0.7317625 -0.8255475
|
||||
-0.45240617124569 -0.93833106759189
|
||||
-0.577254 -1.301075
|
||||
-0.29774575 -1.391895
|
||||
-0.1923419715726 -1.0285844005569
|
||||
0.031614306262131 -0.83601077226744
|
||||
0.10676275 -1.0980035
|
||||
0.22112358843745 -0.69009711121629
|
||||
0.50046759811715 -0.72837571286759
|
||||
0.559018 -0.951057
|
||||
0.71074483315985 -0.70826931724532
|
||||
1.0590195 -0.951057
|
||||
1.231765 -0.713293
|
||||
0.89135027612826 -0.46226040977064
|
||||
0.84948897506491 -0.23986695857234
|
||||
1.077255 -0.2377645
|
||||
0.31586449185434 0.2462788698702
|
||||
-0.13788918217579 0.40149150514309
|
||||
-0.40416548945856 0.0027692745957735
|
||||
-0.14861804521337 -0.3698676302047
|
||||
0.33007376541085 -0.24598293851351
|
||||
0.99473757603443 0.69214841080247
|
||||
-0.38122249894249 1.1629329119286
|
||||
-1.208195003484 -0.0026998371675556
|
||||
-0.35890854853443 -1.1361244276705
|
||||
0.9901912195942 -0.73640851058427
|
||||
@@ -1,201 +0,0 @@
|
||||
# vtk DataFile Version 3.0
|
||||
Generated by MFEM
|
||||
ASCII
|
||||
DATASET UNSTRUCTURED_GRID
|
||||
POINTS 101 double
|
||||
0.01350768617383 -0.0075500592639684 0
|
||||
1 0 0
|
||||
0.309017 0.951057 0
|
||||
1.30902 0.951057 0
|
||||
-0.809017 0.587785 0
|
||||
-0.5 1.53884 0
|
||||
-0.809017 -0.587785 0
|
||||
-1.61803 0 0
|
||||
0.309017 -0.951057 0
|
||||
-0.5 -1.53884 0
|
||||
1.30902 -0.951057 0
|
||||
0.4935497789318 -0.012882964767041 0
|
||||
1.15451 0.475529 0
|
||||
0.809019 0.951057 0
|
||||
0.17136163619581 0.48175756223348 0
|
||||
-0.0954915 1.24495 0
|
||||
-0.654508 1.06331 0
|
||||
-0.41734925397369 0.28726550311701 0
|
||||
-1.21352 0.293893 0
|
||||
-1.21352 -0.293892 0
|
||||
-0.39460365124056 -0.30156877530663 0
|
||||
-0.654508 -1.06331 0
|
||||
-0.0954915 -1.24495 0
|
||||
0.14399901886801 -0.48762042397771 0
|
||||
0.809019 -0.951057 0
|
||||
1.15451 -0.475529 0
|
||||
0.6498356311584 0.48434918539882 0
|
||||
-0.24288407581812 0.75594729997554 0
|
||||
-0.8152592767797 0.0028387384025541 0
|
||||
-0.22754482186326 -0.77540708661379 0
|
||||
0.672255499984 -0.48174474211839 0
|
||||
0.22829595615988 0.0021164169942289 0
|
||||
0.60101450815825 0.21860266792331 0
|
||||
0.41883194868682 0.47605389684094 0
|
||||
0.07343165966527 0.21396989328966 0
|
||||
-0.02571592547416 0.63942139993498 0
|
||||
-0.32229829912758 0.53827901417123 0
|
||||
-0.17873676879185 0.14412581843398 0
|
||||
-0.6182337454462 0.14256917811499 0
|
||||
-0.59596471744054 -0.16569961862581 0
|
||||
-0.19439899436461 -0.12390276596268 0
|
||||
-0.33986575323528 -0.53331120777067 0
|
||||
-0.064647379830725 -0.60235938684263 0
|
||||
0.091924539036435 -0.25440885597942 0
|
||||
0.40469418107844 -0.47549896605132 0
|
||||
0.59442400974309 -0.23815570080881 0
|
||||
0.83567929699787 0.25605757828544 0
|
||||
0.73491944894413 -0.013500778246483 0
|
||||
1.077255 0.2377645 0
|
||||
0.88696375569985 0.49133008726061 0
|
||||
1.231765 0.713293 0
|
||||
1.0590195 0.951057 0
|
||||
0.72725653289275 0.73104100472096 0
|
||||
0.50225974659165 0.6904536152084 0
|
||||
0.559018 0.951057 0
|
||||
0.23657516510421 0.69857072686934 0
|
||||
0.011561493903121 0.87524541641085 0
|
||||
0.10676275 1.0980035 0
|
||||
-0.17127243181091 0.99863326833074 0
|
||||
-0.29774575 1.391895 0
|
||||
-0.577254 1.301075 0
|
||||
-0.45323351407757 0.93490604288187 0
|
||||
-0.55200861955087 0.66792304985565 0
|
||||
-0.7317625 0.8255475 0
|
||||
-0.58327877079184 0.4240660861124 0
|
||||
-0.81465656906104 0.28713104760848 0
|
||||
-1.0112685 0.440839 0
|
||||
-0.99771272279525 0.1592736885552 0
|
||||
-1.415775 0.1469465 0
|
||||
-1.415775 -0.146946 0
|
||||
-1.0166887889241 -0.16866723370018 0
|
||||
-0.80412516287867 -0.29582734656 0
|
||||
-1.0112685 -0.4408385 0
|
||||
-0.6073309356422 -0.45826153759998 0
|
||||
-0.55501395481483 -0.68914767547246 0
|
||||
-0.7317625 -0.8255475 0
|
||||
-0.45240617124569 -0.93833106759189 0
|
||||
-0.577254 -1.301075 0
|
||||
-0.29774575 -1.391895 0
|
||||
-0.1923419715726 -1.0285844005569 0
|
||||
0.031614306262131 -0.83601077226744 0
|
||||
0.10676275 -1.0980035 0
|
||||
0.22112358843745 -0.69009711121629 0
|
||||
0.50046759811715 -0.72837571286759 0
|
||||
0.559018 -0.951057 0
|
||||
0.71074483315985 -0.70826931724532 0
|
||||
1.0590195 -0.951057 0
|
||||
1.231765 -0.713293 0
|
||||
0.89135027612826 -0.46226040977064 0
|
||||
0.84948897506491 -0.23986695857234 0
|
||||
1.077255 -0.2377645 0
|
||||
0.31586449185434 0.2462788698702 0
|
||||
-0.13788918217579 0.40149150514309 0
|
||||
-0.40416548945856 0.0027692745957735 0
|
||||
-0.14861804521337 -0.3698676302047 0
|
||||
0.33007376541085 -0.24598293851351 0
|
||||
0.99473757603443 0.69214841080247 0
|
||||
-0.38122249894249 1.1629329119286 0
|
||||
-1.208195003484 -0.0026998371675556 0
|
||||
-0.35890854853443 -1.1361244276705 0
|
||||
0.9901912195942 -0.73640851058427 0
|
||||
CELLS 30 240
|
||||
9 0 11 26 14 31 32 33 34 91
|
||||
9 0 14 27 17 34 35 36 37 92
|
||||
9 0 17 28 20 37 38 39 40 93
|
||||
9 0 20 29 23 40 41 42 43 94
|
||||
9 0 23 30 11 43 44 45 31 95
|
||||
6 1 26 11 46 32 47
|
||||
6 26 1 12 46 48 49
|
||||
9 26 12 3 13 49 50 51 52 96
|
||||
6 2 26 13 53 52 54
|
||||
6 26 2 14 53 55 33
|
||||
6 2 27 14 56 35 55
|
||||
6 27 2 15 56 57 58
|
||||
9 27 15 5 16 58 59 60 61 97
|
||||
6 4 27 16 62 61 63
|
||||
6 27 4 17 62 64 36
|
||||
6 4 28 17 65 38 64
|
||||
6 28 4 18 65 66 67
|
||||
9 28 18 7 19 67 68 69 70 98
|
||||
6 6 28 19 71 70 72
|
||||
6 28 6 20 71 73 39
|
||||
6 6 29 20 74 41 73
|
||||
6 29 6 21 74 75 76
|
||||
9 29 21 9 22 76 77 78 79 99
|
||||
6 8 29 22 80 79 81
|
||||
6 29 8 23 80 82 42
|
||||
6 8 30 23 83 44 82
|
||||
6 30 8 24 83 84 85
|
||||
9 30 24 10 25 85 86 87 88 100
|
||||
6 1 30 25 89 88 90
|
||||
6 30 1 11 89 47 45
|
||||
CELL_TYPES 30
|
||||
28
|
||||
28
|
||||
28
|
||||
28
|
||||
28
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
CELL_DATA 30
|
||||
SCALARS material int
|
||||
LOOKUP_TABLE default
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@@ -1,107 +0,0 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
30
|
||||
1 3 0 11 26 14
|
||||
1 3 0 14 27 17
|
||||
1 3 0 17 28 20
|
||||
1 3 0 20 29 23
|
||||
1 3 0 23 30 11
|
||||
1 2 11 1 26
|
||||
1 2 1 12 26
|
||||
1 3 26 12 3 13
|
||||
1 2 26 13 2
|
||||
1 2 14 26 2
|
||||
1 2 14 2 27
|
||||
1 2 2 15 27
|
||||
1 3 27 15 5 16
|
||||
1 2 27 16 4
|
||||
1 2 17 27 4
|
||||
1 2 17 4 28
|
||||
1 2 4 18 28
|
||||
1 3 28 18 7 19
|
||||
1 2 28 19 6
|
||||
1 2 20 28 6
|
||||
1 2 20 6 29
|
||||
1 2 6 21 29
|
||||
1 3 29 21 9 22
|
||||
1 2 29 22 8
|
||||
1 2 23 29 8
|
||||
1 2 23 8 30
|
||||
1 2 8 24 30
|
||||
1 3 30 24 10 25
|
||||
1 2 30 25 1
|
||||
1 2 11 30 1
|
||||
|
||||
boundary
|
||||
20
|
||||
1 1 13 2
|
||||
1 1 12 3
|
||||
1 1 16 4
|
||||
1 1 15 5
|
||||
1 1 19 6
|
||||
1 1 18 7
|
||||
1 1 22 8
|
||||
1 1 21 9
|
||||
1 1 25 1
|
||||
1 1 24 10
|
||||
1 1 3 13
|
||||
1 1 1 12
|
||||
1 1 5 16
|
||||
1 1 2 15
|
||||
1 1 7 19
|
||||
1 1 4 18
|
||||
1 1 9 22
|
||||
1 1 6 21
|
||||
1 1 10 25
|
||||
1 1 8 24
|
||||
|
||||
vertices
|
||||
31
|
||||
2
|
||||
0 0
|
||||
1 0
|
||||
0.309017 0.951057
|
||||
1.30902 0.951057
|
||||
-0.809017 0.587785
|
||||
-0.5 1.53884
|
||||
-0.809017 -0.587785
|
||||
-1.61803 0
|
||||
0.309017 -0.951057
|
||||
-0.5 -1.53884
|
||||
1.30902 -0.951057
|
||||
0.5 0
|
||||
1.15451 0.475529
|
||||
0.809019 0.951057
|
||||
0.154508 0.475529
|
||||
-0.0954915 1.24495
|
||||
-0.654508 1.06331
|
||||
-0.404508 0.293893
|
||||
-1.21352 0.293893
|
||||
-1.21352 -0.293892
|
||||
-0.404508 -0.293893
|
||||
-0.654508 -1.06331
|
||||
-0.0954915 -1.24495
|
||||
0.154508 -0.475529
|
||||
0.809019 -0.951057
|
||||
1.15451 -0.475529
|
||||
0.654509 0.475529
|
||||
-0.25 0.769421
|
||||
-0.809016 0
|
||||
-0.25 -0.76942
|
||||
0.654509 -0.475529
|
||||
@@ -1,350 +0,0 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
6
|
||||
1 5 0 1 2 3 4 5 6 7
|
||||
1 5 4 5 6 7 8 9 10 11
|
||||
1 5 8 9 10 11 12 13 14 15
|
||||
1 5 12 13 14 15 16 17 18 19
|
||||
1 5 16 17 18 19 20 21 22 23
|
||||
1 5 20 21 22 23 3 0 1 2
|
||||
|
||||
boundary
|
||||
24
|
||||
1 3 0 1 5 4
|
||||
1 3 1 2 6 5
|
||||
1 3 2 3 7 6
|
||||
1 3 3 0 4 7
|
||||
1 3 4 5 9 8
|
||||
1 3 5 6 10 9
|
||||
1 3 6 7 11 10
|
||||
1 3 7 4 8 11
|
||||
1 3 8 9 13 12
|
||||
1 3 9 10 14 13
|
||||
1 3 10 11 15 14
|
||||
1 3 11 8 12 15
|
||||
1 3 12 13 17 16
|
||||
1 3 13 14 18 17
|
||||
1 3 14 15 19 18
|
||||
1 3 15 12 16 19
|
||||
1 3 16 17 21 20
|
||||
1 3 17 18 22 21
|
||||
1 3 18 19 23 22
|
||||
1 3 19 16 20 23
|
||||
1 3 20 21 0 3
|
||||
1 3 21 22 1 0
|
||||
1 3 22 23 2 1
|
||||
1 3 23 20 3 2
|
||||
|
||||
vertices
|
||||
24
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_3D_P3
|
||||
VDim: 3
|
||||
Ordering: 1
|
||||
|
||||
0.71715729 -1.7565288e-16 -0.28284271
|
||||
0.71715729 -1.7565288e-16 0.28284271
|
||||
1.2828427 -3.1420584e-16 0.28284271
|
||||
1.2828427 -3.1420584e-16 -0.28284271
|
||||
0.3 0.51961524 -2.7755576e-17
|
||||
0.5 0.8660254 0.4
|
||||
0.7 1.2124356 2.7755576e-17
|
||||
0.5 0.8660254 -0.4
|
||||
-0.35857864 0.62107643 0.28284271
|
||||
-0.64142136 1.1109744 0.28284271
|
||||
-0.64142136 1.1109744 -0.28284271
|
||||
-0.35857864 0.62107643 -0.28284271
|
||||
-1 1.2246468e-16 0.4
|
||||
-1.4 1.7145055e-16 2.7755576e-17
|
||||
-1 1.2246468e-16 -0.4
|
||||
-0.6 7.3478808e-17 -2.7755576e-17
|
||||
-0.64142136 -1.1109744 0.28284271
|
||||
-0.64142136 -1.1109744 -0.28284271
|
||||
-0.35857864 -0.62107643 -0.28284271
|
||||
-0.35857864 -0.62107643 0.28284271
|
||||
0.7 -1.2124356 8.3266727e-17
|
||||
0.5 -0.8660254 -0.4
|
||||
0.3 -0.51961524 -8.3266727e-17
|
||||
0.5 -0.8660254 0.4
|
||||
0.71715729 -1.7565288e-16 -0.12649111
|
||||
0.71715729 -1.7565288e-16 0.12649111
|
||||
0.87350889 -2.1394797e-16 0.28284271
|
||||
1.1264911 -2.7591075e-16 0.28284271
|
||||
1.2828427 -3.1420584e-16 0.12649111
|
||||
1.2828427 -3.1420584e-16 -0.12649111
|
||||
0.87350889 -2.1394797e-16 -0.28284271
|
||||
1.1264911 -2.7591075e-16 -0.28284271
|
||||
0.35527864 0.61536066 0.11055728
|
||||
0.44472136 0.77027999 0.28944272
|
||||
0.55527864 0.96177082 0.28944272
|
||||
0.64472136 1.1166902 0.11055728
|
||||
0.64472136 1.1166902 -0.11055728
|
||||
0.55527864 0.96177082 -0.28944272
|
||||
0.35527864 0.61536066 -0.11055728
|
||||
0.44472136 0.77027999 -0.28944272
|
||||
0.63530452 0.18919442 -0.21528657
|
||||
0.44264573 0.41882944 -0.086151128
|
||||
0.75207276 0.22396814 0.33712267
|
||||
0.66379961 0.62808427 0.39061232
|
||||
1.2815042 0.38163342 0.21528657
|
||||
1.01011 0.95576166 0.086151128
|
||||
1.1647359 0.3468597 -0.33712267
|
||||
0.78895615 0.74650684 -0.39061232
|
||||
-0.43675445 0.75648089 0.28284271
|
||||
-0.56324555 0.97556992 0.28284271
|
||||
-0.64142136 1.1109744 0.12649111
|
||||
-0.64142136 1.1109744 -0.12649111
|
||||
-0.56324555 0.97556992 -0.28284271
|
||||
-0.43675445 0.75648089 -0.28284271
|
||||
-0.35857864 0.62107643 0.12649111
|
||||
-0.35857864 0.62107643 -0.12649111
|
||||
0.14139407 0.59275717 0.086151128
|
||||
-0.15380509 0.64478706 0.21528657
|
||||
0.25201581 1.0565095 0.39061232
|
||||
-0.28197865 1.1821208 0.33712267
|
||||
0.32265887 1.3526618 -0.086151128
|
||||
-0.31024785 1.3006319 -0.21528657
|
||||
0.21203713 0.88890945 -0.39061232
|
||||
-0.18207429 0.76329818 -0.33712267
|
||||
-1.1105573 1.3600404e-16 0.28944272
|
||||
-1.2894427 1.5791119e-16 0.11055728
|
||||
-1.2894427 1.5791119e-16 -0.11055728
|
||||
-1.1105573 1.3600404e-16 -0.28944272
|
||||
-0.88944272 1.0892532e-16 -0.28944272
|
||||
-0.71055728 8.701817e-17 -0.11055728
|
||||
-0.88944272 1.0892532e-16 0.28944272
|
||||
-0.71055728 8.701817e-17 0.11055728
|
||||
-0.56999848 0.53933005 0.33712267
|
||||
-0.87583673 0.26082519 0.39061232
|
||||
-0.97125633 0.91899846 0.21528657
|
||||
-1.3327689 0.39690011 0.086151128
|
||||
-0.88275728 0.83526106 -0.33712267
|
||||
-1.040972 0.31000265 -0.39061232
|
||||
-0.48149943 0.45559264 -0.21528657
|
||||
-0.5840398 0.17392773 -0.086151128
|
||||
-0.64142136 -1.1109744 0.12649111
|
||||
-0.64142136 -1.1109744 -0.12649111
|
||||
-0.56324555 -0.97556992 -0.28284271
|
||||
-0.43675445 -0.75648089 -0.28284271
|
||||
-0.35857864 -0.62107643 -0.12649111
|
||||
-0.35857864 -0.62107643 0.12649111
|
||||
-0.56324555 -0.97556992 0.28284271
|
||||
-0.43675445 -0.75648089 0.28284271
|
||||
-1.040972 -0.31000265 0.39061232
|
||||
-0.88275728 -0.83526106 0.33712267
|
||||
-1.3327689 -0.39690011 -0.086151128
|
||||
-0.97125633 -0.91899846 -0.21528657
|
||||
-0.87583673 -0.26082519 -0.39061232
|
||||
-0.56999848 -0.53933005 -0.33712267
|
||||
-0.5840398 -0.17392773 0.086151128
|
||||
-0.48149943 -0.45559264 0.21528657
|
||||
0.64472136 -1.1166902 -0.11055728
|
||||
0.55527864 -0.96177082 -0.28944272
|
||||
0.44472136 -0.77027999 -0.28944272
|
||||
0.35527864 -0.61536066 -0.11055728
|
||||
0.35527864 -0.61536066 0.11055728
|
||||
0.44472136 -0.77027999 0.28944272
|
||||
0.64472136 -1.1166902 0.11055728
|
||||
0.55527864 -0.96177082 0.28944272
|
||||
-0.31024785 -1.3006319 0.21528657
|
||||
0.32265887 -1.3526618 0.086151128
|
||||
-0.28197865 -1.1821208 -0.33712267
|
||||
0.25201581 -1.0565095 -0.39061232
|
||||
-0.15380509 -0.64478706 -0.21528657
|
||||
0.14139407 -0.59275717 -0.086151128
|
||||
-0.18207429 -0.76329818 0.33712267
|
||||
0.21203713 -0.88890945 0.39061232
|
||||
1.2815042 -0.38163342 -0.21528657
|
||||
1.01011 -0.95576166 -0.086151128
|
||||
0.75207276 -0.22396814 -0.33712267
|
||||
0.66379961 -0.62808427 -0.39061232
|
||||
0.63530452 -0.18919442 0.21528657
|
||||
0.44264573 -0.41882944 0.086151128
|
||||
1.1647359 -0.3468597 0.33712267
|
||||
0.78895615 -0.74650684 0.39061232
|
||||
1.1264911 -2.7591075e-16 -0.12649111
|
||||
1.1264911 -2.7591075e-16 0.12649111
|
||||
0.87350889 -2.1394797e-16 -0.12649111
|
||||
0.87350889 -9.8977972e-16 0.12649111
|
||||
0.66757847 0.19880564 -0.062604414
|
||||
0.71979881 0.21435692 0.18444051
|
||||
0.50377116 0.47666605 0.045623048
|
||||
0.60267418 0.57024766 0.25883814
|
||||
0.89840401 0.26754575 0.303448
|
||||
1.1351729 0.33805581 0.24896124
|
||||
0.75951745 0.71865207 0.30646131
|
||||
0.91439218 0.86519386 0.17030213
|
||||
1.2492302 0.3720222 0.062604414
|
||||
1.1970099 0.35647092 -0.18444051
|
||||
0.9489846 0.89792505 -0.045623048
|
||||
0.85008158 0.80434345 -0.25883814
|
||||
1.0184047 0.30328209 -0.303448
|
||||
0.78163576 0.23277203 -0.24896124
|
||||
0.69323831 0.65593903 -0.30646131
|
||||
0.53836358 0.50939725 -0.17030213
|
||||
0.41055728 0.71110607 -1.3877788e-17
|
||||
0.5 0.8660254 0.17888544
|
||||
0.5 0.8660254 -0.17888544
|
||||
0.58944272 1.0209447 1.3877788e-17
|
||||
0.17196917 0.72093516 0.17030213
|
||||
0.22144071 0.9283315 0.30646131
|
||||
-0.18923139 0.79330244 0.24896124
|
||||
-0.24655235 1.0336054 0.303448
|
||||
0.27154107 1.138364 0.25883814
|
||||
0.30313361 1.2708073 0.045623048
|
||||
-0.28979207 1.2148764 0.18444051
|
||||
-0.30243444 1.2678762 -0.062604414
|
||||
0.29208377 1.2244838 -0.17030213
|
||||
0.24261222 1.0170874 -0.30646131
|
||||
-0.27482155 1.1521165 -0.24896124
|
||||
-0.21750059 0.91181357 -0.303448
|
||||
0.19251187 0.80705498 -0.25883814
|
||||
0.16091933 0.67461165 -0.045623048
|
||||
-0.17426087 0.73054252 -0.18444051
|
||||
-0.1616185 0.67754273 0.062604414
|
||||
-0.43675445 0.75648089 0.12649111
|
||||
-0.56324555 0.97556992 0.12649111
|
||||
-0.43675445 0.75648089 -0.12649111
|
||||
-0.56324555 0.97556992 -0.12649111
|
||||
-0.68090342 0.64426782 0.303448
|
||||
-0.86035138 0.81406069 0.24896124
|
||||
-1.0021297 0.29843537 0.30646131
|
||||
-1.2064759 0.35928993 0.17030213
|
||||
-0.94679579 0.89585401 0.062604414
|
||||
-0.90721782 0.85840551 -0.18444051
|
||||
-1.2521182 0.37288224 -0.045623048
|
||||
-1.1216227 0.33402052 -0.25883814
|
||||
-0.77185234 0.73032329 -0.303448
|
||||
-0.59240437 0.56053041 -0.24896124
|
||||
-0.91467902 0.27239247 -0.30646131
|
||||
-0.71033275 0.21153791 -0.17030213
|
||||
-0.50595997 0.47873709 -0.062604414
|
||||
-0.54553794 0.5161856 0.18444051
|
||||
-0.66469049 0.19794559 0.045623048
|
||||
-0.79518604 0.23680732 0.25883814
|
||||
-1 1.2246468e-16 0.17888544
|
||||
-1.1788854 1.4437183e-16 1.3877788e-17
|
||||
-0.82111456 1.0055753e-16 -1.3877788e-17
|
||||
-1 5.6655389e-16 -0.17888544
|
||||
-1.1216227 -0.33402052 0.25883814
|
||||
-1.2521182 -0.37288224 0.045623048
|
||||
-0.90721782 -0.85840551 0.18444051
|
||||
-0.94679579 -0.89585401 -0.062604414
|
||||
-1.2064759 -0.35928993 -0.17030213
|
||||
-1.0021297 -0.29843537 -0.30646131
|
||||
-0.86035138 -0.81406069 -0.24896124
|
||||
-0.68090342 -0.64426782 -0.303448
|
||||
-0.79518604 -0.23680732 -0.25883814
|
||||
-0.66469049 -0.19794559 -0.045623048
|
||||
-0.54553794 -0.5161856 -0.18444051
|
||||
-0.50595997 -0.47873709 0.062604414
|
||||
-0.71033275 -0.21153791 0.17030213
|
||||
-0.91467902 -0.27239247 0.30646131
|
||||
-0.59240437 -0.56053041 0.24896124
|
||||
-0.77185234 -0.73032329 0.303448
|
||||
-0.56324555 -0.97556992 0.12649111
|
||||
-0.56324555 -0.97556992 -0.12649111
|
||||
-0.43675445 -0.75648089 0.12649111
|
||||
-0.43675445 -0.75648089 -0.12649111
|
||||
-0.30243444 -1.2678762 0.062604414
|
||||
-0.28979207 -1.2148764 -0.18444051
|
||||
0.30313361 -1.2708073 -0.045623048
|
||||
0.27154107 -1.138364 -0.25883814
|
||||
-0.24655235 -1.0336054 -0.303448
|
||||
-0.18923139 -0.79330244 -0.24896124
|
||||
0.22144071 -0.9283315 -0.30646131
|
||||
0.17196917 -0.72093516 -0.17030213
|
||||
-0.1616185 -0.67754273 -0.062604414
|
||||
-0.17426087 -0.73054252 0.18444051
|
||||
0.16091933 -0.67461165 0.045623048
|
||||
0.19251187 -0.80705498 0.25883814
|
||||
-0.21750059 -0.91181357 0.303448
|
||||
-0.27482155 -1.1521165 0.24896124
|
||||
0.24261222 -1.0170874 0.30646131
|
||||
0.29208377 -1.2244838 0.17030213
|
||||
0.58944272 -1.0209447 2.7755576e-17
|
||||
0.5 -0.8660254 -0.17888544
|
||||
0.5 -0.8660254 0.17888544
|
||||
0.41055728 -0.71110607 -2.7755576e-17
|
||||
0.91439218 -0.86519386 -0.17030213
|
||||
0.75951745 -0.71865207 -0.30646131
|
||||
1.1351729 -0.33805581 -0.24896124
|
||||
0.89840401 -0.26754575 -0.303448
|
||||
0.60267418 -0.57024766 -0.25883814
|
||||
0.50377116 -0.47666605 -0.045623048
|
||||
0.71979881 -0.21435692 -0.18444051
|
||||
0.66757847 -0.19880564 0.062604414
|
||||
0.53836358 -0.50939725 0.17030213
|
||||
0.69323831 -0.65593903 0.30646131
|
||||
0.78163576 -0.23277203 0.24896124
|
||||
1.0184047 -0.30328209 0.303448
|
||||
0.85008158 -0.80434345 0.25883814
|
||||
0.9489846 -0.89792505 0.045623048
|
||||
1.1970099 -0.35647092 0.18444051
|
||||
1.2492302 -0.3720222 -0.062604414
|
||||
0.81390971 0.24238325 -0.096279082
|
||||
0.86613006 0.25793453 0.15076584
|
||||
1.0506786 0.31289331 -0.15076584
|
||||
1.102899 0.32844459 0.096279082
|
||||
0.59948901 0.56723386 -0.038527956
|
||||
0.69839202 0.66081546 0.17468714
|
||||
0.75436373 0.71377565 -0.17468714
|
||||
0.85326675 0.80735725 0.038527956
|
||||
0.19149443 0.80278964 0.038527956
|
||||
0.24096597 1.010186 0.17468714
|
||||
0.22308696 0.93523296 -0.17468714
|
||||
0.27255851 1.1426293 -0.038527956
|
||||
-0.1970448 0.82605811 0.096279082
|
||||
-0.25436576 1.066361 0.15076584
|
||||
-0.20968717 0.8790579 -0.15076584
|
||||
-0.26700813 1.1193608 -0.096279082
|
||||
-0.65644288 0.62112337 0.15076584
|
||||
-0.83589085 0.79091624 0.096279082
|
||||
-0.61686491 0.58367486 -0.096279082
|
||||
-0.79631287 0.75346774 -0.15076584
|
||||
-0.92147899 0.2744175 0.17468714
|
||||
-1.1258253 0.33527206 0.038527956
|
||||
-0.79098343 0.23555578 -0.038527956
|
||||
-0.99532971 0.29641033 -0.17468714
|
||||
-0.99532971 -0.29641033 0.17468714
|
||||
-1.1258253 -0.33527206 -0.038527956
|
||||
-0.79098343 -0.23555578 0.038527956
|
||||
-0.92147899 -0.2744175 -0.17468714
|
||||
-0.79631287 -0.75346774 0.15076584
|
||||
-0.83589085 -0.79091624 -0.096279082
|
||||
-0.61686491 -0.58367486 0.096279082
|
||||
-0.65644288 -0.62112337 -0.15076584
|
||||
-0.26700813 -1.1193608 0.096279082
|
||||
-0.25436576 -1.066361 -0.15076584
|
||||
-0.20968717 -0.8790579 0.15076584
|
||||
-0.1970448 -0.82605811 -0.096279082
|
||||
0.27255851 -1.1426293 0.038527956
|
||||
0.24096597 -1.010186 -0.17468714
|
||||
0.22308696 -0.93523296 0.17468714
|
||||
0.19149443 -0.80278964 -0.038527956
|
||||
0.85326675 -0.80735725 -0.038527956
|
||||
0.69839202 -0.66081546 -0.17468714
|
||||
0.75436373 -0.71377565 0.17468714
|
||||
0.59948901 -0.56723386 0.038527956
|
||||
1.102899 -0.32844459 -0.096279082
|
||||
0.86613006 -0.25793453 -0.15076584
|
||||
1.0506786 -0.31289331 0.15076584
|
||||
0.81390971 -0.24238325 0.096279082
|
||||
@@ -1,236 +0,0 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
6
|
||||
1 6 0 1 2 3 4 5
|
||||
1 6 3 4 5 6 7 8
|
||||
1 6 6 7 8 9 10 11
|
||||
1 6 9 10 11 12 13 14
|
||||
1 6 12 13 14 15 16 17
|
||||
1 6 15 16 17 0 1 2
|
||||
|
||||
boundary
|
||||
18
|
||||
1 3 0 1 4 3
|
||||
1 3 1 2 5 4
|
||||
1 3 2 0 3 5
|
||||
1 3 3 4 7 6
|
||||
1 3 4 5 8 7
|
||||
1 3 5 3 6 8
|
||||
1 3 6 7 10 9
|
||||
1 3 7 8 11 10
|
||||
1 3 8 6 9 11
|
||||
1 3 9 10 13 12
|
||||
1 3 10 11 14 13
|
||||
1 3 11 9 12 14
|
||||
1 3 12 13 16 15
|
||||
1 3 13 14 17 16
|
||||
1 3 14 12 15 17
|
||||
1 3 15 16 1 0
|
||||
1 3 16 17 2 1
|
||||
1 3 17 15 0 2
|
||||
|
||||
vertices
|
||||
18
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_3D_P3
|
||||
VDim: 3
|
||||
Ordering: 1
|
||||
|
||||
0.6 -1.4695762e-16 -9.7971744e-17
|
||||
1.2 -2.9391523e-16 0.34641016
|
||||
1.2 -1.3597293e-15 -0.34641016
|
||||
0.4 0.69282032 0.34641016
|
||||
0.7 1.2124356 2.7755576e-17
|
||||
0.4 0.69282032 -0.34641016
|
||||
-0.6 1.0392305 0.34641016
|
||||
-0.6 1.0392305 -0.34641016
|
||||
-0.3 0.51961524 -3.8651415e-16
|
||||
-1.4 1.7145055e-16 4.8985872e-17
|
||||
-0.8 9.7971744e-17 -0.34641016
|
||||
-0.8 4.5324311e-16 0.34641016
|
||||
-0.6 -1.0392305 -0.34641016
|
||||
-0.3 -0.51961524 -2.220446e-16
|
||||
-0.6 -1.0392305 0.34641016
|
||||
0.4 -0.69282032 -0.34641016
|
||||
0.4 -0.69282032 0.34641016
|
||||
0.7 -1.2124356 7.7509221e-16
|
||||
0.76583592 -8.6777464e-16 0.095745414
|
||||
1.0341641 2.5022695e-15 0.25066475
|
||||
1.2 -1.3597293e-15 0.15491933
|
||||
1.2 -2.9391523e-16 -0.15491933
|
||||
0.76583592 4.9262324e-16 -0.095745414
|
||||
1.0341641 3.4207917e-15 -0.25066475
|
||||
0.48291796 0.83643844 0.25066475
|
||||
0.61708204 1.0688174 0.095745414
|
||||
0.61708204 1.0688174 -0.095745414
|
||||
0.48291796 0.83643844 -0.25066475
|
||||
0.4 0.69282032 0.15491933
|
||||
0.4 0.69282032 -0.15491933
|
||||
0.59098879 0.17599714 0.11416557
|
||||
0.51532795 0.48760104 0.27491822
|
||||
1.2368698 0.36834126 0.27491822
|
||||
1.0048434 0.95077837 0.11416557
|
||||
1.0473544 0.31190335 -0.38908379
|
||||
0.65896232 0.62350725 -0.38908379
|
||||
-0.6 1.0392305 0.15491933
|
||||
-0.6 1.0392305 -0.15491933
|
||||
-0.51708204 0.89561236 -0.25066475
|
||||
-0.38291796 0.66323336 -0.095745414
|
||||
-0.51708204 0.89561236 0.25066475
|
||||
-0.38291796 0.66323336 0.095745414
|
||||
0.21049196 0.88243173 0.38908379
|
||||
-0.25356098 1.0629872 0.38908379
|
||||
0.32097654 1.3456091 -0.11416557
|
||||
-0.29944203 1.2553313 -0.27491822
|
||||
0.16461091 0.69008761 -0.27491822
|
||||
-0.1430764 0.59980988 -0.11416557
|
||||
-1.2341641 6.9922046e-16 -0.095745414
|
||||
-0.96583592 -1.1684711e-15 -0.25066475
|
||||
-0.8 4.5324311e-16 -0.15491933
|
||||
-0.8 9.7971744e-17 0.15491933
|
||||
-1.2341641 -3.9693744e-16 0.095745414
|
||||
-0.96583592 -1.5973885e-15 0.25066475
|
||||
-0.93742781 0.88699007 0.27491822
|
||||
-1.3258199 0.3948307 0.11416557
|
||||
-0.79379344 0.75108386 -0.38908379
|
||||
-0.86945428 0.25892449 -0.38908379
|
||||
-0.44791239 0.42381273 0.11416557
|
||||
-0.67993886 0.20248658 0.27491822
|
||||
-0.51708204 -0.89561236 -0.25066475
|
||||
-0.38291796 -0.66323336 -0.095745414
|
||||
-0.38291796 -0.66323336 0.095745414
|
||||
-0.51708204 -0.89561236 0.25066475
|
||||
-0.6 -1.0392305 -0.15491933
|
||||
-0.6 -1.0392305 0.15491933
|
||||
-1.3258199 -0.3948307 -0.11416557
|
||||
-0.93742781 -0.88699007 -0.27491822
|
||||
-0.67993886 -0.20248658 -0.27491822
|
||||
-0.44791239 -0.42381273 -0.11416557
|
||||
-0.86945428 -0.25892449 0.38908379
|
||||
-0.79379344 -0.75108386 0.38908379
|
||||
0.4 -0.69282032 -0.15491933
|
||||
0.4 -0.69282032 0.15491933
|
||||
0.48291796 -0.83643844 0.25066475
|
||||
0.61708204 -1.0688174 0.095745414
|
||||
0.48291796 -0.83643844 -0.25066475
|
||||
0.61708204 -1.0688174 -0.095745414
|
||||
-0.25356098 -1.0629872 -0.38908379
|
||||
0.21049196 -0.88243173 -0.38908379
|
||||
-0.1430764 -0.59980988 0.11416557
|
||||
0.16461091 -0.69008761 0.27491822
|
||||
-0.29944203 -1.2553313 0.27491822
|
||||
0.32097654 -1.3456091 0.11416557
|
||||
0.59098879 -0.17599714 -0.11416557
|
||||
0.51532795 -0.48760104 -0.27491822
|
||||
1.0473544 -0.31190335 0.38908379
|
||||
0.65896232 -0.62350725 0.38908379
|
||||
1.2368698 -0.36834126 -0.27491822
|
||||
1.0048434 -0.95077837 -0.11416557
|
||||
1 2.4196059e-15 -1.3788671e-16
|
||||
0.5 0.8660254 -8.6542076e-17
|
||||
0.76950592 0.22915975 0.15859651
|
||||
1.0583527 0.31517866 0.23048728
|
||||
0.65062668 0.6156201 0.23048728
|
||||
0.86954463 0.8227593 0.15859651
|
||||
1.1844891 0.35274221 0.091392579
|
||||
1.0997352 0.32750241 -0.20555815
|
||||
0.9092442 0.86032286 -0.024929133
|
||||
0.75456149 0.71396276 -0.24998909
|
||||
0.92121806 0.2743398 -0.24998909
|
||||
0.71712515 0.2135607 -0.024929133
|
||||
0.61926276 0.5859437 -0.20555815
|
||||
0.55502751 0.52516459 0.091392579
|
||||
-0.5 0.8660254 5.1344633e-17
|
||||
0.24102914 1.0104508 0.24998909
|
||||
0.29043935 1.21759 0.024929133
|
||||
-0.26624219 1.1161498 0.20555815
|
||||
-0.28676082 1.2021687 -0.091392579
|
||||
0.27775814 1.1644274 -0.15859651
|
||||
0.20782931 0.87126929 -0.23048728
|
||||
-0.25622363 1.0741497 -0.23048728
|
||||
-0.1862948 0.78099155 -0.15859651
|
||||
0.17729212 0.74325022 -0.091392579
|
||||
0.19781075 0.82926913 0.20555815
|
||||
-0.17361359 0.72782894 0.024929133
|
||||
-0.22302379 0.93496814 0.24998909
|
||||
-1 -1.2098029e-15 1.3788671e-16
|
||||
-0.89772824 0.84942651 0.091392579
|
||||
-0.833493 0.78864741 -0.20555815
|
||||
-1.1996835 0.35726714 -0.024929133
|
||||
-0.99559063 0.29648804 -0.24998909
|
||||
-0.69819427 0.66062834 -0.24998909
|
||||
-0.54351156 0.51426825 -0.024929133
|
||||
-0.8170735 0.24332543 -0.20555815
|
||||
-0.73231963 0.21808563 0.091392579
|
||||
-0.58321113 0.5518318 0.15859651
|
||||
-0.80212907 0.758971 0.23048728
|
||||
-0.85845599 0.25564918 0.23048728
|
||||
-1.1473028 0.34166809 0.15859651
|
||||
-0.5 -0.8660254 8.6542076e-17
|
||||
-1.1473028 -0.34166809 -0.15859651
|
||||
-0.85845599 -0.25564918 -0.23048728
|
||||
-0.80212907 -0.758971 -0.23048728
|
||||
-0.58321113 -0.5518318 -0.15859651
|
||||
-0.73231963 -0.21808563 -0.091392579
|
||||
-0.8170735 -0.24332543 0.20555815
|
||||
-0.54351156 -0.51426825 0.024929133
|
||||
-0.69819427 -0.66062834 0.24998909
|
||||
-0.99559063 -0.29648804 0.24998909
|
||||
-1.1996835 -0.35726714 0.024929133
|
||||
-0.833493 -0.78864741 0.20555815
|
||||
-0.89772824 -0.84942651 -0.091392579
|
||||
0.5 -0.8660254 -5.1344633e-17
|
||||
-0.22302379 -0.93496814 -0.24998909
|
||||
-0.17361359 -0.72782894 -0.024929133
|
||||
0.19781075 -0.82926913 -0.20555815
|
||||
0.17729212 -0.74325022 0.091392579
|
||||
-0.1862948 -0.78099155 0.15859651
|
||||
-0.25622363 -1.0741497 0.23048728
|
||||
0.20782931 -0.87126929 0.23048728
|
||||
0.27775814 -1.1644274 0.15859651
|
||||
-0.28676082 -1.2021687 0.091392579
|
||||
-0.26624219 -1.1161498 -0.20555815
|
||||
0.29043935 -1.21759 -0.024929133
|
||||
0.24102914 -1.0104508 -0.24998909
|
||||
0.55502751 -0.52516459 -0.091392579
|
||||
0.61926276 -0.5859437 0.20555815
|
||||
0.71712515 -0.2135607 0.024929133
|
||||
0.92121806 -0.2743398 0.24998909
|
||||
0.75456149 -0.71396276 0.24998909
|
||||
0.9092442 -0.86032286 0.024929133
|
||||
1.0997352 -0.32750241 0.20555815
|
||||
1.1844891 -0.35274221 -0.091392579
|
||||
0.86954463 -0.8227593 -0.15859651
|
||||
0.65062668 -0.6156201 -0.23048728
|
||||
1.0583527 -0.31517866 -0.23048728
|
||||
0.76950592 -0.22915975 -0.15859651
|
||||
0.95840435 0.28541392 -1.3795119e-16
|
||||
0.72637788 0.68729555 -1.1412456e-16
|
||||
0.23202647 0.97270947 -5.1760042e-17
|
||||
-0.23202647 0.97270947 1.2226691e-17
|
||||
-0.72637788 0.68729555 8.6191148e-17
|
||||
-0.95840435 0.28541392 1.2635125e-16
|
||||
-0.95840435 -0.28541392 1.3795119e-16
|
||||
-0.72637788 -0.68729555 1.1412456e-16
|
||||
-0.23202647 -0.97270947 5.1760042e-17
|
||||
0.23202647 -0.97270947 -1.2226691e-17
|
||||
0.72637788 -0.68729555 -8.6191148e-17
|
||||
0.95840435 -0.28541392 -1.2635125e-16
|
||||
@@ -71,10 +71,6 @@ namespace mfem {
|
||||
* - <a class="el" href="ex18p_8cpp_source.html">Example 18p</a>: parallel Discontinuous Galerkin (DG) for the Euler equations
|
||||
* - <a class="el" href="ex19_8cpp_source.html">Example 19</a>: incompressible nonlinear elasticity
|
||||
* - <a class="el" href="ex19p_8cpp_source.html">Example 19p</a>: parallel incompressible nonlinear elasticity
|
||||
* - <a class="el" href="ex20_8cpp_source.html">Example 20</a>: symplectic ODE integration
|
||||
* - <a class="el" href="ex20p_8cpp_source.html">Example 20p</a>: parallel symplectic ODE integration
|
||||
* - <a class="el" href="ex22_8cpp_source.html">Example 22</a>: adaptive mesh refinement for linear elasticity
|
||||
* - <a class="el" href="ex22p_8cpp_source.html">Example 22p</a>: parallel adaptive mesh refinement for linear elasticity
|
||||
*
|
||||
* <H4>SUNDIALS Examples</H4>
|
||||
* - Variants of Examples
|
||||
@@ -116,9 +112,7 @@ namespace mfem {
|
||||
* - <a class="el" href="joule_8cpp_source.html">Joule</a>: transient magnetics and Joule heating miniapp
|
||||
* - <a class="el" href="mobius-strip_8cpp_source.html">Mobius Strip</a>: generate various Mobius strip-like meshes
|
||||
* - <a class="el" href="klein-bottle_8cpp_source.html">Klein Bottle</a>: generate three types of Klein bottle surfaces
|
||||
* - <a class="el" href="toroid_8cpp_source.html">Toroid</a>: generate simple toroidal meshes
|
||||
* - <a class="el" href="shaper_8cpp_source.html">Shaper</a>: resolve material interfaces by mesh refinement
|
||||
* - <a class="el" href="extruder_8cpp_source.html">Extruder</a>: extrude a low-dimensional mesh into a higher dimension
|
||||
* - <a class="el" href="mesh-explorer_8cpp_source.html">Mesh Explorer</a>: visualize and manipulate meshes
|
||||
* - <a class="el" href="mesh-optimizer_8cpp_source.html">Mesh Optimizer</a>: optimize high-order meshes, <a class="el" href="mesh-optimizer_8cpp_source.html">serial</a> and <a class="el" href="pmesh-optimizer_8cpp_source.html">parallel</a> versions
|
||||
* - <a class="el" href="display-basis_8cpp_source.html">Display Basis</a>: visualize finite element basis functions
|
||||
|
||||
@@ -26,8 +26,6 @@ list(APPEND ALL_EXE_SRCS
|
||||
ex17.cpp
|
||||
ex18.cpp
|
||||
ex19.cpp
|
||||
ex20.cpp
|
||||
ex22.cpp
|
||||
)
|
||||
|
||||
if (MFEM_USE_MPI)
|
||||
@@ -51,8 +49,6 @@ if (MFEM_USE_MPI)
|
||||
ex17p.cpp
|
||||
ex18p.cpp
|
||||
ex19p.cpp
|
||||
ex20p.cpp
|
||||
ex22p.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -79,7 +75,7 @@ foreach(SRC_FILE ${ALL_EXE_SRCS})
|
||||
COMMAND ${TEST_NAME} ${THIS_TEST_OPTIONS})
|
||||
else()
|
||||
add_test(NAME ${TEST_NAME}_np=4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MFEM_MPI_NP}
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${THIS_TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
|
||||
+2
-7
@@ -4,18 +4,13 @@
|
||||
//
|
||||
// Sample runs: ex1 -m ../data/square-disc.mesh
|
||||
// ex1 -m ../data/star.mesh
|
||||
// ex1 -m ../data/star-mixed.mesh
|
||||
// ex1 -m ../data/escher.mesh
|
||||
// ex1 -m ../data/fichera.mesh
|
||||
// ex1 -m ../data/fichera-mixed.mesh
|
||||
// ex1 -m ../data/toroid-wedge.mesh
|
||||
// ex1 -m ../data/square-disc-p2.vtk -o 2
|
||||
// ex1 -m ../data/square-disc-p3.mesh -o 3
|
||||
// ex1 -m ../data/square-disc-nurbs.mesh -o -1
|
||||
// ex1 -m ../data/star-mixed-p2.mesh -o 2
|
||||
// ex1 -m ../data/disc-nurbs.mesh -o -1
|
||||
// ex1 -m ../data/pipe-nurbs.mesh -o -1
|
||||
// ex1 -m ../data/fichera-mixed-p2.mesh -o 2
|
||||
// ex1 -m ../data/star-surf.mesh
|
||||
// ex1 -m ../data/square-disc-surf.mesh
|
||||
// ex1 -m ../data/inline-segment.mesh
|
||||
@@ -85,8 +80,8 @@ int main(int argc, char *argv[])
|
||||
// largest number that gives a final mesh with no more than 50,000
|
||||
// elements.
|
||||
{
|
||||
int ref_levels =
|
||||
(int)floor(log(50000./mesh->GetNE())/log(2.)/dim);
|
||||
int ref_levels = 0;
|
||||
//(int)floor(log(50000./mesh->GetNE())/log(2.)/dim);
|
||||
for (int l = 0; l < ref_levels; l++)
|
||||
{
|
||||
mesh->UniformRefinement();
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// ex10 -m ../data/beam-tri.mesh -s 3 -r 2 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-hex.mesh -s 2 -r 1 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-tet.mesh -s 2 -r 1 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-wedge.mesh -s 2 -r 1 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-quad.mesh -s 14 -r 2 -o 2 -dt 0.03 -vs 20
|
||||
// ex10 -m ../data/beam-hex.mesh -s 14 -r 1 -o 2 -dt 0.05 -vs 20
|
||||
// ex10 -m ../data/beam-quad-amr.mesh -s 3 -r 2 -o 2 -dt 3
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// mpirun -np 4 ex10p -m ../data/beam-tri.mesh -s 3 -rs 2 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-hex.mesh -s 2 -rs 1 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-tet.mesh -s 2 -rs 1 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-wedge.mesh -s 2 -rs 1 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-quad.mesh -s 14 -rs 2 -dt 0.03 -vs 20
|
||||
// mpirun -np 4 ex10p -m ../data/beam-hex.mesh -s 14 -rs 1 -dt 0.05 -vs 20
|
||||
// mpirun -np 4 ex10p -m ../data/beam-quad-amr.mesh -s 3 -rs 2 -dt 3
|
||||
|
||||
@@ -4,11 +4,8 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex11p -m ../data/square-disc.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/star.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/star-mixed.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/toroid-wedge.mesh -o 2
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-p2.vtk -o 2
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-p3.mesh -o 3
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-nurbs.mesh -o -1
|
||||
@@ -18,11 +15,6 @@
|
||||
// mpirun -np 4 ex11p -m ../data/star-surf.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-surf.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-segment.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-quad.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-tri.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-hex.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-tet.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-wedge.mesh -s 83
|
||||
// mpirun -np 4 ex11p -m ../data/amr-quad.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/amr-hex.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/mobius-strip.mesh -n 8
|
||||
|
||||
+2
-3
@@ -5,10 +5,9 @@
|
||||
// Sample runs:
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tri.mesh
|
||||
// mpirun -np 4 ex12p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tet.mesh -s 79 -n 10 -o 2 -elast
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tet.mesh -n 10 -o 2 -elast
|
||||
// mpirun -np 4 ex12p -m ../data/beam-hex.mesh -s 3876
|
||||
// mpirun -np 4 ex12p -m ../data/beam-wedge.mesh -s 79
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tri.mesh -s 3876 -o 2 -sys
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tri.mesh -o 2 -sys
|
||||
// mpirun -np 4 ex12p -m ../data/beam-quad.mesh -s 4526 -n 6 -o 3 -elast
|
||||
// mpirun -np 4 ex12p -m ../data/beam-quad-nurbs.mesh
|
||||
// mpirun -np 4 ex12p -m ../data/beam-hex-nurbs.mesh
|
||||
|
||||
@@ -4,10 +4,8 @@
|
||||
//
|
||||
// Sample runs: ex14 -m ../data/inline-quad.mesh -o 0
|
||||
// ex14 -m ../data/star.mesh -r 4 -o 2
|
||||
// ex14 -m ../data/star-mixed.mesh -r 4 -o 2
|
||||
// ex14 -m ../data/escher.mesh -s 1
|
||||
// ex14 -m ../data/fichera.mesh -s 1 -k 1
|
||||
// ex14 -m ../data/fichera-mixed.mesh -s 1 -k 1
|
||||
// ex14 -m ../data/square-disc-p2.vtk -r 3 -o 2
|
||||
// ex14 -m ../data/square-disc-p3.mesh -r 2 -o 3
|
||||
// ex14 -m ../data/square-disc-nurbs.mesh -o 1
|
||||
|
||||
@@ -4,10 +4,8 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex14p -m ../data/inline-quad.mesh -o 0
|
||||
// mpirun -np 4 ex14p -m ../data/star.mesh -o 2
|
||||
// mpirun -np 4 ex14p -m ../data/star-mixed.mesh -o 2
|
||||
// mpirun -np 4 ex14p -m ../data/escher.mesh -s 1
|
||||
// mpirun -np 4 ex14p -m ../data/fichera.mesh -s 1 -k 1
|
||||
// mpirun -np 4 ex14p -m ../data/fichera-mixed.mesh -s 1 -k 1
|
||||
// mpirun -np 4 ex14p -m ../data/square-disc-p2.vtk -o 2
|
||||
// mpirun -np 4 ex14p -m ../data/square-disc-p3.mesh -o 3
|
||||
// mpirun -np 4 ex14p -m ../data/square-disc-nurbs.mesh -o 1
|
||||
|
||||
@@ -135,8 +135,6 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
mesh.UniformRefinement();
|
||||
}
|
||||
// Make sure tet-only meshes are marked for local refinement.
|
||||
mesh.Finalize(true);
|
||||
|
||||
// 4. All boundary attributes will be used for essential (Dirichlet) BC.
|
||||
MFEM_VERIFY(mesh.bdr_attributes.Size() > 0,
|
||||
|
||||
@@ -151,8 +151,6 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
mesh->UniformRefinement();
|
||||
}
|
||||
// Make sure tet-only meshes are marked for local refinement.
|
||||
mesh->Finalize(true);
|
||||
|
||||
// 5. Define a parallel mesh by partitioning the serial mesh. Once the
|
||||
// parallel mesh is defined, the serial mesh can be deleted.
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
// ex16 -s 3 -a 0.5 -k 0.5 -o 4
|
||||
// ex16 -s 14 -dt 1.0e-4 -tf 4.0e-2 -vs 40
|
||||
// ex16 -m ../data/fichera-q2.mesh
|
||||
// ex16 -m ../data/fichera-mixed.mesh
|
||||
// ex16 -m ../data/escher.mesh
|
||||
// ex16 -m ../data/beam-tet.mesh -tf 10 -dt 0.1
|
||||
// ex16 -m ../data/amr-quad.mesh -o 4 -r 0
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
// mpirun -np 8 ex16p -s 3 -a 0.5 -k 0.5 -o 4
|
||||
// mpirun -np 4 ex16p -s 14 -dt 1.0e-4 -tf 4.0e-2 -vs 40
|
||||
// mpirun -np 16 ex16p -m ../data/fichera-q2.mesh
|
||||
// mpirun -np 16 ex16p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 16 ex16p -m ../data/escher-p2.mesh
|
||||
// mpirun -np 8 ex16p -m ../data/beam-tet.mesh -tf 10 -dt 0.1
|
||||
// mpirun -np 4 ex16p -m ../data/amr-quad.mesh -o 4 -rs 0 -rp 0
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
// ex17 -m ../data/beam-quad.mesh
|
||||
// ex17 -m ../data/beam-tet.mesh
|
||||
// ex17 -m ../data/beam-hex.mesh
|
||||
// ex17 -m ../data/beam-wedge.mesh
|
||||
// ex17 -m ../data/beam-quad.mesh -r 2 -o 3
|
||||
// ex17 -m ../data/beam-quad.mesh -r 2 -o 2 -a 1 -k 1
|
||||
// ex17 -m ../data/beam-hex.mesh -r 2 -o 2
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
// mpirun -np 4 ex17p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-wedge.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-quad.mesh -rs 2 -rp 2 -o 3 -elast
|
||||
// mpirun -np 4 ex17p -m ../data/beam-quad.mesh -rs 2 -rp 3 -o 2 -a 1 -k 1
|
||||
// mpirun -np 4 ex17p -m ../data/beam-hex.mesh -rs 2 -rp 1 -o 2
|
||||
|
||||
+2
-1
@@ -509,7 +509,8 @@ bool StateIsPhysical(const Vector &state, const int dim)
|
||||
// Initial condition
|
||||
void InitialCondition(const Vector &x, Vector &y)
|
||||
{
|
||||
MFEM_ASSERT(x.Size() == 2, "");
|
||||
const int dim = x.Size();
|
||||
MFEM_ASSERT(dim == 2, "");
|
||||
|
||||
double radius = 0, Minf = 0, beta = 0;
|
||||
if (problem == 1)
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// ex19 -m ../data/beam-tri.mesh
|
||||
// ex19 -m ../data/beam-hex.mesh
|
||||
// ex19 -m ../data/beam-tet.mesh
|
||||
// ex19 -m ../data/beam-wedge.mesh
|
||||
//
|
||||
// Description: This examples solves a quasi-static incompressible nonlinear
|
||||
// elasticity problem of the form 0 = H(x), where H is an
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// mpirun -np 2 ex19p -m ../data/beam-tri.mesh
|
||||
// mpirun -np 2 ex19p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 2 ex19p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 2 ex19p -m ../data/beam-wedge.mesh
|
||||
//
|
||||
// Description: This examples solves a quasi-static incompressible nonlinear
|
||||
// elasticity problem of the form 0 = H(x), where H is an
|
||||
|
||||
@@ -4,19 +4,14 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex1p -m ../data/square-disc.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/star.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/star-mixed.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/toroid-wedge.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-p2.vtk -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-p3.mesh -o 3
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-nurbs.mesh -o -1
|
||||
// mpirun -np 4 ex1p -m ../data/star-mixed-p2.mesh -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/disc-nurbs.mesh -o -1
|
||||
// mpirun -np 4 ex1p -m ../data/pipe-nurbs.mesh -o -1
|
||||
// mpirun -np 4 ex1p -m ../data/ball-nurbs.mesh -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/fichera-mixed-p2.mesh -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/star-surf.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-surf.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/inline-segment.mesh
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
// ex2 -m ../data/beam-quad.mesh
|
||||
// ex2 -m ../data/beam-tet.mesh
|
||||
// ex2 -m ../data/beam-hex.mesh
|
||||
// ex2 -m ../data/beam-wedge.mesh
|
||||
// ex2 -m ../data/beam-quad.mesh -o 3 -sc
|
||||
// ex2 -m ../data/beam-quad-nurbs.mesh
|
||||
// ex2 -m ../data/beam-hex-nurbs.mesh
|
||||
|
||||
@@ -1,298 +0,0 @@
|
||||
// MFEM Example 20
|
||||
//
|
||||
// Compile with: make ex20
|
||||
//
|
||||
// Sample runs: ex20
|
||||
//
|
||||
// Description: This example demonstrates the use of the variable order,
|
||||
// symplectic ODE integration algorithm. Symplectic integration
|
||||
// algorithms are designed to conserve energy when integrating, in
|
||||
// time, systems of ODEs which are derived from Hamiltonian
|
||||
// systems.
|
||||
//
|
||||
// Hamiltonian systems define the energy of a system as a function
|
||||
// of time (t), a set of generalized coordinates (q), and their
|
||||
// corresponding generalized momenta (p).
|
||||
//
|
||||
// H(q,p,t) = T(p) + V(q,t)
|
||||
//
|
||||
// Hamilton's equations then specify how q and p evolve in time:
|
||||
//
|
||||
// dq/dt = dH/dp
|
||||
// dp/dt = -dH/dq
|
||||
//
|
||||
// To use the symplectic integration classes we need to define an
|
||||
// mfem::Operator P which evaluates the action of dH/dp, and an
|
||||
// mfem::TimeDependentOperator F which computes -dH/dq.
|
||||
//
|
||||
// This example offers five simple 1D Hamiltonians:
|
||||
// 0) Simple Harmonic Oscillator (mass on a spring)
|
||||
// H = ( p^2 / m + q^2 / k ) / 2
|
||||
// 1) Pendulum
|
||||
// H = ( p^2 / m - k ( 1 - cos(q) ) ) / 2
|
||||
// 2) Gaussian Potential Well
|
||||
// H = ( p^2 / m ) / 2 - k exp(-q^2 / 2)
|
||||
// 3) Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 + q^2 ) q^2 ) / 2
|
||||
// 4) Negative Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 - q^2 /8 ) q^2 ) / 2
|
||||
//
|
||||
// In all cases these Hamiltonians are shifted by constant values
|
||||
// so that the energy will remain positive. The mean and standard
|
||||
// deviation of the computed energies at each time step are
|
||||
// displayed upon completion.
|
||||
//
|
||||
// We then use GLVis to visualize the results in a non-standard way
|
||||
// by defining the axes to be q, p, and t rather than x, y, and z.
|
||||
// In this space we build a ribbon-like mesh with nodes at (0,0,t)
|
||||
// and (q,p,t). Finally we plot the energy as a function of time
|
||||
// as a scalar field on this ribbon-like mesh.
|
||||
//
|
||||
// For a more traditional plot of the results, including q, p, and
|
||||
// H, can be obtained by selecting the "-gp" option. This creates
|
||||
// a data file and input deck for the GnuPlot application (not
|
||||
// included with MFEM). To visualize these results on most Linux
|
||||
// systems type the command "gnuplot gnuplot_ex20.inp". The data
|
||||
// file, named "ex20.dat", should be simple enough to display with
|
||||
// other plotting programs as well.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
// Constants used in the Hamiltonian
|
||||
static int prob_ = 0;
|
||||
static double m_ = 1.0;
|
||||
static double k_ = 1.0;
|
||||
|
||||
// Hamiltonian functional, see below for implementation
|
||||
double hamiltonian(double q, double p, double t);
|
||||
|
||||
class GradT : public Operator
|
||||
{
|
||||
public:
|
||||
GradT() : Operator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const { y.Set(1.0/m_, x); }
|
||||
};
|
||||
|
||||
class NegGradV : public TimeDependentOperator
|
||||
{
|
||||
public:
|
||||
NegGradV() : TimeDependentOperator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const;
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Parse command-line options.
|
||||
int order = 1;
|
||||
int nsteps = 100;
|
||||
double dt = 0.1;
|
||||
bool visualization = true;
|
||||
bool gnuplot = false;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Time integration order.");
|
||||
args.AddOption(&prob_, "-p", "--problem-type",
|
||||
"Problem Type:\n"
|
||||
"\t 0 - Simple Harmonic Oscillator\n"
|
||||
"\t 1 - Pendulum\n"
|
||||
"\t 2 - Gaussian Potential Well\n"
|
||||
"\t 3 - Quartic Potential\n"
|
||||
"\t 4 - Negative Quartic Potential");
|
||||
args.AddOption(&nsteps, "-n", "--number-of-steps",
|
||||
"Number of time steps.");
|
||||
args.AddOption(&dt, "-dt", "--time-step",
|
||||
"Time step size.");
|
||||
args.AddOption(&m_, "-m", "--mass",
|
||||
"Mass.");
|
||||
args.AddOption(&k_, "-k", "--spring-const",
|
||||
"Spring constant.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&gnuplot, "-gp", "--gnuplot", "-no-gp", "--no-gnuplot",
|
||||
"Enable or disable GnuPlot visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
return 1;
|
||||
}
|
||||
args.PrintOptions(cout);
|
||||
|
||||
// 2. Create and Initialize the Symplectic Integration Solver
|
||||
SIAVSolver siaSolver(order);
|
||||
GradT P;
|
||||
NegGradV F;
|
||||
siaSolver.Init(P,F);
|
||||
|
||||
// 3. Set the initial conditions
|
||||
double t = 0.0;
|
||||
Vector q(1), p(1);
|
||||
Vector e(nsteps+1);
|
||||
q(0) = 0.0;
|
||||
p(0) = 1.0;
|
||||
|
||||
// 4. Prepare GnuPlot output file if needed
|
||||
ofstream ofs;
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs.open("ex20.dat");
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << endl;
|
||||
}
|
||||
|
||||
// 5. Create a Mesh for visualization in phase space
|
||||
int nverts = (visualization) ? 2*(nsteps+1) : 0;
|
||||
int nelems = (visualization) ? nsteps : 0;
|
||||
Mesh mesh(2, nverts, nelems, 0, 3);
|
||||
|
||||
int v[4];
|
||||
Vector x0(3); x0 = 0.0;
|
||||
Vector x1(3); x1 = 0.0;
|
||||
|
||||
// 6. Perform time-stepping
|
||||
double e_mean = 0.0;
|
||||
|
||||
for (int i = 0; i < nsteps; i++)
|
||||
{
|
||||
// 6a. Record initial state
|
||||
if (i == 0)
|
||||
{
|
||||
e[0] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[0];
|
||||
|
||||
if (visualization)
|
||||
{
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = 0.0;
|
||||
mesh.AddVertex(x0);
|
||||
mesh.AddVertex(x1);
|
||||
}
|
||||
}
|
||||
|
||||
// 6b. Advance the state of the system
|
||||
siaSolver.Step(q,p,t,dt);
|
||||
e[i+1] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[i+1];
|
||||
|
||||
// 6c. Record the state of the system
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << "\t" << e[i+1] << endl;
|
||||
}
|
||||
|
||||
// 6d. Add results to GLVis visualization
|
||||
if (visualization)
|
||||
{
|
||||
x0[2] = t;
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = t;
|
||||
mesh.AddVertex(x0);
|
||||
mesh.AddVertex(x1);
|
||||
v[0] = 2*i;
|
||||
v[1] = 2*(i+1);
|
||||
v[2] = 2*(i+1)+1;
|
||||
v[3] = 2*i+1;
|
||||
mesh.AddQuad(v);
|
||||
}
|
||||
}
|
||||
|
||||
// 7. Compute and display mean and standard deviation of the energy
|
||||
e_mean /= (nsteps + 1);
|
||||
double e_var = 0.0;
|
||||
for (int i=0; i<=nsteps; i++)
|
||||
{
|
||||
e_var += pow(e[i] - e_mean, 2);
|
||||
}
|
||||
e_var /= (nsteps + 1);
|
||||
double e_sd = sqrt(e_var);
|
||||
cout << endl << "Mean and standard deviation of the energy" << endl;
|
||||
cout << e_mean << "\t" << e_sd << endl;
|
||||
|
||||
// 8. Finalize the GnuPlot output
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs.close();
|
||||
|
||||
ofs.open("gnuplot_ex20.inp");
|
||||
ofs << "plot 'ex20.dat' using 1:2 w l t 'q', "
|
||||
<< "'ex20.dat' using 1:3 w l t 'p', "
|
||||
<< "'ex20.dat' using 1:4 w l t 'H'" << endl;
|
||||
ofs.close();
|
||||
}
|
||||
|
||||
// 9. Finalize the GLVis output
|
||||
if (visualization)
|
||||
{
|
||||
H1_FECollection fec(order = 1, 2);
|
||||
FiniteElementSpace fespace(&mesh, &fec);
|
||||
GridFunction energy(&fespace);
|
||||
energy = 0.0;
|
||||
for (int i = 0; i <= nsteps; i++)
|
||||
{
|
||||
energy[2*i+0] = e[i];
|
||||
energy[2*i+1] = e[i];
|
||||
}
|
||||
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sock(vishost, visport);
|
||||
sock.precision(8);
|
||||
sock << "solution\n" << mesh << energy
|
||||
<< "window_title 'Energy in Phase Space'\n"
|
||||
<< "keys\n maac\n" << "axis_labels 'q' 'p' 't'\n"<< flush;
|
||||
}
|
||||
}
|
||||
|
||||
double hamiltonian(double q, double p, double t)
|
||||
{
|
||||
double h = 1.0 - 0.5 / m_ + 0.5 * p * p / m_;
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
h += k_ * (1.0 - cos(q));
|
||||
break;
|
||||
case 2:
|
||||
h += k_ * (1.0 - exp(-0.5 * q * q));
|
||||
break;
|
||||
case 3:
|
||||
h += 0.5 * k_ * (1.0 + q * q) * q * q;
|
||||
break;
|
||||
case 4:
|
||||
h += 0.5 * k_ * (1.0 - 0.125 * q * q) * q * q;
|
||||
break;
|
||||
default:
|
||||
h += 0.5 * k_ * q * q;
|
||||
break;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
void NegGradV::Mult(const Vector &x, Vector &y) const
|
||||
{
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
y(0) = - k_* sin(x(0));
|
||||
break;
|
||||
case 2:
|
||||
y(0) = - k_ * x(0) * exp(-0.5 * x(0) * x(0));
|
||||
break;
|
||||
case 3:
|
||||
y(0) = - k_ * (1.0 + 2.0 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
case 4:
|
||||
y(0) = - k_ * (1.0 - 0.25 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
default:
|
||||
y(0) = - k_ * x(0);
|
||||
break;
|
||||
};
|
||||
}
|
||||
@@ -1,364 +0,0 @@
|
||||
// MFEM Example 20 - Parallel Version
|
||||
//
|
||||
// Compile with: make ex20p
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex20p
|
||||
//
|
||||
// Description: This example demonstrates the use of the variable order,
|
||||
// symplectic ODE integration algorithm. Symplectic integration
|
||||
// algorithms are designed to conserve energy when integrating, in
|
||||
// time, systems of ODEs which are derived from Hamiltonian
|
||||
// systems.
|
||||
//
|
||||
// Hamiltonian systems define the energy of a system as a function
|
||||
// of time (t), a set of generalized coordinates (q), and their
|
||||
// corresponding generalized momenta (p).
|
||||
//
|
||||
// H(q,p,t) = T(p) + V(q,t)
|
||||
//
|
||||
// Hamilton's equations then specify how q and p evolve in time:
|
||||
//
|
||||
// dq/dt = dH/dp
|
||||
// dp/dt = -dH/dq
|
||||
//
|
||||
// To use the symplectic integration classes we need to define an
|
||||
// mfem::Operator P which evaluates the action of dH/dp, and an
|
||||
// mfem::TimeDependentOperator F which computes -dH/dq.
|
||||
//
|
||||
// This example offers five simple 1D Hamiltonians:
|
||||
// 0) Simple Harmonic Oscillator (mass on a spring)
|
||||
// H = ( p^2 / m + q^2 / k ) / 2
|
||||
// 1) Pendulum
|
||||
// H = ( p^2 / m - k ( 1 - cos(q) ) ) / 2
|
||||
// 2) Gaussian Potential Well
|
||||
// H = ( p^2 / m ) / 2 - k exp(-q^2 / 2)
|
||||
// 3) Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 + q^2 ) q^2 ) / 2
|
||||
// 4) Negative Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 - q^2 /8 ) q^2 ) / 2
|
||||
//
|
||||
// In all cases these Hamiltonians are shifted by constant values
|
||||
// so that the energy will remain positive. The mean and standard
|
||||
// deviation of the computed energies at each time step are
|
||||
// displayed upon completion. When run in parallel the same
|
||||
// Hamiltonian system is evolved on each processor but starting
|
||||
// from different initial conditions.
|
||||
//
|
||||
// We then use GLVis to visualize the results in a non-standard way
|
||||
// by defining the axes to be q, p, and t rather than x, y, and z.
|
||||
// In this space we build a ribbon-like mesh on each processor with
|
||||
// nodes at (0,0,t) and (q,p,t). When these ribbons are bonded
|
||||
// together on the t-axis they resemble a Rotini pasta. Finally we
|
||||
// plot the energy as a function of time as a scalar field on this
|
||||
// Rotini-like mesh.
|
||||
//
|
||||
// For a more traditional plot of the results, including q, p, and
|
||||
// H from each processor, can be obtained by selecting the "-gp"
|
||||
// option. This creates a collection of data files and an input
|
||||
// deck for the GnuPlot application (not included with MFEM). To
|
||||
// visualize these results on most linux systems type the command
|
||||
// "gnuplot gnuplot_ex20p.inp". The data files, named
|
||||
// "ex20p_?????.dat", should be simple enough to display with other
|
||||
// plotting programs as well.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
// Constants used in the Hamiltonian
|
||||
static int prob_ = 0;
|
||||
static double m_ = 1.0;
|
||||
static double k_ = 1.0;
|
||||
|
||||
// Hamiltonian functional, see below for implementation
|
||||
double hamiltonian(double q, double p, double t);
|
||||
|
||||
class GradT : public Operator
|
||||
{
|
||||
public:
|
||||
GradT() : Operator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const { y.Set(1.0/m_, x); }
|
||||
};
|
||||
|
||||
class NegGradV : public TimeDependentOperator
|
||||
{
|
||||
public:
|
||||
NegGradV() : TimeDependentOperator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const;
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Initialize MPI.
|
||||
int num_procs, myid;
|
||||
MPI_Comm comm = MPI_COMM_WORLD;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(comm, &num_procs);
|
||||
MPI_Comm_rank(comm, &myid);
|
||||
|
||||
// 2. Parse command-line options.
|
||||
int order = 1;
|
||||
int nsteps = 100;
|
||||
double dt = 0.1;
|
||||
bool visualization = true;
|
||||
bool gnuplot = false;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Time integration order.");
|
||||
args.AddOption(&prob_, "-p", "--problem-type",
|
||||
"Problem Type:\n"
|
||||
"\t 0 - Simple Harmonic Oscillator\n"
|
||||
"\t 1 - Pendulum\n"
|
||||
"\t 2 - Gaussian Potential Well\n"
|
||||
"\t 3 - Quartic Potential\n"
|
||||
"\t 4 - Negative Quartic Potential");
|
||||
args.AddOption(&nsteps, "-n", "--number-of-steps",
|
||||
"Number of time steps.");
|
||||
args.AddOption(&dt, "-dt", "--time-step",
|
||||
"Time step size.");
|
||||
args.AddOption(&m_, "-m", "--mass",
|
||||
"Mass.");
|
||||
args.AddOption(&k_, "-k", "--spring-const",
|
||||
"Spring constant.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&gnuplot, "-gp", "--gnuplot", "-no-gp", "--no-gnuplot",
|
||||
"Enable or disable GnuPlot visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 3. Create and Initialize the Symplectic Integration Solver
|
||||
SIAVSolver siaSolver(order);
|
||||
GradT P;
|
||||
NegGradV F;
|
||||
siaSolver.Init(P,F);
|
||||
|
||||
// 4. Set the initial conditions
|
||||
double t = 0.0;
|
||||
Vector q(1), p(1);
|
||||
Vector e(nsteps+1);
|
||||
q(0) = sin(2.0*M_PI*(double)myid/num_procs);
|
||||
p(0) = cos(2.0*M_PI*(double)myid/num_procs);
|
||||
|
||||
// 5. Prepare GnuPlot output file if needed
|
||||
ostringstream oss;
|
||||
ofstream ofs;
|
||||
if (gnuplot)
|
||||
{
|
||||
oss << "ex20p_" << setfill('0') << setw(5) << myid << ".dat";
|
||||
ofs.open(oss.str().c_str());
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << endl;
|
||||
}
|
||||
|
||||
// 6. Create a Mesh for visualization in phase space
|
||||
int nverts = (visualization) ? (num_procs+1)*(nsteps+1) : 0;
|
||||
int nelems = (visualization) ? (nsteps * num_procs) : 0;
|
||||
Mesh mesh(2, nverts, nelems, 0, 3);
|
||||
|
||||
int *part = (visualization) ? (new int[nelems]) : NULL;
|
||||
int v[4];
|
||||
Vector x0(3); x0 = 0.0;
|
||||
Vector x1(3); x1 = 0.0;
|
||||
|
||||
// 7. Perform time-stepping
|
||||
double e_mean = 0.0;
|
||||
|
||||
for (int i = 0; i < nsteps; i++)
|
||||
{
|
||||
// 7a. Record initial state
|
||||
if (i == 0)
|
||||
{
|
||||
e[0] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[0];
|
||||
|
||||
if (visualization)
|
||||
{
|
||||
mesh.AddVertex(x0);
|
||||
for (int j = 0; j < num_procs; j++)
|
||||
{
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = 0.0;
|
||||
mesh.AddVertex(x1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 7b. Advance the state of the system
|
||||
siaSolver.Step(q,p,t,dt);
|
||||
e[i+1] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[i+1];
|
||||
|
||||
// 7c. Record the state of the system
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << "\t" << e[i+1] << endl;
|
||||
}
|
||||
|
||||
// 7d. Add results to GLVis visualization
|
||||
if (visualization)
|
||||
{
|
||||
x0[2] = t;
|
||||
mesh.AddVertex(x0);
|
||||
for (int j = 0; j < num_procs; j++)
|
||||
{
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = t;
|
||||
mesh.AddVertex(x1);
|
||||
v[0] = (num_procs + 1) * i;
|
||||
v[1] = (num_procs + 1) * (i + 1);
|
||||
v[2] = (num_procs + 1) * (i + 1) + j + 1;
|
||||
v[3] = (num_procs + 1) * i + j + 1;
|
||||
mesh.AddQuad(v);
|
||||
part[num_procs * i + j] = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 8. Compute and display mean and standard deviation of the energy
|
||||
e_mean /= (nsteps + 1);
|
||||
double e_var = 0.0;
|
||||
for (int i = 0; i <= nsteps; i++)
|
||||
{
|
||||
e_var += pow(e[i] - e_mean, 2);
|
||||
}
|
||||
e_var /= (nsteps + 1);
|
||||
double e_sd = sqrt(e_var);
|
||||
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << endl << "Mean and standard deviation of the energy" << endl;
|
||||
}
|
||||
for (int i = 0; i < num_procs; i++)
|
||||
{
|
||||
if (myid == i)
|
||||
{
|
||||
cout << myid << ": " << e_mean << "\t" << e_sd << endl;
|
||||
}
|
||||
MPI_Barrier(comm);
|
||||
}
|
||||
|
||||
// 9. Finalize the GnuPlot output
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs.close();
|
||||
if (myid == 0)
|
||||
{
|
||||
ofs.open("gnuplot_ex20p.inp");
|
||||
for (int i = 0; i < num_procs; i++)
|
||||
{
|
||||
ostringstream ossi;
|
||||
ossi << "ex20p_" << setfill('0') << setw(5) << i << ".dat";
|
||||
if (i == 0)
|
||||
{
|
||||
ofs << "plot";
|
||||
}
|
||||
ofs << " '" << ossi.str() << "' using 1:2 w l t 'q" << i << "',"
|
||||
<< " '" << ossi.str() << "' using 1:3 w l t 'p" << i << "',"
|
||||
<< " '" << ossi.str() << "' using 1:4 w l t 'H" << i << "'";
|
||||
if (i < num_procs-1)
|
||||
{
|
||||
ofs << ",";
|
||||
}
|
||||
else
|
||||
{
|
||||
ofs << ";" << endl;
|
||||
}
|
||||
}
|
||||
ofs.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 10. Finalize the GLVis output
|
||||
if (visualization)
|
||||
{
|
||||
mesh.FinalizeQuadMesh(1);
|
||||
ParMesh pmesh(comm, mesh, part);
|
||||
delete [] part;
|
||||
|
||||
H1_FECollection fec(order = 1, 2);
|
||||
ParFiniteElementSpace fespace(&pmesh, &fec);
|
||||
ParGridFunction energy(&fespace);
|
||||
energy = 0.0;
|
||||
for (int i = 0; i <= nsteps; i++)
|
||||
{
|
||||
energy[2*i+0] = e[i];
|
||||
energy[2*i+1] = e[i];
|
||||
}
|
||||
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sock(vishost, visport);
|
||||
sock.precision(8);
|
||||
sock << "parallel " << num_procs << " " << myid << "\n"
|
||||
<< "solution\n" << pmesh << energy
|
||||
<< "window_title 'Energy in Phase Space'\n"
|
||||
<< "keys\n maac\n" << "axis_labels 'q' 'p' 't'\n"<< flush;
|
||||
}
|
||||
|
||||
MPI_Finalize();
|
||||
}
|
||||
|
||||
double hamiltonian(double q, double p, double t)
|
||||
{
|
||||
double h = 1.0 - 0.5 / m_ + 0.5 * p * p / m_;
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
h += k_ * (1.0 - cos(q));
|
||||
break;
|
||||
case 2:
|
||||
h += k_ * (1.0 - exp(-0.5 * q * q));
|
||||
break;
|
||||
case 3:
|
||||
h += 0.5 * k_ * (1.0 + q * q) * q * q;
|
||||
break;
|
||||
case 4:
|
||||
h += 0.5 * k_ * (1.0 - 0.125 * q * q) * q * q;
|
||||
break;
|
||||
default:
|
||||
h += 0.5 * k_ * q * q;
|
||||
break;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
void NegGradV::Mult(const Vector &x, Vector &y) const
|
||||
{
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
y(0) = - k_* sin(x(0));
|
||||
break;
|
||||
case 2:
|
||||
y(0) = - k_ * x(0) * exp(-0.5 * x(0) * x(0));
|
||||
break;
|
||||
case 3:
|
||||
y(0) = - k_ * (1.0 + 2.0 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
case 4:
|
||||
y(0) = - k_ * (1.0 - 0.25 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
default:
|
||||
y(0) = - k_ * x(0);
|
||||
break;
|
||||
};
|
||||
}
|
||||
@@ -1,310 +0,0 @@
|
||||
// MFEM Example 22
|
||||
//
|
||||
// Compile with: make ex22
|
||||
//
|
||||
// Sample runs: ex22
|
||||
// ex22 -o 3
|
||||
// ex22 -m ../data/beam-quad.mesh
|
||||
// ex22 -m ../data/beam-quad.mesh -o 3
|
||||
// ex22 -m ../data/beam-quad.mesh -o 3 -f 1
|
||||
// ex22 -m ../data/beam-tet.mesh
|
||||
// ex22 -m ../data/beam-tet.mesh -o 2
|
||||
// ex22 -m ../data/beam-hex.mesh
|
||||
// ex22 -m ../data/beam-hex.mesh -o 2
|
||||
//
|
||||
// Description: This is a version of Example 2 with a simple adaptive mesh
|
||||
// refinement loop. The problem being solved is again the linear
|
||||
// elasticity describing a multi-material cantilever beam.
|
||||
// The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
// conforming and nonconforming refinements, in 2D and 3D, on
|
||||
// linear and curved meshes. Interpolation of functions from
|
||||
// coarse to fine meshes, as well as persistent GLVis
|
||||
// visualization are also illustrated.
|
||||
//
|
||||
// We recommend viewing Examples 2 and 6 before viewing this
|
||||
// example.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Parse command-line options.
|
||||
const char *mesh_file = "../data/beam-tri.mesh";
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
int flux_averaging = 0;
|
||||
bool visualization = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree).");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&flux_averaging, "-f", "--flux-averaging",
|
||||
"Flux averaging: 0 - global, 1 - by mesh attribute.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
return 1;
|
||||
}
|
||||
args.PrintOptions(cout);
|
||||
|
||||
// 2. Read the mesh from the given mesh file. We can handle triangular,
|
||||
// quadrilateral, tetrahedral, and hexahedral meshes with the same code.
|
||||
Mesh mesh(mesh_file, 1, 1);
|
||||
int dim = mesh.Dimension();
|
||||
MFEM_VERIFY(mesh.SpaceDimension() == dim, "invalid mesh");
|
||||
|
||||
if (mesh.attributes.Max() < 2 || mesh.bdr_attributes.Max() < 2)
|
||||
{
|
||||
cerr << "\nInput mesh should have at least two materials and "
|
||||
<< "two boundary attributes! (See schematic in ex2.cpp)\n"
|
||||
<< endl;
|
||||
return 3;
|
||||
}
|
||||
|
||||
// 3. Since a NURBS mesh can currently only be refined uniformly, we need to
|
||||
// convert it to a piecewise-polynomial curved mesh. First we refine the
|
||||
// NURBS mesh a bit more and then project the curvature to quadratic Nodes.
|
||||
if (mesh.NURBSext)
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
mesh.UniformRefinement();
|
||||
}
|
||||
mesh.SetCurvature(2);
|
||||
}
|
||||
|
||||
// 4. Define a finite element space on the mesh. The polynomial order is
|
||||
// one (linear) by default, but this can be changed on the command line.
|
||||
H1_FECollection fec(order, dim);
|
||||
FiniteElementSpace fespace(&mesh, &fec, dim);
|
||||
|
||||
// 5. As in Example 2, we set up the linear form b(.) which corresponds to
|
||||
// the right-hand side of the FEM linear system. In this case, b_i equals
|
||||
// the boundary integral of f*phi_i where f represents a "pull down"
|
||||
// force on the Neumann part of the boundary and phi_i are the basis
|
||||
// functions in the finite element fespace. The force is defined by the
|
||||
// VectorArrayCoefficient object f, which is a vector of Coefficient
|
||||
// objects. The fact that f is non-zero on boundary attribute 2 is
|
||||
// indicated by the use of piece-wise constants coefficient for its last
|
||||
// component. We don't assemble the discrete problem yet, this will be
|
||||
// done in the main loop.
|
||||
VectorArrayCoefficient f(dim);
|
||||
for (int i = 0; i < dim-1; i++)
|
||||
{
|
||||
f.Set(i, new ConstantCoefficient(0.0));
|
||||
}
|
||||
{
|
||||
Vector pull_force(mesh.bdr_attributes.Max());
|
||||
pull_force = 0.0;
|
||||
pull_force(1) = -1.0e-2;
|
||||
f.Set(dim-1, new PWConstCoefficient(pull_force));
|
||||
}
|
||||
|
||||
LinearForm b(&fespace);
|
||||
b.AddDomainIntegrator(new VectorBoundaryLFIntegrator(f));
|
||||
|
||||
// 6. Set up the bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the linear elasticity integrator with piece-wise
|
||||
// constants coefficient lambda and mu.
|
||||
Vector lambda(mesh.attributes.Max());
|
||||
lambda = 1.0;
|
||||
lambda(0) = lambda(1)*50;
|
||||
PWConstCoefficient lambda_func(lambda);
|
||||
Vector mu(mesh.attributes.Max());
|
||||
mu = 1.0;
|
||||
mu(0) = mu(1)*50;
|
||||
PWConstCoefficient mu_func(mu);
|
||||
|
||||
BilinearForm a(&fespace);
|
||||
BilinearFormIntegrator *integ =
|
||||
new ElasticityIntegrator(lambda_func,mu_func);
|
||||
a.AddDomainIntegrator(integ);
|
||||
if (static_cond) { a.EnableStaticCondensation(); }
|
||||
|
||||
// 7. The solution vector x and the associated finite element grid function
|
||||
// will be maintained over the AMR iterations. We initialize it to zero.
|
||||
Vector zero_vec(dim);
|
||||
zero_vec = 0.0;
|
||||
VectorConstantCoefficient zero_vec_coeff(zero_vec);
|
||||
GridFunction x(&fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 8. Determine the list of true (i.e. conforming) essential boundary dofs.
|
||||
// In this example, the boundary conditions are defined by marking only
|
||||
// boundary attribute 1 from the mesh as essential and converting it to a
|
||||
// list of true dofs. The conversion to true dofs will be done in the
|
||||
// main loop.
|
||||
Array<int> ess_bdr(mesh.bdr_attributes.Max());
|
||||
ess_bdr = 0;
|
||||
ess_bdr[0] = 1;
|
||||
|
||||
// 9. Connect to GLVis.
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock;
|
||||
if (visualization)
|
||||
{
|
||||
sol_sock.open(vishost, visport);
|
||||
sol_sock.precision(8);
|
||||
}
|
||||
|
||||
// 10. Set up an error estimator. Here we use the Zienkiewicz-Zhu estimator
|
||||
// that uses the ComputeElementFlux method of the ElasticityIntegrator to
|
||||
// recover a smoothed flux (stress) that is subtracted from the element
|
||||
// flux to get an error indicator. We need to supply the space for the
|
||||
// smoothed flux: an (H1)^tdim (i.e., vector-valued) space is used here.
|
||||
// Here, tdim represents the number of components for a symmetric (dim x
|
||||
// dim) tensor.
|
||||
const int tdim = dim*(dim+1)/2;
|
||||
FiniteElementSpace flux_fespace(&mesh, &fec, tdim);
|
||||
ZienkiewiczZhuEstimator estimator(*integ, x, flux_fespace);
|
||||
estimator.SetFluxAveraging(flux_averaging);
|
||||
|
||||
// 11. A refiner selects and refines elements based on a refinement strategy.
|
||||
// The strategy here is to refine elements with errors larger than a
|
||||
// fraction of the maximum element error. Other strategies are possible.
|
||||
// The refiner will call the given error estimator.
|
||||
ThresholdRefiner refiner(estimator);
|
||||
refiner.SetTotalErrorFraction(0.7);
|
||||
|
||||
// 12. The main AMR loop. In each iteration we solve the problem on the
|
||||
// current mesh, visualize the solution, and refine the mesh.
|
||||
const int max_dofs = 50000;
|
||||
const int max_amr_itr = 20;
|
||||
for (int it = 0; it <= max_amr_itr; it++)
|
||||
{
|
||||
int cdofs = fespace.GetTrueVSize();
|
||||
cout << "\nAMR iteration " << it << endl;
|
||||
cout << "Number of unknowns: " << cdofs << endl;
|
||||
|
||||
// 13. Assemble the stiffness matrix and the right-hand side.
|
||||
a.Assemble();
|
||||
b.Assemble();
|
||||
|
||||
// 14. Set Dirichlet boundary values in the GridFunction x.
|
||||
// Determine the list of Dirichlet true DOFs in the linear system.
|
||||
Array<int> ess_tdof_list;
|
||||
x.ProjectBdrCoefficient(zero_vec_coeff, ess_bdr);
|
||||
fespace.GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
|
||||
// 15. Create the linear system: eliminate boundary conditions, constrain
|
||||
// hanging nodes and possibly apply other transformations. The system
|
||||
// will be solved for true (unconstrained) DOFs only.
|
||||
SparseMatrix A;
|
||||
Vector B, X;
|
||||
const int copy_interior = 1;
|
||||
a.FormLinearSystem(ess_tdof_list, x, b, A, X, B, copy_interior);
|
||||
|
||||
#ifndef MFEM_USE_SUITESPARSE
|
||||
// 16. Define a simple symmetric Gauss-Seidel preconditioner and use it to
|
||||
// solve the linear system with PCG.
|
||||
GSSmoother M(A);
|
||||
PCG(A, M, B, X, 3, 2000, 1e-12, 0.0);
|
||||
#else
|
||||
// 16. If MFEM was compiled with SuiteSparse, use UMFPACK to solve the
|
||||
// the linear system.
|
||||
UMFPackSolver umf_solver;
|
||||
umf_solver.Control[UMFPACK_ORDERING] = UMFPACK_ORDERING_METIS;
|
||||
umf_solver.SetOperator(A);
|
||||
umf_solver.Mult(B, X);
|
||||
#endif
|
||||
|
||||
// 17. After solving the linear system, reconstruct the solution as a
|
||||
// finite element GridFunction. Constrained nodes are interpolated
|
||||
// from true DOFs (it may therefore happen that x.Size() >= X.Size()).
|
||||
a.RecoverFEMSolution(X, b, x);
|
||||
|
||||
// 18. Send solution by socket to the GLVis server.
|
||||
if (visualization && sol_sock.good())
|
||||
{
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
mesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
x.Neg(); // visualize the backward displacement
|
||||
sol_sock << "solution\n" << mesh << x << flush;
|
||||
x.Neg();
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
if (it == 0)
|
||||
{
|
||||
sol_sock << "keys '" << ((dim == 2) ? "Rjl" : "") << "m'" << endl;
|
||||
}
|
||||
sol_sock << "window_title 'AMR iteration: " << it << "'\n"
|
||||
<< "pause" << endl;
|
||||
cout << "Visualization paused. "
|
||||
"Press <space> in the GLVis window to continue." << endl;
|
||||
}
|
||||
|
||||
if (cdofs > max_dofs)
|
||||
{
|
||||
cout << "Reached the maximum number of dofs. Stop." << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
// 19. Call the refiner to modify the mesh. The refiner calls the error
|
||||
// estimator to obtain element errors, then it selects elements to be
|
||||
// refined and finally it modifies the mesh. The Stop() method can be
|
||||
// used to determine if a stopping criterion was met.
|
||||
refiner.Apply(mesh);
|
||||
if (refiner.Stop())
|
||||
{
|
||||
cout << "Stopping criterion satisfied. Stop." << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
// 20. Update the space to reflect the new state of the mesh. Also,
|
||||
// interpolate the solution x so that it lies in the new space but
|
||||
// represents the same function. This saves solver iterations later
|
||||
// since we'll have a good initial guess of x in the next step.
|
||||
// Internally, FiniteElementSpace::Update() calculates an
|
||||
// interpolation matrix which is then used by GridFunction::Update().
|
||||
fespace.Update();
|
||||
x.Update();
|
||||
|
||||
// 21. Inform also the bilinear and linear forms that the space has
|
||||
// changed.
|
||||
a.Update();
|
||||
b.Update();
|
||||
}
|
||||
|
||||
{
|
||||
ofstream mesh_ref_out("ex22_reference.mesh");
|
||||
mesh_ref_out.precision(16);
|
||||
mesh.Print(mesh_ref_out);
|
||||
|
||||
ofstream mesh_out("ex22_deformed.mesh");
|
||||
mesh_out.precision(16);
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
mesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
mesh.Print(mesh_out);
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
|
||||
ofstream x_out("ex22_displacement.sol");
|
||||
x_out.precision(16);
|
||||
x.Save(x_out);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,366 +0,0 @@
|
||||
// MFEM Example 22
|
||||
//
|
||||
// Compile with: make ex22p
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex22p
|
||||
// mpirun -np 4 ex22p -o 3
|
||||
// mpirun -np 4 ex22p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex22p -m ../data/beam-quad.mesh -o 3
|
||||
// mpirun -np 4 ex22p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex22p -m ../data/beam-tet.mesh -o 2
|
||||
// mpirun -np 4 ex22p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex22p -m ../data/beam-hex.mesh -o 2
|
||||
//
|
||||
// Description: This is a version of Example 2p with a simple adaptive mesh
|
||||
// refinement loop. The problem being solved is again the linear
|
||||
// elasticity describing a multi-material cantilever beam.
|
||||
// The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
// conforming and nonconforming refinements, in 2D and 3D, on
|
||||
// linear and curved meshes. Interpolation of functions from
|
||||
// coarse to fine meshes, as well as persistent GLVis
|
||||
// visualization are also illustrated.
|
||||
//
|
||||
// We recommend viewing Examples 2p and 6p before viewing this
|
||||
// example.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 0. Initialize MPI.
|
||||
int num_procs, myid;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
|
||||
|
||||
// 1. Parse command-line options.
|
||||
const char *mesh_file = "../data/beam-tri.mesh";
|
||||
int serial_ref_levels = 0;
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
bool visualization = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&serial_ref_levels, "-rs", "--refine-serial",
|
||||
"Number of uniform serial refinements (before parallel"
|
||||
" partitioning)");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree).");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 2. Read the mesh from the given mesh file. We can handle triangular,
|
||||
// quadrilateral, tetrahedral, and hexahedral meshes with the same code.
|
||||
Mesh mesh(mesh_file, 1, 1);
|
||||
int dim = mesh.Dimension();
|
||||
MFEM_VERIFY(mesh.SpaceDimension() == dim, "invalid mesh");
|
||||
|
||||
if (mesh.attributes.Max() < 2 || mesh.bdr_attributes.Max() < 2)
|
||||
{
|
||||
cerr << "\nInput mesh should have at least two materials and "
|
||||
<< "two boundary attributes! (See schematic in ex2.cpp)\n"
|
||||
<< endl;
|
||||
MPI_Finalize();
|
||||
return 3;
|
||||
}
|
||||
|
||||
// 3. Refine the mesh before parallel partitioning. Since a NURBS mesh can
|
||||
// currently only be refined uniformly, we need to convert it to a
|
||||
// piecewise-polynomial curved mesh. First we refine the NURBS mesh a bit
|
||||
// more and then project the curvature to quadratic Nodes.
|
||||
if (mesh.NURBSext && serial_ref_levels == 0)
|
||||
{
|
||||
serial_ref_levels = 2;
|
||||
}
|
||||
for (int i = 0; i < serial_ref_levels; i++)
|
||||
{
|
||||
mesh.UniformRefinement();
|
||||
}
|
||||
if (mesh.NURBSext)
|
||||
{
|
||||
mesh.SetCurvature(2);
|
||||
}
|
||||
mesh.EnsureNCMesh();
|
||||
|
||||
ParMesh pmesh(MPI_COMM_WORLD, mesh);
|
||||
mesh.Clear();
|
||||
|
||||
// 4. Define a finite element space on the mesh. The polynomial order is
|
||||
// one (linear) by default, but this can be changed on the command line.
|
||||
H1_FECollection fec(order, dim);
|
||||
ParFiniteElementSpace fespace(&pmesh, &fec, dim);
|
||||
|
||||
// 5. As in Example 2, we set up the linear form b(.) which corresponds to
|
||||
// the right-hand side of the FEM linear system. In this case, b_i equals
|
||||
// the boundary integral of f*phi_i where f represents a "pull down"
|
||||
// force on the Neumann part of the boundary and phi_i are the basis
|
||||
// functions in the finite element fespace. The force is defined by the
|
||||
// VectorArrayCoefficient object f, which is a vector of Coefficient
|
||||
// objects. The fact that f is non-zero on boundary attribute 2 is
|
||||
// indicated by the use of piece-wise constants coefficient for its last
|
||||
// component. We don't assemble the discrete problem yet, this will be
|
||||
// done in the main loop.
|
||||
VectorArrayCoefficient f(dim);
|
||||
for (int i = 0; i < dim-1; i++)
|
||||
{
|
||||
f.Set(i, new ConstantCoefficient(0.0));
|
||||
}
|
||||
{
|
||||
Vector pull_force(pmesh.bdr_attributes.Max());
|
||||
pull_force = 0.0;
|
||||
pull_force(1) = -1.0e-2;
|
||||
f.Set(dim-1, new PWConstCoefficient(pull_force));
|
||||
}
|
||||
|
||||
ParLinearForm b(&fespace);
|
||||
b.AddDomainIntegrator(new VectorBoundaryLFIntegrator(f));
|
||||
|
||||
// 6. Set up the bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the linear elasticity integrator with piece-wise
|
||||
// constants coefficient lambda and mu.
|
||||
Vector lambda(pmesh.attributes.Max());
|
||||
lambda = 1.0;
|
||||
lambda(0) = lambda(1)*50;
|
||||
PWConstCoefficient lambda_func(lambda);
|
||||
Vector mu(pmesh.attributes.Max());
|
||||
mu = 1.0;
|
||||
mu(0) = mu(1)*50;
|
||||
PWConstCoefficient mu_func(mu);
|
||||
|
||||
ParBilinearForm a(&fespace);
|
||||
BilinearFormIntegrator *integ =
|
||||
new ElasticityIntegrator(lambda_func,mu_func);
|
||||
a.AddDomainIntegrator(integ);
|
||||
if (static_cond) { a.EnableStaticCondensation(); }
|
||||
|
||||
// 7. The solution vector x and the associated finite element grid function
|
||||
// will be maintained over the AMR iterations. We initialize it to zero.
|
||||
Vector zero_vec(dim);
|
||||
zero_vec = 0.0;
|
||||
VectorConstantCoefficient zero_vec_coeff(zero_vec);
|
||||
ParGridFunction x(&fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 8. Determine the list of true (i.e. conforming) essential boundary dofs.
|
||||
// In this example, the boundary conditions are defined by marking only
|
||||
// boundary attribute 1 from the mesh as essential and converting it to a
|
||||
// list of true dofs. The conversion to true dofs will be done in the
|
||||
// main loop.
|
||||
Array<int> ess_bdr(pmesh.bdr_attributes.Max());
|
||||
ess_bdr = 0;
|
||||
ess_bdr[0] = 1;
|
||||
|
||||
// 9. GLVis visualization.
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock;
|
||||
|
||||
// 10. Set up an error estimator. Here we use the Zienkiewicz-Zhu estimator
|
||||
// that uses the ComputeElementFlux method of the ElasticityIntegrator to
|
||||
// recover a smoothed flux (stress) that is subtracted from the element
|
||||
// flux to get an error indicator. We need to supply the space for the
|
||||
// smoothed flux: an (H1)^tdim (i.e., vector-valued) space is used here.
|
||||
// Here, tdim represents the number of components for a symmetric (dim x
|
||||
// dim) tensor.
|
||||
const int tdim = dim*(dim+1)/2;
|
||||
L2_FECollection flux_fec(order, dim);
|
||||
ParFiniteElementSpace flux_fespace(&pmesh, &flux_fec, tdim);
|
||||
ParFiniteElementSpace smooth_flux_fespace(&pmesh, &fec, tdim);
|
||||
L2ZienkiewiczZhuEstimator estimator(*integ, x, flux_fespace,
|
||||
smooth_flux_fespace);
|
||||
|
||||
// 11. A refiner selects and refines elements based on a refinement strategy.
|
||||
// The strategy here is to refine elements with errors larger than a
|
||||
// fraction of the maximum element error. Other strategies are possible.
|
||||
// The refiner will call the given error estimator.
|
||||
ThresholdRefiner refiner(estimator);
|
||||
refiner.SetTotalErrorFraction(0.7);
|
||||
|
||||
// 12. The main AMR loop. In each iteration we solve the problem on the
|
||||
// current mesh, visualize the solution, and refine the mesh.
|
||||
const int max_dofs = 50000;
|
||||
const int max_amr_itr = 20;
|
||||
for (int it = 0; it <= max_amr_itr; it++)
|
||||
{
|
||||
HYPRE_Int global_dofs = fespace.GlobalTrueVSize();
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "\nAMR iteration " << it << endl;
|
||||
cout << "Number of unknowns: " << global_dofs << endl;
|
||||
}
|
||||
|
||||
// 13. Assemble the stiffness matrix and the right-hand side.
|
||||
a.Assemble();
|
||||
b.Assemble();
|
||||
|
||||
// 14. Set Dirichlet boundary values in the GridFunction x.
|
||||
// Determine the list of Dirichlet true DOFs in the linear system.
|
||||
Array<int> ess_tdof_list;
|
||||
x.ProjectBdrCoefficient(zero_vec_coeff, ess_bdr);
|
||||
fespace.GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
|
||||
// 15. Create the linear system: eliminate boundary conditions, constrain
|
||||
// hanging nodes and possibly apply other transformations. The system
|
||||
// will be solved for true (unconstrained) DOFs only.
|
||||
|
||||
HypreParMatrix A;
|
||||
Vector B, X;
|
||||
const int copy_interior = 1;
|
||||
a.FormLinearSystem(ess_tdof_list, x, b, A, X, B, copy_interior);
|
||||
|
||||
// 16. Define and apply a parallel PCG solver for AX=B with the BoomerAMG
|
||||
// preconditioner from hypre.
|
||||
HypreBoomerAMG amg;
|
||||
amg.SetPrintLevel(0);
|
||||
// amg.SetSystemsOptions(dim); // optional
|
||||
CGSolver pcg(A.GetComm());
|
||||
pcg.SetPreconditioner(amg);
|
||||
pcg.SetOperator(A);
|
||||
pcg.SetRelTol(1e-6);
|
||||
pcg.SetMaxIter(500);
|
||||
pcg.SetPrintLevel(3); // print the first and the last iterations only
|
||||
pcg.Mult(B, X);
|
||||
|
||||
// 17. After solving the linear system, reconstruct the solution as a
|
||||
// finite element GridFunction. Constrained nodes are interpolated
|
||||
// from true DOFs (it may therefore happen that x.Size() >= X.Size()).
|
||||
a.RecoverFEMSolution(X, b, x);
|
||||
|
||||
// 18. Send solution by socket to the GLVis server.
|
||||
if (visualization && it == 0)
|
||||
{
|
||||
sol_sock.open(vishost, visport);
|
||||
sol_sock.precision(8);
|
||||
}
|
||||
if (visualization && sol_sock.good())
|
||||
{
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
pmesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
x.Neg(); // visualize the backward displacement
|
||||
sol_sock << "parallel " << num_procs << ' ' << myid << '\n';
|
||||
sol_sock << "solution\n" << pmesh << x << flush;
|
||||
x.Neg();
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
if (it == 0)
|
||||
{
|
||||
sol_sock << "keys '" << ((dim == 2) ? "Rjl" : "") << "m'" << endl;
|
||||
}
|
||||
sol_sock << "window_title 'AMR iteration: " << it << "'\n"
|
||||
<< "pause" << endl;
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Visualization paused. "
|
||||
"Press <space> in the GLVis window to continue." << endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (global_dofs > max_dofs)
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Reached the maximum number of dofs. Stop." << endl;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 19. Call the refiner to modify the mesh. The refiner calls the error
|
||||
// estimator to obtain element errors, then it selects elements to be
|
||||
// refined and finally it modifies the mesh. The Stop() method can be
|
||||
// used to determine if a stopping criterion was met.
|
||||
refiner.Apply(pmesh);
|
||||
if (refiner.Stop())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Stopping criterion satisfied. Stop." << endl;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 20. Update the space to reflect the new state of the mesh. Also,
|
||||
// interpolate the solution x so that it lies in the new space but
|
||||
// represents the same function. This saves solver iterations later
|
||||
// since we'll have a good initial guess of x in the next step.
|
||||
// Internally, FiniteElementSpace::Update() calculates an
|
||||
// interpolation matrix which is then used by GridFunction::Update().
|
||||
fespace.Update();
|
||||
x.Update();
|
||||
|
||||
// 21. Load balance the mesh, and update the space and solution. Currently
|
||||
// available only for nonconforming meshes.
|
||||
if (pmesh.Nonconforming())
|
||||
{
|
||||
pmesh.Rebalance();
|
||||
|
||||
// Update the space and the GridFunction. This time the update matrix
|
||||
// redistributes the GridFunction among the processors.
|
||||
fespace.Update();
|
||||
x.Update();
|
||||
}
|
||||
|
||||
// 22. Inform also the bilinear and linear forms that the space has
|
||||
// changed.
|
||||
a.Update();
|
||||
b.Update();
|
||||
}
|
||||
|
||||
{
|
||||
ostringstream mref_name, mesh_name, sol_name;
|
||||
mref_name << "ex22p_reference_mesh." << setfill('0') << setw(6) << myid;
|
||||
mesh_name << "ex22p_deformed_mesh." << setfill('0') << setw(6) << myid;
|
||||
sol_name << "ex22p_displacement." << setfill('0') << setw(6) << myid;
|
||||
|
||||
ofstream mesh_ref_out(mref_name.str().c_str());
|
||||
mesh_ref_out.precision(16);
|
||||
pmesh.Print(mesh_ref_out);
|
||||
|
||||
ofstream mesh_out(mesh_name.str().c_str());
|
||||
mesh_out.precision(16);
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
pmesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
pmesh.Print(mesh_out);
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
|
||||
ofstream x_out(sol_name.str().c_str());
|
||||
x_out.precision(16);
|
||||
x.Save(x_out);
|
||||
}
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
}
|
||||
@@ -6,7 +6,6 @@
|
||||
// mpirun -np 4 ex2p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-wedge.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-tri.mesh -o 2 -sys
|
||||
// mpirun -np 4 ex2p -m ../data/beam-quad.mesh -o 3 -elast
|
||||
// mpirun -np 4 ex2p -m ../data/beam-quad.mesh -o 3 -sc
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// ex3 -m ../data/beam-tet.mesh
|
||||
// ex3 -m ../data/beam-hex.mesh
|
||||
// ex3 -m ../data/escher.mesh
|
||||
// ex3 -m ../data/escher.mesh -o 2
|
||||
// ex3 -m ../data/fichera.mesh
|
||||
// ex3 -m ../data/fichera-q2.vtk
|
||||
// ex3 -m ../data/fichera-q3.mesh
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
// mpirun -np 4 ex3p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/escher.mesh -o 2
|
||||
// mpirun -np 4 ex3p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/fichera-q2.vtk
|
||||
// mpirun -np 4 ex3p -m ../data/fichera-q3.mesh
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// or non-conforming (quadrilateral, hexahedrons) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// or non-conforming (quadrilateral, hexahedrons) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
|
||||
@@ -4,10 +4,8 @@
|
||||
//
|
||||
// Sample runs: ex8 -m ../data/square-disc.mesh
|
||||
// ex8 -m ../data/star.mesh
|
||||
// ex8 -m ../data/star-mixed.mesh
|
||||
// ex8 -m ../data/escher.mesh
|
||||
// ex8 -m ../data/fichera.mesh
|
||||
// ex8 -m ../data/fichera-mixed.mesh
|
||||
// ex8 -m ../data/square-disc-p2.vtk
|
||||
// ex8 -m ../data/square-disc-p3.mesh
|
||||
// ex8 -m ../data/star-surf.mesh -o 2
|
||||
|
||||
@@ -4,10 +4,8 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex8p -m ../data/square-disc.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/star.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/star-mixed.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/square-disc-p2.vtk
|
||||
// mpirun -np 4 ex8p -m ../data/square-disc-p3.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/star-surf.mesh -o 2
|
||||
@@ -125,13 +123,9 @@ int main(int argc, char *argv[])
|
||||
test_order++;
|
||||
}
|
||||
if (test_order < trial_order)
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cerr << "Warning, test space not enriched enough to handle primal"
|
||||
<< " trial space\n";
|
||||
}
|
||||
}
|
||||
|
||||
FiniteElementCollection *x0_fec, *xhat_fec, *test_fec;
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
// ex9 -m ../data/periodic-hexagon.mesh -p 1 -r 2 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/amr-quad.mesh -p 1 -r 2 -dt 0.002 -tf 9
|
||||
// ex9 -m ../data/star-q3.mesh -p 1 -r 2 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/star-mixed.mesh -p 1 -r 2 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/disc-nurbs.mesh -p 1 -r 3 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/disc-nurbs.mesh -p 2 -r 3 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/periodic-square.mesh -p 3 -r 4 -dt 0.0025 -tf 9 -vs 20
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
// mpirun -np 4 ex9p -m ../data/periodic-hexagon.mesh -p 1 -dt 0.005 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/amr-quad.mesh -p 1 -rp 1 -dt 0.002 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/star-q3.mesh -p 1 -rp 1 -dt 0.004 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/star-mixed.mesh -p 1 -rp 1 -dt 0.004 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/disc-nurbs.mesh -p 1 -rp 1 -dt 0.005 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/disc-nurbs.mesh -p 2 -rp 1 -dt 0.005 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/periodic-square.mesh -p 3 -rp 2 -dt 0.0025 -tf 9 -vs 20
|
||||
|
||||
+2
-4
@@ -22,9 +22,9 @@ MFEM_LIB_FILE = mfem_is_not_built
|
||||
-include $(CONFIG_MK)
|
||||
|
||||
SEQ_EXAMPLES = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 ex10 ex14 ex15 ex16 ex17\
|
||||
ex18 ex19 ex20 ex22
|
||||
ex18 ex19
|
||||
PAR_EXAMPLES = ex1p ex2p ex3p ex4p ex5p ex6p ex7p ex8p ex9p ex10p ex11p ex12p\
|
||||
ex13p ex14p ex15p ex16p ex17p ex18p ex19p ex20p ex22p
|
||||
ex13p ex14p ex15p ex16p ex17p ex18p ex19p
|
||||
|
||||
ifeq ($(MFEM_USE_MPI),NO)
|
||||
EXAMPLES = $(SEQ_EXAMPLES)
|
||||
@@ -118,5 +118,3 @@ clean-exec:
|
||||
@rm -f ex16.mesh ex16-mesh.* ex16-init.* ex16-final.*
|
||||
@rm -f vortex-mesh.* vortex.mesh vortex-?-init.* vortex-?-final.*
|
||||
@rm -f deformation.* pressure.*
|
||||
@rm -f ex20.dat ex20p_?????.dat gnuplot_ex20.inp gnuplot_ex20p.inp
|
||||
@rm -f ex22*.mesh ex22*.sol ex22p_*.*
|
||||
|
||||
@@ -96,7 +96,7 @@ foreach(TEST_OPTIONS_VAR
|
||||
# All PETSC tests are parallel.
|
||||
if (MFEM_USE_MPI)
|
||||
add_test(NAME ${TEST_NAME_FULL}_np=4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MFEM_MPI_NP}
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
|
||||
@@ -239,7 +239,7 @@ int main(int argc, char *argv[])
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc)
|
||||
{
|
||||
MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL);
|
||||
PetscInitialize(NULL,NULL,petscrc_file,NULL);
|
||||
}
|
||||
|
||||
// 3. Read the serial mesh from the given mesh file on all processors. We can
|
||||
@@ -446,7 +446,7 @@ int main(int argc, char *argv[])
|
||||
delete oper;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
// 2b. We initialize PETSc
|
||||
MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL);
|
||||
PetscInitialize(NULL,NULL,petscrc_file,NULL);
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -266,6 +266,7 @@ int main(int argc, char *argv[])
|
||||
if (visualization && petscmonitor)
|
||||
{
|
||||
pcg->SetMonitor(&mymon);
|
||||
pcg->SetPrintLevel(4);
|
||||
pcg->iterative_mode = true;
|
||||
X.Randomize();
|
||||
}
|
||||
@@ -313,7 +314,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
MFEMFinalizePetsc();
|
||||
PetscFinalize();
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -359,7 +359,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
kappa = freq * M_PI;
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
kappa = freq * M_PI;
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
@@ -330,7 +330,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -544,7 +544,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// or non-conforming (quadrilateral, hexahedrons) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
@@ -88,7 +88,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -315,7 +315,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
|
||||
@@ -248,7 +248,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
// When using PETSc, we just create the ODE solver. We use command line
|
||||
// customization to select a specific solver.
|
||||
MFEMInitializePetsc(NULL, NULL, petscrc_file, NULL);
|
||||
PetscInitialize(NULL, NULL, petscrc_file, NULL);
|
||||
ode_solver = pode_solver = new PetscODESolver(MPI_COMM_WORLD);
|
||||
}
|
||||
|
||||
@@ -481,7 +481,7 @@ int main(int argc, char *argv[])
|
||||
delete pmon;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
|
||||
@@ -40,8 +40,7 @@ add_mfem_examples(PUMI_EXAMPLES_SRCS ${PFX} "" test_pumi)
|
||||
# Command line options for the tests.
|
||||
# TODO...
|
||||
|
||||
# Set the number of processors for the parallel examples. The value of
|
||||
# MFEM_MPI_NP is ignored.
|
||||
# Set the number of processors for the parallel examples.
|
||||
set(EX1_TEST_NP 1)
|
||||
set(EX1P_TEST_NP 8)
|
||||
set(EX2_TEST_NP 1)
|
||||
|
||||
@@ -209,15 +209,15 @@ int main(int argc, char *argv[])
|
||||
Transform(Geometries.GetCenter(mesh->GetElementBaseGeometry(el)),cent);
|
||||
if (cent(0) <= -0.05)
|
||||
{
|
||||
mesh->SetAttribute(el, 1);
|
||||
mesh->SetAttribute(el , 1);
|
||||
}
|
||||
else if (cent(0) >= 0.05)
|
||||
{
|
||||
mesh->SetAttribute(el, 2);
|
||||
mesh->SetAttribute(el , 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh->SetAttribute(el, 3);
|
||||
mesh->SetAttribute(el , 3);
|
||||
}
|
||||
}
|
||||
mesh->SetAttributes();
|
||||
|
||||
@@ -68,7 +68,7 @@ foreach(SRC_FILE ${SUNDIALS_EXAMPLES_SRCS})
|
||||
COMMAND ${TEST_NAME} ${THIS_TEST_OPTIONS})
|
||||
else()
|
||||
add_test(NAME ${TEST_NAME}_np=4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MFEM_MPI_NP}
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${THIS_TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
|
||||
+32
-31
@@ -79,6 +79,9 @@ BilinearForm::BilinearForm (FiniteElementSpace * f)
|
||||
BilinearForm::BilinearForm (FiniteElementSpace * f, BilinearForm * bf, int ps)
|
||||
: Matrix (f->GetVSize())
|
||||
{
|
||||
int i;
|
||||
Array<BilinearFormIntegrator*> *bfi;
|
||||
|
||||
fes = f;
|
||||
sequence = f->GetSequence();
|
||||
mat_e = NULL;
|
||||
@@ -89,16 +92,33 @@ BilinearForm::BilinearForm (FiniteElementSpace * f, BilinearForm * bf, int ps)
|
||||
precompute_sparsity = ps;
|
||||
diag_policy = DIAG_KEEP;
|
||||
|
||||
// Copy the pointers to the integrators
|
||||
dbfi = bf->dbfi;
|
||||
bfi = bf->GetDBFI();
|
||||
dbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
dbfi[i] = (*bfi)[i];
|
||||
}
|
||||
|
||||
bbfi = bf->bbfi;
|
||||
bbfi_marker = bf->bbfi_marker;
|
||||
bfi = bf->GetBBFI();
|
||||
bbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
bbfi[i] = (*bfi)[i];
|
||||
}
|
||||
|
||||
fbfi = bf->fbfi;
|
||||
bfi = bf->GetFBFI();
|
||||
fbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
fbfi[i] = (*bfi)[i];
|
||||
}
|
||||
|
||||
bfbfi = bf->bfbfi;
|
||||
bfbfi_marker = bf->bfbfi_marker;
|
||||
bfi = bf->GetBFBFI();
|
||||
bfbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
bfbfi[i] = (*bfi)[i];
|
||||
}
|
||||
|
||||
AllocMat();
|
||||
}
|
||||
@@ -921,23 +941,6 @@ MixedBilinearForm::MixedBilinearForm (FiniteElementSpace *tr_fes,
|
||||
trial_fes = tr_fes;
|
||||
test_fes = te_fes;
|
||||
mat = NULL;
|
||||
extern_bfs = 0;
|
||||
}
|
||||
|
||||
MixedBilinearForm::MixedBilinearForm (FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes,
|
||||
MixedBilinearForm * mbf)
|
||||
: Matrix(te_fes->GetVSize(), tr_fes->GetVSize())
|
||||
{
|
||||
trial_fes = tr_fes;
|
||||
test_fes = te_fes;
|
||||
mat = NULL;
|
||||
extern_bfs = 1;
|
||||
|
||||
// Copy the pointers to the integrators
|
||||
dom = mbf->dom;
|
||||
bdr = mbf->bdr;
|
||||
skt = mbf->skt;
|
||||
}
|
||||
|
||||
double & MixedBilinearForm::Elem (int i, int j)
|
||||
@@ -1174,14 +1177,12 @@ void MixedBilinearForm::Update()
|
||||
|
||||
MixedBilinearForm::~MixedBilinearForm()
|
||||
{
|
||||
int i;
|
||||
|
||||
if (mat) { delete mat; }
|
||||
if (!extern_bfs)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < dom.Size(); i++) { delete dom[i]; }
|
||||
for (i = 0; i < bdr.Size(); i++) { delete bdr[i]; }
|
||||
for (i = 0; i < skt.Size(); i++) { delete skt[i]; }
|
||||
}
|
||||
for (i = 0; i < dom.Size(); i++) { delete dom[i]; }
|
||||
for (i = 0; i < bdr.Size(); i++) { delete bdr[i]; }
|
||||
for (i = 0; i < skt.Size(); i++) { delete skt[i]; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
+40
-133
@@ -29,21 +29,19 @@ namespace mfem
|
||||
class BilinearForm : public Matrix
|
||||
{
|
||||
protected:
|
||||
/// Sparse matrix to be associated with the form. Owned.
|
||||
/// Sparse matrix to be associated with the form.
|
||||
SparseMatrix *mat;
|
||||
|
||||
/// Matrix used to eliminate b.c. Owned.
|
||||
/// Matrix used to eliminate b.c.
|
||||
SparseMatrix *mat_e;
|
||||
|
||||
/// FE space on which the form lives. Not owned.
|
||||
/// FE space on which the form lives.
|
||||
FiniteElementSpace *fes;
|
||||
|
||||
/// Indicates the Mesh::sequence corresponding to the current state of the
|
||||
/// BilinearForm.
|
||||
long sequence;
|
||||
|
||||
/** @brief Indicates the BilinearFormIntegrator%s stored in #dbfi, #bbfi,
|
||||
#fbfi, and #bfbfi are owned by another BilinearForm. */
|
||||
int extern_bfs;
|
||||
|
||||
/// Set of Domain Integrators to be applied.
|
||||
@@ -51,22 +49,22 @@ protected:
|
||||
|
||||
/// Set of Boundary Integrators to be applied.
|
||||
Array<BilinearFormIntegrator*> bbfi;
|
||||
Array<Array<int>*> bbfi_marker; ///< Entries are not owned.
|
||||
Array<Array<int>*> bbfi_marker;
|
||||
|
||||
/// Set of interior face Integrators to be applied.
|
||||
Array<BilinearFormIntegrator*> fbfi;
|
||||
|
||||
/// Set of boundary face Integrators to be applied.
|
||||
Array<BilinearFormIntegrator*> bfbfi;
|
||||
Array<Array<int>*> bfbfi_marker; ///< Entries are not owned.
|
||||
Array<Array<int>*> bfbfi_marker;
|
||||
|
||||
DenseMatrix elemmat;
|
||||
Array<int> vdofs;
|
||||
|
||||
DenseTensor *element_matrices; ///< Owned.
|
||||
DenseTensor *element_matrices;
|
||||
|
||||
StaticCondensation *static_cond; ///< Owned.
|
||||
Hybridization *hybridization; ///< Owned.
|
||||
StaticCondensation *static_cond;
|
||||
Hybridization *hybridization;
|
||||
|
||||
/**
|
||||
* This member allows one to specify what should be done
|
||||
@@ -91,28 +89,10 @@ protected:
|
||||
diag_policy = DIAG_KEEP;
|
||||
}
|
||||
|
||||
private:
|
||||
/// Copy construction is not supported; body is undefined.
|
||||
BilinearForm(const BilinearForm &);
|
||||
|
||||
/// Copy assignment is not supported; body is undefined.
|
||||
BilinearForm &operator=(const BilinearForm &);
|
||||
|
||||
public:
|
||||
/// Creates bilinear form associated with FE space @a *f.
|
||||
/** The pointer @a f is not owned by the newly constructed object. */
|
||||
BilinearForm(FiniteElementSpace *f);
|
||||
|
||||
/** @brief Create a BilinearForm on the FiniteElementSpace @a f, using the
|
||||
same integrators as the BilinearForm @a bf.
|
||||
|
||||
The pointer @a f is not owned by the newly constructed object.
|
||||
|
||||
The integrators in @a bf are copied as pointers and they are not owned by
|
||||
the newly constructed BilinearForm.
|
||||
|
||||
The optional parameter @a ps is used to initialize the internal flag
|
||||
#precompute_sparsity, see UsePrecomputedSparsity() for details. */
|
||||
BilinearForm(FiniteElementSpace *f, BilinearForm *bf, int ps = 0);
|
||||
|
||||
/// Get the size of the BilinearForm as a square matrix.
|
||||
@@ -163,25 +143,13 @@ public:
|
||||
finalized) and the entries are initialized with zeros. */
|
||||
void AllocateMatrix() { if (mat == NULL) { AllocMat(); } }
|
||||
|
||||
/// Access all integrators added with AddDomainIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetDBFI() { return &dbfi; }
|
||||
|
||||
/// Access all integrators added with AddBoundaryIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetBBFI() { return &bbfi; }
|
||||
/** @brief Access all boundary markers added with AddBoundaryIntegrator().
|
||||
If no marker was specified when the integrator was added, the
|
||||
corresponding pointer (to Array<int>) will be NULL. */
|
||||
Array<Array<int>*> *GetBBFI_Marker() { return &bbfi_marker; }
|
||||
|
||||
/// Access all integrators added with AddInteriorFaceIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetFBFI() { return &fbfi; }
|
||||
|
||||
/// Access all integrators added with AddBdrFaceIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetBFBFI() { return &bfbfi; }
|
||||
/** @brief Access all boundary markers added with AddBdrFaceIntegrator().
|
||||
If no marker was specified when the integrator was added, the
|
||||
corresponding pointer (to Array<int>) will be NULL. */
|
||||
Array<Array<int>*> *GetBFBFI_Marker() { return &bfbfi_marker; }
|
||||
|
||||
const double &operator()(int i, int j) { return (*mat)(i,j); }
|
||||
|
||||
@@ -207,10 +175,10 @@ public:
|
||||
const double a = 1.0) const
|
||||
{ mat->AddMultTranspose(x, y, a); }
|
||||
|
||||
void FullAddMultTranspose(const Vector & x, Vector & y) const
|
||||
void FullAddMultTranspose (const Vector & x, Vector & y) const
|
||||
{ mat->AddMultTranspose(x, y); mat_e->AddMultTranspose(x, y); }
|
||||
|
||||
virtual void MultTranspose(const Vector & x, Vector & y) const
|
||||
virtual void MultTranspose (const Vector & x, Vector & y) const
|
||||
{ y = 0.0; AddMultTranspose (x, y); }
|
||||
|
||||
double InnerProduct(const Vector &x, const Vector &y) const
|
||||
@@ -247,31 +215,25 @@ public:
|
||||
return *mat_e;
|
||||
}
|
||||
|
||||
/// Adds new Domain Integrator. Assumes ownership of @a bfi.
|
||||
/// Adds new Domain Integrator.
|
||||
void AddDomainIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/// Adds new Boundary Integrator. Assumes ownership of @a bfi.
|
||||
/// Adds new Boundary Integrator.
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/** @brief Adds new Boundary Integrator, restricted to specific boundary
|
||||
attributes.
|
||||
|
||||
Assumes ownership of @a bfi. The array @a bdr_marker is stored internally
|
||||
as a pointer to the given Array<int> object. */
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi,
|
||||
attributes. */
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator * bfi,
|
||||
Array<int> &bdr_marker);
|
||||
|
||||
/// Adds new interior Face Integrator. Assumes ownership of @a bfi.
|
||||
/// Adds new interior Face Integrator.
|
||||
void AddInteriorFaceIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/// Adds new boundary Face Integrator. Assumes ownership of @a bfi.
|
||||
/// Adds new boundary Face Integrator.
|
||||
void AddBdrFaceIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/** @brief Adds new boundary Face Integrator, restricted to specific boundary
|
||||
attributes.
|
||||
|
||||
Assumes ownership of @a bfi. The array @a bdr_marker is stored internally
|
||||
as a pointer to the given Array<int> object. */
|
||||
attributes. */
|
||||
void AddBdrFaceIntegrator(BilinearFormIntegrator *bfi,
|
||||
Array<int> &bdr_marker);
|
||||
|
||||
@@ -431,68 +393,36 @@ public:
|
||||
class MixedBilinearForm : public Matrix
|
||||
{
|
||||
protected:
|
||||
SparseMatrix *mat; ///< Owned.
|
||||
SparseMatrix *mat;
|
||||
|
||||
FiniteElementSpace *trial_fes, ///< Not owned
|
||||
*test_fes; ///< Not owned
|
||||
FiniteElementSpace *trial_fes, *test_fes;
|
||||
|
||||
/** @brief Indicates the BilinearFormIntegrator%s stored in #dom, #bdr, and
|
||||
#skt are owned by another MixedBilinearForm. */
|
||||
int extern_bfs;
|
||||
|
||||
/// Domain integrators.
|
||||
Array<BilinearFormIntegrator*> dom;
|
||||
/// Boundary integrators.
|
||||
Array<BilinearFormIntegrator*> bdr;
|
||||
/// Trace face (skeleton) integrators.
|
||||
Array<BilinearFormIntegrator*> skt;
|
||||
|
||||
private:
|
||||
/// Copy construction is not supported; body is undefined.
|
||||
MixedBilinearForm(const MixedBilinearForm &);
|
||||
|
||||
/// Copy assignment is not supported; body is undefined.
|
||||
MixedBilinearForm &operator=(const MixedBilinearForm &);
|
||||
Array<BilinearFormIntegrator*> skt; // trace face integrators
|
||||
|
||||
public:
|
||||
/** @brief Construct a MixedBilinearForm on the given trial, @a tr_fes, and
|
||||
test, @a te_fes, FiniteElementSpace%s. */
|
||||
/** The pointers @a tr_fes and @a te_fes are not owned by the newly
|
||||
constructed object. */
|
||||
MixedBilinearForm(FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes);
|
||||
MixedBilinearForm (FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes);
|
||||
|
||||
/** @brief Create a MixedBilinearForm on the given trial, @a tr_fes, and
|
||||
test, @a te_fes, FiniteElementSpace%s, using the same integrators as the
|
||||
MixedBilinearForm @a mbf.
|
||||
virtual double& Elem (int i, int j);
|
||||
|
||||
The pointers @a tr_fes and @a te_fes are not owned by the newly
|
||||
constructed object.
|
||||
virtual const double& Elem (int i, int j) const;
|
||||
|
||||
The integrators in @a mbf are copied as pointers and they are not owned
|
||||
by the newly constructed MixedBilinearForm. */
|
||||
MixedBilinearForm(FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes,
|
||||
MixedBilinearForm *mbf);
|
||||
virtual void Mult (const Vector & x, Vector & y) const;
|
||||
|
||||
virtual double &Elem(int i, int j);
|
||||
virtual void AddMult (const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
|
||||
virtual const double &Elem(int i, int j) const;
|
||||
virtual void AddMultTranspose (const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
|
||||
virtual void Mult(const Vector & x, Vector & y) const;
|
||||
|
||||
virtual void AddMult(const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
|
||||
virtual void AddMultTranspose(const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
|
||||
virtual void MultTranspose(const Vector & x, Vector & y) const
|
||||
virtual void MultTranspose (const Vector & x, Vector & y) const
|
||||
{ y = 0.0; AddMultTranspose (x, y); }
|
||||
|
||||
virtual MatrixInverse *Inverse() const;
|
||||
virtual MatrixInverse * Inverse() const;
|
||||
|
||||
virtual void Finalize(int skip_zeros = 1);
|
||||
virtual void Finalize (int skip_zeros = 1);
|
||||
|
||||
/** Extract the associated matrix as SparseMatrix blocks. The number of
|
||||
block rows and columns is given by the vector dimensions (vdim) of the
|
||||
@@ -503,31 +433,24 @@ public:
|
||||
SparseMatrix &SpMat() { return *mat; }
|
||||
SparseMatrix *LoseMat() { SparseMatrix *tmp = mat; mat = NULL; return tmp; }
|
||||
|
||||
/// Adds a domain integrator. Assumes ownership of @a bfi.
|
||||
void AddDomainIntegrator(BilinearFormIntegrator *bfi);
|
||||
void AddDomainIntegrator (BilinearFormIntegrator * bfi);
|
||||
|
||||
/// Adds a boundary integrator. Assumes ownership of @a bfi.
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi);
|
||||
void AddBoundaryIntegrator (BilinearFormIntegrator * bfi);
|
||||
|
||||
/** @brief Add a trace face integrator. Assumes ownership of @a bfi.
|
||||
/** Add a trace face integrator. This type of integrator assembles terms
|
||||
over all faces of the mesh using the face FE from the trial space and the
|
||||
two adjacent volume FEs from the test space. */
|
||||
void AddTraceFaceIntegrator (BilinearFormIntegrator * bfi);
|
||||
|
||||
This type of integrator assembles terms over all faces of the mesh using
|
||||
the face FE from the trial space and the two adjacent volume FEs from the
|
||||
test space. */
|
||||
void AddTraceFaceIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/// Access all integrators added with AddDomainIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetDBFI() { return &dom; }
|
||||
|
||||
/// Access all integrators added with AddBoundaryIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetBBFI() { return &bdr; }
|
||||
|
||||
/// Access all integrators added with AddTraceFaceIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetTFBFI() { return &skt; }
|
||||
|
||||
void operator=(const double a) { *mat = a; }
|
||||
void operator= (const double a) { *mat = a; }
|
||||
|
||||
void Assemble(int skip_zeros = 1);
|
||||
void Assemble (int skip_zeros = 1);
|
||||
|
||||
/** For partially conforming trial and/or test FE spaces, complete the
|
||||
assembly process by performing A := P2^t A P1 where A is the internal
|
||||
@@ -582,35 +505,19 @@ public:
|
||||
*/
|
||||
class DiscreteLinearOperator : public MixedBilinearForm
|
||||
{
|
||||
private:
|
||||
/// Copy construction is not supported; body is undefined.
|
||||
DiscreteLinearOperator(const DiscreteLinearOperator &);
|
||||
|
||||
/// Copy assignment is not supported; body is undefined.
|
||||
DiscreteLinearOperator &operator=(const DiscreteLinearOperator &);
|
||||
|
||||
public:
|
||||
/** @brief Construct a DiscreteLinearOperator on the given
|
||||
FiniteElementSpace%s @a domain_fes and @a range_fes. */
|
||||
/** The pointers @a domain_fes and @a range_fes are not owned by the newly
|
||||
constructed object. */
|
||||
DiscreteLinearOperator(FiniteElementSpace *domain_fes,
|
||||
FiniteElementSpace *range_fes)
|
||||
: MixedBilinearForm(domain_fes, range_fes) { }
|
||||
|
||||
/// Adds a domain interpolator. Assumes ownership of @a di.
|
||||
void AddDomainInterpolator(DiscreteInterpolator *di)
|
||||
{ AddDomainIntegrator(di); }
|
||||
|
||||
/// Adds a trace face interpolator. Assumes ownership of @a di.
|
||||
void AddTraceFaceInterpolator(DiscreteInterpolator *di)
|
||||
{ AddTraceFaceIntegrator(di); }
|
||||
|
||||
/// Access all interpolators added with AddDomainInterpolator().
|
||||
Array<BilinearFormIntegrator*> *GetDI() { return &dom; }
|
||||
|
||||
/** @brief Construct the internal matrix representation of the discrete
|
||||
linear operator. */
|
||||
virtual void Assemble(int skip_zeros = 1);
|
||||
};
|
||||
|
||||
|
||||
+55
-235
@@ -962,8 +962,8 @@ void VectorMassIntegrator::AssembleElementMatrix
|
||||
|
||||
double norm;
|
||||
|
||||
// If vdim is not set, set it to the space dimension
|
||||
vdim = (vdim == -1) ? spaceDim : vdim;
|
||||
// Get vdim from VQ, MQ, or the space dimension
|
||||
int vdim = (VQ) ? (VQ -> GetVDim()) : ((MQ) ? (MQ -> GetVDim()) : spaceDim);
|
||||
|
||||
elmat.SetSize(nd*vdim);
|
||||
shape.SetSize(nd);
|
||||
@@ -1041,11 +1041,13 @@ void VectorMassIntegrator::AssembleElementMatrix2(
|
||||
{
|
||||
int tr_nd = trial_fe.GetDof();
|
||||
int te_nd = test_fe.GetDof();
|
||||
int dim = trial_fe.GetDim();
|
||||
int vdim;
|
||||
|
||||
double norm;
|
||||
|
||||
// If vdim is not set, set it to the space dimension
|
||||
vdim = (vdim == -1) ? Trans.GetSpaceDim() : vdim;
|
||||
// Get vdim from the ElementTransformation Trans ?
|
||||
vdim = (VQ) ? (VQ -> GetVDim()) : ((MQ) ? (MQ -> GetVDim()) : (dim));
|
||||
|
||||
elmat.SetSize(te_nd*vdim, tr_nd*vdim);
|
||||
shape.SetSize(tr_nd);
|
||||
@@ -2178,12 +2180,11 @@ void ElasticityIntegrator::AssembleElementMatrix(
|
||||
int dim = el.GetDim();
|
||||
double w, L, M;
|
||||
|
||||
MFEM_ASSERT(dim == Trans.GetSpaceDim(), "");
|
||||
|
||||
#ifdef MFEM_THREAD_SAFE
|
||||
DenseMatrix dshape(dof, dim), gshape(dof, dim), pelmat(dof);
|
||||
DenseMatrix dshape(dof, dim), Jinv(dim), gshape(dof, dim), pelmat(dof);
|
||||
Vector divshape(dim*dof);
|
||||
#else
|
||||
Jinv.SetSize(dim);
|
||||
dshape.SetSize(dof, dim);
|
||||
gshape.SetSize(dof, dim);
|
||||
pelmat.SetSize(dof);
|
||||
@@ -2209,7 +2210,8 @@ void ElasticityIntegrator::AssembleElementMatrix(
|
||||
|
||||
Trans.SetIntPoint(&ip);
|
||||
w = ip.weight * Trans.Weight();
|
||||
Mult(dshape, Trans.InverseJacobian(), gshape);
|
||||
CalcInverse(Trans.Jacobian(), Jinv);
|
||||
Mult(dshape, Jinv, gshape);
|
||||
MultAAt(gshape, pelmat);
|
||||
gshape.GradToDiv (divshape);
|
||||
|
||||
@@ -2244,184 +2246,14 @@ void ElasticityIntegrator::AssembleElementMatrix(
|
||||
{
|
||||
for (int k = 0; k < dof; k++)
|
||||
for (int l = 0; l < dof; l++)
|
||||
{
|
||||
elmat(dof*i+k, dof*j+l) +=
|
||||
(M * w) * gshape(k, j) * gshape(l, i);
|
||||
}
|
||||
// + (L * w) * gshape(k, i) * gshape(l, j)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ElasticityIntegrator::ComputeElementFlux(
|
||||
const mfem::FiniteElement &el, ElementTransformation &Trans,
|
||||
Vector &u, const mfem::FiniteElement &fluxelem, Vector &flux,
|
||||
int with_coef)
|
||||
{
|
||||
const int dof = el.GetDof();
|
||||
const int dim = el.GetDim();
|
||||
const int tdim = dim*(dim+1)/2; // num. entries in a symmetric tensor
|
||||
double L, M;
|
||||
|
||||
MFEM_ASSERT(dim == 2 || dim == 3,
|
||||
"dimension is not supported: dim = " << dim);
|
||||
MFEM_ASSERT(dim == Trans.GetSpaceDim(), "");
|
||||
MFEM_ASSERT(fluxelem.GetMapType() == FiniteElement::VALUE, "");
|
||||
MFEM_ASSERT(dynamic_cast<const NodalFiniteElement*>(&fluxelem), "");
|
||||
|
||||
#ifdef MFEM_THREAD_SAFE
|
||||
DenseMatrix dshape(dof, dim);
|
||||
#else
|
||||
dshape.SetSize(dof, dim);
|
||||
#endif
|
||||
|
||||
double gh_data[9], grad_data[9];
|
||||
DenseMatrix gh(gh_data, dim, dim);
|
||||
DenseMatrix grad(grad_data, dim, dim);
|
||||
|
||||
const IntegrationRule &ir = fluxelem.GetNodes();
|
||||
const int fnd = ir.GetNPoints();
|
||||
flux.SetSize(fnd * tdim);
|
||||
|
||||
DenseMatrix loc_data_mat(u.GetData(), dof, dim);
|
||||
for (int i = 0; i < fnd; i++)
|
||||
{
|
||||
const IntegrationPoint &ip = ir.IntPoint(i);
|
||||
el.CalcDShape(ip, dshape);
|
||||
MultAtB(loc_data_mat, dshape, gh);
|
||||
|
||||
Trans.SetIntPoint(&ip);
|
||||
Mult(gh, Trans.InverseJacobian(), grad);
|
||||
|
||||
M = mu->Eval(Trans, ip);
|
||||
if (lambda)
|
||||
{
|
||||
L = lambda->Eval(Trans, ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
L = q_lambda * M;
|
||||
M = q_mu * M;
|
||||
}
|
||||
|
||||
// stress = 2*M*e(u) + L*tr(e(u))*I, where
|
||||
// e(u) = (1/2)*(grad(u) + grad(u)^T)
|
||||
const double M2 = 2.0*M;
|
||||
if (dim == 2)
|
||||
{
|
||||
L *= (grad(0,0) + grad(1,1));
|
||||
// order of the stress entries: s_xx, s_yy, s_xy
|
||||
flux(i+fnd*0) = M2*grad(0,0) + L;
|
||||
flux(i+fnd*1) = M2*grad(1,1) + L;
|
||||
flux(i+fnd*2) = M*(grad(0,1) + grad(1,0));
|
||||
}
|
||||
else if (dim == 3)
|
||||
{
|
||||
L *= (grad(0,0) + grad(1,1) + grad(2,2));
|
||||
// order of the stress entries: s_xx, s_yy, s_zz, s_xy, s_xz, s_yz
|
||||
flux(i+fnd*0) = M2*grad(0,0) + L;
|
||||
flux(i+fnd*1) = M2*grad(1,1) + L;
|
||||
flux(i+fnd*2) = M2*grad(2,2) + L;
|
||||
flux(i+fnd*3) = M*(grad(0,1) + grad(1,0));
|
||||
flux(i+fnd*4) = M*(grad(0,2) + grad(2,0));
|
||||
flux(i+fnd*5) = M*(grad(1,2) + grad(2,1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double ElasticityIntegrator::ComputeFluxEnergy(const FiniteElement &fluxelem,
|
||||
ElementTransformation &Trans,
|
||||
Vector &flux, Vector *d_energy)
|
||||
{
|
||||
const int dof = fluxelem.GetDof();
|
||||
const int dim = fluxelem.GetDim();
|
||||
const int tdim = dim*(dim+1)/2; // num. entries in a symmetric tensor
|
||||
double L, M;
|
||||
|
||||
// The MFEM_ASSERT constraints in ElasticityIntegrator::ComputeElementFlux
|
||||
// are assumed here too.
|
||||
MFEM_ASSERT(d_energy == NULL, "anisotropic estimates are not supported");
|
||||
MFEM_ASSERT(flux.Size() == dof*tdim, "invalid 'flux' vector");
|
||||
|
||||
#ifndef MFEM_THREAD_SAFE
|
||||
shape.SetSize(dof);
|
||||
#else
|
||||
Vector shape(dof);
|
||||
#endif
|
||||
double pointstress_data[6];
|
||||
Vector pointstress(pointstress_data, tdim);
|
||||
|
||||
// View of the 'flux' vector as a (dof x tdim) matrix
|
||||
DenseMatrix flux_mat(flux.GetData(), dof, tdim);
|
||||
|
||||
// Use the same integration rule as in AssembleElementMatrix, replacing 'el'
|
||||
// with 'fluxelem' when 'IntRule' is not set.
|
||||
// Should we be using a different (more accurate) rule here?
|
||||
const IntegrationRule *ir = IntRule;
|
||||
if (ir == NULL)
|
||||
{
|
||||
int order = 2 * Trans.OrderGrad(&fluxelem);
|
||||
ir = &IntRules.Get(fluxelem.GetGeomType(), order);
|
||||
}
|
||||
|
||||
double energy = 0.0;
|
||||
|
||||
for (int i = 0; i < ir->GetNPoints(); i++)
|
||||
{
|
||||
const IntegrationPoint &ip = ir->IntPoint(i);
|
||||
fluxelem.CalcShape(ip, shape);
|
||||
|
||||
flux_mat.MultTranspose(shape, pointstress);
|
||||
|
||||
Trans.SetIntPoint(&ip);
|
||||
double w = Trans.Weight() * ip.weight;
|
||||
|
||||
M = mu->Eval(Trans, ip);
|
||||
if (lambda)
|
||||
{
|
||||
L = lambda->Eval(Trans, ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
L = q_lambda * M;
|
||||
M = q_mu * M;
|
||||
}
|
||||
|
||||
// The strain energy density at a point is given by (1/2)*(s : e) where s
|
||||
// and e are the stress and strain tensors, respectively. Since we only
|
||||
// have the stress, we need to compute the strain from the stress:
|
||||
// s = 2*mu*e + lambda*tr(e)*I
|
||||
// Taking trace on both sides we find:
|
||||
// tr(s) = 2*mu*tr(e) + lambda*tr(e)*dim = (2*mu + dim*lambda)*tr(e)
|
||||
// which gives:
|
||||
// tr(e) = tr(s)/(2*mu + dim*lambda)
|
||||
// Then from the first identity above we can find the strain:
|
||||
// e = (1/(2*mu))*(s - lambda*tr(e)*I)
|
||||
|
||||
double pt_e; // point strain energy density
|
||||
const double *s = pointstress_data;
|
||||
if (dim == 2)
|
||||
{
|
||||
// s entries: s_xx, s_yy, s_xy
|
||||
const double tr_e = (s[0] + s[1])/(2*(M + L));
|
||||
L *= tr_e;
|
||||
pt_e = (0.25/M)*(s[0]*(s[0] - L) + s[1]*(s[1] - L) + 2*s[2]*s[2]);
|
||||
}
|
||||
else // (dim == 3)
|
||||
{
|
||||
// s entries: s_xx, s_yy, s_zz, s_xy, s_xz, s_yz
|
||||
const double tr_e = (s[0] + s[1] + s[2])/(2*M + 3*L);
|
||||
L *= tr_e;
|
||||
pt_e = (0.25/M)*(s[0]*(s[0] - L) + s[1]*(s[1] - L) + s[2]*(s[2] - L) +
|
||||
2*(s[3]*s[3] + s[4]*s[4] + s[5]*s[5]));
|
||||
}
|
||||
|
||||
energy += w * pt_e;
|
||||
}
|
||||
|
||||
return energy;
|
||||
}
|
||||
|
||||
void DGTraceIntegrator::AssembleFaceMatrix(const FiniteElement &el1,
|
||||
const FiniteElement &el2,
|
||||
FaceElementTransformations &Trans,
|
||||
@@ -3215,38 +3047,32 @@ void NormalInterpolator::AssembleElementMatrix2(
|
||||
}
|
||||
|
||||
|
||||
namespace internal
|
||||
{
|
||||
|
||||
// Scalar shape functions scaled by scalar coefficient.
|
||||
// Used in the implementation of class ScalarProductInterpolator below.
|
||||
struct ShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
Coefficient &Q;
|
||||
const FiniteElement &fe;
|
||||
|
||||
ShapeCoefficient(Coefficient &q, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), Q(q), fe(fe_) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
fe.CalcPhysShape(T, V);
|
||||
V *= Q.Eval(T, ip);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
ScalarProductInterpolator::AssembleElementMatrix2(const FiniteElement &dom_fe,
|
||||
const FiniteElement &ran_fe,
|
||||
ElementTransformation &Trans,
|
||||
DenseMatrix &elmat)
|
||||
{
|
||||
internal::ShapeCoefficient dom_shape_coeff(Q, dom_fe);
|
||||
// Scalar shape functions scaled by scalar coefficient
|
||||
struct ShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
Coefficient &Q;
|
||||
const FiniteElement &fe;
|
||||
|
||||
ShapeCoefficient(Coefficient &q, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), Q(q), fe(fe_) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
fe.CalcPhysShape(T, V);
|
||||
V *= Q.Eval(T, ip);
|
||||
}
|
||||
};
|
||||
|
||||
ShapeCoefficient dom_shape_coeff(Q, dom_fe);
|
||||
|
||||
elmat.SetSize(ran_fe.GetDof(),dom_fe.GetDof());
|
||||
|
||||
@@ -3383,35 +3209,6 @@ VectorCrossProductInterpolator::AssembleElementMatrix2(
|
||||
}
|
||||
|
||||
|
||||
namespace internal
|
||||
{
|
||||
|
||||
// Vector shape functions dot product with a vector coefficient.
|
||||
// Used in the implementation of class VectorInnerProductInterpolator below.
|
||||
struct VDotVShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
VectorCoefficient &VQ;
|
||||
const FiniteElement &fe;
|
||||
DenseMatrix vshape;
|
||||
Vector vc;
|
||||
|
||||
VDotVShapeCoefficient(VectorCoefficient &vq, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), VQ(vq), fe(fe_),
|
||||
vshape(vdim, vq.GetVDim()), vc(vq.GetVDim()) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
VQ.Eval(vc, T, ip);
|
||||
fe.CalcPhysVShape(T, vshape);
|
||||
vshape.Mult(vc, V);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
VectorInnerProductInterpolator::AssembleElementMatrix2(
|
||||
const FiniteElement &dom_fe,
|
||||
@@ -3419,7 +3216,30 @@ VectorInnerProductInterpolator::AssembleElementMatrix2(
|
||||
ElementTransformation &Trans,
|
||||
DenseMatrix &elmat)
|
||||
{
|
||||
internal::VDotVShapeCoefficient dom_shape_coeff(VQ, dom_fe);
|
||||
// Vector shape functions dot product with a vector coefficient
|
||||
struct VDotVShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
VectorCoefficient &VQ;
|
||||
const FiniteElement &fe;
|
||||
DenseMatrix vshape;
|
||||
Vector vc;
|
||||
|
||||
VDotVShapeCoefficient(VectorCoefficient &vq, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), VQ(vq), fe(fe_),
|
||||
vshape(vdim, vq.GetVDim()), vc(vq.GetVDim()) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
VQ.Eval(vc, T, ip);
|
||||
fe.CalcPhysVShape(T, vshape);
|
||||
vshape.Mult(vc, V);
|
||||
}
|
||||
};
|
||||
|
||||
VDotVShapeCoefficient dom_shape_coeff(VQ, dom_fe);
|
||||
|
||||
elmat.SetSize(ran_fe.GetDof(),dom_fe.GetDof());
|
||||
|
||||
|
||||
+6
-86
@@ -69,60 +69,12 @@ public:
|
||||
const Vector &elfun, DenseMatrix &elmat)
|
||||
{ AssembleFaceMatrix(el1, el2, Tr, elmat); }
|
||||
|
||||
/** @brief Virtual method required for Zienkiewicz-Zhu type error estimators.
|
||||
|
||||
The purpose of the method is to compute a local "flux" finite element
|
||||
function given a local finite element solution. The "flux" function has
|
||||
to be computed in terms of its coefficients (represented by the Vector
|
||||
@a flux) which multiply the basis functions defined by the FiniteElement
|
||||
@a fluxelem. Typically, the "flux" function will have more than one
|
||||
component and consequently @a flux should be store the coefficients of
|
||||
all components: first all coefficient for component 0, then all
|
||||
coefficients for component 1, etc. What the "flux" function represents
|
||||
depends on the specific integrator. For example, in the case of
|
||||
DiffusionIntegrator, the flux is the gradient of the solution multiplied
|
||||
by the diffusion coefficient.
|
||||
|
||||
@param[in] el FiniteElement of the solution.
|
||||
@param[in] Trans The ElementTransformation describing the physical
|
||||
position of the mesh element.
|
||||
@param[in] u Solution coefficients representing the expansion of the
|
||||
solution function in the basis of @a el.
|
||||
@param[in] fluxelem FiniteElement of the "flux".
|
||||
@param[out] flux "Flux" coefficients representing the expansion of the
|
||||
"flux" function in the basis of @a fluxelem. The size
|
||||
of @a flux as a Vector has to be set by this method,
|
||||
e.g. using Vector::SetSize().
|
||||
@param[in] with_coef If zero (the default value is 1) the implementation
|
||||
of the method may choose not to scale the "flux"
|
||||
function by any coefficients describing the
|
||||
integrator.
|
||||
*/
|
||||
virtual void ComputeElementFlux(const FiniteElement &el,
|
||||
ElementTransformation &Trans,
|
||||
Vector &u,
|
||||
const FiniteElement &fluxelem,
|
||||
Vector &flux, int with_coef = 1) { }
|
||||
|
||||
/** @brief Virtual method required for Zienkiewicz-Zhu type error estimators.
|
||||
|
||||
The purpose of this method is to compute a local number that measures the
|
||||
energy of a given "flux" function (see ComputeElementFlux() for a
|
||||
description of the "flux" function). Typically, the energy of a "flux"
|
||||
function should be equal to a_local(u,u), if the "flux" is defined from
|
||||
a solution u; here a_local(.,.) denotes the element-local bilinear
|
||||
form represented by the integrator.
|
||||
|
||||
@param[in] fluxelem FiniteElement of the "flux".
|
||||
@param[in] Trans The ElementTransformation describing the physical
|
||||
position of the mesh element.
|
||||
@param[in] flux "Flux" coefficients representing the expansion of the
|
||||
"flux" function in the basis of @a fluxelem.
|
||||
@param[out] d_energy If not NULL, the given Vector should be set to
|
||||
represent directional energy split that can be used
|
||||
for anisotropic error estimation.
|
||||
@returns The computed energy.
|
||||
*/
|
||||
virtual double ComputeFluxEnergy(const FiniteElement &fluxelem,
|
||||
ElementTransformation &Trans,
|
||||
Vector &flux, Vector *d_energy = NULL)
|
||||
@@ -1754,7 +1706,6 @@ public:
|
||||
class VectorMassIntegrator: public BilinearFormIntegrator
|
||||
{
|
||||
private:
|
||||
int vdim;
|
||||
Vector shape, te_shape, vec;
|
||||
DenseMatrix partelmat;
|
||||
DenseMatrix mcoeff;
|
||||
@@ -1767,25 +1718,22 @@ private:
|
||||
public:
|
||||
/// Construct an integrator with coefficient 1.0
|
||||
VectorMassIntegrator()
|
||||
: vdim(-1), Q(NULL), VQ(NULL), MQ(NULL), Q_order(0) { }
|
||||
{ Q = NULL; VQ = NULL; MQ = NULL; Q_order = 0; }
|
||||
/** Construct an integrator with scalar coefficient q.
|
||||
If possible, save memory by using a scalar integrator since
|
||||
the resulting matrix is block diagonal with the same diagonal
|
||||
block repeated. */
|
||||
VectorMassIntegrator(Coefficient &q, int qo = 0)
|
||||
: vdim(-1), Q(&q) { VQ = NULL; MQ = NULL; Q_order = qo; }
|
||||
: Q(&q) { VQ = NULL; MQ = NULL; Q_order = qo; }
|
||||
VectorMassIntegrator(Coefficient &q, const IntegrationRule *ir)
|
||||
: BilinearFormIntegrator(ir), vdim(-1), Q(&q)
|
||||
: BilinearFormIntegrator(ir), Q(&q)
|
||||
{ VQ = NULL; MQ = NULL; Q_order = 0; }
|
||||
/// Construct an integrator with diagonal coefficient q
|
||||
VectorMassIntegrator(VectorCoefficient &q, int qo = 0)
|
||||
: vdim(q.GetVDim()), VQ(&q) { Q = NULL; MQ = NULL; Q_order = qo; }
|
||||
: VQ(&q) { Q = NULL; MQ = NULL; Q_order = qo; }
|
||||
/// Construct an integrator with matrix coefficient q
|
||||
VectorMassIntegrator(MatrixCoefficient &q, int qo = 0)
|
||||
: vdim(q.GetVDim()), MQ(&q) { Q = NULL; VQ = NULL; Q_order = qo; }
|
||||
|
||||
int GetVDim() const { return vdim; }
|
||||
void SetVDim(int vdim) { this->vdim = vdim; }
|
||||
: MQ(&q) { Q = NULL; VQ = NULL; Q_order = qo; }
|
||||
|
||||
virtual void AssembleElementMatrix(const FiniteElement &el,
|
||||
ElementTransformation &Trans,
|
||||
@@ -2070,8 +2018,7 @@ private:
|
||||
Coefficient *lambda, *mu;
|
||||
|
||||
#ifndef MFEM_THREAD_SAFE
|
||||
Vector shape;
|
||||
DenseMatrix dshape, gshape, pelmat;
|
||||
DenseMatrix dshape, Jinv, gshape, pelmat;
|
||||
Vector divshape;
|
||||
#endif
|
||||
|
||||
@@ -2086,33 +2033,6 @@ public:
|
||||
virtual void AssembleElementMatrix(const FiniteElement &,
|
||||
ElementTransformation &,
|
||||
DenseMatrix &);
|
||||
|
||||
/** Compute the stress corresponding to the local displacement @a u and
|
||||
interpolate it at the nodes of the given @a fluxelem. Only the symmetric
|
||||
part of the stress is stored, so that the size of @a flux is equal to
|
||||
the number of DOFs in @a fluxelem times dim*(dim+1)/2. In 2D, the order
|
||||
of the stress components is: s_xx, s_yy, s_xy. In 3D, it is: s_xx, s_yy,
|
||||
s_zz, s_xy, s_xz, s_yz. In other words, @a flux is the local vector for
|
||||
a FE space with dim*(dim+1)/2 vector components, based on the finite
|
||||
element @a fluxelem. */
|
||||
virtual void ComputeElementFlux(const FiniteElement &el,
|
||||
ElementTransformation &Trans,
|
||||
Vector &u,
|
||||
const FiniteElement &fluxelem,
|
||||
Vector &flux, int with_coef = 1);
|
||||
|
||||
/** Compute the element energy (integral of the strain energy density)
|
||||
corresponding to the stress represented by @a flux which is a vector of
|
||||
coefficients multiplying the basis functions defined by @a fluxelem. In
|
||||
other words, @a flux is the local vector for a FE space with
|
||||
dim*(dim+1)/2 vector components, based on the finite element @a fluxelem.
|
||||
The number of components, dim*(dim+1)/2 is such that it represents the
|
||||
symmetric part of the (symmetric) stress tensor. The order of the
|
||||
components is: s_xx, s_yy, s_xy in 2D, and s_xx, s_yy, s_zz, s_xy, s_xz,
|
||||
s_yz in 3D. */
|
||||
virtual double ComputeFluxEnergy(const FiniteElement &fluxelem,
|
||||
ElementTransformation &Trans,
|
||||
Vector &flux, Vector *d_energy = NULL);
|
||||
};
|
||||
|
||||
/** Integrator for the DG form:
|
||||
|
||||
+2
-279
@@ -87,6 +87,7 @@ double DeltaCoefficient::EvalDelta(ElementTransformation &T,
|
||||
return weight ? weight->Eval(T, ip, GetTime())*w : w;
|
||||
}
|
||||
|
||||
|
||||
void VectorCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationRule &ir)
|
||||
{
|
||||
@@ -152,17 +153,11 @@ void VectorArrayCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
}
|
||||
|
||||
VectorGridFunctionCoefficient::VectorGridFunctionCoefficient (
|
||||
GridFunction *gf)
|
||||
: VectorCoefficient ((gf) ? gf -> VectorDim() : 0)
|
||||
GridFunction *gf) : VectorCoefficient (gf -> VectorDim())
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
void VectorGridFunctionCoefficient::SetGridFunction(GridFunction *gf)
|
||||
{
|
||||
GridFunc = gf; vdim = (gf) ? gf -> VectorDim() : 0;
|
||||
}
|
||||
|
||||
void VectorGridFunctionCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
@@ -175,64 +170,6 @@ void VectorGridFunctionCoefficient::Eval(
|
||||
GridFunc->GetVectorValues(T, ir, M);
|
||||
}
|
||||
|
||||
GradientGridFunctionCoefficient::GradientGridFunctionCoefficient (
|
||||
GridFunction *gf)
|
||||
: VectorCoefficient((gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0)
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
void GradientGridFunctionCoefficient::SetGridFunction(GridFunction *gf)
|
||||
{
|
||||
GridFunc = gf; vdim = (gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0;
|
||||
}
|
||||
|
||||
void GradientGridFunctionCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
GridFunc->GetGradient(T, V);
|
||||
}
|
||||
|
||||
void GradientGridFunctionCoefficient::Eval(
|
||||
DenseMatrix &M, ElementTransformation &T, const IntegrationRule &ir)
|
||||
{
|
||||
GridFunc->GetGradients(T, ir, M);
|
||||
}
|
||||
|
||||
CurlGridFunctionCoefficient::CurlGridFunctionCoefficient (
|
||||
GridFunction *gf)
|
||||
: VectorCoefficient ((gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0)
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
void CurlGridFunctionCoefficient::SetGridFunction(GridFunction *gf)
|
||||
{
|
||||
GridFunc = gf; vdim = (gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0;
|
||||
}
|
||||
|
||||
void CurlGridFunctionCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
GridFunc->GetCurl(T, V);
|
||||
}
|
||||
|
||||
DivergenceGridFunctionCoefficient::DivergenceGridFunctionCoefficient (
|
||||
GridFunction *gf) : Coefficient()
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
double DivergenceGridFunctionCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
return GridFunc->GetDivergence(T);
|
||||
}
|
||||
|
||||
void VectorDeltaCoefficient::SetDirection(const Vector &_d)
|
||||
{
|
||||
dir = _d;
|
||||
@@ -350,220 +287,6 @@ void MatrixRestrictedCoefficient::Eval(DenseMatrix &K, ElementTransformation &T,
|
||||
}
|
||||
}
|
||||
|
||||
InnerProductCoefficient::InnerProductCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: a(&A), b(&B)
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == B.GetVDim(),
|
||||
"InnerProductCoefficient: "
|
||||
"Arguments have incompatible dimensions.");
|
||||
}
|
||||
|
||||
double InnerProductCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
return va * vb;
|
||||
}
|
||||
|
||||
VectorRotProductCoefficient::VectorRotProductCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: a(&A), b(&B), va(A.GetVDim()), vb(B.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == 2 && B.GetVDim() == 2,
|
||||
"VectorRotProductCoefficient: "
|
||||
"Arguments must have dimension equal to two.");
|
||||
}
|
||||
|
||||
double VectorRotProductCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
return va[0] * vb[1] - va[1] * vb[0];
|
||||
}
|
||||
|
||||
DeterminantCoefficient::DeterminantCoefficient(MatrixCoefficient &A)
|
||||
: a(&A), ma(A.GetHeight(), A.GetWidth())
|
||||
{
|
||||
MFEM_ASSERT(A.GetHeight() == A.GetWidth(),
|
||||
"DeterminantCoefficient: "
|
||||
"Argument must be a square matrix.");
|
||||
}
|
||||
|
||||
double DeterminantCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(ma, T, ip);
|
||||
return ma.Det();
|
||||
}
|
||||
|
||||
VectorSumCoefficient::VectorSumCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B,
|
||||
double _alpha, double _beta)
|
||||
: VectorCoefficient(A.GetVDim()), a(&A), b(&B), alpha(_alpha), beta(_beta),
|
||||
va(A.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == B.GetVDim(),
|
||||
"VectorSumCoefficient: "
|
||||
"Arguments must have the same dimension.");
|
||||
}
|
||||
|
||||
void VectorSumCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
b->Eval(V, T, ip);
|
||||
if ( beta != 1.0 ) { V *= beta; }
|
||||
a->Eval(va, T, ip);
|
||||
V.Add(alpha, va);
|
||||
}
|
||||
|
||||
ScalarVectorProductCoefficient::ScalarVectorProductCoefficient(
|
||||
Coefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: VectorCoefficient(B.GetVDim()), a(&A), b(&B)
|
||||
{}
|
||||
|
||||
void ScalarVectorProductCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
double sa = a->Eval(T, ip);
|
||||
b->Eval(V, T, ip);
|
||||
V *= sa;
|
||||
}
|
||||
|
||||
VectorCrossProductCoefficient::VectorCrossProductCoefficient(
|
||||
VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: VectorCoefficient(3), a(&A), b(&B), va(A.GetVDim()), vb(B.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == 3 && B.GetVDim() == 3,
|
||||
"VectorCrossProductCoefficient: "
|
||||
"Arguments must have dimension equal to three.");
|
||||
}
|
||||
|
||||
void VectorCrossProductCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
V.SetSize(3);
|
||||
V[0] = va[1] * vb[2] - va[2] * vb[1];
|
||||
V[1] = va[2] * vb[0] - va[0] * vb[2];
|
||||
V[2] = va[0] * vb[1] - va[1] * vb[0];
|
||||
}
|
||||
|
||||
MatVecCoefficient::MatVecCoefficient(MatrixCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: VectorCoefficient(A.GetHeight()), a(&A), b(&B),
|
||||
ma(A.GetHeight(), A.GetWidth()), vb(B.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetWidth() == B.GetVDim(),
|
||||
"MatVecCoefficient: Arguments have incompatible dimensions.");
|
||||
}
|
||||
|
||||
void MatVecCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(ma, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
ma.Mult(vb, V);
|
||||
}
|
||||
|
||||
void IdentityMatrixCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
M.SetSize(dim);
|
||||
M = 0.0;
|
||||
for (int d=0; d<dim; d++) { M(d,d) = 1.0; }
|
||||
}
|
||||
|
||||
MatrixSumCoefficient::MatrixSumCoefficient(MatrixCoefficient &A,
|
||||
MatrixCoefficient &B,
|
||||
double _alpha, double _beta)
|
||||
: MatrixCoefficient(A.GetHeight(), A.GetWidth()),
|
||||
a(&A), b(&B), alpha(_alpha), beta(_beta),
|
||||
ma(A.GetHeight(), A.GetWidth())
|
||||
{
|
||||
MFEM_ASSERT(A.GetHeight() == B.GetHeight() && A.GetWidth() == B.GetWidth(),
|
||||
"MatrixSumCoefficient: "
|
||||
"Arguments must have the same dimensions.");
|
||||
}
|
||||
|
||||
void MatrixSumCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
b->Eval(M, T, ip);
|
||||
if ( beta != 1.0 ) { M *= beta; }
|
||||
a->Eval(ma, T, ip);
|
||||
M.Add(alpha, ma);
|
||||
}
|
||||
|
||||
ScalarMatrixProductCoefficient::ScalarMatrixProductCoefficient(
|
||||
Coefficient &A,
|
||||
MatrixCoefficient &B)
|
||||
: MatrixCoefficient(B.GetHeight(), B.GetWidth()), a(&A), b(&B)
|
||||
{}
|
||||
|
||||
void ScalarMatrixProductCoefficient::Eval(DenseMatrix &M,
|
||||
ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
double sa = a->Eval(T, ip);
|
||||
b->Eval(M, T, ip);
|
||||
M *= sa;
|
||||
}
|
||||
|
||||
TransposeMatrixCoefficient::TransposeMatrixCoefficient(MatrixCoefficient &A)
|
||||
: MatrixCoefficient(A.GetWidth(), A.GetHeight()), a(&A)
|
||||
{}
|
||||
|
||||
void TransposeMatrixCoefficient::Eval(DenseMatrix &M,
|
||||
ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(M, T, ip);
|
||||
M.Transpose();
|
||||
}
|
||||
|
||||
InverseMatrixCoefficient::InverseMatrixCoefficient(MatrixCoefficient &A)
|
||||
: MatrixCoefficient(A.GetHeight(), A.GetWidth()), a(&A)
|
||||
{
|
||||
MFEM_ASSERT(A.GetHeight() == A.GetWidth(),
|
||||
"InverseMatrixCoefficient: "
|
||||
"Argument must be a square matrix.");
|
||||
}
|
||||
|
||||
void InverseMatrixCoefficient::Eval(DenseMatrix &M,
|
||||
ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(M, T, ip);
|
||||
M.Invert();
|
||||
}
|
||||
|
||||
OuterProductCoefficient::OuterProductCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: MatrixCoefficient(A.GetVDim(), B.GetVDim()), a(&A), b(&B),
|
||||
va(A.GetVDim()), vb(B.GetVDim())
|
||||
{}
|
||||
|
||||
void OuterProductCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
M.SetSize(va.Size(), vb.Size());
|
||||
for (int i=0; i<va.Size(); i++)
|
||||
{
|
||||
for (int j=0; j<vb.Size(); j++)
|
||||
{
|
||||
M(i, j) = va[i] * vb[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double LpNormLoop(double p, Coefficient &coeff, Mesh &mesh,
|
||||
const IntegrationRule *irs[])
|
||||
{
|
||||
|
||||
+6
-368
@@ -39,19 +39,9 @@ public:
|
||||
void SetTime(double t) { time = t; }
|
||||
double GetTime() { return time; }
|
||||
|
||||
/** @brief Evaluate the coefficient in the element described by @a T at the
|
||||
point @a ip. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip) = 0;
|
||||
|
||||
/** @brief Evaluate the coefficient in the element described by @a T at the
|
||||
point @a ip at time @a t. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip, double t)
|
||||
{
|
||||
@@ -167,7 +157,6 @@ private:
|
||||
int Component;
|
||||
|
||||
public:
|
||||
GridFunctionCoefficient() : GridF(NULL), Component(1) { }
|
||||
/** Construct GridFunctionCoefficient from a given GridFunction, and
|
||||
optionally specify a component to use if it is a vector GridFunction. */
|
||||
GridFunctionCoefficient (GridFunction *gf, int comp = 1)
|
||||
@@ -253,7 +242,7 @@ public:
|
||||
Coefficient *Weight() { return weight; }
|
||||
void GetDeltaCenter(Vector& center);
|
||||
/// Return the Scale() multiplied by the weight Coefficient, if any.
|
||||
virtual double EvalDelta(ElementTransformation &T, const IntegrationPoint &ip);
|
||||
double EvalDelta(ElementTransformation &T, const IntegrationPoint &ip);
|
||||
/** @brief A DeltaFunction cannot be evaluated. Calling this method will
|
||||
cause an MFEM error, terminating the application. */
|
||||
virtual double Eval(ElementTransformation &T, const IntegrationPoint &ip)
|
||||
@@ -291,26 +280,11 @@ public:
|
||||
/// Returns dimension of the vector.
|
||||
int GetVDim() { return vdim; }
|
||||
|
||||
/** @brief Evaluate the vector coefficient in the element described by @a T
|
||||
at the point @a ip, storing the result in @a V. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip) = 0;
|
||||
|
||||
/** @brief Evaluate the vector coefficient in the element described by @a T
|
||||
at all points of @a ir, storing the result in @a M. */
|
||||
/** The dimensions of @a M are GetVDim() by ir.GetNPoints() and they must be
|
||||
set by the implementation of this method.
|
||||
|
||||
The general implementation provided by the base class (using the Eval
|
||||
method for one IntegrationPoint at a time) can be overloaded for more
|
||||
efficient implementation.
|
||||
|
||||
@note The IntegrationPoint associated with @a T is not used, and this
|
||||
method will generally modify this IntegrationPoint associated with @a T.
|
||||
*/
|
||||
// General implementation using the Eval method for one IntegrationPoint.
|
||||
// Can be overloaded for more efficient implementation.
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationRule &ir);
|
||||
|
||||
@@ -400,10 +374,9 @@ protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
VectorGridFunctionCoefficient() : VectorCoefficient(0), GridFunc(NULL) { }
|
||||
VectorGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf);
|
||||
void SetGridFunction(GridFunction *gf) { GridFunc = gf; }
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
@@ -415,63 +388,6 @@ public:
|
||||
virtual ~VectorGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as the Gradient of a scalar GridFunction
|
||||
class GradientGridFunctionCoefficient : public VectorCoefficient
|
||||
{
|
||||
protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
GradientGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf);
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationRule &ir);
|
||||
|
||||
virtual ~GradientGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as the Curl of a vector GridFunction
|
||||
class CurlGridFunctionCoefficient : public VectorCoefficient
|
||||
{
|
||||
protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
CurlGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf);
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
|
||||
virtual ~CurlGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the Divergence of a vector GridFunction
|
||||
class DivergenceGridFunctionCoefficient : public Coefficient
|
||||
{
|
||||
protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
DivergenceGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf) { GridFunc = gf; }
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
|
||||
virtual ~DivergenceGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// VectorDeltaCoefficient: DeltaCoefficient with a direction
|
||||
class VectorDeltaCoefficient : public VectorCoefficient
|
||||
{
|
||||
@@ -504,8 +420,8 @@ public:
|
||||
/** @brief Return the specified direction vector multiplied by the value
|
||||
returned by DeltaCoefficient::EvalDelta() of the associated scalar
|
||||
DeltaCoefficient. */
|
||||
virtual void EvalDelta(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
void EvalDelta(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
using VectorCoefficient::Eval;
|
||||
/** @brief A VectorDeltaFunction cannot be evaluated. Calling this method
|
||||
will cause an MFEM error, terminating the application. */
|
||||
@@ -554,11 +470,6 @@ public:
|
||||
// For backward compatibility
|
||||
int GetVDim() const { return width; }
|
||||
|
||||
/** @brief Evaluate the matrix coefficient in the element described by @a T
|
||||
at the point @a ip, storing the result in @a K. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
virtual void Eval(DenseMatrix &K, ElementTransformation &T,
|
||||
const IntegrationPoint &ip) = 0;
|
||||
|
||||
@@ -660,279 +571,6 @@ public:
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Coefficients based on sums and products of other coefficients
|
||||
|
||||
/// Scalar coefficient defined as the sum of two scalar coefficients
|
||||
class SumCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
Coefficient * b;
|
||||
|
||||
double alpha;
|
||||
double beta;
|
||||
|
||||
public:
|
||||
// Result is _alpha * A + _beta * B
|
||||
SumCoefficient(Coefficient &A, Coefficient &B,
|
||||
double _alpha = 1.0, double _beta = 1.0)
|
||||
: a(&A), b(&B), alpha(_alpha), beta(_beta) { }
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{ return alpha * a->Eval(T, ip) + beta * b->Eval(T, ip); }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the product of two scalar coefficients
|
||||
class ProductCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
Coefficient * b;
|
||||
|
||||
public:
|
||||
ProductCoefficient(Coefficient &A, Coefficient &B)
|
||||
: a(&A), b(&B) { }
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{ return a->Eval(T, ip) * b->Eval(T, ip); }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as a scalar raised to a power
|
||||
class PowerCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
|
||||
double p;
|
||||
|
||||
public:
|
||||
// Result is A^p
|
||||
PowerCoefficient(Coefficient &A, double _p)
|
||||
: a(&A), p(_p) { }
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{ return pow(a->Eval(T, ip), p); }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the inner product of two vector coefficients
|
||||
class InnerProductCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
public:
|
||||
InnerProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as a cross product of two vectors in 2D
|
||||
class VectorRotProductCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
VectorRotProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the determinant of a matrix coefficient
|
||||
class DeterminantCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
|
||||
mutable DenseMatrix ma;
|
||||
|
||||
public:
|
||||
DeterminantCoefficient(MatrixCoefficient &A);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as the sum of two vector coefficients
|
||||
class VectorSumCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
double alpha;
|
||||
double beta;
|
||||
|
||||
mutable Vector va;
|
||||
|
||||
public:
|
||||
// Result is _alpha * A + _beta * B
|
||||
VectorSumCoefficient(VectorCoefficient &A, VectorCoefficient &B,
|
||||
double _alpha = 1.0, double _beta = 1.0);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as a product of a scalar and a vector
|
||||
class ScalarVectorProductCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
public:
|
||||
ScalarVectorProductCoefficient(Coefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as a cross product of two vectors
|
||||
class VectorCrossProductCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
VectorCrossProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as a matrix vector product
|
||||
class MatVecCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable DenseMatrix ma;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
MatVecCoefficient(MatrixCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the identity of dimension d
|
||||
class IdentityMatrixCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
int dim;
|
||||
|
||||
public:
|
||||
IdentityMatrixCoefficient(int d)
|
||||
: MatrixCoefficient(d, d), dim(d) { }
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the sum of two matrix coefficients
|
||||
class MatrixSumCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
MatrixCoefficient * b;
|
||||
|
||||
double alpha;
|
||||
double beta;
|
||||
|
||||
mutable DenseMatrix ma;
|
||||
|
||||
public:
|
||||
// Result is _alpha * A + _beta * B
|
||||
MatrixSumCoefficient(MatrixCoefficient &A, MatrixCoefficient &B,
|
||||
double _alpha = 1.0, double _beta = 1.0);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as a product of a scalar and a matrix
|
||||
class ScalarMatrixProductCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
MatrixCoefficient * b;
|
||||
|
||||
public:
|
||||
ScalarMatrixProductCoefficient(Coefficient &A, MatrixCoefficient &B);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the transpose a matrix
|
||||
class TransposeMatrixCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
|
||||
public:
|
||||
TransposeMatrixCoefficient(MatrixCoefficient &A);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the inverse a matrix
|
||||
class InverseMatrixCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
|
||||
public:
|
||||
InverseMatrixCoefficient(MatrixCoefficient &A);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the outer product of two vectors
|
||||
class OuterProductCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
OuterProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/** Compute the Lp norm of a function f.
|
||||
\f$ \| f \|_{Lp} = ( \int_\Omega | f |^p d\Omega)^{1/p} \f$ */
|
||||
double ComputeLpNorm(double p, Coefficient &coeff, Mesh &mesh,
|
||||
|
||||
@@ -699,7 +699,8 @@ ConduitDataCollection::MeshToBlueprintMesh(Mesh *mesh,
|
||||
n_topo["type"] = "unstructured";
|
||||
n_topo["coordset"] = coordset_name;
|
||||
|
||||
Element::Type ele_type = mesh->GetElementType(0);
|
||||
Element::Type ele_type = static_cast<Element::Type>(mesh->GetElement(
|
||||
0)->GetType());
|
||||
|
||||
std::string ele_shape = ElementTypeToShapeName(ele_type);
|
||||
|
||||
@@ -773,7 +774,8 @@ ConduitDataCollection::MeshToBlueprintMesh(Mesh *mesh,
|
||||
n_bndry_topo["type"] = "unstructured";
|
||||
n_bndry_topo["coordset"] = coordset_name;
|
||||
|
||||
Element::Type bndry_ele_type = mesh->GetBdrElementType(0);
|
||||
Element::Type bndry_ele_type = static_cast<Element::Type>(mesh->GetBdrElement(
|
||||
0)->GetType());
|
||||
|
||||
std::string bndry_ele_shape = ElementTypeToShapeName(bndry_ele_type);
|
||||
|
||||
@@ -1161,8 +1163,6 @@ ConduitDataCollection::ElementTypeToShapeName(Element::Type element_type)
|
||||
case Element::QUADRILATERAL: return "quad";
|
||||
case Element::TETRAHEDRON: return "tet";
|
||||
case Element::HEXAHEDRON: return "hex";
|
||||
case Element::WEDGE:
|
||||
default: ;
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
|
||||
+1
-3
@@ -367,8 +367,7 @@ int InverseElementTransformation::Transform(const Vector &pt,
|
||||
}
|
||||
|
||||
|
||||
void IsoparametricTransformation::SetIdentityTransformation(
|
||||
Geometry::Type GeomType)
|
||||
void IsoparametricTransformation::SetIdentityTransformation(int GeomType)
|
||||
{
|
||||
switch (GeomType)
|
||||
{
|
||||
@@ -378,7 +377,6 @@ void IsoparametricTransformation::SetIdentityTransformation(
|
||||
case Geometry::SQUARE : FElem = &QuadrilateralFE; break;
|
||||
case Geometry::TETRAHEDRON : FElem = &TetrahedronFE; break;
|
||||
case Geometry::CUBE : FElem = &HexahedronFE; break;
|
||||
case Geometry::PRISM : FElem = &WedgeFE; break;
|
||||
default:
|
||||
MFEM_ABORT("unknown Geometry::Type!");
|
||||
}
|
||||
|
||||
+3
-4
@@ -34,8 +34,7 @@ protected:
|
||||
ADJUGATE_MASK = 4,
|
||||
INVERSE_MASK = 8
|
||||
};
|
||||
Geometry::Type geom;
|
||||
int space_dim;
|
||||
int geom, space_dim;
|
||||
|
||||
// Evaluate the Jacobian of the transformation at the IntPoint and store it
|
||||
// in dFdx.
|
||||
@@ -83,7 +82,7 @@ public:
|
||||
virtual int OrderGrad(const FiniteElement *fe) = 0;
|
||||
|
||||
/// Return the Geometry::Type of the reference element.
|
||||
Geometry::Type GetGeometryType() const { return geom; }
|
||||
int GetGeometryType() const { return geom; }
|
||||
|
||||
/// Return the dimension of the reference element.
|
||||
int GetDimension() const { return Geometry::Dimension[geom]; }
|
||||
@@ -313,7 +312,7 @@ public:
|
||||
DenseMatrix &GetPointMat() { return PointMat; }
|
||||
void FinalizeTransformation() { space_dim = PointMat.Height(); }
|
||||
|
||||
void SetIdentityTransformation(Geometry::Type GeomType);
|
||||
void SetIdentityTransformation(int GeomType);
|
||||
|
||||
virtual void Transform(const IntegrationPoint &, Vector &);
|
||||
virtual void Transform(const IntegrationRule &, DenseMatrix &);
|
||||
|
||||
+2
-3
@@ -17,14 +17,13 @@ namespace mfem
|
||||
void ZienkiewiczZhuEstimator::ComputeEstimates()
|
||||
{
|
||||
flux_space->Update(false);
|
||||
// In parallel, 'flux' can be a GridFunction, as long as 'flux_space' is a
|
||||
// ParFiniteElementSpace and 'solution' is a ParGridFunction.
|
||||
GridFunction flux(flux_space);
|
||||
|
||||
if (!anisotropic) { aniso_flags.SetSize(0); }
|
||||
const int with_subdomains = 1;
|
||||
total_error = ZZErrorEstimator(*integ, *solution, flux, error_estimates,
|
||||
anisotropic ? &aniso_flags : NULL,
|
||||
flux_averaging);
|
||||
with_subdomains);
|
||||
|
||||
current_sequence = solution->FESpace()->GetMesh()->GetSequence();
|
||||
}
|
||||
|
||||
@@ -77,7 +77,6 @@ protected:
|
||||
double total_error;
|
||||
bool anisotropic;
|
||||
Array<int> aniso_flags;
|
||||
int flux_averaging; // see SetFluxAveraging()
|
||||
|
||||
BilinearFormIntegrator *integ; ///< Not owned.
|
||||
GridFunction *solution; ///< Not owned.
|
||||
@@ -110,7 +109,6 @@ public:
|
||||
: current_sequence(-1),
|
||||
total_error(),
|
||||
anisotropic(false),
|
||||
flux_averaging(0),
|
||||
integ(&integ),
|
||||
solution(&sol),
|
||||
flux_space(flux_fes),
|
||||
@@ -129,7 +127,6 @@ public:
|
||||
: current_sequence(-1),
|
||||
total_error(),
|
||||
anisotropic(false),
|
||||
flux_averaging(0),
|
||||
integ(&integ),
|
||||
solution(&sol),
|
||||
flux_space(&flux_fes),
|
||||
@@ -141,14 +138,6 @@ public:
|
||||
ComputeFluxEnergy() method. */
|
||||
void SetAnisotropic(bool aniso = true) { anisotropic = aniso; }
|
||||
|
||||
/** @brief Set the way the flux is averaged (smoothed) across elements.
|
||||
|
||||
When @a fa is zero (default), averaging is performed globally. When @a fa
|
||||
is non-zero, the flux averaging is performed locally for each mesh
|
||||
attribute, i.e. the flux is not averaged across interfaces between
|
||||
different mesh attributes. */
|
||||
void SetFluxAveraging(int fa) { flux_averaging = fa; }
|
||||
|
||||
/// Return the total error from the last error estimate.
|
||||
double GetTotalError() const { return total_error; }
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user