From 190ddafa446812d799d05a79f16362890970e459 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 14 Apr 2021 07:06:24 +0200 Subject: [PATCH 1/7] don't support old file formats --- python/damask/_result.py | 69 +++++++++++++++------------------------- 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index 667a89c87..86c488416 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -79,34 +79,25 @@ class Result: self.version_major = f.attrs['DADF5_version_major'] self.version_minor = f.attrs['DADF5_version_minor'] - if self.version_major != 0 or not 7 <= self.version_minor <= 12: + if self.version_major != 0 or not 12 <= self.version_minor <= 12: raise TypeError(f'Unsupported DADF5 version {self.version_major}.{self.version_minor}') - self.structured = 'grid' in f['geometry'].attrs.keys() or \ - 'cells' in f['geometry'].attrs.keys() + self.structured = 'cells' in f['geometry'].attrs.keys() if self.structured: - try: - self.cells = f['geometry'].attrs['cells'] - except KeyError: - self.cells = f['geometry'].attrs['grid'] + self.cells = f['geometry'].attrs['cells'] self.size = f['geometry'].attrs['size'] self.origin = f['geometry'].attrs['origin'] - r=re.compile('inc[0-9]+' if self.version_minor < 12 else 'increment_[0-9]+') + r=re.compile('increment_[0-9]+') self.increments = sorted([i for i in f.keys() if r.match(i)],key=util.natural_sort) - self.times = [round(f[i].attrs['time/s' if self.version_minor < 12 else - 't/s'],12) for i in self.increments] + self.times = [round(f[i].attrs['t/s'],12) for i in self.increments] - grp = 'mapping' if self.version_minor < 12 else 'cell_to' + self.N_materialpoints, self.N_constituents = np.shape(f[f'cell_to/phase']) - self.N_materialpoints, self.N_constituents = np.shape(f[f'{grp}/phase']) - - self.homogenizations = [m.decode() for m in np.unique(f[f'{grp}/homogenization'] - ['Name' if self.version_minor < 12 else 'label'])] + self.homogenizations = [m.decode() for m in np.unique(f[f'cell_to/homogenization']['label'])] self.homogenizations = sorted(self.homogenizations,key=util.natural_sort) - self.phases = [c.decode() for c in np.unique(f[f'{grp}/phase'] - ['Name' if self.version_minor < 12 else 'label'])] + self.phases = [c.decode() for c in np.unique(f[f'cell_to/phase']['label'])] self.phases = sorted(self.phases,key=util.natural_sort) self.fields = [] @@ -172,10 +163,9 @@ class Result: choice = list(datasets).copy() if hasattr(datasets,'__iter__') and not isinstance(datasets,str) else \ [datasets] - inc = 'inc' if self.version_minor < 12 else 'increment_' # compatibility hack if what == 'increments': - choice = [c if isinstance(c,str) and c.startswith(inc) else - f'{inc}{c}' for c in choice] + choice = [c if isinstance(c,str) and c.startswith('increment_') else + f'increment_{c}' for c in choice] elif what == 'times': what = 'increments' if choice == ['*']: @@ -233,11 +223,9 @@ class Result: End increment. """ - # compatibility hack - ln = 3 if self.version_minor < 12 else 10 selected = [] - for i,inc in enumerate([int(i[ln:]) for i in self.increments]): - s,e = map(lambda x: int(x[ln:] if isinstance(x,str) and x.startswith('inc') else x), (start,end)) + for i,inc in enumerate([int(i[10:]) for i in self.increments]): + s,e = map(lambda x: int(x[10:] if isinstance(x,str) and x.startswith('inc') else x), (start,end)) if s <= inc <= e: selected.append(self.increments[i]) return selected @@ -341,9 +329,6 @@ class Result: def list_data(self): """Return information on all active datasets in the file.""" - # compatibility hack - de = 'Description' if self.version_minor < 12 else 'description' - un = 'Unit' if self.version_minor < 12 else 'unit' msg = '' with h5py.File(self.fname,'r') as f: for inc in self.visible['increments']: @@ -356,10 +341,10 @@ class Result: msg = ' '.join([msg,f'{field}\n']) for d in f['/'.join([inc,ty,label,field])].keys(): dataset = f['/'.join([inc,ty,label,field,d])] - unit = f' / {dataset.attrs[un]}' if h5py3 else \ - f' / {dataset.attrs[un].decode()}' - description = dataset.attrs[de] if h5py3 else \ - dataset.attrs[de].decode() + unit = f' / {dataset.attrs["unit"]}' if h5py3 else \ + f' / {dataset.attrs["unit"].decode()}' + description = dataset.attrs['description'] if h5py3 else \ + dataset.attrs['description'].decode() msg = ' '.join([msg,f'{d}{unit}: {description}\n']) return msg @@ -1023,7 +1008,6 @@ class Result: Defaults to '*', in which case all datasets are considered. """ - u = 'Unit' if self.version_minor < 12 else 'unit' # compatibility hack if self.N_constituents != 1 or len(self.phases) != 1 or not self.structured: raise TypeError('XDMF output requires structured grid with single phase and single constituent.') @@ -1104,7 +1088,8 @@ class Result: shape = f[name].shape[1:] dtype = f[name].dtype - unit = f[name].attrs[u] if h5py3 else f[name].attrs[u].decode() + unit = f[name].attrs['unit'] if h5py3 else \ + f[name].attrs['unit'].decode() attributes.append(ET.SubElement(grid, 'Attribute')) attributes[-1].attrib = {'Name': '/'.join([ty,field,out])+f' / {unit}', @@ -1123,23 +1108,20 @@ class Result: def _mappings(self): - grp = 'mapping' if self.version_minor < 12 else 'cell_to' # compatibility hack - name = 'Name' if self.version_minor < 12 else 'label' # compatibility hack - member = 'member' if self.version_minor < 12 else 'entry' # compatibility hack - + """Mappings to place data spatially.""" with h5py.File(self.fname,'r') as f: at_cell_ph = [] in_data_ph = [] for c in range(self.N_constituents): - at_cell_ph.append({label: np.where(f['/'.join([grp,'phase'])][:,c][name] == label.encode())[0] \ + at_cell_ph.append({label: np.where(f['/'.join(['cell_to','phase'])][:,c]['label'] == label.encode())[0] \ for label in self.visible['phases']}) - in_data_ph.append({label: f['/'.join([grp,'phase'])][member][at_cell_ph[c][label]][:,c] \ + in_data_ph.append({label: f['/'.join(['cell_to','phase'])]['entry'][at_cell_ph[c][label]][:,c] \ for label in self.visible['phases']}) - at_cell_ho = {label: np.where(f['/'.join([grp,'homogenization'])][:][name] == label.encode())[0] \ + at_cell_ho = {label: np.where(f['/'.join(['cell_to','homogenization'])][:]['label'] == label.encode())[0] \ for label in self.visible['homogenizations']} - in_data_ho = {label: f['/'.join([grp,'homogenization'])][member][at_cell_ho[label]] \ + in_data_ho = {label: f['/'.join(['cell_to','homogenization'])]['entry'][at_cell_ho[label]] \ for label in self.visible['homogenizations']} return at_cell_ph,in_data_ph,at_cell_ho,in_data_ho @@ -1176,8 +1158,7 @@ class Result: elif mode.lower()=='point': v = VTK.from_poly_data(self.coordinates0_point) - ln = 3 if self.version_minor < 12 else 10 # compatibility hack - N_digits = int(np.floor(np.log10(max(1,int(self.increments[-1][ln:])))))+1 + N_digits = int(np.floor(np.log10(max(1,int(self.increments[-1][10:])))))+1 constituents_ = constituents if isinstance(constituents,Iterable) else \ (range(self.N_constituents) if constituents is None else [constituents]) @@ -1221,7 +1202,7 @@ class Result: for label,dataset in outs.items(): v.add(dataset,' / '.join(['/'.join([ty,field,label]),dataset.dtype.metadata['unit']])) - v.save(f'{self.fname.stem}_inc{inc[ln:].zfill(N_digits)}',parallel=parallel) + v.save(f'{self.fname.stem}_inc{inc[10:].zfill(N_digits)}',parallel=parallel) def get(self,output='*',flatten=True,prune=True): From 18aa6f7f1234c3a6c357447496baad2eb3183c03 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sat, 24 Apr 2021 21:24:26 +0200 Subject: [PATCH 2/7] support for string arrays allows to add phase label from mapping. Only scalar string arrays are allowed (no real restriction) --- python/damask/_result.py | 4 ++-- python/damask/_vtk.py | 32 +++++++++++++++++++++++++------- python/tests/test_VTK.py | 12 ++++++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index 2c6cb7285..18ad93fd6 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -1352,12 +1352,12 @@ class Result: at_cell_ph = [] in_data_ph = [] for c in range(self.N_constituents): - at_cell_ph.append({label: np.where(f['/'.join(['cell_to','phase'])][:,c]['label'] == label.encode())[0] \ + at_cell_ph.append({label: np.where(self.phase[:,c] == label)[0] \ for label in self.visible['phases']}) in_data_ph.append({label: f['/'.join(['cell_to','phase'])]['entry'][at_cell_ph[c][label]][:,c] \ for label in self.visible['phases']}) - at_cell_ho = {label: np.where(f['/'.join(['cell_to','homogenization'])][:]['label'] == label.encode())[0] \ + at_cell_ho = {label: np.where(self.homogenization[:] == label)[0] \ for label in self.visible['homogenizations']} in_data_ho = {label: f['/'.join(['cell_to','homogenization'])]['entry'][at_cell_ho[label]] \ for label in self.visible['homogenizations']} diff --git a/python/damask/_vtk.py b/python/damask/_vtk.py index 2a6cbd3f2..f8a4c47fc 100644 --- a/python/damask/_vtk.py +++ b/python/damask/_vtk.py @@ -265,10 +265,18 @@ class VTK: raise ValueError('No label defined for numpy.ndarray') N_data = data.shape[0] - data_ = np.where(data.mask,data.fill_value,data) if isinstance(data,np.ma.MaskedArray) else\ - data - d = np_to_vtk((data_.astype(np.single) if data_.dtype in [np.double, np.longdouble] else - data_).reshape(N_data,-1),deep=True) # avoid large files + data_ = (data if not isinstance(data,np.ma.MaskedArray) else + np.where(data.mask,data.fill_value,data)).reshape(N_data,-1) + + if data_.dtype in [np.double,np.longdouble]: + d = np_to_vtk(data_.astype(np.single),deep=True) # avoid large files + elif data_.dtype.type is np.str_: + d = vtk.vtkStringArray() + for s in np.squeeze(data_): + d.InsertNextValue(s) + else: + d = np_to_vtk(data_,deep=True) + d.SetName(label) if N_data == N_points: @@ -305,14 +313,24 @@ class VTK: cell_data = self.vtk_data.GetCellData() for a in range(cell_data.GetNumberOfArrays()): if cell_data.GetArrayName(a) == label: - return vtk_to_np(cell_data.GetArray(a)) + try: + return vtk_to_np(cell_data.GetArray(a)) + except AttributeError: + vtk_array = cell_data.GetAbstractArray(a) # string array point_data = self.vtk_data.GetPointData() for a in range(point_data.GetNumberOfArrays()): if point_data.GetArrayName(a) == label: - return vtk_to_np(point_data.GetArray(a)) + try: + return vtk_to_np(point_data.GetArray(a)) + except AttributeError: + vtk_array = point_data.GetAbstractArray(a) # string array - raise ValueError(f'Array "{label}" not found.') + try: + # string array + return np.array([vtk_array.GetValue(i) for i in range(vtk_array.GetNumberOfValues())]).astype(str) + except UnboundLocalError: + raise ValueError(f'Array "{label}" not found.') def get_comments(self): diff --git a/python/tests/test_VTK.py b/python/tests/test_VTK.py index 4328dc810..d4606d5c1 100644 --- a/python/tests/test_VTK.py +++ b/python/tests/test_VTK.py @@ -135,6 +135,18 @@ class TestVTK: with pytest.raises(TypeError): default.add('invalid_type','valid') + @pytest.mark.parametrize('data_type,shape',[(float,(3,)), + (float,(3,3)), + (float,(1,)), + (int,(4,)), + (str,(1,))]) + @pytest.mark.parametrize('N_values',[5*6*7,6*7*8]) + def test_add_get(self,default,data_type,shape,N_values): + data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type) + default.add(data,'data') + assert (np.squeeze(data.reshape(N_values,-1)) == default.get('data')).all() + + def test_add_masked(self,default): data = np.random.rand(5*6*7,3) masked = ma.MaskedArray(data,mask=data<.4,fill_value=42.) From 68a839ed979787161b84430513e1c8881f19e947 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 25 Apr 2021 17:34:41 +0200 Subject: [PATCH 3/7] typo + improved help --- python/damask/_result.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index 6daeffbc2..d73c678d8 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -400,8 +400,7 @@ class Result: Rename/move datasets (within the same group/folder). This operation is discouraged because the history of the - data becomes untracable and scientific integrity cannot be - ensured. + data becomes untraceable and data integrity is not ensured. Parameters ---------- @@ -442,8 +441,7 @@ class Result: Remove/delete datasets. This operation is discouraged because the history of the - data becomes untracable and scientific integrity cannot be - ensured. + data becomes untraceable and data integrity is not ensured. Parameters ---------- @@ -596,7 +594,7 @@ class Result: >>> r = damask.Result('my_file.hdf5') >>> r.add_calculation('np.sum(#rho_mob#,axis=1)','rho_mob_total', ... '1/m²','total mobile dislocation density') - >>> r.add_calculation(''np.sum(#rho_dip#,axis=1)',rho_dip_total', + >>> r.add_calculation('np.sum(#rho_dip#,axis=1)','rho_dip_total', ... '1/m²','total dislocation dipole density') >>> r.add_calculation('#rho_dip_total#+#rho_mob_total','rho_total', ... '1/m²','total dislocation density') @@ -953,6 +951,13 @@ class Result: F : str, optional Name of deformation gradient dataset. Defaults to 'F'. + Notes + ----- + The definition of the second Piola-Kirchhoff (S) stress follows + the standard nonlinear continuum mechanics definition. It does + NOT take the different configurations into account as it would + be required for the crystal plasticity definition of S. + """ self._add_generic_pointwise(self._add_stress_second_Piola_Kirchhoff,{'P':P,'F':F}) From 62c987badfc6500ecd808e77d95079085f39de51 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 25 Apr 2021 22:52:13 +0200 Subject: [PATCH 4/7] add tracer to vtk files --- python/damask/_result.py | 7 ++++++- .../Result/12grains6x7x8_tensionY.hdf5 | Bin 2295784 -> 2299880 bytes .../Result/save_VTK/test_vtk[0-0-0].md5 | 2 +- .../Result/save_VTK/test_vtk[0-0-1].md5 | 2 +- .../Result/save_VTK/test_vtk[0-0-2].md5 | 2 +- .../Result/save_VTK/test_vtk[1-0-0].md5 | 2 +- .../Result/save_VTK/test_vtk[1-0-1].md5 | 2 +- .../Result/save_VTK/test_vtk[1-0-2].md5 | 2 +- python/tests/test_Result.py | 2 +- src/results.f90 | 8 +++++--- 10 files changed, 18 insertions(+), 11 deletions(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index d73c678d8..e2103d802 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -98,7 +98,7 @@ class Result: self.version_major = f.attrs['DADF5_version_major'] self.version_minor = f.attrs['DADF5_version_minor'] - if self.version_major != 0 or not 12 <= self.version_minor <= 12: + if self.version_major != 0 or not 12 <= self.version_minor <= 13: raise TypeError(f'Unsupported DADF5 version {self.version_major}.{self.version_minor}') self.structured = 'cells' in f['geometry'].attrs.keys() @@ -1407,6 +1407,7 @@ class Result: v = self.geometry0 elif mode.lower()=='point': v = VTK.from_poly_data(self.coordinates0_point) + v.set_comments(util.execution_stamp('Result','save_VTK')) N_digits = int(np.floor(np.log10(max(1,int(self.increments[-1][10:])))))+1 @@ -1419,6 +1420,10 @@ class Result: at_cell_ph,in_data_ph,at_cell_ho,in_data_ho = self._mappings() with h5py.File(self.fname,'r') as f: + if self.version_minor >= 13: + creator = f.attrs['creator'] if h5py3 else f.attrs['creator'].decode() + created = f.attrs['created'] if h5py3 else f.attrs['created'].decode() + v.add_comments(f'{creator} ({created})') for inc in util.show_progress(self.visible['increments']): diff --git a/python/tests/reference/Result/12grains6x7x8_tensionY.hdf5 b/python/tests/reference/Result/12grains6x7x8_tensionY.hdf5 index 9fa9006ad09e7408bfc249aecc50bbf27c2af1f8..1d914f8bb6fac4bd86d9421dbec5f564bd3185e5 100644 GIT binary patch delta 31127 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 XzjNo(o&q(FCs?MiddWb3qwoI$wQ}WG delta 30729 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 diff --git a/python/tests/reference/Result/save_VTK/test_vtk[0-0-0].md5 b/python/tests/reference/Result/save_VTK/test_vtk[0-0-0].md5 index 838037bb2..2d6393540 100644 --- a/python/tests/reference/Result/save_VTK/test_vtk[0-0-0].md5 +++ b/python/tests/reference/Result/save_VTK/test_vtk[0-0-0].md5 @@ -1 +1 @@ -3b83384def67552ab7dd211efc0d54fd \ No newline at end of file +0f68c932b85aac1d30e03e05a16c4605 \ No newline at end of file diff --git a/python/tests/reference/Result/save_VTK/test_vtk[0-0-1].md5 b/python/tests/reference/Result/save_VTK/test_vtk[0-0-1].md5 index 7ceffc337..9ef213fd3 100644 --- a/python/tests/reference/Result/save_VTK/test_vtk[0-0-1].md5 +++ b/python/tests/reference/Result/save_VTK/test_vtk[0-0-1].md5 @@ -1 +1 @@ -c32c86ed50dbb39a93ca2a2ebe47d9cb \ No newline at end of file +b206ef9e7a096586c7d71d58fc7278bd \ No newline at end of file diff --git a/python/tests/reference/Result/save_VTK/test_vtk[0-0-2].md5 b/python/tests/reference/Result/save_VTK/test_vtk[0-0-2].md5 index f5b7daec3..d1f08336d 100644 --- a/python/tests/reference/Result/save_VTK/test_vtk[0-0-2].md5 +++ b/python/tests/reference/Result/save_VTK/test_vtk[0-0-2].md5 @@ -1 +1 @@ -ead4f6fcaff174fddc041d701e54ac60 \ No newline at end of file +11bd422f0a6c78ee1d3c939b1fccf1ee \ No newline at end of file diff --git a/python/tests/reference/Result/save_VTK/test_vtk[1-0-0].md5 b/python/tests/reference/Result/save_VTK/test_vtk[1-0-0].md5 index df00a513f..2f7077569 100644 --- a/python/tests/reference/Result/save_VTK/test_vtk[1-0-0].md5 +++ b/python/tests/reference/Result/save_VTK/test_vtk[1-0-0].md5 @@ -1 +1 @@ -bde8b728110c2c05a6a4740f7c5f9c06 \ No newline at end of file +541f423cfde8e2a98582491f7af3add5 \ No newline at end of file diff --git a/python/tests/reference/Result/save_VTK/test_vtk[1-0-1].md5 b/python/tests/reference/Result/save_VTK/test_vtk[1-0-1].md5 index 35c577900..e1c35f93d 100644 --- a/python/tests/reference/Result/save_VTK/test_vtk[1-0-1].md5 +++ b/python/tests/reference/Result/save_VTK/test_vtk[1-0-1].md5 @@ -1 +1 @@ -e09bfa9248283fc390003ad28d15d36e \ No newline at end of file +82e309984cab644fd94f433d5ec24133 \ No newline at end of file diff --git a/python/tests/reference/Result/save_VTK/test_vtk[1-0-2].md5 b/python/tests/reference/Result/save_VTK/test_vtk[1-0-2].md5 index d5874d88b..c9125e234 100644 --- a/python/tests/reference/Result/save_VTK/test_vtk[1-0-2].md5 +++ b/python/tests/reference/Result/save_VTK/test_vtk[1-0-2].md5 @@ -1 +1 @@ -3f21254164f96de8ee4a28249ae72cc6 \ No newline at end of file +f1f85bcdba23e3e4001512c1c6c4707a \ No newline at end of file diff --git a/python/tests/test_Result.py b/python/tests/test_Result.py index 56bc4a00f..9d9a5fc74 100644 --- a/python/tests/test_Result.py +++ b/python/tests/test_Result.py @@ -333,7 +333,7 @@ class TestResult: @pytest.mark.parametrize('output',['F','*',['P']],ids=range(3)) @pytest.mark.parametrize('fname',['12grains6x7x8_tensionY.hdf5'],ids=range(1)) @pytest.mark.parametrize('inc',[4,0],ids=range(2)) - def test_vtk(self,request,tmp_path,ref_path,update,output,fname,inc): + def test_vtk(self,request,tmp_path,ref_path,update,patch_execution_stamp,patch_datetime_now,output,fname,inc): result = Result(ref_path/fname).view('increments',inc) os.chdir(tmp_path) result.save_VTK(output) diff --git a/src/results.f90 b/src/results.f90 index 90727b9c3..f0af4a1cb 100644 --- a/src/results.f90 +++ b/src/results.f90 @@ -57,7 +57,7 @@ subroutine results_init(restart) logical, intent(in) :: restart - character(len=pStringLen) :: commandLine + character(len=pPathLen) :: commandLine print'(/,a)', ' <<<+- results init -+>>>'; flush(IO_STDOUT) @@ -67,8 +67,10 @@ subroutine results_init(restart) if(.not. restart) then resultsFile = HDF5_openFile(getSolverJobName()//'.hdf5','w') call results_addAttribute('DADF5_version_major',0) - call results_addAttribute('DADF5_version_minor',12) - call results_addAttribute('DAMASK_version',DAMASKVERSION) + call results_addAttribute('DADF5_version_minor',13) + call get_command_argument(0,commandLine) + call results_addAttribute('creator',trim(commandLine)//' '//DAMASKVERSION) + call results_addAttribute('created',now()) call get_command(commandLine) call results_addAttribute('call',trim(commandLine)) call results_closeGroup(results_addGroup('cell_to')) From de79d2d897647c0d7ff24bf32d44b2cbbf90a312 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 26 Apr 2021 00:22:37 +0200 Subject: [PATCH 5/7] test handling of Marc results --- python/damask/_result.py | 2 +- .../reference/Result/check_compile_job1.hdf5 | Bin 0 -> 61584 bytes python/tests/test_Result.py | 13 +++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 python/tests/reference/Result/check_compile_job1.hdf5 diff --git a/python/damask/_result.py b/python/damask/_result.py index e2103d802..cf30bf624 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -505,7 +505,7 @@ class Result: return grid_filters.coordinates0_point(self.cells,self.size,self.origin).reshape(-1,3,order='F') else: with h5py.File(self.fname,'r') as f: - return f['geometry/x_c'][()] + return f['geometry/x_p'][()] @property def coordinates0_node(self): diff --git a/python/tests/reference/Result/check_compile_job1.hdf5 b/python/tests/reference/Result/check_compile_job1.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..2634c26ce293a652b55d92694125c662081dfca1 GIT binary patch literal 61584 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 len(c_p) + @pytest.mark.parametrize('mode',['point','cell']) def test_vtk_mode(self,tmp_path,single_phase,mode): os.chdir(tmp_path) From 5567512f737ffcc2e915a66102e2cbcdadbc05a8 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Mon, 26 Apr 2021 14:26:16 -0400 Subject: [PATCH 6/7] removed unnecessary f-strings; added any -x to increments view --- python/damask/_result.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index cf30bf624..c424207e5 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -112,11 +112,11 @@ class Result: self.increments = sorted([i for i in f.keys() if r.match(i)],key=util.natural_sort) self.times = [round(f[i].attrs['t/s'],12) for i in self.increments] - self.N_materialpoints, self.N_constituents = np.shape(f[f'cell_to/phase']) + self.N_materialpoints, self.N_constituents = np.shape(f['cell_to/phase']) - self.homogenization = f[f'cell_to/homogenization']['label'].astype('str') + self.homogenization = f['cell_to/homogenization']['label'].astype('str') self.homogenizations = sorted(np.unique(self.homogenization),key=util.natural_sort) - self.phase = f[f'cell_to/phase']['label'].astype('str') + self.phase = f['cell_to/phase']['label'].astype('str') self.phases = sorted(np.unique(self.phase),key=util.natural_sort) self.fields = [] @@ -189,8 +189,7 @@ class Result: if what == 'increments': choice = [c if isinstance(c,str) and c.startswith('increment_') else - f'increment_{c}' for c in choice] - if datasets == -1: choice = [self.increments[-1]] + self.increments[c] if c<0 else f'increment_{c}' for c in choice] elif what == 'times': what = 'increments' if choice == ['*']: @@ -953,10 +952,10 @@ class Result: Notes ----- - The definition of the second Piola-Kirchhoff (S) stress follows - the standard nonlinear continuum mechanics definition. It does - NOT take the different configurations into account as it would - be required for the crystal plasticity definition of S. + The definition of the second Piola-Kirchhoff stress (S = [F^-1 P]_sym) + follows the standard definition in nonlinear continuum mechanics. + As such, no intermediate configuration, for instance that reached by F_p, + is taken into account. """ self._add_generic_pointwise(self._add_stress_second_Piola_Kirchhoff,{'P':P,'F':F}) From ba938f17463aa3c3e597ad354c8a9736f85f0664 Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Mon, 26 Apr 2021 17:56:15 -0400 Subject: [PATCH 7/7] need to check for isinstance(int) --- python/damask/_result.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index c424207e5..0520f08f2 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -189,7 +189,8 @@ class Result: if what == 'increments': choice = [c if isinstance(c,str) and c.startswith('increment_') else - self.increments[c] if c<0 else f'increment_{c}' for c in choice] + self.increments[c] if isinstance(c,int) and c<0 else + f'increment_{c}' for c in choice] elif what == 'times': what = 'increments' if choice == ['*']: