') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - LightForm-group/matflow: Computational materials science workflow management in Python · GitHub
Skip to content

Repository files navigation

DOIPyPI version

This code has been superseded by a new version that can be found here: https://github.com/hpcflow/matflow-new.

MatFlow

MatFlow is a framework for running reproducible workflows in materials science developed in the EPSRC programme grant LightForm, a research programme on light alloy formability. It is a python program that interacts with software (open-source and proprietary) used in materials science via extensions (see supported extensions below). It is particularly suited for hybrid workflows (involving experimental data and computational work), like for example HPC model calibration. Outputs,together with details of the worflow are automatically stored in an open source file format for post-processing, which Matflow can automatically upload to data repositories like Zenodo.

See this repository for information regarding a MatFlow installation.

Extensions

MatFlow uses extension packages to interact with arbitrary software. Here is a list of current MatFlow extensions.

Released/in-progress extensions

SoftwareDescriptionStatusVersion
DAMASKDüsseldorf Advanced Material Simulation Kit (crystal plasticity)ReleasedPyPI version
MTEXMatlab toolbox for analyzing and modeling crystallographic texturesReleasedPyPI version
formableFormability analyses in PythonReleasedPyPI version
DefDAPA python library for correlating EBSD and HRDIC data.ReleasedPyPI version
AbaqusFinite element analysisIn-progressPyPI version
NeperPolycrystal generation and meshingReleased/In-progressPyPI version

Example inputs/outputs

LabelAttributesOutput from tasksInput to tasks
ODFcrystal_symmetry
speciment_symmetry
euler_angles
euler_angle_labels
weights
orientation_coordinate_system
get_model_texture
estimate_ODF
sample_texture
microstructure_seedsposition
orientations
grid_size
phase_label
generate_microstructure_seedsgenerate_volume_element
orientationseuler_angles
euler_angle_labels
orientation_coordinate_system
sample_texturegenerate_volume_element
volume_elementgrid
size
origin
orientations
grain_orientation_idx
grain_phase_label_idx
phase_labels
voxel_grain_idx
voxel_homogenization_idx
generate_volume_elementvisualise_volume_element
simulate_volume_element_loading
load_casetotal_time
num_increments
def_grad_aim
def_grad_rate
stress
rotation
generate_load_casesimulate_volume_element_loading
volume_element_response...simulate_volume_element_loading

Specifying default run options

Default run options (i.e. options passed to the scheduler) can be specified in a few ways. Firstly, within the workflow file, run_options specified at the top-level will be used for any tasks that do not have a run_options specified. If a task does have a run_options key specified, the global run_options will not be used at all for that task.

Additionally, you can specify default run options in the MatFlow configuration file (config.yml, by default generated in ~/.matflow) with the options default_run_options and default_sticky_run_options. The "sticky" defaults are merged with any run options specified in the workflow file (with workflow-specified options taking precedence), whereas the "non-sticky" defaults are only used if no run options are supplied for a task. If no run options are supplied for a task, then both the "sticky" and "non-sticky" defaults will be used (with the "non-sticky" defaults taking precedence over the "sticky" defaults). Similar keys exist for task preparation and processing run options: default_preparation_run_options, default_sticky_preparation_run_options and default_processing_run_options, default_sticky_processing_run_options.

About

Computational materials science workflow management in Python

Topics

Resources

Stars

17 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages