MOOSE Newsletter (August 2018)
MooseDocs Plots
It is now possible to include line plots in MOOSE markdown. The plots are created using plotly; additional information may be found on the Graph Extension page.
!plot scatter data=[{'x':[1,2,3,4], 'y':[2,4,6,8], 'name':'2x'},
{'x':[1,2,3,4], 'y':[1,4,9,16], 'name':'x*x', 'marker':{'size':14}}]
MeshModifier for creating lower dimensional blocks
It is now possible to generate a lower dimensional block from sidesets using the MOOSE MeshModifier LowerDBlockFromSideset
. The required parameters to use the modifier are sidesets
which is a vector of BoundaryID
s from which to build the new block and new_block_id
which is the SubdomainID
of the new block. An optional parameter is new_block_name
if the user wants to define a name for the newly created block. The order of the lower dimensional elements created will match the order of the parent element. E.g. if we are creating a block from QUAD9
or TRI6
faces, then the newly created 1D block will have elements of type EDGE3
. QUAD4
and TRI3
elements would yield EDGE2
. 3D behavior is analogous. The snippet below shows input file syntax for using LowerDBlocksFromSideset
:
[MeshModifiers]
[./lower]
type = LowerDBlockFromSideset
sidesets = '0 1 2 3'
new_block_id = 10
new_block_name = 'lower_d'
[../]
[]
Threaded General User Objects
Up until now, general user objects were executed in a single threaded region, even if the application ran with multiple-threads. Now, it is possible to have threaded general user objects. Users need to inherit from ThreadedGeneralUserObject
class and MOOSE will create one threaded instance per thread. Then, it is possible to safely access the user object from each thread. This is not possible in the normal GeneralUserObject unless the access is guarded with a spin mutex.
The fluid_properties
module was updated to use the ThreadedGeneralUserObject
to ensure that fluid property lookup is always thread safe and that there is no loss of performance.
Note that ThreadedGeneralUserObject
s are not available when users use pthreads as their threading model. The reason is that if a ThreadedGeneralUserObject
(which runs in a threaded region) created a threaded section, there would be n_threads + n_threads^2
threads active which would cause a performance loss. If threaded general user objects are needed, they will run properly with OpenMP or TBB.
Working with a different version of libMesh
A new flag has been added to the update_and_rebuild.sh script so that you can work with a different version of libmesh. This can be handy when a new feature makes its way into libMesh but has not been rolled out in MOOSE yet. To use this flag, simply check out the version of libMesh that you want and supply "–skip-submodule-update" on the command line to keep that version when you build libMesh.
GrainTracker Enhancements
For those people working with phase-field and using the GrainTracker, several enhacements and updates were added during July. First, a significant algorithmic change parallelizing the merging of grains across multiple processors was completed, resulting in a significant speed increase when running larger problems. Second, an experimental "boundary restrictable" capability was added to only count features on specified boundaries. New test cases and large input files were added. A tolerate_failure
option was also added, along with several new PerfGraph timers, for profiling purposes.
Parameter Error and Warning
Formatting improvments merged this month.
What is paramWarning and paramError?
While these methods are not new features (they were introduced earlier this spring), it's worth mentioning again. All developers are encouraged to use the paramInfo, paramWarning, or paramError methods instead of the mooseInfo, mooseWarning, or mooseError methods in MOOSE when working with input parameters. The former methods report line numbers along with user supplied messages when information, warnings, or errors are issued. This can be very helpful when users are hunting down input file problems.
Bug fixes
LayeredBase is now restartable (finally)
Better errors for unregistered objects
AverageGrainVolume now correctly calculates by dividing by the number of active (not total) grains