diff --git a/.gitattributes b/.gitattributes index 2f356076d..8d1f26a78 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,8 +3,8 @@ # always use LF, even if the files are edited on windows, they need to be compiled/used on unix * text eol=lf -installation/mods_Abaqus/abaqus_v6_windows.env eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary *.cae binary +*.hdf5 binary diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ccb6f06d..47cb2810c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -308,13 +308,6 @@ nonlocal_densityConservation: - master - release -Spectral_ipNeighborhood: - stage: grid - script: Spectral_ipNeighborhood/test.py - except: - - master - - release - RGC_DetectChanges: stage: grid script: RGC_DetectChanges/test.py diff --git a/PRIVATE b/PRIVATE index a3a88933c..66d562c75 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit a3a88933cbb92b81d481305ce93374917baf3980 +Subproject commit 66d562c755cd9aa4bbb8280c509383014acd52db diff --git a/VERSION b/VERSION index 1a1650364..1fe12d401 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-1097-ga7fca4df +v2.0.3-1133-gfede8225 diff --git a/examples/ConfigFiles/Crystallite_All.config b/examples/ConfigFiles/Crystallite_All.config deleted file mode 100644 index 2e9bafa73..000000000 --- a/examples/ConfigFiles/Crystallite_All.config +++ /dev/null @@ -1,9 +0,0 @@ -[all] -(output) orientation # quaternion -(output) grainrotation # deviation from initial orientation as axis (1-3) and angle in degree (4) in crystal reference coordinates -(output) F # deformation gradient tensor -(output) Fe # elastic deformation gradient tensor -(output) Fp # plastic deformation gradient tensor -(output) P # first Piola-Kichhoff stress tensor -(output) S # second Piola-Kichhoff stress tensor -(output) Lp # plastic velocity gradient tensor diff --git a/examples/SpectralMethod/Polycrystal/material.config b/examples/SpectralMethod/Polycrystal/material.config index 4570941aa..e47c2142c 100644 --- a/examples/SpectralMethod/Polycrystal/material.config +++ b/examples/SpectralMethod/Polycrystal/material.config @@ -5,18 +5,6 @@ [SX] mech none -#-------------------# - -#-------------------# -[almostAll] -(output) orientation # quaternion -(output) grainrotation # deviation from initial orientation as axis (1-3) and angle in degree (4) -(output) F # deformation gradient tensor -(output) Fe # elastic deformation gradient tensor -(output) Fp # plastic deformation gradient tensor -(output) P # first Piola-Kichhoff stress tensor -(output) Lp # plastic velocity gradient tensor - #-------------------# #-------------------# diff --git a/processing/post/DADF5_postResults.py b/processing/post/DADF5_postResults.py index a16ef147c..88e4d777a 100755 --- a/processing/post/DADF5_postResults.py +++ b/processing/post/DADF5_postResults.py @@ -59,35 +59,35 @@ for filename in options.filenames: data = np.concatenate((data,coords),1) header+=' 1_pos 2_pos 3_pos' + results.set_visible('materialpoints',False) + results.set_visible('constituents', True) for label in options.con: - for p in results.iter_visible('con_physics'): - for c in results.iter_visible('constituents'): - x = results.get_dataset_location(label) - if len(x) == 0: - continue - array = results.read_dataset(x,0,plain=True) - d = int(np.product(np.shape(array)[1:])) - data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) - - if d>1: - header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) - else: - header+=' '+label + x = results.get_dataset_location(label) + if len(x) == 0: + continue + array = results.read_dataset(x,0,plain=True) + d = np.product(np.shape(array)[1:]) + data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) + if d>1: + header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) + else: + header+=' '+label + + results.set_visible('constituents', False) + results.set_visible('materialpoints',True) for label in options.mat: - for p in results.iter_visible('mat_physics'): - for m in results.iter_visible('materialpoints'): - x = results.get_dataset_location(label) - if len(x) == 0: - continue - array = results.read_dataset(x,0,plain=True) - d = int(np.product(np.shape(array)[1:])) - data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) + x = results.get_dataset_location(label) + if len(x) == 0: + continue + array = results.read_dataset(x,0,plain=True) + d = np.product(np.shape(array)[1:]) + data = np.concatenate((data,np.reshape(array,[np.product(results.grid),d])),1) - if d>1: - header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) - else: - header+=' '+label + if d>1: + header+= ''.join([' {}_{}'.format(j+1,label) for j in range(d)]) + else: + header+=' '+label dirname = os.path.abspath(os.path.join(os.path.dirname(filename),options.dir)) if not os.path.isdir(dirname): diff --git a/processing/post/DADF5_vtk_cells.py b/processing/post/DADF5_vtk_cells.py index 1f5cc6686..9cd982e50 100755 --- a/processing/post/DADF5_vtk_cells.py +++ b/processing/post/DADF5_vtk_cells.py @@ -74,7 +74,6 @@ for filename in options.filenames: results.set_visible('materialpoints',False) results.set_visible('constituents', True) for label in options.con: - for p in results.iter_visible('con_physics'): if p != 'generic': for c in results.iter_visible('constituents'): diff --git a/python/tests/conftest.py b/python/tests/conftest.py new file mode 100644 index 000000000..a0504c499 --- /dev/null +++ b/python/tests/conftest.py @@ -0,0 +1,21 @@ +import os + +import pytest + +import damask + +def pytest_addoption(parser): + parser.addoption("--update", + action="store_true", + default=False) + +@pytest.fixture +def update(request): + """Store current results as new reference results.""" + return request.config.getoption("--update") + +@pytest.fixture +def reference_dir_base(): + """Directory containing reference results.""" + env = damask.Environment() + return os.path.join(env.rootDir(),'python','tests','reference') diff --git a/python/tests/reference/DADF5/12grains6x7x8.geom b/python/tests/reference/DADF5/12grains6x7x8.geom new file mode 100644 index 000000000..7bb4a3e4d --- /dev/null +++ b/python/tests/reference/DADF5/12grains6x7x8.geom @@ -0,0 +1,125 @@ +68 header +geom_fromVoronoiTessellation 2.0.3-1073-g6f3cb071 + +[Grain1] +(gauss) phi1 358.98 Phi 65.62 phi2 24.48 +[Grain2] +(gauss) phi1 121.05 Phi 176.11 phi2 295.73 +[Grain3] +(gauss) phi1 43.79 Phi 113.76 phi2 345.90 +[Grain4] +(gauss) phi1 265.15 Phi 62.52 phi2 299.71 +[Grain5] +(gauss) phi1 221.23 Phi 26.54 phi2 207.05 +[Grain6] +(gauss) phi1 249.81 Phi 61.47 phi2 152.14 +[Grain7] +(gauss) phi1 332.45 Phi 99.16 phi2 345.34 +[Grain8] +(gauss) phi1 312.27 Phi 118.27 phi2 181.59 +[Grain9] +(gauss) phi1 303.10 Phi 48.21 phi2 358.03 +[Grain10] +(gauss) phi1 338.26 Phi 48.11 phi2 176.78 +[Grain11] +(gauss) phi1 115.17 Phi 56.54 phi2 223.84 +[Grain12] +(gauss) phi1 281.04 Phi 97.48 phi2 27.94 + +[Grain1] +crystallite 1 +(constituent) phase 1 texture 1 fraction 1.0 +[Grain2] +crystallite 1 +(constituent) phase 1 texture 2 fraction 1.0 +[Grain3] +crystallite 1 +(constituent) phase 1 texture 3 fraction 1.0 +[Grain4] +crystallite 1 +(constituent) phase 1 texture 4 fraction 1.0 +[Grain5] +crystallite 1 +(constituent) phase 1 texture 5 fraction 1.0 +[Grain6] +crystallite 1 +(constituent) phase 1 texture 6 fraction 1.0 +[Grain7] +crystallite 1 +(constituent) phase 1 texture 7 fraction 1.0 +[Grain8] +crystallite 1 +(constituent) phase 1 texture 8 fraction 1.0 +[Grain9] +crystallite 1 +(constituent) phase 1 texture 9 fraction 1.0 +[Grain10] +crystallite 1 +(constituent) phase 1 texture 10 fraction 1.0 +[Grain11] +crystallite 1 +(constituent) phase 1 texture 11 fraction 1.0 +[Grain12] +crystallite 1 +(constituent) phase 1 texture 12 fraction 1.0 + +grid a 6 b 7 c 8 +size x 0.75 y 0.875 z 1.0 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 9 3 3 10 9 9 + 9 1 1 1 9 9 + 9 11 1 1 7 9 + 7 11 11 7 7 7 + 7 11 11 7 7 7 +12 3 3 10 7 12 +12 3 3 10 10 12 +12 3 3 1 9 9 + 9 1 1 1 9 9 + 9 1 1 1 7 7 + 7 1 1 7 7 7 +12 12 3 7 7 7 +12 3 3 3 12 12 +12 3 3 3 12 12 +12 3 3 1 1 12 + 9 1 1 1 1 9 + 6 1 1 1 8 8 + 7 6 8 8 8 8 +12 12 8 8 8 12 +12 3 3 3 12 12 +12 3 3 3 12 12 + 5 6 6 6 1 12 + 6 6 6 6 8 8 + 6 6 6 8 8 8 + 8 6 8 8 8 8 +12 5 8 8 8 8 +12 5 5 8 8 12 + 5 5 5 3 12 12 + 5 5 6 6 6 5 + 6 6 6 6 6 6 + 6 6 6 6 8 8 + 4 4 6 8 8 8 + 4 4 2 2 2 8 + 5 5 5 2 2 2 + 5 5 5 5 2 5 + 5 5 5 10 10 5 + 6 6 6 6 10 4 + 4 4 11 11 2 4 + 4 4 11 2 2 4 + 4 4 2 2 2 2 + 5 5 5 2 2 2 + 5 5 5 10 10 5 + 5 5 10 10 10 9 + 4 11 11 11 10 9 + 4 4 11 11 11 4 + 4 4 11 11 2 4 + 4 4 2 2 2 2 + 5 5 2 2 2 2 + 5 5 10 10 10 10 + 9 10 10 10 10 9 + 9 11 11 10 9 9 + 4 11 11 11 9 9 + 4 11 11 11 7 7 + 4 4 11 2 7 7 +12 10 10 10 10 7 + 9 10 10 10 10 9 diff --git a/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 b/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 new file mode 100644 index 000000000..caafce478 Binary files /dev/null and b/python/tests/reference/DADF5/12grains6x7x8_tensionY.hdf5 differ diff --git a/python/tests/reference/DADF5/material.config b/python/tests/reference/DADF5/material.config new file mode 100644 index 000000000..0b0808a12 --- /dev/null +++ b/python/tests/reference/DADF5/material.config @@ -0,0 +1,129 @@ + +[none] +mech none +ngrains 1 + + +[Grain1] +(gauss) phi1 358.98 Phi 65.62 phi2 24.48 +[Grain2] +(gauss) phi1 121.05 Phi 176.11 phi2 295.73 +[Grain3] +(gauss) phi1 43.79 Phi 113.76 phi2 345.90 +[Grain4] +(gauss) phi1 265.15 Phi 62.52 phi2 299.71 +[Grain5] +(gauss) phi1 221.23 Phi 26.54 phi2 207.05 +[Grain6] +(gauss) phi1 249.81 Phi 61.47 phi2 152.14 +[Grain7] +(gauss) phi1 332.45 Phi 99.16 phi2 345.34 +[Grain8] +(gauss) phi1 312.27 Phi 118.27 phi2 181.59 +[Grain9] +(gauss) phi1 303.10 Phi 48.21 phi2 358.03 +[Grain10] +(gauss) phi1 338.26 Phi 48.11 phi2 176.78 +[Grain11] +(gauss) phi1 115.17 Phi 56.54 phi2 223.84 +[Grain12] +(gauss) phi1 281.04 Phi 97.48 phi2 27.94 + + +[Grain1] +crystallite 1 +(constituent) phase 1 texture 1 fraction 1.0 +[Grain2] +crystallite 1 +(constituent) phase 1 texture 2 fraction 1.0 +[Grain3] +crystallite 1 +(constituent) phase 1 texture 3 fraction 1.0 +[Grain4] +crystallite 1 +(constituent) phase 1 texture 4 fraction 1.0 +[Grain5] +crystallite 1 +(constituent) phase 1 texture 5 fraction 1.0 +[Grain6] +crystallite 1 +(constituent) phase 1 texture 6 fraction 1.0 +[Grain7] +crystallite 1 +(constituent) phase 2 texture 7 fraction 1.0 +[Grain8] +crystallite 1 +(constituent) phase 2 texture 8 fraction 1.0 +[Grain9] +crystallite 1 +(constituent) phase 2 texture 9 fraction 1.0 +[Grain10] +crystallite 1 +(constituent) phase 2 texture 10 fraction 1.0 +[Grain11] +crystallite 1 +(constituent) phase 2 texture 11 fraction 1.0 +[Grain12] +crystallite 1 +(constituent) phase 2 texture 12 fraction 1.0 + + +[pheno_fcc] +elasticity hooke +plasticity phenopowerlaw + +(output) orientation # quaternion +(output) F # deformation gradient tensor +(output) Fe # elastic deformation gradient tensor +(output) Fp # plastic deformation gradient tensor +(output) P # first Piola-Kichhoff stress tensor +(output) Lp # plastic velocity gradient tensor + + +lattice_structure fcc +Nslip 12 # per family +Ntwin 0 # per family + +c11 106.75e9 +c12 60.41e9 +c44 28.34e9 + +gdot0_slip 0.001 +n_slip 20 +tau0_slip 31e6 # per family +tausat_slip 63e6 # per family +a_slip 2.25 +h0_slipslip 75e6 +interaction_slipslip 1 1 1.4 1.4 1.4 1.4 +atol_resistance 1 + +[pheno_bcc] +elasticity hooke +plasticity phenopowerlaw + +(output) orientation # quaternion +(output) F # deformation gradient tensor +(output) Fe # elastic deformation gradient tensor +(output) Fp # plastic deformation gradient tensor +(output) P # first Piola-Kichhoff stress tensor +(output) Lp # plastic velocity gradient tensor + + +lattice_structure bcc +Nslip 12 # per family + +c11 106.75e9 +c12 60.41e9 +c44 28.34e9 + +gdot0_slip 0.001 +n_slip 20 +tau0_slip 31e6 # per family +tausat_slip 63e6 # per family +a_slip 2.25 +h0_slipslip 75e6 +interaction_slipslip 1 1 1.4 1.4 1.4 1.4 +atol_resistance 1 + + +[dummy] diff --git a/python/tests/reference/DADF5/tensionY.load b/python/tests/reference/DADF5/tensionY.load new file mode 100644 index 000000000..9332144d8 --- /dev/null +++ b/python/tests/reference/DADF5/tensionY.load @@ -0,0 +1 @@ +fdot * 0 0 0 1.0e-3 0 0 0 * stress 0 * * * * * * * 0 time 20 incs 40 freq 4 diff --git a/python/tests/reference/Geom/clean_stencil=1.geom b/python/tests/reference/Geom/clean_stencil=1.geom new file mode 100644 index 000000000..2fe5314fe --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=1.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 diff --git a/python/tests/reference/Geom/clean_stencil=2.geom b/python/tests/reference/Geom/clean_stencil=2.geom new file mode 100644 index 000000000..f074fea56 --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=2.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 1 2 2 2 1 1 + 1 1 1 2 2 2 2 1 + 1 1 1 6 2 2 2 5 + 1 1 1 10 2 2 2 9 + 1 1 1 14 2 2 2 13 + 1 1 1 2 2 2 2 1 + 1 1 1 2 2 2 2 1 + 1 1 1 6 2 2 2 5 + 1 1 1 10 2 2 2 9 + 1 1 1 14 2 2 2 13 + 1 1 1 3 2 2 2 2 + 1 1 1 3 2 2 2 2 + 1 1 1 7 2 2 2 6 + 1 1 1 11 2 2 2 10 + 1 1 1 15 2 2 2 14 + 1 1 1 4 2 2 2 3 + 1 1 1 4 2 2 2 3 + 1 1 1 8 2 2 2 7 + 1 1 1 12 2 2 2 11 + 1 1 1 16 2 2 2 15 diff --git a/python/tests/reference/Geom/clean_stencil=3.geom b/python/tests/reference/Geom/clean_stencil=3.geom new file mode 100644 index 000000000..63e1dce5a --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=3.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 25 + 1 1 1 2 2 2 2 29 + 1 1 1 2 2 2 2 37 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 21 + 1 1 1 2 2 2 2 25 + 1 1 1 2 2 2 2 29 + 1 1 1 2 2 2 2 37 + 1 1 1 2 2 2 2 22 + 1 1 1 2 2 2 2 22 + 1 1 1 2 2 2 2 26 + 1 1 1 2 2 2 2 30 + 1 1 1 2 2 2 2 38 + 1 1 1 2 2 2 2 24 + 1 1 1 2 2 2 2 24 + 1 1 1 2 2 2 2 28 + 1 1 1 2 2 2 2 32 + 1 1 1 2 2 2 2 40 diff --git a/python/tests/reference/Geom/clean_stencil=4.geom b/python/tests/reference/Geom/clean_stencil=4.geom new file mode 100644 index 000000000..eef322d3f --- /dev/null +++ b/python/tests/reference/Geom/clean_stencil=4.geom @@ -0,0 +1,25 @@ +4 header +grid a 8 b 5 c 4 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 2 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 +1 1 1 1 2 2 2 2 diff --git a/python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom b/python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom new file mode 100644 index 000000000..77ff709d7 --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=x-y-z_reflect=True.geom @@ -0,0 +1,85 @@ +4 header +grid a 16 b 10 c 8 +size x 1.6e-05 y 1e-05 z 8e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 21 41 2 2 20 40 40 20 2 2 41 21 1 1 + 1 1 17 37 2 2 16 36 36 16 2 2 37 17 1 1 + 1 1 13 33 2 2 12 32 32 12 2 2 33 13 1 1 + 1 1 9 29 2 2 8 28 28 8 2 2 29 9 1 1 + 1 1 5 25 2 2 4 24 24 4 2 2 25 5 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 20 40 2 2 19 39 39 19 2 2 40 20 1 1 + 1 1 16 36 2 2 15 35 35 15 2 2 36 16 1 1 + 1 1 12 32 2 2 11 31 31 11 2 2 32 12 1 1 + 1 1 8 28 2 2 7 27 27 7 2 2 28 8 1 1 + 1 1 4 24 2 2 3 23 23 3 2 2 24 4 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 19 39 2 2 18 38 38 18 2 2 39 19 1 1 + 1 1 15 35 2 2 14 34 34 14 2 2 35 15 1 1 + 1 1 11 31 2 2 10 30 30 10 2 2 31 11 1 1 + 1 1 7 27 2 2 6 26 26 6 2 2 27 7 1 1 + 1 1 3 23 2 2 2 22 22 2 2 2 23 3 1 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 18 38 2 2 17 37 37 17 2 2 38 18 1 1 + 1 1 14 34 2 2 13 33 33 13 2 2 34 14 1 1 + 1 1 10 30 2 2 9 29 29 9 2 2 30 10 1 1 + 1 1 6 26 2 2 5 25 25 5 2 2 26 6 1 1 + 1 1 2 22 2 2 1 21 21 1 2 2 22 2 1 1 diff --git a/python/tests/reference/Geom/mirror_directions=x_reflect=False.geom b/python/tests/reference/Geom/mirror_directions=x_reflect=False.geom new file mode 100644 index 000000000..afb3bb5f8 --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=x_reflect=False.geom @@ -0,0 +1,25 @@ +4 header +grid a 14 b 5 c 4 +size x 1.4e-05 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 1 2 2 22 2 1 + 1 1 6 26 2 2 5 25 5 2 2 26 6 1 + 1 1 10 30 2 2 9 29 9 2 2 30 10 1 + 1 1 14 34 2 2 13 33 13 2 2 34 14 1 + 1 1 18 38 2 2 17 37 17 2 2 38 18 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 5 25 2 2 4 24 4 2 2 25 5 1 + 1 1 9 29 2 2 8 28 8 2 2 29 9 1 + 1 1 13 33 2 2 12 32 12 2 2 33 13 1 + 1 1 17 37 2 2 16 36 16 2 2 37 17 1 + 1 1 21 41 2 2 20 40 20 2 2 41 21 1 diff --git a/python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom b/python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom new file mode 100644 index 000000000..37d8ae18e --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=y-z_reflect=False.geom @@ -0,0 +1,53 @@ +4 header +grid a 8 b 8 c 6 +size x 8e-06 y 8.000000000000001e-06 z 6e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 14 34 2 2 13 33 + 1 1 10 30 2 2 9 29 + 1 1 6 26 2 2 5 25 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 15 35 2 2 14 34 + 1 1 11 31 2 2 10 30 + 1 1 7 27 2 2 6 26 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 16 36 2 2 15 35 + 1 1 12 32 2 2 11 31 + 1 1 8 28 2 2 7 27 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 + 1 1 17 37 2 2 16 36 + 1 1 13 33 2 2 12 32 + 1 1 9 29 2 2 8 28 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 16 36 2 2 15 35 + 1 1 12 32 2 2 11 31 + 1 1 8 28 2 2 7 27 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 15 35 2 2 14 34 + 1 1 11 31 2 2 10 30 + 1 1 7 27 2 2 6 26 diff --git a/python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom b/python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom new file mode 100644 index 000000000..5d7c23eb0 --- /dev/null +++ b/python/tests/reference/Geom/mirror_directions=z-x-y_reflect=False.geom @@ -0,0 +1,53 @@ +4 header +grid a 14 b 8 c 6 +size x 1.4e-05 y 8.000000000000001e-06 z 6e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 1 2 2 22 2 1 + 1 1 6 26 2 2 5 25 5 2 2 26 6 1 + 1 1 10 30 2 2 9 29 9 2 2 30 10 1 + 1 1 14 34 2 2 13 33 13 2 2 34 14 1 + 1 1 18 38 2 2 17 37 17 2 2 38 18 1 + 1 1 14 34 2 2 13 33 13 2 2 34 14 1 + 1 1 10 30 2 2 9 29 9 2 2 30 10 1 + 1 1 6 26 2 2 5 25 5 2 2 26 6 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 5 25 2 2 4 24 4 2 2 25 5 1 + 1 1 9 29 2 2 8 28 8 2 2 29 9 1 + 1 1 13 33 2 2 12 32 12 2 2 33 13 1 + 1 1 17 37 2 2 16 36 16 2 2 37 17 1 + 1 1 21 41 2 2 20 40 20 2 2 41 21 1 + 1 1 17 37 2 2 16 36 16 2 2 37 17 1 + 1 1 13 33 2 2 12 32 12 2 2 33 13 1 + 1 1 9 29 2 2 8 28 8 2 2 29 9 1 + 1 1 4 24 2 2 3 23 3 2 2 24 4 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 20 40 2 2 19 39 19 2 2 40 20 1 + 1 1 16 36 2 2 15 35 15 2 2 36 16 1 + 1 1 12 32 2 2 11 31 11 2 2 32 12 1 + 1 1 8 28 2 2 7 27 7 2 2 28 8 1 + 1 1 3 23 2 2 2 22 2 2 2 23 3 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 19 39 2 2 18 38 18 2 2 39 19 1 + 1 1 15 35 2 2 14 34 14 2 2 35 15 1 + 1 1 11 31 2 2 10 30 10 2 2 31 11 1 + 1 1 7 27 2 2 6 26 6 2 2 27 7 1 diff --git a/python/tests/reference/Geom/scale_grid=10-10-10.geom b/python/tests/reference/Geom/scale_grid=10-10-10.geom new file mode 100644 index 000000000..43587a615 --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-10-10.geom @@ -0,0 +1,105 @@ +4 header +grid a 10 b 10 c 10 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=10-11-10.geom b/python/tests/reference/Geom/scale_grid=10-11-10.geom new file mode 100644 index 000000000..e12fc64fc --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-11-10.geom @@ -0,0 +1,115 @@ +4 header +grid a 10 b 11 c 10 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=10-13-10.geom b/python/tests/reference/Geom/scale_grid=10-13-10.geom new file mode 100644 index 000000000..cbe4afc00 --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-13-10.geom @@ -0,0 +1,135 @@ +4 header +grid a 10 b 13 c 10 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 3 3 23 2 2 2 2 22 + 1 1 3 3 23 2 2 2 2 22 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 7 7 27 2 2 2 6 26 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 11 11 31 2 2 2 10 30 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 15 15 35 2 2 2 14 34 + 1 1 19 19 39 2 2 2 18 38 + 1 1 19 19 39 2 2 2 18 38 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 4 4 24 2 2 2 3 23 + 1 1 4 4 24 2 2 2 3 23 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 8 8 28 2 2 2 7 27 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 12 12 32 2 2 2 11 31 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 16 16 36 2 2 2 15 35 + 1 1 20 20 40 2 2 2 19 39 + 1 1 20 20 40 2 2 2 19 39 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=10-20-2.geom b/python/tests/reference/Geom/scale_grid=10-20-2.geom new file mode 100644 index 000000000..6b1888f17 --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=10-20-2.geom @@ -0,0 +1,45 @@ +4 header +grid a 10 b 20 c 2 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 2 2 22 2 2 2 1 21 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 6 6 26 2 2 2 5 25 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 10 10 30 2 2 2 9 29 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 14 14 34 2 2 2 13 33 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 18 18 38 2 2 2 17 37 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 5 5 25 2 2 2 4 24 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 9 9 29 2 2 2 8 28 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 13 13 33 2 2 2 12 32 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 17 17 37 2 2 2 16 36 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 + 1 1 21 21 41 2 2 2 20 40 diff --git a/python/tests/reference/Geom/scale_grid=5-4-20.geom b/python/tests/reference/Geom/scale_grid=5-4-20.geom new file mode 100644 index 000000000..043683f6a --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=5-4-20.geom @@ -0,0 +1,85 @@ +4 header +grid a 5 b 4 c 20 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 2 2 2 21 + 1 6 2 2 25 + 1 14 2 2 33 + 1 18 2 2 37 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 3 2 2 22 + 1 7 2 2 26 + 1 15 2 2 34 + 1 19 2 2 38 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 4 2 2 23 + 1 8 2 2 27 + 1 16 2 2 35 + 1 20 2 2 39 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 + 1 5 2 2 24 + 1 9 2 2 28 + 1 17 2 2 36 + 1 21 2 2 40 diff --git a/python/tests/reference/Geom/scale_grid=8-10-12.geom b/python/tests/reference/Geom/scale_grid=8-10-12.geom new file mode 100644 index 000000000..5cfe66aba --- /dev/null +++ b/python/tests/reference/Geom/scale_grid=8-10-12.geom @@ -0,0 +1,125 @@ +4 header +grid a 8 b 10 c 12 +size x 8e-06 y 5e-06 z 4e-06 +origin x 0.0 y 0.0 z 0.0 +homogenization 1 + 1 1 2 22 2 2 1 21 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 18 38 2 2 17 37 + 1 1 2 22 2 2 1 21 + 1 1 2 22 2 2 1 21 + 1 1 6 26 2 2 5 25 + 1 1 6 26 2 2 5 25 + 1 1 10 30 2 2 9 29 + 1 1 10 30 2 2 9 29 + 1 1 14 34 2 2 13 33 + 1 1 14 34 2 2 13 33 + 1 1 18 38 2 2 17 37 + 1 1 18 38 2 2 17 37 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 3 23 2 2 2 22 + 1 1 3 23 2 2 2 22 + 1 1 7 27 2 2 6 26 + 1 1 7 27 2 2 6 26 + 1 1 11 31 2 2 10 30 + 1 1 11 31 2 2 10 30 + 1 1 15 35 2 2 14 34 + 1 1 15 35 2 2 14 34 + 1 1 19 39 2 2 18 38 + 1 1 19 39 2 2 18 38 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 4 24 2 2 3 23 + 1 1 4 24 2 2 3 23 + 1 1 8 28 2 2 7 27 + 1 1 8 28 2 2 7 27 + 1 1 12 32 2 2 11 31 + 1 1 12 32 2 2 11 31 + 1 1 16 36 2 2 15 35 + 1 1 16 36 2 2 15 35 + 1 1 20 40 2 2 19 39 + 1 1 20 40 2 2 19 39 + 1 1 5 25 2 2 4 24 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 + 1 1 21 41 2 2 20 40 + 1 1 5 25 2 2 4 24 + 1 1 5 25 2 2 4 24 + 1 1 9 29 2 2 8 28 + 1 1 9 29 2 2 8 28 + 1 1 13 33 2 2 12 32 + 1 1 13 33 2 2 12 32 + 1 1 17 37 2 2 16 36 + 1 1 17 37 2 2 16 36 + 1 1 21 41 2 2 20 40 + 1 1 21 41 2 2 20 40 diff --git a/python/tests/test_DADF5.py b/python/tests/test_DADF5.py new file mode 100644 index 000000000..5a6478f03 --- /dev/null +++ b/python/tests/test_DADF5.py @@ -0,0 +1,67 @@ +import shutil +import os + +import pytest +import numpy as np + +from damask import DADF5 +from damask import mechanics + +@pytest.fixture +def default(tmp_path,reference_dir): + """Small DADF5 file in temp location for modification.""" + fname = '12grains6x7x8_tensionY.hdf5' + shutil.copy(os.path.join(reference_dir,fname),tmp_path) + f = DADF5(os.path.join(tmp_path,fname)) + f.set_by_time(20.0,20.0) + return f + +@pytest.fixture +def reference_dir(reference_dir_base): + """Directory containing reference results.""" + return os.path.join(reference_dir_base,'DADF5') + + +class TestDADF5: + + def test_add_deviator(self,default): + default.add_deviator('P') + loc = {'P' :default.get_dataset_location('P'), + 's_P':default.get_dataset_location('s_P')} + in_memory = mechanics.deviatoric_part(default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['s_P'],0) + assert np.allclose(in_memory,in_file) + + def test_add_Cauchy(self,default): + default.add_Cauchy('P','F') + loc = {'F': default.get_dataset_location('F'), + 'P': default.get_dataset_location('P'), + 'sigma':default.get_dataset_location('sigma')} + in_memory = mechanics.Cauchy(default.read_dataset(loc['F'],0), + default.read_dataset(loc['P'],0)) + in_file = default.read_dataset(loc['sigma'],0) + assert np.allclose(in_memory,in_file) + + def test_add_absolute(self,default): + default.add_absolute('Fe') + loc = {'Fe': default.get_dataset_location('Fe'), + '|Fe|': default.get_dataset_location('|Fe|')} + in_memory = np.abs(default.read_dataset(loc['Fe'],0)) + in_file = default.read_dataset(loc['|Fe|'],0) + assert np.allclose(in_memory,in_file) + + def test_add_determinant(self,default): + default.add_determinant('P') + loc = {'P': default.get_dataset_location('P'), + 'det(P)': default.get_dataset_location('det(P)')} + in_memory = np.linalg.det(default.read_dataset(loc['P'],0)).reshape(-1,1) + in_file = default.read_dataset(loc['det(P)'],0) + assert np.allclose(in_memory,in_file) + + def test_add_spherical(self,default): + default.add_spherical('P') + loc = {'P': default.get_dataset_location('P'), + 'p_P': default.get_dataset_location('p_P')} + in_memory = mechanics.spherical_part(default.read_dataset(loc['P'],0)).reshape(-1,1) + in_file = default.read_dataset(loc['p_P'],0) + assert np.allclose(in_memory,in_file) diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py new file mode 100644 index 000000000..bc3a3e751 --- /dev/null +++ b/python/tests/test_Geom.py @@ -0,0 +1,99 @@ +import copy +import os + +import pytest +import numpy as np + +from damask import Geom + + +def geom_equal(a,b): + return np.all(a.get_microstructure() == b.get_microstructure()) and \ + np.all(a.get_size() == b.get_size()) and \ + np.all(a.get_grid() == b.get_grid()) + +@pytest.fixture +def default(): + """Simple geometry.""" + x=np.concatenate((np.ones(40,dtype=int), + np.arange(2,42), + np.ones(40,dtype=int)*2, + np.arange(1,41))).reshape((8,5,4)) + return Geom(x,[8e-6,5e-6,4e-6]) + +@pytest.fixture +def reference_dir(reference_dir_base): + """Directory containing reference results.""" + return os.path.join(reference_dir_base,'Geom') + + +class TestGeom: + + def test_update(self,default): + modified = copy.deepcopy(default) + modified.update( + default.get_microstructure(), + default.get_size(), + default.get_origin() + ) + assert geom_equal(modified,default) + + + def test_write_read_str(self,default,tmpdir): + default.to_file(str(tmpdir.join('default.geom'))) + new = Geom.from_file(str(tmpdir.join('default.geom'))) + assert geom_equal(new,default) + + def test_write_read_file(self,default,tmpdir): + with open(tmpdir.join('default.geom'),'w') as f: + default.to_file(f) + with open(tmpdir.join('default.geom')) as f: + new = Geom.from_file(f) + assert geom_equal(new,default) + + @pytest.mark.parametrize('pack',[True,False]) + def test_pack(self,default,tmpdir,pack): + default.to_file(tmpdir.join('default.geom'),pack=pack) + new = Geom.from_file(tmpdir.join('default.geom')) + assert geom_equal(new,default) + + @pytest.mark.parametrize('directions,reflect',[ + (['x'], False), + (['x','y','z'],True), + (['z','x','y'],False), + (['y','z'], False) + ] + ) + def test_mirror(self,default,update,reference_dir,directions,reflect): + modified = copy.deepcopy(default) + modified.mirror(directions,reflect) + tag = 'directions={}_reflect={}'.format('-'.join(directions),reflect) + reference = os.path.join(reference_dir,'mirror_{}.geom'.format(tag)) + if update: modified.to_file(reference) + assert geom_equal(modified,Geom.from_file(reference)) + + @pytest.mark.parametrize('stencil',[(1),(2),(3),(4)]) + def test_clean(self,default,update,reference_dir,stencil): + modified = copy.deepcopy(default) + modified.clean(stencil) + tag = 'stencil={}'.format(stencil) + reference = os.path.join(reference_dir,'clean_{}.geom'.format(tag)) + if update: modified.to_file(reference) + assert geom_equal(modified,Geom.from_file(reference)) + + @pytest.mark.parametrize('grid',[ + ((10,11,10)), + ([10,13,10]), + (np.array((10,10,10))), + (np.array((8, 10,12))), + (np.array((5, 4, 20))), + (np.array((10,20,2)) ) + ] + ) + def test_scale(self,default,update,reference_dir,grid): + modified = copy.deepcopy(default) + modified.scale(grid) + tag = 'grid={}'.format('-'.join([str(x) for x in grid])) + reference = os.path.join(reference_dir,'scale_{}.geom'.format(tag)) + if update: modified.to_file(reference) + assert geom_equal(modified,Geom.from_file(reference)) diff --git a/python/tests/test_Rotation.py b/python/tests/test_Rotation.py new file mode 100644 index 000000000..72956c013 --- /dev/null +++ b/python/tests/test_Rotation.py @@ -0,0 +1,55 @@ +import pytest +import numpy as np + +from damask import Rotation + +n = 1000 + +@pytest.fixture +def default(): + """A set of n random rotations.""" + return [Rotation.fromRandom() for r in range(n)] + + +class TestRotation: + + def test_Eulers(self,default): + for rot in default: + assert np.allclose(rot.asQuaternion(), + Rotation.fromEulers(rot.asEulers()).asQuaternion()) + + + def test_AxisAngle(self,default): + for rot in default: + assert np.allclose(rot.asEulers(), + Rotation.fromAxisAngle(rot.asAxisAngle()).asEulers()) + + + def test_Matrix(self,default): + for rot in default: + assert np.allclose(rot.asAxisAngle(), + Rotation.fromMatrix(rot.asMatrix()).asAxisAngle()) + + + def test_Rodriques(self,default): + for rot in default: + assert np.allclose(rot.asMatrix(), + Rotation.fromRodrigues(rot.asRodrigues()).asMatrix()) + + + def test_Homochoric(self,default): + for rot in default: + assert np.allclose(rot.asRodrigues(), + Rotation.fromHomochoric(rot.asHomochoric()).asRodrigues()) + + + def test_Cubochoric(self,default): + for rot in default: + assert np.allclose(rot.asHomochoric(), + Rotation.fromCubochoric(rot.asCubochoric()).asHomochoric()) + + + def test_Quaternion(self,default): + for rot in default: + assert np.allclose(rot.asCubochoric(), + Rotation.fromQuaternion(rot.asQuaternion()).asCubochoric()) diff --git a/python/tests/test_mechanics.py b/python/tests/test_mechanics.py new file mode 100644 index 000000000..aab92bef3 --- /dev/null +++ b/python/tests/test_mechanics.py @@ -0,0 +1,142 @@ +import numpy as np +from damask import mechanics + +class TestMechanics: + + n = 1000 + c = np.random.randint(n) + + + def test_vectorize_Cauchy(self): + P = np.random.random((self.n,3,3)) + F = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Cauchy(F,P)[self.c], + mechanics.Cauchy(F[self.c],P[self.c])) + + + def test_vectorize_strain_tensor(self): + F = np.random.random((self.n,3,3)) + t = ['V','U'][np.random.randint(0,2)] + m = np.random.random()*10. -5.0 + assert np.allclose(mechanics.strain_tensor(F,t,m)[self.c], + mechanics.strain_tensor(F[self.c],t,m)) + + + def test_vectorize_deviatoric_part(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.deviatoric_part(x)[self.c], + mechanics.deviatoric_part(x[self.c])) + + + def test_vectorize_spherical_part(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.spherical_part(x)[self.c], + mechanics.spherical_part(x[self.c])) + + + def test_vectorize_Mises_stress(self): + sigma = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Mises_stress(sigma)[self.c], + mechanics.Mises_stress(sigma[self.c])) + + + def test_vectorize_Mises_strain(self): + epsilon = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Mises_strain(epsilon)[self.c], + mechanics.Mises_strain(epsilon[self.c])) + + + def test_vectorize_symmetric(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.symmetric(x)[self.c], + mechanics.symmetric(x[self.c])) + + + def test_vectorize_maximum_shear(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.maximum_shear(x)[self.c], + mechanics.maximum_shear(x[self.c])) + + + def test_vectorize_principal_components(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.principal_components(x)[self.c], + mechanics.principal_components(x[self.c])) + + + def test_vectorize_transpose(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.transpose(x)[self.c], + mechanics.transpose(x[self.c])) + + + def test_vectorize_rotational_part(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.rotational_part(x)[self.c], + mechanics.rotational_part(x[self.c])) + + + def test_vectorize_left_stretch(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.left_stretch(x)[self.c], + mechanics.left_stretch(x[self.c])) + + + def test_vectorize_right_stretch(self): + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.right_stretch(x)[self.c], + mechanics.right_stretch(x[self.c])) + + + def test_Cauchy(self): + """Ensure Cauchy stress is symmetrized 1. Piola-Kirchhoff stress for no deformation.""" + P = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Cauchy(np.broadcast_to(np.eye(3),(self.n,3,3)),P), + mechanics.symmetric(P)) + + + def test_strain_tensor_no_rotation(self): + """Ensure that left and right stretch give same results for no rotation.""" + F = np.broadcast_to(np.eye(3),[self.n,3,3])*np.random.random((self.n,3,3)) + m = np.random.random()*20.0-10.0 + assert np.allclose(mechanics.strain_tensor(F,'U',m), + mechanics.strain_tensor(F,'V',m)) + + + def test_strain_tensor_rotation(self): + """Ensure that pure rotation results in no strain.""" + F = mechanics.rotational_part(np.random.random((self.n,3,3))) + t = ['V','U'][np.random.randint(0,2)] + m = np.random.random()*2.0 - 1.0 + assert np.allclose(mechanics.strain_tensor(F,t,m), + 0.0) + + + def test_spherical_deviatoric_part(self): + """Ensure that full tensor is sum of spherical and deviatoric part.""" + x = np.random.random((self.n,3,3)) + sph = np.broadcast_to(np.eye(3),(self.n,3,3))\ + * np.repeat(mechanics.spherical_part(x),9).reshape(self.n,3,3) + assert np.allclose(sph + mechanics.deviatoric_part(x), + x) + + + def test_symmetric(self): + """Ensure that a symmetric tensor is half of the sum of a tensor and its transpose.""" + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.symmetric(x)*2.0, + mechanics.transpose(x)+x) + + + def test_transpose(self): + """Ensure that a symmetric tensor equals its transpose.""" + x = mechanics.symmetric(np.random.random((self.n,3,3))) + assert np.allclose(mechanics.transpose(x), + x) + + + def test_Mises(self): + """Ensure that equivalent stress is 3/2 of equivalent strain.""" + x = np.random.random((self.n,3,3)) + assert np.allclose(mechanics.Mises_stress(x)/mechanics.Mises_strain(x), + 1.5) diff --git a/src/CPFEM2.f90 b/src/CPFEM2.f90 index 5e8aad95e..7123602f8 100644 --- a/src/CPFEM2.f90 +++ b/src/CPFEM2.f90 @@ -57,10 +57,10 @@ subroutine CPFEM_initAll call config_init call math_init call rotations_init - call mesh_init call lattice_init call HDF5_utilities_init call results_init + call mesh_init call material_init call constitutive_init call crystallite_init diff --git a/src/config.f90 b/src/config.f90 index e66b85d2d..00b473767 100644 --- a/src/config.f90 +++ b/src/config.f90 @@ -85,6 +85,7 @@ subroutine config_init case (trim('crystallite')) call parse_materialConfig(config_name_crystallite,config_crystallite,line,fileContent(i+1:)) if (verbose) write(6,'(a)') ' Crystallite parsed'; flush(6) + deallocate(config_crystallite) case (trim('homogenization')) call parse_materialConfig(config_name_homogenization,config_homogenization,line,fileContent(i+1:)) @@ -102,27 +103,25 @@ subroutine config_init call IO_error(160,ext_msg='') if (.not. allocated(config_microstructure) .or. size(config_microstructure) < 1) & call IO_error(160,ext_msg='') - if (.not. allocated(config_crystallite) .or. size(config_crystallite) < 1) & - call IO_error(160,ext_msg='') if (.not. allocated(config_phase) .or. size(config_phase) < 1) & call IO_error(160,ext_msg='') if (.not. allocated(config_texture) .or. size(config_texture) < 1) & call IO_error(160,ext_msg='') - inquire(file='numerics.config', exist=fileExists) - if (fileExists) then - write(6,'(/,a)') ' reading numerics.config'; flush(6) - fileContent = IO_read_ASCII('numerics.config') - call parse_debugAndNumericsConfig(config_numerics,fileContent) - endif + inquire(file='numerics.config', exist=fileExists) + if (fileExists) then + write(6,'(/,a)') ' reading numerics.config'; flush(6) + fileContent = IO_read_ASCII('numerics.config') + call parse_debugAndNumericsConfig(config_numerics,fileContent) + endif - inquire(file='debug.config', exist=fileExists) - if (fileExists) then - write(6,'(/,a)') ' reading debug.config'; flush(6) - fileContent = IO_read_ASCII('debug.config') - call parse_debugAndNumericsConfig(config_debug,fileContent) - endif + inquire(file='debug.config', exist=fileExists) + if (fileExists) then + write(6,'(/,a)') ' reading debug.config'; flush(6) + fileContent = IO_read_ASCII('debug.config') + call parse_debugAndNumericsConfig(config_debug,fileContent) + endif contains @@ -295,9 +294,6 @@ subroutine config_deallocate(what) case('material.config/microstructure') deallocate(config_microstructure) - case('material.config/crystallite') - deallocate(config_crystallite) - case('material.config/homogenization') deallocate(config_homogenization) diff --git a/src/crystallite.f90 b/src/crystallite.f90 index c35237b9d..672bd2112 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -22,22 +22,10 @@ module crystallite use discretization use lattice use plastic_nonlocal - use geometry_plastic_nonlocal, only: & - nIPneighbors => geometry_plastic_nonlocal_nIPneighbors, & - IPneighborhood => geometry_plastic_nonlocal_IPneighborhood - use HDF5_utilities use results implicit none private - character(len=64), dimension(:,:), allocatable :: & - crystallite_output !< name of each post result output - integer, public, protected :: & - crystallite_maxSizePostResults !< description not available - integer, dimension(:), allocatable, public, protected :: & - crystallite_sizePostResults !< description not available - integer, dimension(:,:), allocatable :: & - crystallite_sizePostResult !< description not available real(pReal), dimension(:,:,:), allocatable, public :: & crystallite_dt !< requested time increment of each grain @@ -90,21 +78,11 @@ module crystallite enum, bind(c) enumerator :: undefined_ID, & - phase_ID, & - texture_ID, & orientation_ID, & - grainrotation_ID, & defgrad_ID, & - fe_ID, & fp_ID, & - fi_ID, & - lp_ID, & - li_ID, & p_ID, & - s_ID, & - elasmatrix_ID, & - neighboringip_ID, & - neighboringelement_ID + elasmatrix_ID end enum integer(kind(undefined_ID)),dimension(:,:), allocatable :: & crystallite_outputID !< ID of each post result output @@ -213,13 +191,6 @@ subroutine crystallite_init allocate(crystallite_requested(cMax,iMax,eMax), source=.false.) allocate(crystallite_todo(cMax,iMax,eMax), source=.false.) allocate(crystallite_converged(cMax,iMax,eMax), source=.true.) - allocate(crystallite_output(maxval(crystallite_Noutput), & - size(config_crystallite))) ; crystallite_output = '' - allocate(crystallite_outputID(maxval(crystallite_Noutput), & - size(config_crystallite)), source=undefined_ID) - allocate(crystallite_sizePostResults(size(config_crystallite)),source=0) - allocate(crystallite_sizePostResult(maxval(crystallite_Noutput), & - size(config_crystallite)), source=0) num%subStepMinCryst = config_numerics%getFloat('substepmincryst', defaultVal=1.0e-3_pReal) num%subStepSizeCryst = config_numerics%getFloat('substepsizecryst', defaultVal=0.25_pReal) @@ -266,55 +237,6 @@ subroutine crystallite_init integrateState => integrateStateRKCK45 end select - - - do c = 1, size(config_crystallite) -#if defined(__GFORTRAN__) - str = ['GfortranBug86277'] - str = config_crystallite(c)%getStrings('(output)',defaultVal=str) - if (str(1) == 'GfortranBug86277') str = [character(len=65536)::] -#else - str = config_crystallite(c)%getStrings('(output)',defaultVal=[character(len=65536)::]) -#endif - do o = 1, size(str) - crystallite_output(o,c) = str(o) - outputName: select case(str(o)) - case ('phase') outputName - crystallite_outputID(o,c) = phase_ID - case ('texture') outputName - crystallite_outputID(o,c) = texture_ID - case ('orientation') outputName - crystallite_outputID(o,c) = orientation_ID - case ('grainrotation') outputName - crystallite_outputID(o,c) = grainrotation_ID - case ('defgrad','f') outputName ! ToDo: no alias (f only) - crystallite_outputID(o,c) = defgrad_ID - case ('fe') outputName - crystallite_outputID(o,c) = fe_ID - case ('fp') outputName - crystallite_outputID(o,c) = fp_ID - case ('fi') outputName - crystallite_outputID(o,c) = fi_ID - case ('lp') outputName - crystallite_outputID(o,c) = lp_ID - case ('li') outputName - crystallite_outputID(o,c) = li_ID - case ('p','firstpiola','1stpiola') outputName ! ToDo: no alias (p only) - crystallite_outputID(o,c) = p_ID - case ('s','tstar','secondpiola','2ndpiola') outputName ! ToDo: no alias (s only) - crystallite_outputID(o,c) = s_ID - case ('elasmatrix') outputName - crystallite_outputID(o,c) = elasmatrix_ID - case ('neighboringip') outputName ! ToDo: this is not a result, it is static. Should be written out by mesh - crystallite_outputID(o,c) = neighboringip_ID - case ('neighboringelement') outputName ! ToDo: this is not a result, it is static. Should be written out by mesh - crystallite_outputID(o,c) = neighboringelement_ID - case default outputName - call IO_error(105,ext_msg=trim(str(o))//' (Crystallite)') - end select outputName - enddo - enddo - allocate(output_constituent(size(config_phase))) do c = 1, size(config_phase) #if defined(__GFORTRAN__) @@ -327,47 +249,14 @@ subroutine crystallite_init #endif enddo - - do r = 1,size(config_crystallite) - do o = 1,crystallite_Noutput(r) - select case(crystallite_outputID(o,r)) - case(orientation_ID) - mySize = 4 - case(defgrad_ID,fp_ID,p_ID) - mySize = 9 - case(neighboringip_ID,neighboringelement_ID) - mySize = nIPneighbors - case default - mySize = 0 - end select - crystallite_sizePostResult(o,r) = mySize - crystallite_sizePostResults(r) = crystallite_sizePostResults(r) + mySize - enddo - enddo - - crystallite_maxSizePostResults = & - maxval(crystallite_sizePostResults(microstructure_crystallite),microstructure_active) - - !-------------------------------------------------------------------------------------------------- ! write description file for crystallite output if (worldrank == 0) then call IO_write_jobFile(FILEUNIT,'outputCrystallite') - - do r = 1,size(config_crystallite) - if (any(microstructure_crystallite(discretization_microstructureAt) == r)) then - write(FILEUNIT,'(/,a,/)') '['//trim(config_name_crystallite(r))//']' - do o = 1,crystallite_Noutput(r) - write(FILEUNIT,'(a,i4)') trim(crystallite_output(o,r))//char(9),crystallite_sizePostResult(o,r) - enddo - endif - enddo - + write(FILEUNIT,'(/,a,/)') '[not supported anymore]' close(FILEUNIT) endif - call config_deallocate('material.config/phase') - call config_deallocate('material.config/crystallite') !-------------------------------------------------------------------------------------------------- ! initialize @@ -869,59 +758,21 @@ function crystallite_postResults(ipc, ip, el) ip, & !< integration point index ipc !< grain index - real(pReal), dimension(1+crystallite_sizePostResults(microstructure_crystallite(discretization_microstructureAt(el))) + & + real(pReal), dimension(1+ & 1+plasticState(material_phaseAt(ipc,el))%sizePostResults + & sum(sourceState(material_phaseAt(ipc,el))%p(:)%sizePostResults)) :: & crystallite_postResults integer :: & o, & c, & - crystID, & mySize, & n - crystID = microstructure_crystallite(discretization_microstructureAt(el)) crystallite_postResults = 0.0_pReal - crystallite_postResults(1) = real(crystallite_sizePostResults(crystID),pReal) ! header-like information (length) + crystallite_postResults(1) = 0.0_pReal ! header-like information (length) c = 1 - do o = 1,crystallite_Noutput(crystID) - mySize = 0 - select case(crystallite_outputID(o,crystID)) - case (orientation_ID) - mySize = 4 - crystallite_postResults(c+1:c+mySize) = crystallite_orientation(ipc,ip,el)%asQuaternion() - -! remark: tensor output is of the form 11,12,13, 21,22,23, 31,32,33 -! thus row index i is slow, while column index j is fast. reminder: "row is slow" - - case (defgrad_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_partionedF(1:3,1:3,ipc,ip,el)),[mySize]) - case (fp_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_Fp(1:3,1:3,ipc,ip,el)),[mySize]) - case (p_ID) - mySize = 9 - crystallite_postResults(c+1:c+mySize) = & - reshape(transpose(crystallite_P(1:3,1:3,ipc,ip,el)),[mySize]) - case(neighboringelement_ID) - mySize = nIPneighbors - crystallite_postResults(c+1:c+mySize) = 0.0_pReal - forall (n = 1:mySize) & - crystallite_postResults(c+n) = real(IPneighborhood(1,n,ip,el),pReal) - case(neighboringip_ID) - mySize = nIPneighbors - crystallite_postResults(c+1:c+mySize) = 0.0_pReal - forall (n = 1:mySize) & - crystallite_postResults(c+n) = real(IPneighborhood(2,n,ip,el),pReal) - end select - c = c + mySize - enddo - crystallite_postResults(c+1) = real(plasticState(material_phaseAt(ipc,el))%sizePostResults,pReal) ! size of constitutive results c = c + 1 if (size(crystallite_postResults)-c > 0) & @@ -945,7 +796,7 @@ subroutine crystallite_results do p=1,size(config_name_phase) group = trim('current/constituent')//'/'//trim(config_name_phase(p))//'/generic' - call HDF5_closeGroup(results_addGroup(group)) + call results_closeGroup(results_addGroup(group)) do o = 1, size(output_constituent(p)%label) select case (output_constituent(p)%label(o)) diff --git a/src/discretization.f90 b/src/discretization.f90 index dfcad48a3..873148666 100644 --- a/src/discretization.f90 +++ b/src/discretization.f90 @@ -6,9 +6,6 @@ module discretization use prec use results -#if defined(PETSc) || defined(DAMASK_HDF5) - use HDF5_utilities -#endif implicit none private @@ -84,7 +81,7 @@ subroutine discretization_results #if defined(PETSc) || defined(DAMASK_HDF5) real(pReal), dimension(:,:), allocatable :: u - call HDF5_closeGroup(results_addGroup(trim('current/geometry'))) + call results_closeGroup(results_addGroup(trim('current/geometry'))) u = discretization_NodeCoords (1:3,:discretization_sharedNodesBeginn) & - discretization_NodeCoords0(1:3,:discretization_sharedNodesBeginn) diff --git a/src/geometry_plastic_nonlocal.f90 b/src/geometry_plastic_nonlocal.f90 index 88634c245..408306b2b 100644 --- a/src/geometry_plastic_nonlocal.f90 +++ b/src/geometry_plastic_nonlocal.f90 @@ -122,7 +122,7 @@ subroutine geometry_plastic_nonlocal_results integer, dimension(:), allocatable :: shp -#if defined(DAMASK_HDF5) +#if defined(PETSc) || defined(DAMASK_HDF5) call results_openJobFile writeVolume: block diff --git a/src/grid/DAMASK_grid.f90 b/src/grid/DAMASK_grid.f90 index 24c9da274..e83cf3283 100644 --- a/src/grid/DAMASK_grid.f90 +++ b/src/grid/DAMASK_grid.f90 @@ -27,7 +27,6 @@ program DAMASK_spectral use grid_mech_FEM use grid_damage_spectral use grid_thermal_spectral - use HDF5_utilities use results use rotations @@ -319,15 +318,9 @@ program DAMASK_spectral enddo close(fileUnit) - call results_openJobFile - call HDF5_closeGroup(results_addGroup('geometry')) - call results_addAttribute('grid',grid,'geometry') - call results_addAttribute('size',geomSize,'geometry') - call results_closeJobFile - !-------------------------------------------------------------------------------------------------- ! doing initialization depending on active solvers - call Utilities_init() + call Utilities_init do field = 1, nActiveFields select case (loadCases(1)%ID(field)) case(FIELD_MECH_ID) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 64edf95cc..a62f94820 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -262,7 +262,7 @@ subroutine homogenization_init materialpoint_sizeResults = 1 & ! grain count + 1 + thermal_maxSizePostResults & + damage_maxSizePostResults & - + homogenization_maxNgrains * (1 + crystallite_maxSizePostResults & ! crystallite size & crystallite results + + homogenization_maxNgrains * (1 & ! crystallite size + 1 + constitutive_plasticity_maxSizePostResults & ! constitutive size & constitutive results + constitutive_source_maxSizePostResults) allocate(materialpoint_results(materialpoint_sizeResults,discretization_nIP,discretization_nElem)) @@ -592,15 +592,13 @@ subroutine materialpoint_postResults thePos, & theSize, & myNgrains, & - myCrystallite, & g, & !< grain number i, & !< integration point number e !< element number - !$OMP PARALLEL DO PRIVATE(myNgrains,myCrystallite,thePos,theSize) + !$OMP PARALLEL DO PRIVATE(myNgrains,thePos,theSize) elementLooping: do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) - myCrystallite = microstructure_crystallite(discretization_microstructureAt(e)) IpLooping: do i = FEsolving_execIP(1,e),FEsolving_execIP(2,e) thePos = 0 @@ -618,7 +616,7 @@ subroutine materialpoint_postResults thePos = thePos + 1 grainLooping :do g = 1,myNgrains - theSize = 1 + crystallite_sizePostResults(myCrystallite) + & + theSize = 1 + & 1 + plasticState (material_phaseAt(g,e))%sizePostResults + & sum(sourceState(material_phaseAt(g,e))%p(:)%sizePostResults) materialpoint_results(thePos+1:thePos+theSize,i,e) = crystallite_postResults(g,i,e) ! tell crystallite results diff --git a/src/material.f90 b/src/material.f90 index 2212fbe28..2f70fe97b 100644 --- a/src/material.f90 +++ b/src/material.f90 @@ -116,13 +116,11 @@ module material phase_Noutput, & !< number of '(output)' items per phase phase_elasticityInstance, & !< instance of particular elasticity of each phase phase_plasticityInstance, & !< instance of particular plasticity of each phase - crystallite_Noutput, & !< number of '(output)' items per crystallite setting homogenization_Ngrains, & !< number of grains in each homogenization homogenization_Noutput, & !< number of '(output)' items per homogenization homogenization_typeInstance, & !< instance of particular type of each homogenization thermal_typeInstance, & !< instance of particular type of each thermal transport - damage_typeInstance, & !< instance of particular type of each nonlocal damage - microstructure_crystallite !< crystallite setting ID of each microstructure ! DEPRECATED !!!! + damage_typeInstance !< instance of particular type of each nonlocal damage real(pReal), dimension(:), allocatable, public, protected :: & thermal_initialT, & !< initial temperature per each homogenization @@ -245,9 +243,6 @@ subroutine material_init call material_parseMicrostructure() if (iand(myDebug,debug_levelBasic) /= 0) write(6,'(a)') ' Microstructure parsed'; flush(6) - call material_parseCrystallite() - if (iand(myDebug,debug_levelBasic) /= 0) write(6,'(a)') ' Crystallite parsed'; flush(6) - call material_parseHomogenization() if (iand(myDebug,debug_levelBasic) /= 0) write(6,'(a)') ' Homogenization parsed'; flush(6) @@ -277,9 +272,6 @@ subroutine material_init allocate(temperatureRate (material_Nhomogenization)) do m = 1,size(config_microstructure) - if(microstructure_crystallite(m) < 1 .or. & - microstructure_crystallite(m) > size(config_crystallite)) & - call IO_error(150,m,ext_msg='crystallite') if(minval(microstructure_phase(1:microstructure_Nconstituents(m),m)) < 1 .or. & maxval(microstructure_phase(1:microstructure_Nconstituents(m),m)) > size(config_phase)) & call IO_error(150,m,ext_msg='phase') @@ -298,9 +290,8 @@ subroutine material_init enddo write(6,'(/,a14,18x,1x,a11,1x,a12,1x,a13)') 'microstructure','crystallite','constituents' do m = 1,size(config_microstructure) - write(6,'(1x,a32,1x,i11,1x,i12)') config_name_microstructure(m), & - microstructure_crystallite(m), & - microstructure_Nconstituents(m) + write(6,'(1x,a32,1x,i12)') config_name_microstructure(m), & + microstructure_Nconstituents(m) if (microstructure_Nconstituents(m) > 0) then do c = 1,microstructure_Nconstituents(m) write(6,'(a1,1x,a32,1x,a32,1x,f7.4)') '>',config_name_phase(microstructure_phase(c,m)),& @@ -500,7 +491,6 @@ subroutine material_parseMicrostructure character(len=65536) :: & tag - allocate(microstructure_crystallite(size(config_microstructure)), source=0) allocate(microstructure_Nconstituents(size(config_microstructure)), source=0) allocate(microstructure_active(size(config_microstructure)), source=.false.) @@ -512,7 +502,6 @@ subroutine material_parseMicrostructure do m=1, size(config_microstructure) microstructure_Nconstituents(m) = config_microstructure(m)%countKeys('(constituent)') - microstructure_crystallite(m) = config_microstructure(m)%getInt('crystallite') enddo microstructure_maxNconstituents = maxval(microstructure_Nconstituents) @@ -547,21 +536,6 @@ subroutine material_parseMicrostructure end subroutine material_parseMicrostructure -!-------------------------------------------------------------------------------------------------- -!> @brief parses the crystallite part in the material configuration file -!-------------------------------------------------------------------------------------------------- -subroutine material_parseCrystallite - - integer :: c - - allocate(crystallite_Noutput(size(config_crystallite)),source=0) - do c=1, size(config_crystallite) - crystallite_Noutput(c) = config_crystallite(c)%countKeys('(output)') - enddo - -end subroutine material_parseCrystallite - - !-------------------------------------------------------------------------------------------------- !> @brief parses the phase part in the material configuration file !-------------------------------------------------------------------------------------------------- diff --git a/src/mesh_grid.f90 b/src/mesh_grid.f90 index d09e01793..2b337f047 100644 --- a/src/mesh_grid.f90 +++ b/src/mesh_grid.f90 @@ -14,6 +14,7 @@ module mesh_grid use IO use debug use numerics + use results use discretization use geometry_plastic_nonlocal use FEsolving @@ -99,6 +100,14 @@ subroutine mesh_init(ip,el) FEsolving_execElem = [1,product(myGrid)] ! parallel loop bounds set to comprise all elements allocate(FEsolving_execIP(2,product(myGrid)),source=1) ! parallel loop bounds set to comprise the only IP +!-------------------------------------------------------------------------------------------------- +! store geometry information for post processing + call results_openJobFile + call results_closeGroup(results_addGroup('geometry')) + call results_addAttribute('grid',grid,'geometry') + call results_addAttribute('size',geomSize,'geometry') + call results_closeJobFile + !-------------------------------------------------------------------------------------------------- ! geometry information required by the nonlocal CP model call geometry_plastic_nonlocal_setIPvolume(reshape([(product(mySize/real(myGrid,pReal)),j=1,product(myGrid))], & diff --git a/src/mesh_marc.f90 b/src/mesh_marc.f90 index e67d5e0d1..f640baa72 100644 --- a/src/mesh_marc.f90 +++ b/src/mesh_marc.f90 @@ -69,7 +69,7 @@ subroutine mesh_init(ip,el) microstructureAt, & homogenizationAt integer:: & - Nnodes !< total number of nodes in mesh + Nnodes !< total number of nodes in mesh real(pReal), dimension(:,:), allocatable :: & ip_reshaped @@ -119,15 +119,17 @@ subroutine mesh_init(ip,el) reshape(connectivity_cell,[elem%NcellNodesPerCell,elem%nIPs*nElems]),& node0_cell,ip_reshaped) +!-------------------------------------------------------------------------------------------------- +! geometry information required by the nonlocal CP model call geometry_plastic_nonlocal_setIPvolume(IPvolume(elem,node0_cell,connectivity_cell)) unscaledNormals = IPareaNormal(elem,nElems,connectivity_cell,node0_cell) call geometry_plastic_nonlocal_setIParea(norm2(unscaledNormals,1)) call geometry_plastic_nonlocal_setIPareaNormal(unscaledNormals/spread(norm2(unscaledNormals,1),1,3)) call geometry_plastic_nonlocal_results - end subroutine mesh_init + !-------------------------------------------------------------------------------------------------- !> @brief Writes all information needed for the DADF5 geometry !-------------------------------------------------------------------------------------------------- diff --git a/src/results.f90 b/src/results.f90 index 471f994d6..93355b6c4 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -50,6 +50,7 @@ module results results_addIncrement, & results_addGroup, & results_openGroup, & + results_closeGroup, & results_writeDataset, & results_setLink, & results_addAttribute, & @@ -120,6 +121,7 @@ subroutine results_addIncrement(inc,time) end subroutine results_addIncrement + !-------------------------------------------------------------------------------------------------- !> @brief open a group from the results file !-------------------------------------------------------------------------------------------------- @@ -144,6 +146,18 @@ integer(HID_T) function results_addGroup(groupName) end function results_addGroup +!-------------------------------------------------------------------------------------------------- +!> @brief close a group +!-------------------------------------------------------------------------------------------------- +subroutine results_closeGroup(group_id) + + integer(HID_T), intent(in) :: group_id + + call HDF5_closeGroup(group_id) + +end subroutine results_closeGroup + + !-------------------------------------------------------------------------------------------------- !> @brief set link to object in results file !--------------------------------------------------------------------------------------------------