From 4f7d639fc5dc2f7ba3f4c4018b930a28a88c4443 Mon Sep 17 00:00:00 2001 From: Oliver Sander <oliver.sander@tu-dresden.de> Date: Tue, 9 Feb 2021 22:19:15 +0100 Subject: [PATCH] Python test driver for quasiconvexity tests --- .../quasiconvexity-micromorphic-testsuite.py | 28 +++ .../render-quasiconvexity-test-results.py | 222 ++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 quasiconvexity-micromorphic-testsuite/quasiconvexity-micromorphic-testsuite.py create mode 100644 quasiconvexity-micromorphic-testsuite/render-quasiconvexity-test-results.py diff --git a/quasiconvexity-micromorphic-testsuite/quasiconvexity-micromorphic-testsuite.py b/quasiconvexity-micromorphic-testsuite/quasiconvexity-micromorphic-testsuite.py new file mode 100644 index 0000000..c66fd47 --- /dev/null +++ b/quasiconvexity-micromorphic-testsuite/quasiconvexity-micromorphic-testsuite.py @@ -0,0 +1,28 @@ +import subprocess + +numLevels = 3 + +c = 1 + +processList = [] + +for L_c in [1,10,100]: + + for x0 in [0.2, 0.5, 2]: + + LOGFILE = "./quasiconvexity_micromorphic_" + str(numLevels) + "_" + str(L_c) + "_" + str(x0) + ".log" + + ## run the actual simulation + proc = subprocess.Popen("./quasiconvexity-test-micromorphic quasiconvexity-circle-magic.parset" + + " -materialParameters.c " + str(c) + + " -L_c " + str(L_c) + + " -x0 " + str(x0) + + " -numLevels " + str(numLevels) + + " | tee " + LOGFILE, shell=True) + processList.append(proc) + + # Wait for all simulation subprocesses before proceeding to the error measurement step + #exit_codes = [proc.wait() for p in processList] + + + diff --git a/quasiconvexity-micromorphic-testsuite/render-quasiconvexity-test-results.py b/quasiconvexity-micromorphic-testsuite/render-quasiconvexity-test-results.py new file mode 100644 index 0000000..a7f7e46 --- /dev/null +++ b/quasiconvexity-micromorphic-testsuite/render-quasiconvexity-test-results.py @@ -0,0 +1,222 @@ +#### import the simple module from the paraview +from paraview.simple import * + +# For pattern matching +import re + +#### disable automatic camera reset on 'Show' +paraview.simple._DisableFirstRenderCameraReset() + +# get the material library +materialLibrary1 = GetMaterialLibrary() + +# Render result +def renderResult(filePrefix, texFile): + + # ---------------------------------------------------------------- + # setup views used in the visualization + # ---------------------------------------------------------------- + + # Create a new 'Render View' + renderView1 = CreateView('RenderView') + renderView1.ViewSize = [1000, 695] + renderView1.InteractionMode = '2D' + renderView1.AxesGrid = 'GridAxes3DActor' + renderView1.StereoType = 'Crystal Eyes' + renderView1.CameraPosition = [0.0, 0.0, 10000.0] + renderView1.CameraFocalDisk = 1.0 + renderView1.CameraParallelScale = 1.4142135623730951 + renderView1.BackEnd = 'OSPRay raycaster' + renderView1.OSPRayMaterialLibrary = materialLibrary1 + + SetActiveView(None) + + # ---------------------------------------------------------------- + # setup view layouts + # ---------------------------------------------------------------- + + # create new layout object 'Layout #1' + layout1 = CreateLayout(name='Layout #1') + layout1.AssignView(0, renderView1) + layout1.SetSize(1247, 695) + + # ---------------------------------------------------------------- + # restore active view + SetActiveView(renderView1) + # ---------------------------------------------------------------- + + # ---------------------------------------------------------------- + # setup the data processing pipelines + # ---------------------------------------------------------------- + + # create a new 'XML Unstructured Grid Reader' + data = XMLUnstructuredGridReader(registrationName=filePrefix + ".vtu", FileName=['/home/sander/dune/dune-elasticity/quasiconvexity-micromorphic-testsuite/' + filePrefix + ".vtu"]) + data.CellArrayStatus = ['determinant', 'K'] + data.TimeArray = 'None' + + # ---------------------------------------------------------------- + # setup the visualization in view 'renderView1' + # ---------------------------------------------------------------- + + # show data from 'data' + dataDisplay = Show(data, renderView1, 'UnstructuredGridRepresentation') + + determinantRange = data.CellData[0].GetRange() # Let's hope this is determinant + texFile.write("det range: " + str(determinantRange[0]) + ", " + str(determinantRange[1]) + "\n\n") + + KRange = data.CellData[1].GetRange() # Let's hope this is K + texFile.write("K range: " + str(KRange[0]) + ", " + str(KRange[1]) + "\n\n") + + # get color transfer function/color map for 'determinant' + #determinantLUT = GetColorTransferFunction('determinant') + #determinantLUT.RGBPoints = [-0.016938600689172745, 0.231373, 0.298039, 0.752941, 0.8577657174319029, 0.865003, 0.865003, 0.865003, 1.7324700355529785, 0.705882, 0.0156863, 0.14902] + #determinantLUT.ScalarRangeInitialized = 1.0 + determinantLUT = MakeBlueToRedLT(determinantRange[0], determinantRange[1]) + KLUT = MakeBlueToRedLT(KRange[0], KRange[1]) + + + # get opacity transfer function/opacity map for 'determinant' + determinantPWF = GetOpacityTransferFunction('determinant') + determinantPWF.Points = [-0.016938600689172745, 0.0, 0.5, 0.0, 1.7324700355529785, 1.0, 0.5, 0.0] + determinantPWF.ScalarRangeInitialized = 1 + + # trace defaults for the display properties. + dataDisplay.Representation = 'Surface' + dataDisplay.ColorArrayName = ['CELLS', 'determinant'] + dataDisplay.LookupTable = determinantLUT + dataDisplay.SelectTCoordArray = 'None' + dataDisplay.SelectNormalArray = 'None' + dataDisplay.SelectTangentArray = 'None' + dataDisplay.OSPRayScaleFunction = 'PiecewiseFunction' + dataDisplay.SelectOrientationVectors = 'None' + dataDisplay.ScaleFactor = 0.2 + dataDisplay.SelectScaleArray = 'determinant' + dataDisplay.GaussianRadius = 0.01 + dataDisplay.SetScaleArray = [None, ''] + dataDisplay.ScaleTransferFunction = 'PiecewiseFunction' + dataDisplay.OpacityArray = [None, ''] + dataDisplay.OpacityTransferFunction = 'PiecewiseFunction' + dataDisplay.DataAxesGrid = 'GridAxesRepresentation' + dataDisplay.PolarAxes = 'PolarAxesRepresentation' + + # setup the color legend parameters for each legend in this view + + # get color legend/bar for determinantLUT in view renderView1 + determinantLUTColorBar = GetScalarBar(determinantLUT, renderView1) + determinantLUTColorBar.Title = 'determinant' + determinantLUTColorBar.ComponentTitle = '' + + # set color bar visibility + determinantLUTColorBar.Visibility = 1 + + # show color legend + dataDisplay.SetScalarBarVisibility(renderView1, True) + + Render() + + #save screenshot + WriteImage(filePrefix + "-det.png") + + # Render again, showing the K value + determinantLUTColorBar.Visibility = 0 + dataDisplay.ColorArrayName = ['CELLS', 'K'] + dataDisplay.LookupTable = KLUT + + # get color legend/bar for determinantLUT in view renderView1 + determinantLUTColorBar = GetScalarBar(KLUT, renderView1) + determinantLUTColorBar.Title = 'K' + determinantLUTColorBar.ComponentTitle = '' + + # set color bar visibility + determinantLUTColorBar.Visibility = 1 + + # show color legend + dataDisplay.SetScalarBarVisibility(renderView1, True) + + Render() + + #save screenshot + WriteImage(filePrefix + "-K.png") + + # ---------------------------------------------------------------- + # setup color maps and opacity mapes used in the visualization + # note: the Get..() functions create a new object, if needed + # ---------------------------------------------------------------- + + # ---------------------------------------------------------------- + # restore active source + SetActiveSource(data) + # ---------------------------------------------------------------- + + + if __name__ == '__main__': + # generate extracts + SaveExtracts(ExtractsOutputDirectory='extracts') + + +# Open output document and write LaTeX header +texFile = open(r"quasiconvexity-test-micromorphic-results.tex","w+") + +texFile.write("\documentclass[a4paper,10pt]{article}\n") +texFile.write("\\usepackage[utf8]{inputenc}\n") +texFile.write("\\usepackage{graphicx}\n") +texFile.write("\\usepackage{hyperref}\n") + +texFile.write("\\title{Minimizers of a micromorphically relaxed magic functional}\n") +texFile.write("\\author{Oliver Sander}\n") + +texFile.write("\\begin{document}\n") + +texFile.write("\maketitle\n") + +levels = 3 + +# Render the results +for L_c in [1,10,100]: + + for x0 in [0.2, 0.5, 2]: + + # Start a new section + texFile.write("\\newpage\n") + texFile.write("\\section{$L_c = " + str(L_c) + "$, $x_0 = " + str(x0) + "$}\n") + + # Get the energy values from the corresponding log file + logfilename = "quasiconvexity_micromorphic_" + str(levels) + "_" + str(L_c) + "_" + str(x0) + ".log" + logFile = open(logfilename) + + for line in logFile: + + # Search for the line with the energy of the homogeneous solution + if (re.search("Trust-Region Step Number: 0", line)): + initialRadius, initialEnergy = re.findall("-?\d+\.\d+", line) + if (initialEnergy): + texFile.write("Homogeneous energy: " + str(initialEnergy) + "\n\n") + + # Search for the final energy without regularization + if (re.search("Energy without regularization:", line)): + energy = re.findall("-?\d+\.\d+", line) + if (energy): + texFile.write("Final energy without regularization: " + str(energy) + "\n\n") + + # Search for the final energy with regularization + if (re.search("Energy with regularization:", line)): + energy = re.findall("-?\d+\.\d+", line) + if (energy): + texFile.write("Final energy with regularization: " + str(energy) + "\n\n") + + # Use ParaView to render the result + L_c_string = format(L_c, 'f') + x0_string = format(x0, 'f') + prefix = "quasiconvexity-test-micromorphic-result_" + L_c_string + "_" + x0_string + renderResult(prefix, texFile) + + # Include the creates image into the tex file + texFile.write("\\begin{center}\n") + texFile.write("\\includegraphics[width=\\textwidth]{" + prefix + "-det}\n\n") + texFile.write("\\vspace{0.05\\textheight}\n\n") + texFile.write("\\includegraphics[width=\\textwidth]{" + prefix + "-K}\n") + texFile.write("\\end{center}\n") + +texFile.write("\end{document}\n") + +texFile.close() -- GitLab