Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions two-scale-heat-conduction/micro-dumux-mada/mada_switcher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import numpy as np


def switching_function(resolution, location, t, input, prev_output):
result = 0
# in the beginning we only want FOM
if t == 0.0:
if resolution > 0: result = -1
else: result = 0
# after small init phase, we want dynamic model selection
# for test purposes we say ROM is accurate in range
else:
concentration = input['concentration']
is_valid_range = 0.45 < concentration < 0.55
is_fom = resolution == 0

if is_fom and is_valid_range: result = 1
if not is_fom and not is_valid_range: result = -1

return result
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"micro_file_name": "micro_sim",
"coupling_params": {
"participant_name": "Micro-Manager",
"precice_config_file_name": "../precice-config.xml",
"macro_mesh_name": "macro-mesh",
"write_data_names": ["k_00", "k_01", "k_10", "k_11", "porosity"],
"read_data_names": ["concentration"]
},
"simulation_params": {
"micro_dt": 0.01,
"macro_domain_bounds": [0.0, 1.0, 0.0, 0.5],
"decomposition": [1, 1],
"adaptivity": "True",
"adaptivity_settings": {
"type": "global",
"data": ["k_00", "k_11", "porosity", "concentration"],
"history_param": 0.1,
"coarsening_constant": 0.2,
"refining_constant": 0.05,
"every_implicit_iteration": "False",
"similarity_measure": "L2rel"
},
"model_adaptivity": true,
"model_adaptivity_settings": {
"micro_file_names": ["micro_sim", "micro_sim_sur"],
"data": [],
"thresholds": [1.0, 1.0],
"switching_function": "mada_switcher"
}
},
"diagnostics": {
"data_from_micro_sims": ["grain_size"]
}
}
15 changes: 15 additions & 0 deletions two-scale-heat-conduction/micro-dumux-mada/micro_sim.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
CXX=@CXX@
CC=@CC@
DEPENDENCIES=@REQUIRES@

Name: @PACKAGE_NAME@
Version: @VERSION@
Description: micro_sim module
URL: http://dune-project.org/
Requires: dumux-phasefield dumux-precice
Libs: -L${libdir}
Cflags: -I${includedir}
59 changes: 59 additions & 0 deletions two-scale-heat-conduction/micro-dumux-mada/micro_sim_sur.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Micro simulation Surrogate, requrie previous computation of surrogate model
"""
import os
import subprocess
from bayesvalidrox import PyLinkForwardModel, Input, PCE, ExpDesigns, Engine
import h5py
import joblib
import numpy as np
import math


class MicroSimulation:

def __init__(self, sim_id):
"""
Constructor of MicroSimulation class.
"""
self._sim_id = sim_id
self._state = None

self._model = None
with open('micro-dumux-surrogate.pkl', 'rb') as input:
self._model = joblib.load(input)
if self._model is None:
raise RuntimeError("Failed to load model.")

def initialize(self):
output_data = dict()
output_data["k_00"] = 0.4912490635619572
output_data["k_11"] = 0.4912490635989945
output_data["porosity"] = 0.4933482661391027

if self._sim_id == 0:
output_data["k_00"] = 0.4912490640081466
output_data["k_11"] = 0.4912490640081367

return output_data

def get_state(self):
return self._state;

def set_state(self, state):
self._state = state

def solve(self, macro_data, dt):
model_eval, _ = self._model.eval_metamodel(np.array([macro_data["concentration"]])[:, np.newaxis])
output_data = dict()
output_data["k_00"] = model_eval["k_00"][0][0]
output_data["k_01"] = model_eval["k_01"][0][0]
output_data["k_10"] = model_eval["k_10"][0][0]
output_data["k_11"] = model_eval["k_11"][0][0]
output_data["porosity"] = model_eval["porosity"][0][0]
output_data["grain_size"] = math.sqrt((1 - model_eval["porosity"][0][0]) / math.pi)

return output_data



25 changes: 25 additions & 0 deletions two-scale-heat-conduction/micro-dumux-mada/params.input
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[Assembly]
Multithreading = false

[TimeLoop]
TEnd = 0.25 # end time of the simulation
DtInitial = 0.01 # initial time step size
MaxTimeStepSize = 0.01 # maximal time step size

[Grid]
LowerLeft = 0.0 0.0 # lower left (front) corner of the domain (keep this fixed at 0 0!)
UpperRight = 1.0 1.0 # upper right (back) corner of the domain
Cells = 80 80 # grid resolution in each coordinate direction
Periodic = 1 1 # Periodic Boundary conditions in both dimensions

[Problem]
xi = 0.08 # phasefield parameter (lambda, set to around 4/Ncells)
omega = 0.01 # phasefield diffusivity/surface tension parameter (gamma)
kt = 1.0 # constant deciding speed of expansion/contraction
eqconc = 0.5 # equilibrium concentration
ks = 1.0 # conductivity of sand material
kg = 0.0 # conductivity of void material
Name = cell_phase # base name for VTK output files
Radius = 0.4 # initial radius of the grain
PhasefieldICScaling = 4.0 # factor in initial phasefield function
MaxPorosity = 0.9686 # porosity cap
6 changes: 6 additions & 0 deletions two-scale-heat-conduction/micro-dumux-surrogate/clean.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env sh
set -e -u

. ../../tools/cleaning-tools.sh

clean_dumux .
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -e -u

. ../../tools/log.sh
exec > >(tee --append "$LOGFILE") 2>&1

usage() { echo "Usage: cmd [-s] [-p n]" 1>&2; exit 1; }

# Check if no input argument was provided
if [ -z "$*" ] ; then
echo "No input argument provided. Micro Manager for snapshot computation is launched in serial"
micro-manager-precice --snapshot micro-manager-snapshot-config.json
fi

while getopts ":sp" opt; do
case ${opt} in
s)
micro-manager-precice --snapshot micro-manager-snapshot-config.json
;;
p)
mpiexec -n "$2" micro-manager-precice --snapshot micro-manager-snapshot-config.json
;;
*)
usage
;;
esac
done

close_log
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"micro_file_name": "micro_sim",
"coupling_params": {
"parameter_file_name": "input_samples.hdf5",
"read_data_names": ["concentration"],
"write_data_names": ["k_00", "k_01", "k_10", "k_11", "porosity"]
},
"simulation_params": {
"micro_dt": 0.01
},
"snapshot_params": {
"initialize_once": false
},
"output_directory": "output"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"micro_file_name": "micro_sim_sur",
"coupling_params": {
"participant_name": "Micro-Manager",
"precice_config_file_name": "../precice-config.xml",
"macro_mesh_name": "macro-mesh",
"write_data_names": ["k_00", "k_01", "k_10", "k_11", "porosity"],
"read_data_names": ["concentration"]
},
"simulation_params": {
"micro_dt": 0.01,
"macro_domain_bounds": [0.0, 1.0, 0.0, 0.5],
"decomposition": [1, 1],
"adaptivity": "True",
"adaptivity_settings": {
"type": "global",
"data": ["k_00", "k_11", "porosity", "concentration"],
"history_param": 0.1,
"coarsening_constant": 0.2,
"refining_constant": 0.05,
"every_implicit_iteration": "False",
"similarity_measure": "L2rel"
}
},
"diagnostics": {
"data_from_micro_sims": ["grain_size"]
}
}
15 changes: 15 additions & 0 deletions two-scale-heat-conduction/micro-dumux-surrogate/micro_sim.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
CXX=@CXX@
CC=@CC@
DEPENDENCIES=@REQUIRES@

Name: @PACKAGE_NAME@
Version: @VERSION@
Description: micro_sim module
URL: http://dune-project.org/
Requires: dumux-phasefield dumux-precice
Libs: -L${libdir}
Cflags: -I${includedir}
59 changes: 59 additions & 0 deletions two-scale-heat-conduction/micro-dumux-surrogate/micro_sim_sur.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Micro simulation Surrogate, requrie previous computation of surrogate model
"""
import os
import subprocess
from bayesvalidrox import PyLinkForwardModel, Input, PCE, ExpDesigns, Engine
import h5py
import joblib
import numpy as np
import math


