diff --git a/python/damask/_result.py b/python/damask/_result.py index a872b5215..47b5f3f3d 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -1974,7 +1974,7 @@ class Result: for c in range(self.N_constituents): crystal_structure = [999] phase_name = ['Unknown Phase Type'] - cell_orientation = np.zeros((np.prod(self.cells),3)) + cell_orientation = np.zeros((np.prod(self.cells),3),np.float32) phase_ID = np.zeros((np.prod(self.cells)),dtype=np.int32) count = 1 for label in self.visible['phases']: @@ -2001,7 +2001,7 @@ class Result: with h5py.File(f'{out_dir}/{self.fname.stem}_inc{inc.split(prefix_inc)[-1].zfill(N_digits)}.dream3d','w') as f_out: add_attribute(f_out,'FileVersion','7.0') - for g in ['DataContainerBundles','Pipeline']: # empty groups (needed) + for g in ['DataContainerBundles','Pipeline']: # empty groups (needed) f_out.create_group(g) data_container = create_and_open(f_out,'DataContainers/SyntheticVolumeDataContainer') diff --git a/python/tests/resources/Result/2phase_irregularGrid.dream3d b/python/tests/resources/Result/2phase_irregularGrid.dream3d deleted file mode 100644 index f4fe6545f..000000000 Binary files a/python/tests/resources/Result/2phase_irregularGrid.dream3d and /dev/null differ diff --git a/python/tests/resources/Result/2phase_irregularGrid.dream3d b/python/tests/resources/Result/2phase_irregularGrid.dream3d new file mode 120000 index 000000000..0c1611d87 --- /dev/null +++ b/python/tests/resources/Result/2phase_irregularGrid.dream3d @@ -0,0 +1 @@ +../GeomGrid/2phase_irregularGrid.dream3d \ No newline at end of file diff --git a/python/tests/resources/Result/2phase_irregularGrid.material.yaml b/python/tests/resources/Result/2phase_irregularGrid.material.yaml deleted file mode 100644 index 4c542f4bf..000000000 --- a/python/tests/resources/Result/2phase_irregularGrid.material.yaml +++ /dev/null @@ -1,122 +0,0 @@ ---- -homogenization: - SX: - N_constituents: 1 - mechanical: {type: pass} - -phase: - Aluminum: - lattice: cF - mechanical: - output: [F, P, F_e, F_p, L_p, O] - elastic: {type: Hooke, C_11: 106.75e+9, C_12: 60.41e+9, C_44: 28.34e+9} - plastic: - type: phenopowerlaw - N_sl: [12] - a_sl: [2.25] - atol_xi: 1.0 - dot_gamma_0_sl: [0.001] - h_0_sl-sl: [75.e+6] - h_sl-sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4] - n_sl: [20] - output: [xi_sl] - xi_0_sl: [31.e+6] - xi_inf_sl: [63.e+6] - Precipitate: - lattice: hP - c/a: 1.629 - mechanical: - output: [F, P, F_e, F_p, L_p, O] - elastic: {type: Hooke, C_11: 162.4e9, C_12: 92.0e9, C_13: 69.0e9, C_33: 180.7e9, C_44: 49.7e9} - -material: - - constituents: - - phase: Aluminum - O: [0.1312565298463503, -0.6783546785504293, -0.5822736006738253, 0.4284438206110302] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.3891991356899201, 0.024147743013653567, 0.3536664846442759, -0.8502122893283336] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.35508306685640884, -0.3893349018602677, -0.8446679875041884, 0.09418248622184058] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.40195601820142496, -0.1636779350134876, -0.4207744499665131, 0.7966114205035945] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.044972436776441485, 0.7143848123638518, -0.24549539260737738, -0.6537307029678221] - v: 1.0 - homogenization: SX - - constituents: - - phase: Precipitate - O: [0.30372565221929093, -0.24301975423298977, -0.8125481043098195, -0.43411715632882125] - v: 1.0 - homogenization: SX - - constituents: - - phase: Precipitate - O: [0.4596497204333957, -0.39026498957046113, 0.7976125696376123, 0.015151276419962625] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.0827510723946788, 0.6317627669782209, 0.4175514636120652, -0.6478262433036925] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.2996310655335684, 0.10384972751072818, 0.8974007140905373, 0.3067709520358135] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.6358670871419496, 0.4180753134572028, -0.5146965710042285, -0.3949348295146467] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.6972058990579978, 0.2748121746094387, -0.4615030442772494, 0.4747600900749678] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.023323490584044985, -0.4124930466803271, 0.5037800801437966, 0.7586245000510248] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.5327908616905777, 0.17796155315964704, 0.602711877421405, -0.5667468359957407] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.5031041456929413, -0.4763268942553399, 0.6700266228868177, 0.2665768801275235] - v: 1.0 - homogenization: SX - - constituents: - - phase: Precipitate - O: [0.5641709021797874, 0.6941319122105223, -0.0813139963653807, -0.4396363446983193] - v: 1.0 - homogenization: SX - - constituents: - - phase: Aluminum - O: [0.40014270416551667, 0.38360239122229783, -0.040760057321212455, 0.8313083901169376] - v: 1.0 - homogenization: SX - - constituents: - - phase: Precipitate - O: [0.25941430307519847, -0.7938792882664125, -0.20362736335049575, -0.510877472508378] - v: 1.0 - homogenization: SX - - constituents: - - phase: Precipitate - O: [0.3297509101153507, 0.7826199404802652, 0.20188018251173903, -0.4878675618954298] - v: 1.0 - homogenization: SX diff --git a/python/tests/resources/Result/2phase_irregularGrid.vti b/python/tests/resources/Result/2phase_irregularGrid.vti deleted file mode 100644 index 5e841a0d4..000000000 --- a/python/tests/resources/Result/2phase_irregularGrid.vti +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - AQAAAACAAABDAAAASQAAAA==eF5LScxNLM7Wcy/KTNHLyU9MiXcJcnX0NXZRKNPT0weiMNegYE9/PwUNIwMjY11DQ10DUwUDcytjIysDC20DQwMDTQYAn+cREg== - - - - - - - - AQAAAACAAACAIAAAWQEAAA==eF7tlUFuwkAQBBdIAoEQyP8/m4vn0vJQuzuzxiD3pYVAVZLdI0oZk530qCzt2T/8VTwH6VEZ5fmAzspoD/GzPF6W3nWW59Pp7PvxPLbnr5ITz2O9lCdrb8bx+FHPcWq6m6iHspeOht5P1EN87d4Qd+2ek3wm7qt4jtLEz7of8qx918TbPPMhXpands9Znlpf9H6Ib/1dYiF+9LkRb/PMh3hZnvPUxO31nKWJ2+vREPdVPMTbPPMhnteX0pbeXV+kNXo3vXcUDfHf9f+ndQfEIw/twUK8LE/rzsijvt4913qi9/NTckIeux96H16IX/vcKMSt9Xi+69TEbfWob7RH90fcXo/u2fZKfPsd8clT279OU66N7Xlob9r6vPR74ymf9la7O/XU9rt6btJZnru08WnPrfejHuLW3g+9l9Zemyfqo/eyFs+fdLZH+Vke3bXnefb9/AOizxNG - - - - - diff --git a/python/tests/resources/Result/2phase_irregularGrid_tensionX.hdf5 b/python/tests/resources/Result/2phase_irregularGrid_tensionX.hdf5 deleted file mode 100644 index 9bf9a2de0..000000000 Binary files a/python/tests/resources/Result/2phase_irregularGrid_tensionX.hdf5 and /dev/null differ diff --git a/python/tests/resources/Result/2phase_irregularGrid_tensionX_inc000.dream3d b/python/tests/resources/Result/2phase_irregularGrid_tensionX_inc000.dream3d deleted file mode 100644 index 933856445..000000000 Binary files a/python/tests/resources/Result/2phase_irregularGrid_tensionX_inc000.dream3d and /dev/null differ diff --git a/python/tests/resources/Result/2phase_irregularGrid_tensionX_material.hdf5 b/python/tests/resources/Result/2phase_irregularGrid_tensionX_material.hdf5 new file mode 100644 index 000000000..83a2024d9 Binary files /dev/null and b/python/tests/resources/Result/2phase_irregularGrid_tensionX_material.hdf5 differ diff --git a/python/tests/resources/Result/tensionX.yaml b/python/tests/resources/Result/tensionX.yaml deleted file mode 100644 index af163050e..000000000 --- a/python/tests/resources/Result/tensionX.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- - -solver: - mechanical: spectral_basic - -loadstep: - - boundary_conditions: - mechanical: - dot_F: [[1.0e-3, 0, 0], - [0, x, 0], - [0, 0, x]] - P: [[x, x, x], - [x, 0, x], - [x, x, 0]] - discretization: - t: 10 - N: 40 - f_out: 40 diff --git a/python/tests/test_Result.py b/python/tests/test_Result.py index c4389c381..bad55c98d 100644 --- a/python/tests/test_Result.py +++ b/python/tests/test_Result.py @@ -450,98 +450,34 @@ class TestResult: single_phase.export_VTK(mode='point',target_dir=export_dir,parallel=False) assert set(os.listdir(export_dir)) == set([f'{single_phase.fname.stem}_inc{i:02}.vtp' for i in range(0,40+1,4)]) - def test_export_DREAM3D(self,tmp_path,res_path): - result = Result(res_path/'2phase_irregularGrid_tensionX.hdf5').view(increments=0) #comparing the initial data only + def test_export_DREAM3D(self,tmp_path,res_path,h5py_dataset_iterator): + result = Result(res_path/'2phase_irregularGrid_tensionX_material.hdf5').view(increments=0) # compare the initial data only result.export_DREAM3D(target_dir=tmp_path) - ref = h5py.File(res_path/'2phase_irregularGrid.dream3d','r') - cur = h5py.File(tmp_path/f'2phase_irregularGrid_tensionX_inc000.dream3d','r') + def ignore(path): + # features present in reference but not in exported file + for i in ['Pipeline','StatsGeneratorDataContainer','Grain Data', + 'BoundaryCells','FeatureIds','IPFColor','NumFeatures']: + if path.find(i) >= 0: return True + return False - error_messages = [] + with h5py.File(res_path/'2phase_irregularGrid.dream3d','r') as ref, \ + h5py.File(tmp_path/'2phase_irregularGrid_tensionX_material_inc0.dream3d','r') as cur: - data_container_label = 'DataContainers/SyntheticVolumeDataContainer' - cell_data_label = data_container_label + '/CellData' - ensemble_label = data_container_label + '/CellEnsembleData' - geom_label = data_container_label + '/_SIMPL_GEOMETRY' + for (path,dset) in h5py_dataset_iterator(ref): + if ignore(path): continue + if path.find('PhaseName') < 0: + assert np.array_equal(dset,cur[path]) + else: + c = [_.decode() for _ in cur[path]] + r = ['Unknown Phase Type'] + result.phases + assert c == r + grp = os.path.split(path)[0] + for attr in ref[grp].attrs: + assert np.array_equal(ref[grp].attrs[attr],cur[grp].attrs[attr]) + for attr in dset.attrs: + assert np.array_equal(dset.attrs[attr],cur[path].attrs[attr]) - # check phase array - results_phase = np.array(cur[cell_data_label + '/Phases']) - ref_phase = np.array(ref[cell_data_label + '/Phases']) - if not np.array_equal(results_phase,ref_phase): - error_messages.append('Phase array does not match') - - # check euler angles - results_eulers = np.array(cur[cell_data_label + '/EulerAngles']) - ref_eulers = np.array(ref[cell_data_label + '/EulerAngles']) - if not np.allclose(results_eulers,ref_eulers,atol=1E-06): - error_messages.append('Euler angles array does not match') - - # check CellData group attributes - for attrs in ['AttributeMatrixType','TupleDimensions']: - ref_val = ref[cell_data_label].attrs[attrs] - actual_val = cur[cell_data_label].attrs[attrs] - if not np.array_equal(ref_val,actual_val): - error_messages.append("Cell Data attributes do not match") - - # Common Attributes for datasets in CellData - for dataset in ['/Phases','/EulerAngles']: - for attrs in ['DataArrayVersion','Tuple Axis Dimensions','ComponentDimensions','ObjectType','TupleDimensions']: - ref_val = ref[cell_data_label + '/' + dataset].attrs[attrs] - actual_val = cur[cell_data_label + '/' + dataset].attrs[attrs] - if not np.array_equal(ref_val,actual_val): - error_messages.append("Common attributes in datasets of CellData do not match") - - # check crystal structure array - results_crystal_structure = np.array(cur[ensemble_label + '/CrystalStructures']) - ref_crystal_structure = np.array(ref[ensemble_label + '/CrystalStructures']) - if not np.allclose(results_crystal_structure, ref_crystal_structure): - error_messages.append('Crystal structure does not match') - - # check PhaseName array - results_phase_name = np.array(cur[ensemble_label + '/PhaseName']) - ref_phase_name = ['Unknown Phase Type'] - ref_phase_name.extend(i for i in result.visible['phases']) - ref_phase_name = [bytes(i,encoding='utf-8') for i in ref_phase_name] - if not np.all(results_phase_name == np.array(ref_phase_name,dtype=object)): - error_messages.append('Phase names are different') - - # check attributes ensemble matrix - for attrs in ['AttributeMatrixType','TupleDimensions']: - ref_val = ref[ensemble_label].attrs[attrs] - actual_val = cur[ensemble_label].attrs[attrs] - if not np.array_equal(ref_val,actual_val): - error_messages.append("Attributes of CellEnsembleData do not match") - - # check attributes of the data in ensemble matrix - # in the reference file the dataset PhaseTypes is in another group, so the path is different - for dataset in ['CrystalStructures','PhaseTypes']: - for attrs in ['DataArrayVersion','Tuple Axis Dimensions','ComponentDimensions','ObjectType','TupleDimensions']: - ref_value = ref['DataContainers/StatsGeneratorDataContainer/CellEnsembleData/' + dataset].attrs[attrs] - actual_val = cur[ensemble_label + '/' + dataset].attrs[attrs] - if not np.array_equal(ref_value,actual_val): - error_messages.append(f'Attributes of {dataset}s within CellEnsembleData do not match for this {attrs}') - - for dataset in ['PhaseName']: - for attrs in ['DataArrayVersion','Tuple Axis Dimensions','ComponentDimensions','ObjectType','TupleDimensions']: - ref_value = ref['DataContainers/StatsGeneratorDataContainer/CellEnsembleData/' + dataset].attrs[attrs] - actual_val = cur[ensemble_label + '/' + dataset].attrs[attrs] - if not np.array_equal(ref_value,actual_val): - error_messages.append(f'Attributes of {dataset}s within CellEnsembleData do not match for this {attrs}') - - # check geometry data - for dataset in ['DIMENSIONS','ORIGIN','SPACING']: - results_val = np.array(cur[geom_label + '/' + dataset]) - ref_val = np.array(ref[geom_label + '/' + dataset]) - if not np.array_equal(ref_val,results_val): - error_messages.append(f'The {dataset} values are incorrect') - - for attrs in ['GeometryName','GeometryTypeName','GeometryType','SpatialDimensionality','UnitDimensionality']: - ref_value = ref[geom_label].attrs[attrs] - actual_val = cur[geom_label].attrs[attrs] - if not np.array_equal(ref_value,actual_val): - error_messages.append("Geometry attributes do not match") - - assert not error_messages def test_XDMF_datatypes(self,tmp_path,single_phase,update,res_path): for what,shape in {'scalar':(),'vector':(3,),'tensor':(3,3),'matrix':(12,)}.items():