## 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 BoundaryIDs 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'
[../]
[]


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 ThreadedGeneralUserObjects 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