class MicroSimulation:

def __init__(self, sim_id):
"""
Constructor of MicroSimulation class.
"""
self._sim_id = sim_id
self._state = None

self._model = None
with open('micro-dumux-surrogate.pkl', 'rb') as input:
self._model = joblib.load(input)
if self._model is None:
raise RuntimeError("Failed to load model.")

def initialize(self):
output_data = dict()
output_data["k_00"] = 0.4912490635619572
output_data["k_11"] = 0.4912490635989945
output_data["porosity"] = 0.4933482661391027

if self._sim_id == 0:
output_data["k_00"] = 0.4912490640081466
output_data["k_11"] = 0.4912490640081367

return output_data

def get_state(self):
return self._state;

def set_state(self, state):
self._state = state

def solve(self, macro_data, dt):
model_eval, _ = self._model.eval_metamodel(np.array([macro_data["concentration"]])[:, np.newaxis])
output_data = dict()
output_data["k_00"] = model_eval["k_00"][0][0]
output_data["k_01"] = model_eval["k_01"][0][0]
output_data["k_10"] = model_eval["k_10"][0][0]
output_data["k_11"] = model_eval["k_11"][0][0]
output_data["porosity"] = model_eval["porosity"][0][0]
output_data["grain_size"] = math.sqrt((1 - model_eval["porosity"][0][0]) / math.pi)

return output_data



5 changes: 5 additions & 0 deletions two-scale-heat-conduction/micro-dumux-surrogate/model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Dummy model function for the micro-dumux surrogate.
# We do not wrap the original DuMuX model because we will directly provide
# snapshots (computed by the Micro Manager) to BayesValidRox.
def model(samples):
return None
25 changes: 25 additions & 0 deletions two-scale-heat-conduction/micro-dumux-surrogate/params.input
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[Assembly]
Multithreading = false

[TimeLoop]
TEnd = 0.25 # end time of the simulation
DtInitial = 0.01 # initial time step size
MaxTimeStepSize = 0.01 # maximal time step size

[Grid]
LowerLeft = 0.0 0.0 # lower left (front) corner of the domain (keep this fixed at 0 0!)
UpperRight = 1.0 1.0 # upper right (back) corner of the domain
Cells = 80 80 # grid resolution in each coordinate direction
Periodic = 1 1 # Periodic Boundary conditions in both dimensions

[Problem]
xi = 0.08 # phasefield parameter (lambda, set to around 4/Ncells)
omega = 0.01 # phasefield diffusivity/surface tension parameter (gamma)
kt = 1.0 # constant deciding speed of expansion/contraction
eqconc = 0.5 # equilibrium concentration
ks = 1.0 # conductivity of sand material
kg = 0.0 # conductivity of void material
Name = cell_phase # base name for VTK output files
Radius = 0.4 # initial radius of the grain
PhasefieldICScaling = 4.0 # factor in initial phasefield function
MaxPorosity = 0.9686 # porosity cap
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
numpy
bayesvalidrox
micro-manager-precice
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -e -u

python3 -m venv .venv
. .venv/bin/activate

pip install -r requirements.txt

python surrogate_workflow.py
29 changes: 29 additions & 0 deletions two-scale-heat-conduction/micro-dumux-surrogate/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -e -u

. ../../tools/log.sh
exec > >(tee --append "$LOGFILE") 2>&1

usage() { echo "Usage: cmd [-s] [-p n]" 1>&2; exit 1; }

# Check if no input argument was provided
if [ -z "$*" ] ; then
echo "No input argument provided. Micro Manager is launched in serial"
micro-manager-precice micro-manager-surrogate-config.json
fi

while getopts ":sp" opt; do
case ${opt} in
s)
micro-manager-precice micro-manager-surrogate-config.json
;;
p)
mpiexec -n "$2" micro-manager-precice micro-manager-surrogate-config.json
;;
*)
usage
;;
esac
done

close_log
Loading
Loading