From fbd61fda99b9eab87d41d738411d648cfcc5022a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 2 Apr 2020 11:54:34 +0200 Subject: [PATCH 01/27] ignore comments --- python/damask/_geom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index 6bc92e300..f39343a50 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -287,7 +287,7 @@ class Geom: comments = [] for i,line in enumerate(content[:header_length]): - items = line.lower().strip().split() + items = line.split('#')[0].lower().strip().split() key = items[0] if items else '' if key == 'grid': grid = np.array([ int(dict(zip(items[1::2],items[2::2]))[i]) for i in ['a','b','c']]) @@ -303,7 +303,7 @@ class Geom: microstructure = np.empty(grid.prod()) # initialize as flat array i = 0 for line in content[header_length:]: - items = line.split() + items = line.split('#')[0].split() if len(items) == 3: if items[1].lower() == 'of': items = np.ones(int(items[0]))*float(items[2]) From 98373904068d19b6a083210d6f4f7f531f2d54f1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 10 Apr 2020 12:30:39 +0200 Subject: [PATCH 02/27] do not clutter namespace we do not need damask.util.np etc --- python/damask/grid_filters.py | 142 +++++++++++++++++----------------- python/damask/mechanics.py | 76 +++++++++--------- 2 files changed, 109 insertions(+), 109 deletions(-) diff --git a/python/damask/grid_filters.py b/python/damask/grid_filters.py index 35876fc99..8106ed905 100644 --- a/python/damask/grid_filters.py +++ b/python/damask/grid_filters.py @@ -1,5 +1,5 @@ -from scipy import spatial -import numpy as np +from scipy import spatial as _spatial +import numpy as _np def _ks(size,grid,first_order=False): """ @@ -11,16 +11,16 @@ def _ks(size,grid,first_order=False): physical size of the periodic field. """ - k_sk = np.where(np.arange(grid[0])>grid[0]//2,np.arange(grid[0])-grid[0],np.arange(grid[0]))/size[0] + k_sk = _np.where(_np.arange(grid[0])>grid[0]//2,_np.arange(grid[0])-grid[0],_np.arange(grid[0]))/size[0] if grid[0]%2 == 0 and first_order: k_sk[grid[0]//2] = 0 # Nyquist freq=0 for even grid (Johnson, MIT, 2011) - k_sj = np.where(np.arange(grid[1])>grid[1]//2,np.arange(grid[1])-grid[1],np.arange(grid[1]))/size[1] + k_sj = _np.where(_np.arange(grid[1])>grid[1]//2,_np.arange(grid[1])-grid[1],_np.arange(grid[1]))/size[1] if grid[1]%2 == 0 and first_order: k_sj[grid[1]//2] = 0 # Nyquist freq=0 for even grid (Johnson, MIT, 2011) - k_si = np.arange(grid[2]//2+1)/size[2] + k_si = _np.arange(grid[2]//2+1)/size[2] - kk, kj, ki = np.meshgrid(k_sk,k_sj,k_si,indexing = 'ij') - return np.concatenate((ki[:,:,:,None],kj[:,:,:,None],kk[:,:,:,None]),axis = 3) + kk, kj, ki = _np.meshgrid(k_sk,k_sj,k_si,indexing = 'ij') + return _np.concatenate((ki[:,:,:,None],kj[:,:,:,None],kk[:,:,:,None]),axis = 3) def curl(size,field): @@ -33,18 +33,18 @@ def curl(size,field): physical size of the periodic field. """ - n = np.prod(field.shape[3:]) + n = _np.prod(field.shape[3:]) k_s = _ks(size,field.shape[:3],True) - e = np.zeros((3, 3, 3)) + e = _np.zeros((3, 3, 3)) e[0, 1, 2] = e[1, 2, 0] = e[2, 0, 1] = +1.0 # Levi-Civita symbol e[0, 2, 1] = e[2, 1, 0] = e[1, 0, 2] = -1.0 - field_fourier = np.fft.rfftn(field,axes=(0,1,2)) - curl_ = (np.einsum('slm,ijkl,ijkm ->ijks', e,k_s,field_fourier)*2.0j*np.pi if n == 3 else # vector, 3 -> 3 - np.einsum('slm,ijkl,ijknm->ijksn',e,k_s,field_fourier)*2.0j*np.pi) # tensor, 3x3 -> 3x3 + field_fourier = _np.fft.rfftn(field,axes=(0,1,2)) + curl_ = (_np.einsum('slm,ijkl,ijkm ->ijks', e,k_s,field_fourier)*2.0j*_np.pi if n == 3 else # vector, 3 -> 3 + _np.einsum('slm,ijkl,ijknm->ijksn',e,k_s,field_fourier)*2.0j*_np.pi) # tensor, 3x3 -> 3x3 - return np.fft.irfftn(curl_,axes=(0,1,2),s=field.shape[:3]) + return _np.fft.irfftn(curl_,axes=(0,1,2),s=field.shape[:3]) def divergence(size,field): @@ -57,14 +57,14 @@ def divergence(size,field): physical size of the periodic field. """ - n = np.prod(field.shape[3:]) + n = _np.prod(field.shape[3:]) k_s = _ks(size,field.shape[:3],True) - field_fourier = np.fft.rfftn(field,axes=(0,1,2)) - div_ = (np.einsum('ijkl,ijkl ->ijk', k_s,field_fourier)*2.0j*np.pi if n == 3 else # vector, 3 -> 1 - np.einsum('ijkm,ijklm->ijkl',k_s,field_fourier)*2.0j*np.pi) # tensor, 3x3 -> 3 + field_fourier = _np.fft.rfftn(field,axes=(0,1,2)) + div_ = (_np.einsum('ijkl,ijkl ->ijk', k_s,field_fourier)*2.0j*_np.pi if n == 3 else # vector, 3 -> 1 + _np.einsum('ijkm,ijklm->ijkl',k_s,field_fourier)*2.0j*_np.pi) # tensor, 3x3 -> 3 - return np.fft.irfftn(div_,axes=(0,1,2),s=field.shape[:3]) + return _np.fft.irfftn(div_,axes=(0,1,2),s=field.shape[:3]) def gradient(size,field): @@ -77,17 +77,17 @@ def gradient(size,field): physical size of the periodic field. """ - n = np.prod(field.shape[3:]) + n = _np.prod(field.shape[3:]) k_s = _ks(size,field.shape[:3],True) - field_fourier = np.fft.rfftn(field,axes=(0,1,2)) - grad_ = (np.einsum('ijkl,ijkm->ijkm', field_fourier,k_s)*2.0j*np.pi if n == 1 else # scalar, 1 -> 3 - np.einsum('ijkl,ijkm->ijklm',field_fourier,k_s)*2.0j*np.pi) # vector, 3 -> 3x3 + field_fourier = _np.fft.rfftn(field,axes=(0,1,2)) + grad_ = (_np.einsum('ijkl,ijkm->ijkm', field_fourier,k_s)*2.0j*_np.pi if n == 1 else # scalar, 1 -> 3 + _np.einsum('ijkl,ijkm->ijklm',field_fourier,k_s)*2.0j*_np.pi) # vector, 3 -> 3x3 - return np.fft.irfftn(grad_,axes=(0,1,2),s=field.shape[:3]) + return _np.fft.irfftn(grad_,axes=(0,1,2),s=field.shape[:3]) -def cell_coord0(grid,size,origin=np.zeros(3)): +def cell_coord0(grid,size,origin=_np.zeros(3)): """ Cell center positions (undeformed). @@ -103,7 +103,7 @@ def cell_coord0(grid,size,origin=np.zeros(3)): """ start = origin + size/grid*.5 end = origin + size - size/grid*.5 - return np.mgrid[start[0]:end[0]:grid[0]*1j,start[1]:end[1]:grid[1]*1j,start[2]:end[2]:grid[2]*1j].T + return _np.mgrid[start[0]:end[0]:grid[0]*1j,start[1]:end[1]:grid[1]*1j,start[2]:end[2]:grid[2]*1j].T def cell_displacement_fluct(size,F): @@ -118,19 +118,19 @@ def cell_displacement_fluct(size,F): deformation gradient field. """ - integrator = 0.5j*size/np.pi + integrator = 0.5j*size/_np.pi k_s = _ks(size,F.shape[:3],False) - k_s_squared = np.einsum('...l,...l',k_s,k_s) + k_s_squared = _np.einsum('...l,...l',k_s,k_s) k_s_squared[0,0,0] = 1.0 - displacement = -np.einsum('ijkml,ijkl,l->ijkm', - np.fft.rfftn(F,axes=(0,1,2)), + displacement = -_np.einsum('ijkml,ijkl,l->ijkm', + _np.fft.rfftn(F,axes=(0,1,2)), k_s, integrator, - ) / k_s_squared[...,np.newaxis] + ) / k_s_squared[...,_np.newaxis] - return np.fft.irfftn(displacement,axes=(0,1,2),s=F.shape[:3]) + return _np.fft.irfftn(displacement,axes=(0,1,2),s=F.shape[:3]) def cell_displacement_avg(size,F): @@ -145,8 +145,8 @@ def cell_displacement_avg(size,F): deformation gradient field. """ - F_avg = np.average(F,axis=(0,1,2)) - return np.einsum('ml,ijkl->ijkm',F_avg-np.eye(3),cell_coord0(F.shape[:3][::-1],size)) + F_avg = _np.average(F,axis=(0,1,2)) + return _np.einsum('ml,ijkl->ijkm',F_avg-_np.eye(3),cell_coord0(F.shape[:3][::-1],size)) def cell_displacement(size,F): @@ -164,7 +164,7 @@ def cell_displacement(size,F): return cell_displacement_avg(size,F) + cell_displacement_fluct(size,F) -def cell_coord(size,F,origin=np.zeros(3)): +def cell_coord(size,F,origin=_np.zeros(3)): """ Cell center positions. @@ -193,17 +193,17 @@ def cell_coord0_gridSizeOrigin(coord0,ordered=True): expect coord0 data to be ordered (x fast, z slow). """ - coords = [np.unique(coord0[:,i]) for i in range(3)] - mincorner = np.array(list(map(min,coords))) - maxcorner = np.array(list(map(max,coords))) - grid = np.array(list(map(len,coords)),'i') - size = grid/np.maximum(grid-1,1) * (maxcorner-mincorner) + coords = [_np.unique(coord0[:,i]) for i in range(3)] + mincorner = _np.array(list(map(min,coords))) + maxcorner = _np.array(list(map(max,coords))) + grid = _np.array(list(map(len,coords)),'i') + size = grid/_np.maximum(grid-1,1) * (maxcorner-mincorner) delta = size/grid origin = mincorner - delta*.5 # 1D/2D: size/origin combination undefined, set origin to 0.0 - size [np.where(grid==1)] = origin[np.where(grid==1)]*2. - origin[np.where(grid==1)] = 0.0 + size [_np.where(grid==1)] = origin[_np.where(grid==1)]*2. + origin[_np.where(grid==1)] = 0.0 if grid.prod() != len(coord0): raise ValueError('Data count {} does not match grid {}.'.format(len(coord0),grid)) @@ -211,13 +211,13 @@ def cell_coord0_gridSizeOrigin(coord0,ordered=True): start = origin + delta*.5 end = origin - delta*.5 + size - if not np.allclose(coords[0],np.linspace(start[0],end[0],grid[0])) and \ - np.allclose(coords[1],np.linspace(start[1],end[1],grid[1])) and \ - np.allclose(coords[2],np.linspace(start[2],end[2],grid[2])): + if not _np.allclose(coords[0],_np.linspace(start[0],end[0],grid[0])) and \ + _np.allclose(coords[1],_np.linspace(start[1],end[1],grid[1])) and \ + _np.allclose(coords[2],_np.linspace(start[2],end[2],grid[2])): raise ValueError('Regular grid spacing violated.') - if ordered and not np.allclose(coord0.reshape(tuple(grid[::-1])+(3,)),cell_coord0(grid,size,origin)): - raise ValueError('Input data is not a regular grid.') + if ordered and not _np.allclose(coord0.reshape(tuple(grid[::-1])+(3,)),cell_coord0(grid,size,origin)): + raise ValueError('I_nput data is not a regular grid.') return (grid,size,origin) @@ -235,7 +235,7 @@ def coord0_check(coord0): cell_coord0_gridSizeOrigin(coord0,ordered=True) -def node_coord0(grid,size,origin=np.zeros(3)): +def node_coord0(grid,size,origin=_np.zeros(3)): """ Nodal positions (undeformed). @@ -249,7 +249,7 @@ def node_coord0(grid,size,origin=np.zeros(3)): physical origin of the periodic field. Defaults to [0.0,0.0,0.0]. """ - return np.mgrid[origin[0]:size[0]+origin[0]:(grid[0]+1)*1j, + return _np.mgrid[origin[0]:size[0]+origin[0]:(grid[0]+1)*1j, origin[1]:size[1]+origin[1]:(grid[1]+1)*1j, origin[2]:size[2]+origin[2]:(grid[2]+1)*1j].T @@ -281,8 +281,8 @@ def node_displacement_avg(size,F): deformation gradient field. """ - F_avg = np.average(F,axis=(0,1,2)) - return np.einsum('ml,ijkl->ijkm',F_avg-np.eye(3),node_coord0(F.shape[:3][::-1],size)) + F_avg = _np.average(F,axis=(0,1,2)) + return _np.einsum('ml,ijkl->ijkm',F_avg-_np.eye(3),node_coord0(F.shape[:3][::-1],size)) def node_displacement(size,F): @@ -300,7 +300,7 @@ def node_displacement(size,F): return node_displacement_avg(size,F) + node_displacement_fluct(size,F) -def node_coord(size,F,origin=np.zeros(3)): +def node_coord(size,F,origin=_np.zeros(3)): """ Nodal positions. @@ -319,18 +319,18 @@ def node_coord(size,F,origin=np.zeros(3)): def cell_2_node(cell_data): """Interpolate periodic cell data to nodal data.""" - n = ( cell_data + np.roll(cell_data,1,(0,1,2)) - + np.roll(cell_data,1,(0,)) + np.roll(cell_data,1,(1,)) + np.roll(cell_data,1,(2,)) - + np.roll(cell_data,1,(0,1)) + np.roll(cell_data,1,(1,2)) + np.roll(cell_data,1,(2,0)))*0.125 + n = ( cell_data + _np.roll(cell_data,1,(0,1,2)) + + _np.roll(cell_data,1,(0,)) + _np.roll(cell_data,1,(1,)) + _np.roll(cell_data,1,(2,)) + + _np.roll(cell_data,1,(0,1)) + _np.roll(cell_data,1,(1,2)) + _np.roll(cell_data,1,(2,0)))*0.125 - return np.pad(n,((0,1),(0,1),(0,1))+((0,0),)*len(cell_data.shape[3:]),mode='wrap') + return _np.pad(n,((0,1),(0,1),(0,1))+((0,0),)*len(cell_data.shape[3:]),mode='wrap') def node_2_cell(node_data): """Interpolate periodic nodal data to cell data.""" - c = ( node_data + np.roll(node_data,1,(0,1,2)) - + np.roll(node_data,1,(0,)) + np.roll(node_data,1,(1,)) + np.roll(node_data,1,(2,)) - + np.roll(node_data,1,(0,1)) + np.roll(node_data,1,(1,2)) + np.roll(node_data,1,(2,0)))*0.125 + c = ( node_data + _np.roll(node_data,1,(0,1,2)) + + _np.roll(node_data,1,(0,)) + _np.roll(node_data,1,(1,)) + _np.roll(node_data,1,(2,)) + + _np.roll(node_data,1,(0,1)) + _np.roll(node_data,1,(1,2)) + _np.roll(node_data,1,(2,0)))*0.125 return c[:-1,:-1,:-1] @@ -347,23 +347,23 @@ def node_coord0_gridSizeOrigin(coord0,ordered=False): expect coord0 data to be ordered (x fast, z slow). """ - coords = [np.unique(coord0[:,i]) for i in range(3)] - mincorner = np.array(list(map(min,coords))) - maxcorner = np.array(list(map(max,coords))) - grid = np.array(list(map(len,coords)),'i') - 1 + coords = [_np.unique(coord0[:,i]) for i in range(3)] + mincorner = _np.array(list(map(min,coords))) + maxcorner = _np.array(list(map(max,coords))) + grid = _np.array(list(map(len,coords)),'i') - 1 size = maxcorner-mincorner origin = mincorner if (grid+1).prod() != len(coord0): raise ValueError('Data count {} does not match grid {}.'.format(len(coord0),grid)) - if not np.allclose(coords[0],np.linspace(mincorner[0],maxcorner[0],grid[0]+1)) and \ - np.allclose(coords[1],np.linspace(mincorner[1],maxcorner[1],grid[1]+1)) and \ - np.allclose(coords[2],np.linspace(mincorner[2],maxcorner[2],grid[2]+1)): + if not _np.allclose(coords[0],_np.linspace(mincorner[0],maxcorner[0],grid[0]+1)) and \ + _np.allclose(coords[1],_np.linspace(mincorner[1],maxcorner[1],grid[1]+1)) and \ + _np.allclose(coords[2],_np.linspace(mincorner[2],maxcorner[2],grid[2]+1)): raise ValueError('Regular grid spacing violated.') - if ordered and not np.allclose(coord0.reshape(tuple((grid+1)[::-1])+(3,)),node_coord0(grid,size,origin)): - raise ValueError('Input data is not a regular grid.') + if ordered and not _np.allclose(coord0.reshape(tuple((grid+1)[::-1])+(3,)),node_coord0(grid,size,origin)): + raise ValueError('I_nput data is not a regular grid.') return (grid,size,origin) @@ -386,10 +386,10 @@ def regrid(size,F,new_grid): + cell_displacement_avg(size,F) \ + cell_displacement_fluct(size,F) - outer = np.dot(np.average(F,axis=(0,1,2)),size) + outer = _np.dot(_np.average(F,axis=(0,1,2)),size) for d in range(3): - c[np.where(c[:,:,:,d]<0)] += outer[d] - c[np.where(c[:,:,:,d]>outer[d])] -= outer[d] + c[_np.where(c[:,:,:,d]<0)] += outer[d] + c[_np.where(c[:,:,:,d]>outer[d])] -= outer[d] - tree = spatial.cKDTree(c.reshape(-1,3),boxsize=outer) + tree = _spatial.cKDTree(c.reshape(-1,3),boxsize=outer) return tree.query(cell_coord0(new_grid,outer))[1].flatten() diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 674ff9c5a..e19f140fb 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -1,4 +1,4 @@ -import numpy as np +import numpy as _np def Cauchy(P,F): """ @@ -14,10 +14,10 @@ def Cauchy(P,F): First Piola-Kirchhoff stress. """ - if np.shape(F) == np.shape(P) == (3,3): - sigma = 1.0/np.linalg.det(F) * np.dot(P,F.T) + if _np.shape(F) == _np.shape(P) == (3,3): + sigma = 1.0/_np.linalg.det(F) * _np.dot(P,F.T) else: - sigma = np.einsum('i,ijk,ilk->ijl',1.0/np.linalg.det(F),P,F) + sigma = _np.einsum('i,ijk,ilk->ijl',1.0/_np.linalg.det(F),P,F) return symmetric(sigma) @@ -31,8 +31,8 @@ def deviatoric_part(T): Tensor of which the deviatoric part is computed. """ - return T - np.eye(3)*spherical_part(T) if np.shape(T) == (3,3) else \ - T - np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),[T.shape[0],3,3]),spherical_part(T)) + return T - _np.eye(3)*spherical_part(T) if _np.shape(T) == (3,3) else \ + T - _np.einsum('ijk,i->ijk',_np.broadcast_to(_np.eye(3),[T.shape[0],3,3]),spherical_part(T)) def eigenvalues(T_sym): @@ -48,7 +48,7 @@ def eigenvalues(T_sym): Symmetric tensor of which the eigenvalues are computed. """ - return np.linalg.eigvalsh(symmetric(T_sym)) + return _np.linalg.eigvalsh(symmetric(T_sym)) def eigenvectors(T_sym,RHS=False): @@ -65,13 +65,13 @@ def eigenvectors(T_sym,RHS=False): Enforce right-handed coordinate system. Default is False. """ - (u,v) = np.linalg.eigh(symmetric(T_sym)) + (u,v) = _np.linalg.eigh(symmetric(T_sym)) if RHS: - if np.shape(T_sym) == (3,3): - if np.linalg.det(v) < 0.0: v[:,2] *= -1.0 + if _np.shape(T_sym) == (3,3): + if _np.linalg.det(v) < 0.0: v[:,2] *= -1.0 else: - v[np.linalg.det(v) < 0.0,:,2] *= -1.0 + v[_np.linalg.det(v) < 0.0,:,2] *= -1.0 return v @@ -99,7 +99,7 @@ def maximum_shear(T_sym): """ w = eigenvalues(T_sym) - return (w[0] - w[2])*0.5 if np.shape(T_sym) == (3,3) else \ + return (w[0] - w[2])*0.5 if _np.shape(T_sym) == (3,3) else \ (w[:,0] - w[:,2])*0.5 @@ -141,10 +141,10 @@ def PK2(P,F): Deformation gradient. """ - if np.shape(F) == np.shape(P) == (3,3): - S = np.dot(np.linalg.inv(F),P) + if _np.shape(F) == _np.shape(P) == (3,3): + S = _np.dot(_np.linalg.inv(F),P) else: - S = np.einsum('ijk,ikl->ijl',np.linalg.inv(F),P) + S = _np.einsum('ijk,ikl->ijl',_np.linalg.inv(F),P) return symmetric(S) @@ -187,14 +187,14 @@ def spherical_part(T,tensor=False): """ if T.shape == (3,3): - sph = np.trace(T)/3.0 - return sph if not tensor else np.eye(3)*sph + sph = _np.trace(T)/3.0 + return sph if not tensor else _np.eye(3)*sph else: - sph = np.trace(T,axis1=1,axis2=2)/3.0 + sph = _np.trace(T,axis1=1,axis2=2)/3.0 if not tensor: return sph else: - return np.einsum('ijk,i->ijk',np.broadcast_to(np.eye(3),(T.shape[0],3,3)),sph) + return _np.einsum('ijk,i->ijk',_np.broadcast_to(_np.eye(3),(T.shape[0],3,3)),sph) def strain_tensor(F,t,m): @@ -216,22 +216,22 @@ def strain_tensor(F,t,m): """ F_ = F.reshape(1,3,3) if F.shape == (3,3) else F if t == 'V': - B = np.matmul(F_,transpose(F_)) - w,n = np.linalg.eigh(B) + B = _np.matmul(F_,transpose(F_)) + w,n = _np.linalg.eigh(B) elif t == 'U': - C = np.matmul(transpose(F_),F_) - w,n = np.linalg.eigh(C) + C = _np.matmul(transpose(F_),F_) + w,n = _np.linalg.eigh(C) if m > 0.0: - eps = 1.0/(2.0*abs(m)) * (+ np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) - - np.broadcast_to(np.eye(3),[F_.shape[0],3,3])) + eps = 1.0/(2.0*abs(m)) * (+ _np.matmul(n,_np.einsum('ij,ikj->ijk',w**m,n)) + - _np.broadcast_to(_np.eye(3),[F_.shape[0],3,3])) elif m < 0.0: - eps = 1.0/(2.0*abs(m)) * (- np.matmul(n,np.einsum('ij,ikj->ijk',w**m,n)) - + np.broadcast_to(np.eye(3),[F_.shape[0],3,3])) + eps = 1.0/(2.0*abs(m)) * (- _np.matmul(n,_np.einsum('ij,ikj->ijk',w**m,n)) + + _np.broadcast_to(_np.eye(3),[F_.shape[0],3,3])) else: - eps = np.matmul(n,np.einsum('ij,ikj->ijk',0.5*np.log(w),n)) + eps = _np.matmul(n,_np.einsum('ij,ikj->ijk',0.5*_np.log(w),n)) - return eps.reshape(3,3) if np.shape(F) == (3,3) else \ + return eps.reshape(3,3) if _np.shape(F) == (3,3) else \ eps @@ -258,8 +258,8 @@ def transpose(T): Tensor of which the transpose is computed. """ - return T.T if np.shape(T) == (3,3) else \ - np.transpose(T,(0,2,1)) + return T.T if _np.shape(T) == (3,3) else \ + _np.transpose(T,(0,2,1)) def _polar_decomposition(T,requested): @@ -275,17 +275,17 @@ def _polar_decomposition(T,requested): ‘V’ for left stretch tensor and ‘U’ for right stretch tensor. """ - u, s, vh = np.linalg.svd(T) - R = np.dot(u,vh) if np.shape(T) == (3,3) else \ - np.einsum('ijk,ikl->ijl',u,vh) + u, s, vh = _np.linalg.svd(T) + R = _np.dot(u,vh) if _np.shape(T) == (3,3) else \ + _np.einsum('ijk,ikl->ijl',u,vh) output = [] if 'R' in requested: output.append(R) if 'V' in requested: - output.append(np.dot(T,R.T) if np.shape(T) == (3,3) else np.einsum('ijk,ilk->ijl',T,R)) + output.append(_np.dot(T,R.T) if _np.shape(T) == (3,3) else _np.einsum('ijk,ilk->ijl',T,R)) if 'U' in requested: - output.append(np.dot(R.T,T) if np.shape(T) == (3,3) else np.einsum('ikj,ikl->ijl',R,T)) + output.append(_np.dot(R.T,T) if _np.shape(T) == (3,3) else _np.einsum('ikj,ikl->ijl',R,T)) return tuple(output) @@ -303,5 +303,5 @@ def _Mises(T_sym,s): """ d = deviatoric_part(T_sym) - return np.sqrt(s*(np.sum(d**2.0))) if np.shape(T_sym) == (3,3) else \ - np.sqrt(s*np.einsum('ijk->i',d**2.0)) + return _np.sqrt(s*(_np.sum(d**2.0))) if _np.shape(T_sym) == (3,3) else \ + _np.sqrt(s*_np.einsum('ijk->i',d**2.0)) From 656c0199cf0ca8dd604b6d3177f53af933c5b23b Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 10 Apr 2020 12:32:33 +0200 Subject: [PATCH 03/27] sorted and make explicitly available what we need --- python/damask/__init__.py | 2 +- python/damask/util.py | 153 +++++++++++++++++++++----------------- 2 files changed, 87 insertions(+), 68 deletions(-) diff --git a/python/damask/__init__.py b/python/damask/__init__.py index 87c557721..9a01e8e62 100644 --- a/python/damask/__init__.py +++ b/python/damask/__init__.py @@ -6,7 +6,7 @@ name = 'damask' with open(_os.path.join(_os.path.dirname(__file__),'VERSION')) as _f: version = _re.sub(r'^v','',_f.readline().strip()) -# classes +# make classes directly accessible as damask.Class from ._environment import Environment # noqa from ._table import Table # noqa from ._vtk import VTK # noqa diff --git a/python/damask/util.py b/python/damask/util.py index 273da8c1e..d45ea366e 100644 --- a/python/damask/util.py +++ b/python/damask/util.py @@ -9,37 +9,22 @@ from optparse import Option import numpy as np -class bcolors: - """ - ASCII Colors. - - https://svn.blender.org/svnroot/bf-blender/trunk/blender/build_files/scons/tools/bcolors.py - https://stackoverflow.com/questions/287871 - """ - - HEADER = '\033[95m' - OKBLUE = '\033[94m' - OKGREEN = '\033[92m' - WARNING = '\033[93m' - FAIL = '\033[91m' - ENDC = '\033[0m' - BOLD = '\033[1m' - DIM = '\033[2m' - UNDERLINE = '\033[4m' - CROSSOUT = '\033[9m' - - def disable(self): - self.HEADER = '' - self.OKBLUE = '' - self.OKGREEN = '' - self.WARNING = '' - self.FAIL = '' - self.ENDC = '' - self.BOLD = '' - self.UNDERLINE = '' - self.CROSSOUT = '' - +# limit visibility +__all__=[ + 'srepr', + 'croak', + 'report', + 'emph','deemph','delete','strikeout', + 'execute', + 'show_progress', + 'scale_to_coprime', + 'return_message', + 'extendableOption', + ] +#################################################################################################### +# Functions +#################################################################################################### def srepr(arg,glue = '\n'): r""" Join arguments as individual lines. @@ -144,6 +129,52 @@ def execute(cmd, return out,error +def show_progress(iterable,N_iter=None,prefix='',bar_length=50): + """ + Decorate a loop with a status bar. + + Use similar like enumerate. + + Parameters + ---------- + iterable : iterable/function with yield statement + Iterable (or function with yield statement) to be decorated. + N_iter : int + Total # of iterations. Needed if number of iterations can not be obtained as len(iterable). + prefix : str, optional. + Prefix string. + bar_length : int, optional + Character length of bar. Defaults to 50. + + """ + status = _ProgressBar(N_iter if N_iter else len(iterable),prefix,bar_length) + + for i,item in enumerate(iterable): + yield item + status.update(i) + + +def scale_to_coprime(v): + """Scale vector to co-prime (relatively prime) integers.""" + MAX_DENOMINATOR = 1000 + + def get_square_denominator(x): + """Denominator of the square of a number.""" + return fractions.Fraction(x ** 2).limit_denominator(MAX_DENOMINATOR).denominator + + def lcm(a, b): + """Least common multiple.""" + return a * b // np.gcd(a, b) + + denominators = [int(get_square_denominator(i)) for i in v] + s = reduce(lcm, denominators) ** 0.5 + m = (np.array(v)*s).astype(np.int) + return m//reduce(np.gcd,m) + + +#################################################################################################### +# Classes +#################################################################################################### class extendableOption(Option): """ Used for definition of new option parser action 'extend', which enables to take multiple option arguments. @@ -215,47 +246,36 @@ class _ProgressBar: sys.stderr.write('\n') sys.stderr.flush() -def show_progress(iterable,N_iter=None,prefix='',bar_length=50): + +class bcolors: """ - Decorate a loop with a status bar. - - Use similar like enumerate. - - Parameters - ---------- - iterable : iterable/function with yield statement - Iterable (or function with yield statement) to be decorated. - N_iter : int - Total # of iterations. Needed if number of iterations can not be obtained as len(iterable). - prefix : str, optional. - Prefix string. - bar_length : int, optional - Character length of bar. Defaults to 50. + ASCII Colors. + https://svn.blender.org/svnroot/bf-blender/trunk/blender/build_files/scons/tools/bcolors.py + https://stackoverflow.com/questions/287871 """ - status = _ProgressBar(N_iter if N_iter else len(iterable),prefix,bar_length) - for i,item in enumerate(iterable): - yield item - status.update(i) + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + DIM = '\033[2m' + UNDERLINE = '\033[4m' + CROSSOUT = '\033[9m' - -def scale_to_coprime(v): - """Scale vector to co-prime (relatively prime) integers.""" - MAX_DENOMINATOR = 1000 - - def get_square_denominator(x): - """Denominator of the square of a number.""" - return fractions.Fraction(x ** 2).limit_denominator(MAX_DENOMINATOR).denominator - - def lcm(a, b): - """Least common multiple.""" - return a * b // np.gcd(a, b) - - denominators = [int(get_square_denominator(i)) for i in v] - s = reduce(lcm, denominators) ** 0.5 - m = (np.array(v)*s).astype(np.int) - return m//reduce(np.gcd,m) + def disable(self): + self.HEADER = '' + self.OKBLUE = '' + self.OKGREEN = '' + self.WARNING = '' + self.FAIL = '' + self.ENDC = '' + self.BOLD = '' + self.UNDERLINE = '' + self.CROSSOUT = '' class return_message: @@ -276,4 +296,3 @@ class return_message: def __repr__(self): """Return message suitable for interactive shells.""" return srepr(self.message) - From a2e70612ff0cfacc04ad33c38d93ea3b515befcb Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 10 Apr 2020 12:52:27 +0200 Subject: [PATCH 04/27] interface checking for LAPACK --- src/LAPACK_interface.f90 | 59 ++++++++++++++++++++++++++++++++++ src/commercialFEM_fileList.f90 | 1 + src/crystallite.f90 | 2 -- src/math.f90 | 11 +------ src/rotations.f90 | 2 -- 5 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 src/LAPACK_interface.f90 diff --git a/src/LAPACK_interface.f90 b/src/LAPACK_interface.f90 new file mode 100644 index 000000000..7d3043ed0 --- /dev/null +++ b/src/LAPACK_interface.f90 @@ -0,0 +1,59 @@ +!-------------------------------------------------------------------------------------------------- +!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH +!> @brief Fortran interfaces for LAPACK routines +!> @details https://www.netlib.org/lapack/ +!-------------------------------------------------------------------------------------------------- +module LAPACK_interface + interface + + subroutine dgeev(jobvl,jobvr,n,a,lda,wr,wi,vl,ldvl,vr,ldvr,work,lwork,info) + use prec + character, intent(in) :: jobvl,jobvr + integer, intent(in) :: n,lda,ldvl,ldvr,lwork + real(pReal), intent(inout), dimension(lda,n) :: a + real(pReal), intent(out), dimension(n) :: wr,wi + real(pReal), intent(out), dimension(ldvl,n) :: vl + real(pReal), intent(out), dimension(ldvr,n) :: vr + real(pReal), intent(out), dimension(max(1,lwork)) :: work + integer, intent(out) :: info + end subroutine dgeev + + subroutine dgesv(n,nrhs,a,lda,ipiv,b,ldb,info) + use prec + integer, intent(in) :: n,nrhs,lda,ldb + real(pReal), intent(inout), dimension(lda,n) :: a + integer, intent(out), dimension(n) :: ipiv + real(pReal), intent(out), dimension(ldb,nrhs) :: b + integer, intent(out) :: info + end subroutine dgesv + + subroutine dgetrf(m,n,a,lda,ipiv,info) + use prec + integer, intent(in) :: m,n,lda + real(pReal), intent(inout), dimension(lda,n) :: a + integer, intent(out), dimension(min(m,n)) :: ipiv + integer, intent(out) :: info + end subroutine dgetrf + + subroutine dgetri(n,a,lda,ipiv,work,lwork,info) + use prec + integer, intent(in) :: n,lda,lwork + real(pReal), intent(inout), dimension(lda,n) :: a + integer, intent(out), dimension(n) :: ipiv + real(pReal), intent(out), dimension(max(1,lwork)) :: work + integer, intent(out) :: info + end subroutine dgetri + + subroutine dsyev(jobz,uplo,n,a,lda,w,work,lwork,info) + use prec + character, intent(in) :: jobz,uplo + integer, intent(in) :: n,lda,lwork + real(pReal), intent(inout), dimension(lda,n) :: a + real(pReal), intent(out), dimension(n) :: w + real(pReal), intent(out), dimension(max(1,lwork)) :: work + integer, intent(out) :: info + end subroutine dsyev + + end interface + +end module LAPACK_interface diff --git a/src/commercialFEM_fileList.f90 b/src/commercialFEM_fileList.f90 index ab26ee9d5..64ad3e1d7 100644 --- a/src/commercialFEM_fileList.f90 +++ b/src/commercialFEM_fileList.f90 @@ -9,6 +9,7 @@ #include "list.f90" #include "future.f90" #include "config.f90" +#include "LAPACK_interface.f90" #include "math.f90" #include "quaternions.f90" #include "Lambert.f90" diff --git a/src/crystallite.f90 b/src/crystallite.f90 index efa066696..9bc254e0c 100644 --- a/src/crystallite.f90 +++ b/src/crystallite.f90 @@ -835,8 +835,6 @@ logical function integrateStress(ipc,ip,el,timeFraction) jacoCounterLp, & jacoCounterLi ! counters to check for Jacobian update logical :: error - external :: & - dgesv integrateStress = .false. diff --git a/src/math.f90 b/src/math.f90 index b0852e8d4..3bd3f7112 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -9,6 +9,7 @@ module math use prec use IO use numerics + use LAPACK_interface implicit none public @@ -489,9 +490,6 @@ function math_invSym3333(A) real(pReal), dimension(6,6) :: temp66 real(pReal), dimension(6*(64+2)) :: work integer :: ierr_i, ierr_f - external :: & - dgetrf, & - dgetri temp66 = math_sym3333to66(A) call dgetrf(6,6,temp66,6,ipiv6,ierr_i) @@ -518,9 +516,6 @@ subroutine math_invert(InvA, error, A) integer, dimension(size(A,1)) :: ipiv real(pReal), dimension(size(A,1)*(64+2)) :: work integer :: ierr - external :: & - dgetrf, & - dgetri invA = A call dgetrf(size(A,1),size(A,1),invA,size(A,1),ipiv,ierr) @@ -885,8 +880,6 @@ subroutine math_eigh(m,w,v,error) logical, intent(out) :: error integer :: ierr real(pReal), dimension((64+2)*size(m,1)) :: work ! block size of 64 taken from http://www.netlib.org/lapack/double/dsyev.f - external :: & - dsyev v = m ! copy matrix to input (doubles as output) array call dsyev('V','U',size(m,1),v,size(m,1),w,work,size(work,1),ierr) @@ -1042,8 +1035,6 @@ function math_eigvalsh(m) real(pReal), dimension(size(m,1),size(m,1)) :: m_ integer :: ierr real(pReal), dimension((64+2)*size(m,1)) :: work ! block size of 64 taken from http://www.netlib.org/lapack/double/dsyev.f - external :: & - dsyev m_= m ! copy matrix to input (will be destroyed) call dsyev('N','U',size(m,1),m_,size(m,1),math_eigvalsh,work,size(work,1),ierr) diff --git a/src/rotations.f90 b/src/rotations.f90 index 7ce366f74..b4e143f28 100644 --- a/src/rotations.f90 +++ b/src/rotations.f90 @@ -596,8 +596,6 @@ function om2ax(om) result(ax) real(pReal), dimension(3,3) :: VR, devNull, om_ integer :: ierr, i - external :: dgeev - om_ = om ! first get the rotation angle From 59b0a6e825e00ca6d1fe59d18586b959bf4daa8f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 10 Apr 2020 13:07:05 +0200 Subject: [PATCH 05/27] tuples not needed/avoid eval --- python/tests/test_grid_filters.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/python/tests/test_grid_filters.py b/python/tests/test_grid_filters.py index cdddca89e..acbdbf688 100644 --- a/python/tests/test_grid_filters.py +++ b/python/tests/test_grid_filters.py @@ -24,7 +24,7 @@ class TestGridFilters: n = grid_filters.node_coord0(grid,size) + size/grid*.5 assert np.allclose(c,n) - @pytest.mark.parametrize('mode',[('cell'),('node')]) + @pytest.mark.parametrize('mode',['cell','node']) def test_grid_DNA(self,mode): """Ensure that xx_coord0_gridSizeOrigin is the inverse of xx_coord0.""" grid = np.random.randint(8,32,(3)) @@ -49,7 +49,7 @@ class TestGridFilters: assert np.allclose(grid_filters.node_coord(size,F) [1:-1,1:-1,1:-1],grid_filters.cell_2_node( grid_filters.cell_coord(size,F))[1:-1,1:-1,1:-1]) - @pytest.mark.parametrize('mode',[('cell'),('node')]) + @pytest.mark.parametrize('mode',['cell','node']) def test_coord0_origin(self,mode): origin= np.random.random(3) size = np.random.random(3) # noqa @@ -61,22 +61,24 @@ class TestGridFilters: elif mode == 'node': assert np.allclose(shifted,unshifted+np.broadcast_to(origin,tuple(grid[::-1]+1)+(3,))) - @pytest.mark.parametrize('mode',[('cell'),('node')]) - def test_displacement_avg_vanishes(self,mode): + @pytest.mark.parametrize('function',[grid_filters.cell_displacement_avg, + grid_filters.node_displacement_avg]) + def test_displacement_avg_vanishes(self,function): """Ensure that random fluctuations in F do not result in average displacement.""" - size = np.random.random(3) # noqa + size = np.random.random(3) grid = np.random.randint(8,32,(3)) F = np.random.random(tuple(grid)+(3,3)) F += np.eye(3) - np.average(F,axis=(0,1,2)) - assert np.allclose(eval('grid_filters.{}_displacement_avg(size,F)'.format(mode)),0.0) + assert np.allclose(function(size,F),0.0) - @pytest.mark.parametrize('mode',[('cell'),('node')]) - def test_displacement_fluct_vanishes(self,mode): + @pytest.mark.parametrize('function',[grid_filters.cell_displacement_fluct, + grid_filters.node_displacement_fluct]) + def test_displacement_fluct_vanishes(self,function): """Ensure that constant F does not result in fluctuating displacement.""" - size = np.random.random(3) # noqa + size = np.random.random(3) grid = np.random.randint(8,32,(3)) - F = np.broadcast_to(np.random.random((3,3)), tuple(grid)+(3,3)) # noqa - assert np.allclose(eval('grid_filters.{}_displacement_fluct(size,F)'.format(mode)),0.0) + F = np.broadcast_to(np.random.random((3,3)), tuple(grid)+(3,3)) + assert np.allclose(function(size,F),0.0) def test_regrid(self): size = np.random.random(3) From c7508d85f604d0de461b532069d5820b6fc46048 Mon Sep 17 00:00:00 2001 From: Franz Roters Date: Fri, 10 Apr 2020 15:48:08 +0200 Subject: [PATCH 06/27] now with python documentation --- PRIVATE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PRIVATE b/PRIVATE index 62bd5ede5..aa0b9fe99 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 62bd5ede5260cd4e0e3d1c3930c474c1e045aeef +Subproject commit aa0b9fe992ce0bfc172989ab006893ddb8939c1e From c929581029a666f719e12cb6643e54da9b31e765 Mon Sep 17 00:00:00 2001 From: Test User Date: Fri, 10 Apr 2020 18:20:40 +0200 Subject: [PATCH 07/27] [skip ci] updated version information after successful test of v2.0.3-2245-gc7508d85 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2d8aa9597..804287b93 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-2243-gbb03483b +v2.0.3-2245-gc7508d85 From a6d1e02b3248dd259036275967fd8c1237525e68 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Fri, 10 Apr 2020 23:54:38 +0200 Subject: [PATCH 08/27] LAPACK calls the unblocked versions for our small matrices so a work that holds exactly the data seems to be the best choice --- src/math.f90 | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/math.f90 b/src/math.f90 index 3bd3f7112..070751de8 100644 --- a/src/math.f90 +++ b/src/math.f90 @@ -486,15 +486,14 @@ function math_invSym3333(A) real(pReal),dimension(3,3,3,3),intent(in) :: A - integer, dimension(6) :: ipiv6 - real(pReal), dimension(6,6) :: temp66 - real(pReal), dimension(6*(64+2)) :: work - integer :: ierr_i, ierr_f + integer, dimension(6) :: ipiv6 + real(pReal), dimension(6,6) :: temp66 + real(pReal), dimension(6*6) :: work + integer :: ierr_i, ierr_f temp66 = math_sym3333to66(A) call dgetrf(6,6,temp66,6,ipiv6,ierr_i) call dgetri(6,temp66,6,ipiv6,work,size(work,1),ierr_f) - if (ierr_i /= 0 .or. ierr_f /= 0) then call IO_error(400, ext_msg = 'math_invSym3333') else @@ -513,9 +512,9 @@ subroutine math_invert(InvA, error, A) real(pReal), dimension(size(A,1),size(A,1)), intent(out) :: invA logical, intent(out) :: error - integer, dimension(size(A,1)) :: ipiv - real(pReal), dimension(size(A,1)*(64+2)) :: work - integer :: ierr + integer, dimension(size(A,1)) :: ipiv + real(pReal), dimension(size(A,1)**2) :: work + integer :: ierr invA = A call dgetrf(size(A,1),size(A,1),invA,size(A,1),ipiv,ierr) @@ -879,7 +878,7 @@ subroutine math_eigh(m,w,v,error) logical, intent(out) :: error integer :: ierr - real(pReal), dimension((64+2)*size(m,1)) :: work ! block size of 64 taken from http://www.netlib.org/lapack/double/dsyev.f + real(pReal), dimension(size(m,1)**2) :: work v = m ! copy matrix to input (doubles as output) array call dsyev('V','U',size(m,1),v,size(m,1),w,work,size(work,1),ierr) @@ -1034,7 +1033,7 @@ function math_eigvalsh(m) real(pReal), dimension(size(m,1),size(m,1)) :: m_ integer :: ierr - real(pReal), dimension((64+2)*size(m,1)) :: work ! block size of 64 taken from http://www.netlib.org/lapack/double/dsyev.f + real(pReal), dimension(size(m,1)**2) :: work m_= m ! copy matrix to input (will be destroyed) call dsyev('N','U',size(m,1),m_,size(m,1),math_eigvalsh,work,size(work,1),ierr) From 99ec48aba4712a0e1996bf8d91b0250364ab7496 Mon Sep 17 00:00:00 2001 From: Test User Date: Sun, 12 Apr 2020 19:42:46 +0200 Subject: [PATCH 09/27] [skip ci] updated version information after successful test of v2.0.3-2255-gc74ffae8 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 804287b93..0e875200a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-2245-gc7508d85 +v2.0.3-2255-gc74ffae8 From 95e41e0b3f7961c1570124237baee585b989a15a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 07:22:30 +0200 Subject: [PATCH 10/27] not needed (just linear interpolation) --- src/homogenization.f90 | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 50331cbdd..cef3c2c5b 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -161,7 +161,6 @@ subroutine homogenization_init allocate(materialpoint_dPdF(3,3,3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) materialpoint_F0 = spread(spread(math_I3,3,discretization_nIP),4,discretization_nElem) ! initialize to identity materialpoint_F = materialpoint_F0 ! initialize to identity - allocate(materialpoint_subF0(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_subF(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_P(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_subFrac(discretization_nIP,discretization_nElem), source=0.0_pReal) @@ -238,8 +237,6 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) enddo - - materialpoint_subF0(1:3,1:3,i,e) = materialpoint_F0(1:3,1:3,i,e) materialpoint_subFrac(i,e) = 0.0_pReal materialpoint_subStep(i,e) = 1.0_pReal/num%subStepSizeHomog ! <> materialpoint_converged(i,e) = .false. ! pretend failed step of twice the required size @@ -326,8 +323,6 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) damageState(material_homogenizationAt(e))%subState0(:,material_homogenizationMemberAt(i,e)) = & damageState(material_homogenizationAt(e))%State (:,material_homogenizationMemberAt(i,e)) - materialpoint_subF0(1:3,1:3,i,e) = materialpoint_subF(1:3,1:3,i,e) - endif steppingNeeded else converged @@ -390,9 +385,9 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if (materialpoint_subStep(i,e) > num%subStepMinHomog) then materialpoint_requested(i,e) = .true. - materialpoint_subF(1:3,1:3,i,e) = materialpoint_subF0(1:3,1:3,i,e) & - + materialpoint_subStep(i,e) * (materialpoint_F(1:3,1:3,i,e) & - - materialpoint_F0(1:3,1:3,i,e)) + materialpoint_subF(1:3,1:3,i,e) = materialpoint_F0(1:3,1:3,i,e) & + + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & + * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) materialpoint_subdt(i,e) = materialpoint_subStep(i,e) * dt materialpoint_doneAndHappy(1:2,i,e) = [.false.,.true.] endif From d616c1dda8764af5a333b426ab84a3161c424b65 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 07:45:39 +0200 Subject: [PATCH 11/27] better use explicit arguments --- src/homogenization.f90 | 46 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index cef3c2c5b..157b688f5 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -414,7 +414,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) IpLooping2: do i = FEsolving_execIP(1),FEsolving_execIP(2) if ( materialpoint_requested(i,e) .and. & ! process requested but... .not. materialpoint_doneAndHappy(1,i,e)) then ! ...not yet done material points - call partitionDeformation(i,e) ! partition deformation onto constituents + call partitionDeformation(materialpoint_subF(1:3,1:3,i,e),i,e) ! partition deformation onto constituents crystallite_dt(1:myNgrains,i,e) = materialpoint_subdt(i,e) ! propagate materialpoint dt to grains crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents else @@ -441,7 +441,9 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if (.not. materialpoint_converged(i,e)) then materialpoint_doneAndHappy(1:2,i,e) = [.true.,.false.] else - materialpoint_doneAndHappy(1:2,i,e) = updateState(i,e) + materialpoint_doneAndHappy(1:2,i,e) = updateState(materialpoint_subdt(i,e), & + materialpoint_subF(1:3,1:3,i,e), & + i,e) materialpoint_converged(i,e) = all(materialpoint_doneAndHappy(1:2,i,e)) ! converged if done and happy endif endif @@ -476,26 +478,28 @@ end subroutine materialpoint_stressAndItsTangent !-------------------------------------------------------------------------------------------------- !> @brief partition material point def grad onto constituents !-------------------------------------------------------------------------------------------------- -subroutine partitionDeformation(ip,el) +subroutine partitionDeformation(subF,ip,el) - integer, intent(in) :: & + real(pReal), intent(in), dimension(3,3) :: & + subF + integer, intent(in) :: & ip, & !< integration point el !< element number chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) case (HOMOGENIZATION_NONE_ID) chosenHomogenization - crystallite_partionedF(1:3,1:3,1,ip,el) = materialpoint_subF(1:3,1:3,ip,el) + crystallite_partionedF(1:3,1:3,1,ip,el) = subF case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization call mech_isostrain_partitionDeformation(& crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - materialpoint_subF(1:3,1:3,ip,el)) + subF) case (HOMOGENIZATION_RGC_ID) chosenHomogenization call mech_RGC_partitionDeformation(& crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - materialpoint_subF(1:3,1:3,ip,el),& + subF,& ip, & el) end select chosenHomogenization @@ -507,9 +511,13 @@ end subroutine partitionDeformation !> @brief update the internal state of the homogenization scheme and tell whether "done" and !> "happy" with result !-------------------------------------------------------------------------------------------------- -function updateState(ip,el) +function updateState(subdt,subF,ip,el) - integer, intent(in) :: & + real(pReal), intent(in) :: & + subdt !< current time step + real(pReal), intent(in), dimension(3,3) :: & + subF + integer, intent(in) :: & ip, & !< integration point el !< element number logical, dimension(2) :: updateState @@ -519,21 +527,21 @@ function updateState(ip,el) case (HOMOGENIZATION_RGC_ID) chosenHomogenization updateState = & updateState .and. & - mech_RGC_updateState(crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - crystallite_partionedF0(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el),& - materialpoint_subF(1:3,1:3,ip,el),& - materialpoint_subdt(ip,el), & - crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - ip, & - el) + mech_RGC_updateState(crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + crystallite_partionedF0(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el),& + subF,& + subdt, & + crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + ip, & + el) end select chosenHomogenization chosenThermal: select case (thermal_type(material_homogenizationAt(el))) case (THERMAL_adiabatic_ID) chosenThermal updateState = & updateState .and. & - thermal_adiabatic_updateState(materialpoint_subdt(ip,el), & + thermal_adiabatic_updateState(subdt, & ip, & el) end select chosenThermal @@ -542,7 +550,7 @@ function updateState(ip,el) case (DAMAGE_local_ID) chosenDamage updateState = & updateState .and. & - damage_local_updateState(materialpoint_subdt(ip,el), & + damage_local_updateState(subdt, & ip, & el) end select chosenDamage From 08948867441d9dd212da62ee71e10f2353d697ef Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 07:57:25 +0200 Subject: [PATCH 12/27] can be calculated when needed --- src/homogenization.f90 | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 157b688f5..d6112fe8d 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -43,8 +43,7 @@ module homogenization materialpoint_subF !< def grad of IP to be reached at end of homog inc real(pReal), dimension(:,:), allocatable :: & materialpoint_subFrac, & - materialpoint_subStep, & - materialpoint_subdt + materialpoint_subStep logical, dimension(:,:), allocatable :: & materialpoint_requested, & materialpoint_converged @@ -165,7 +164,6 @@ subroutine homogenization_init allocate(materialpoint_P(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_subFrac(discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_subStep(discretization_nIP,discretization_nElem), source=0.0_pReal) - allocate(materialpoint_subdt(discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_requested(discretization_nIP,discretization_nElem), source=.false.) allocate(materialpoint_converged(discretization_nIP,discretization_nElem), source=.true.) allocate(materialpoint_doneAndHappy(2,discretization_nIP,discretization_nElem), source=.true.) @@ -388,7 +386,6 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) materialpoint_subF(1:3,1:3,i,e) = materialpoint_F0(1:3,1:3,i,e) & + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) - materialpoint_subdt(i,e) = materialpoint_subStep(i,e) * dt materialpoint_doneAndHappy(1:2,i,e) = [.false.,.true.] endif enddo IpLooping1 @@ -415,7 +412,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if ( materialpoint_requested(i,e) .and. & ! process requested but... .not. materialpoint_doneAndHappy(1,i,e)) then ! ...not yet done material points call partitionDeformation(materialpoint_subF(1:3,1:3,i,e),i,e) ! partition deformation onto constituents - crystallite_dt(1:myNgrains,i,e) = materialpoint_subdt(i,e) ! propagate materialpoint dt to grains + crystallite_dt(1:myNgrains,i,e) = dt*materialpoint_subStep(i,e) ! propagate materialpoint dt to grains crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents else crystallite_requested(1:myNgrains,i,e) = .false. ! calculation for constituents not required anymore @@ -441,7 +438,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if (.not. materialpoint_converged(i,e)) then materialpoint_doneAndHappy(1:2,i,e) = [.true.,.false.] else - materialpoint_doneAndHappy(1:2,i,e) = updateState(materialpoint_subdt(i,e), & + materialpoint_doneAndHappy(1:2,i,e) = updateState(dt*materialpoint_subStep(i,e), & materialpoint_subF(1:3,1:3,i,e), & i,e) materialpoint_converged(i,e) = all(materialpoint_doneAndHappy(1:2,i,e)) ! converged if done and happy From 0de4520580f87f68328c38f3ca1c3a574ca07984 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 08:24:28 +0200 Subject: [PATCH 13/27] directly calculate subF --- src/homogenization.f90 | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index d6112fe8d..543388f1c 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -38,9 +38,6 @@ module homogenization real(pReal), dimension(:,:,:,:,:,:), allocatable, public :: & materialpoint_dPdF !< tangent of first P--K stress at IP - real(pReal), dimension(:,:,:,:), allocatable :: & - materialpoint_subF0, & !< def grad of IP at beginning of homogenization increment - materialpoint_subF !< def grad of IP to be reached at end of homog inc real(pReal), dimension(:,:), allocatable :: & materialpoint_subFrac, & materialpoint_subStep @@ -160,7 +157,6 @@ subroutine homogenization_init allocate(materialpoint_dPdF(3,3,3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) materialpoint_F0 = spread(spread(math_I3,3,discretization_nIP),4,discretization_nElem) ! initialize to identity materialpoint_F = materialpoint_F0 ! initialize to identity - allocate(materialpoint_subF(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_P(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_subFrac(discretization_nIP,discretization_nElem), source=0.0_pReal) allocate(materialpoint_subStep(discretization_nIP,discretization_nElem), source=0.0_pReal) @@ -200,6 +196,8 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) e, & !< element number mySource, & myNgrains + real(pReal), dimension(3,3) :: & + subF #ifdef DEBUG if (iand(debug_level(debug_homogenization), debug_levelBasic) /= 0) then @@ -383,9 +381,6 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if (materialpoint_subStep(i,e) > num%subStepMinHomog) then materialpoint_requested(i,e) = .true. - materialpoint_subF(1:3,1:3,i,e) = materialpoint_F0(1:3,1:3,i,e) & - + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & - * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) materialpoint_doneAndHappy(1:2,i,e) = [.false.,.true.] endif enddo IpLooping1 @@ -405,13 +400,16 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) ! deformation partitioning ! based on materialpoint_subF0,.._subF,crystallite_partionedF0, and homogenization_state, ! results in crystallite_partionedF - !$OMP PARALLEL DO PRIVATE(myNgrains) + !$OMP PARALLEL DO PRIVATE(myNgrains,subF) elementLooping2: do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) IpLooping2: do i = FEsolving_execIP(1),FEsolving_execIP(2) if ( materialpoint_requested(i,e) .and. & ! process requested but... .not. materialpoint_doneAndHappy(1,i,e)) then ! ...not yet done material points - call partitionDeformation(materialpoint_subF(1:3,1:3,i,e),i,e) ! partition deformation onto constituents + subF = materialpoint_F0(1:3,1:3,i,e) & + + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & + * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) + call partitionDeformation(subF,i,e) ! partition deformation onto constituents crystallite_dt(1:myNgrains,i,e) = dt*materialpoint_subStep(i,e) ! propagate materialpoint dt to grains crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents else @@ -430,7 +428,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) !-------------------------------------------------------------------------------------------------- ! state update - !$OMP PARALLEL DO + !$OMP PARALLEL DO PRIVATE(subF) elementLooping3: do e = FEsolving_execElem(1),FEsolving_execElem(2) IpLooping3: do i = FEsolving_execIP(1),FEsolving_execIP(2) if ( materialpoint_requested(i,e) .and. & @@ -438,8 +436,11 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if (.not. materialpoint_converged(i,e)) then materialpoint_doneAndHappy(1:2,i,e) = [.true.,.false.] else + subF = materialpoint_F0(1:3,1:3,i,e) & + + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & + * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) materialpoint_doneAndHappy(1:2,i,e) = updateState(dt*materialpoint_subStep(i,e), & - materialpoint_subF(1:3,1:3,i,e), & + subF, & i,e) materialpoint_converged(i,e) = all(materialpoint_doneAndHappy(1:2,i,e)) ! converged if done and happy endif From 912c064b575d9166f6e649e05c7ad9bebd86c521 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 09:38:32 +0200 Subject: [PATCH 14/27] indicate read-only public variables --- src/homogenization.f90 | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 543388f1c..795bcce35 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -27,15 +27,17 @@ module homogenization implicit none private -!-------------------------------------------------------------------------------------------------- -! General variables for the homogenization at a material point logical, public :: & terminallyIll = .false. !< at least one material point is terminally ill - real(pReal), dimension(:,:,:,:), allocatable, public :: & + +!-------------------------------------------------------------------------------------------------- +! General variables for the homogenization at a material point + real(pReal), dimension(:,:,:,:), allocatable, public :: & materialpoint_F0, & !< def grad of IP at start of FE increment - materialpoint_F, & !< def grad of IP to be reached at end of FE increment + materialpoint_F !< def grad of IP to be reached at end of FE increment + real(pReal), dimension(:,:,:,:), allocatable, public, protected :: & materialpoint_P !< first P--K stress of IP - real(pReal), dimension(:,:,:,:,:,:), allocatable, public :: & + real(pReal), dimension(:,:,:,:,:,:), allocatable, public, protected :: & materialpoint_dPdF !< tangent of first P--K stress at IP real(pReal), dimension(:,:), allocatable :: & @@ -49,7 +51,7 @@ module homogenization type :: tNumerics integer :: & - nMPstate !< materialpoint state loop limit + nMPstate !< materialpoint state loop limit real(pReal) :: & subStepMinHomog, & !< minimum (relative) size of sub-step allowed during cutback in homogenization subStepSizeHomog, & !< size of first substep when cutback in homogenization From 9d831cf268c464b2ba0e45168be189db0f332dc1 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 09:43:18 +0200 Subject: [PATCH 15/27] not needed as module variable --- src/homogenization.f90 | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 795bcce35..7c532834e 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -40,15 +40,6 @@ module homogenization real(pReal), dimension(:,:,:,:,:,:), allocatable, public, protected :: & materialpoint_dPdF !< tangent of first P--K stress at IP - real(pReal), dimension(:,:), allocatable :: & - materialpoint_subFrac, & - materialpoint_subStep - logical, dimension(:,:), allocatable :: & - materialpoint_requested, & - materialpoint_converged - logical, dimension(:,:,:), allocatable :: & - materialpoint_doneAndHappy - type :: tNumerics integer :: & nMPstate !< materialpoint state loop limit @@ -160,11 +151,6 @@ subroutine homogenization_init materialpoint_F0 = spread(spread(math_I3,3,discretization_nIP),4,discretization_nElem) ! initialize to identity materialpoint_F = materialpoint_F0 ! initialize to identity allocate(materialpoint_P(3,3,discretization_nIP,discretization_nElem), source=0.0_pReal) - allocate(materialpoint_subFrac(discretization_nIP,discretization_nElem), source=0.0_pReal) - allocate(materialpoint_subStep(discretization_nIP,discretization_nElem), source=0.0_pReal) - allocate(materialpoint_requested(discretization_nIP,discretization_nElem), source=.false.) - allocate(materialpoint_converged(discretization_nIP,discretization_nElem), source=.true.) - allocate(materialpoint_doneAndHappy(2,discretization_nIP,discretization_nElem), source=.true.) write(6,'(/,a)') ' <<<+- homogenization init -+>>>'; flush(6) @@ -200,6 +186,14 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) myNgrains real(pReal), dimension(3,3) :: & subF + real(pReal), dimension(discretization_nIP,discretization_nElem) :: & + materialpoint_subFrac, & + materialpoint_subStep + logical, dimension(discretization_nIP,discretization_nElem) :: & + materialpoint_requested, & + materialpoint_converged + logical, dimension(2,discretization_nIP,discretization_nElem) :: & + materialpoint_doneAndHappy #ifdef DEBUG if (iand(debug_level(debug_homogenization), debug_levelBasic) /= 0) then From bf970bb146c4045432b78f5506858f8f0e216a28 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 09:49:03 +0200 Subject: [PATCH 16/27] 2 space indentation --- src/homogenization.f90 | 158 ++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 7c532834e..eab1e86c1 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -474,29 +474,29 @@ end subroutine materialpoint_stressAndItsTangent !-------------------------------------------------------------------------------------------------- subroutine partitionDeformation(subF,ip,el) - real(pReal), intent(in), dimension(3,3) :: & - subF - integer, intent(in) :: & - ip, & !< integration point - el !< element number + real(pReal), intent(in), dimension(3,3) :: & + subF + integer, intent(in) :: & + ip, & !< integration point + el !< element number - chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) + chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) - case (HOMOGENIZATION_NONE_ID) chosenHomogenization - crystallite_partionedF(1:3,1:3,1,ip,el) = subF + case (HOMOGENIZATION_NONE_ID) chosenHomogenization + crystallite_partionedF(1:3,1:3,1,ip,el) = subF - case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization - call mech_isostrain_partitionDeformation(& + case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization + call mech_isostrain_partitionDeformation(& + crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + subF) + + case (HOMOGENIZATION_RGC_ID) chosenHomogenization + call mech_RGC_partitionDeformation(& crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - subF) - - case (HOMOGENIZATION_RGC_ID) chosenHomogenization - call mech_RGC_partitionDeformation(& - crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - subF,& - ip, & - el) - end select chosenHomogenization + subF,& + ip, & + el) + end select chosenHomogenization end subroutine partitionDeformation @@ -507,47 +507,47 @@ end subroutine partitionDeformation !-------------------------------------------------------------------------------------------------- function updateState(subdt,subF,ip,el) - real(pReal), intent(in) :: & - subdt !< current time step - real(pReal), intent(in), dimension(3,3) :: & - subF - integer, intent(in) :: & - ip, & !< integration point - el !< element number - logical, dimension(2) :: updateState + real(pReal), intent(in) :: & + subdt !< current time step + real(pReal), intent(in), dimension(3,3) :: & + subF + integer, intent(in) :: & + ip, & !< integration point + el !< element number + logical, dimension(2) :: updateState - updateState = .true. - chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) - case (HOMOGENIZATION_RGC_ID) chosenHomogenization - updateState = & - updateState .and. & - mech_RGC_updateState(crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - crystallite_partionedF0(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el),& - subF,& - subdt, & - crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - ip, & - el) - end select chosenHomogenization + updateState = .true. + chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) + case (HOMOGENIZATION_RGC_ID) chosenHomogenization + updateState = & + updateState .and. & + mech_RGC_updateState(crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + crystallite_partionedF(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + crystallite_partionedF0(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el),& + subF,& + subdt, & + crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + ip, & + el) + end select chosenHomogenization - chosenThermal: select case (thermal_type(material_homogenizationAt(el))) - case (THERMAL_adiabatic_ID) chosenThermal - updateState = & - updateState .and. & - thermal_adiabatic_updateState(subdt, & - ip, & - el) - end select chosenThermal + chosenThermal: select case (thermal_type(material_homogenizationAt(el))) + case (THERMAL_adiabatic_ID) chosenThermal + updateState = & + updateState .and. & + thermal_adiabatic_updateState(subdt, & + ip, & + el) + end select chosenThermal - chosenDamage: select case (damage_type(material_homogenizationAt(el))) - case (DAMAGE_local_ID) chosenDamage - updateState = & - updateState .and. & - damage_local_updateState(subdt, & - ip, & - el) - end select chosenDamage + chosenDamage: select case (damage_type(material_homogenizationAt(el))) + case (DAMAGE_local_ID) chosenDamage + updateState = & + updateState .and. & + damage_local_updateState(subdt, & + ip, & + el) + end select chosenDamage end function updateState @@ -557,31 +557,31 @@ end function updateState !-------------------------------------------------------------------------------------------------- subroutine averageStressAndItsTangent(ip,el) - integer, intent(in) :: & - ip, & !< integration point - el !< element number + integer, intent(in) :: & + ip, & !< integration point + el !< element number - chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) - case (HOMOGENIZATION_NONE_ID) chosenHomogenization - materialpoint_P(1:3,1:3,ip,el) = crystallite_P(1:3,1:3,1,ip,el) - materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el) = crystallite_dPdF(1:3,1:3,1:3,1:3,1,ip,el) + chosenHomogenization: select case(homogenization_type(material_homogenizationAt(el))) + case (HOMOGENIZATION_NONE_ID) chosenHomogenization + materialpoint_P(1:3,1:3,ip,el) = crystallite_P(1:3,1:3,1,ip,el) + materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el) = crystallite_dPdF(1:3,1:3,1:3,1:3,1,ip,el) - case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization - call mech_isostrain_averageStressAndItsTangent(& - materialpoint_P(1:3,1:3,ip,el), & - materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),& - crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - homogenization_typeInstance(material_homogenizationAt(el))) + case (HOMOGENIZATION_ISOSTRAIN_ID) chosenHomogenization + call mech_isostrain_averageStressAndItsTangent(& + materialpoint_P(1:3,1:3,ip,el), & + materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),& + crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + homogenization_typeInstance(material_homogenizationAt(el))) - case (HOMOGENIZATION_RGC_ID) chosenHomogenization - call mech_RGC_averageStressAndItsTangent(& - materialpoint_P(1:3,1:3,ip,el), & - materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),& - crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & - homogenization_typeInstance(material_homogenizationAt(el))) - end select chosenHomogenization + case (HOMOGENIZATION_RGC_ID) chosenHomogenization + call mech_RGC_averageStressAndItsTangent(& + materialpoint_P(1:3,1:3,ip,el), & + materialpoint_dPdF(1:3,1:3,1:3,1:3,ip,el),& + crystallite_P(1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + crystallite_dPdF(1:3,1:3,1:3,1:3,1:homogenization_Ngrains(material_homogenizationAt(el)),ip,el), & + homogenization_typeInstance(material_homogenizationAt(el))) + end select chosenHomogenization end subroutine averageStressAndItsTangent From 69857176b2311513da4f4fcd824923ca4f097274 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 11:13:07 +0200 Subject: [PATCH 17/27] search and replace error --- python/damask/grid_filters.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/damask/grid_filters.py b/python/damask/grid_filters.py index 8106ed905..5134fd15e 100644 --- a/python/damask/grid_filters.py +++ b/python/damask/grid_filters.py @@ -41,8 +41,8 @@ def curl(size,field): e[0, 2, 1] = e[2, 1, 0] = e[1, 0, 2] = -1.0 field_fourier = _np.fft.rfftn(field,axes=(0,1,2)) - curl_ = (_np.einsum('slm,ijkl,ijkm ->ijks', e,k_s,field_fourier)*2.0j*_np.pi if n == 3 else # vector, 3 -> 3 - _np.einsum('slm,ijkl,ijknm->ijksn',e,k_s,field_fourier)*2.0j*_np.pi) # tensor, 3x3 -> 3x3 + curl_ = (_np.einsum('slm,ijkl,ijkm ->ijks', e,k_s,field_fourier)*2.0j*_np.pi if n == 3 else # vector, 3 -> 3 + _np.einsum('slm,ijkl,ijknm->ijksn',e,k_s,field_fourier)*2.0j*_np.pi) # tensor, 3x3 -> 3x3 return _np.fft.irfftn(curl_,axes=(0,1,2),s=field.shape[:3]) @@ -61,8 +61,8 @@ def divergence(size,field): k_s = _ks(size,field.shape[:3],True) field_fourier = _np.fft.rfftn(field,axes=(0,1,2)) - div_ = (_np.einsum('ijkl,ijkl ->ijk', k_s,field_fourier)*2.0j*_np.pi if n == 3 else # vector, 3 -> 1 - _np.einsum('ijkm,ijklm->ijkl',k_s,field_fourier)*2.0j*_np.pi) # tensor, 3x3 -> 3 + div_ = (_np.einsum('ijkl,ijkl ->ijk', k_s,field_fourier)*2.0j*_np.pi if n == 3 else # vector, 3 -> 1 + _np.einsum('ijkm,ijklm->ijkl',k_s,field_fourier)*2.0j*_np.pi) # tensor, 3x3 -> 3 return _np.fft.irfftn(div_,axes=(0,1,2),s=field.shape[:3]) @@ -81,8 +81,8 @@ def gradient(size,field): k_s = _ks(size,field.shape[:3],True) field_fourier = _np.fft.rfftn(field,axes=(0,1,2)) - grad_ = (_np.einsum('ijkl,ijkm->ijkm', field_fourier,k_s)*2.0j*_np.pi if n == 1 else # scalar, 1 -> 3 - _np.einsum('ijkl,ijkm->ijklm',field_fourier,k_s)*2.0j*_np.pi) # vector, 3 -> 3x3 + grad_ = (_np.einsum('ijkl,ijkm->ijkm', field_fourier,k_s)*2.0j*_np.pi if n == 1 else # scalar, 1 -> 3 + _np.einsum('ijkl,ijkm->ijklm',field_fourier,k_s)*2.0j*_np.pi) # vector, 3 -> 3x3 return _np.fft.irfftn(grad_,axes=(0,1,2),s=field.shape[:3]) @@ -217,7 +217,7 @@ def cell_coord0_gridSizeOrigin(coord0,ordered=True): raise ValueError('Regular grid spacing violated.') if ordered and not _np.allclose(coord0.reshape(tuple(grid[::-1])+(3,)),cell_coord0(grid,size,origin)): - raise ValueError('I_nput data is not a regular grid.') + raise ValueError('Input data is not a regular grid.') return (grid,size,origin) @@ -363,7 +363,7 @@ def node_coord0_gridSizeOrigin(coord0,ordered=False): raise ValueError('Regular grid spacing violated.') if ordered and not _np.allclose(coord0.reshape(tuple((grid+1)[::-1])+(3,)),node_coord0(grid,size,origin)): - raise ValueError('I_nput data is not a regular grid.') + raise ValueError('Input data is not a regular grid.') return (grid,size,origin) From c7e62777585cd33eb871a3c2473e766062c0a497 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 14 Apr 2020 15:34:38 +0200 Subject: [PATCH 18/27] not needed https://stackoverflow.com/questions/19687233 --- src/homogenization.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index eab1e86c1..40a6e7280 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -321,7 +321,6 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) if ( (myNgrains == 1 .and. materialpoint_subStep(i,e) <= 1.0 ) .or. & ! single grain already tried internal subStepping in crystallite num%subStepSizeHomog * materialpoint_subStep(i,e) <= num%subStepMinHomog ) then ! would require too small subStep ! cutback makes no sense - !$OMP FLUSH(terminallyIll) if (.not. terminallyIll) then ! so first signals terminally ill... !$OMP CRITICAL (write2out) write(6,*) 'Integration point ', i,' at element ', e, ' terminally ill' From d3eba4151966f3132aacc9f30f3c58e1b40282db Mon Sep 17 00:00:00 2001 From: Philip Eisenlohr Date: Tue, 14 Apr 2020 12:21:35 -0400 Subject: [PATCH 19/27] [skip ci] fixed bug of double execution of np.degrees in asAxisAngle --- python/damask/_rotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/damask/_rotation.py b/python/damask/_rotation.py index bea7aa5e6..ff4025ddc 100644 --- a/python/damask/_rotation.py +++ b/python/damask/_rotation.py @@ -206,7 +206,7 @@ class Rotation: """ ax = Rotation.qu2ax(self.quaternion) if degrees: ax[3] = np.degrees(ax[3]) - return (ax[:3],np.degrees(ax[3])) if pair else ax + return (ax[:3],ax[3]) if pair else ax def asMatrix(self): """Rotation matrix.""" From ca26dbe3819e84ad1bdb84238d2ea0e776ea7c9f Mon Sep 17 00:00:00 2001 From: Test User Date: Wed, 15 Apr 2020 03:38:45 +0200 Subject: [PATCH 20/27] [skip ci] updated version information after successful test of v2.0.3-2291-g03aa6f9c --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0e875200a..458484abe 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-2255-gc74ffae8 +v2.0.3-2291-g03aa6f9c From ae95a96c88804d6f304f32d0fa8ca24d4966ab1e Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 15 Apr 2020 08:53:25 +0200 Subject: [PATCH 21/27] better readable --- src/homogenization.f90 | 54 +++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 40a6e7280..2d3807d18 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -207,7 +207,7 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) #endif !-------------------------------------------------------------------------------------------------- -! initialize restoration points of ... +! initialize restoration points do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) do i = FEsolving_execIP(1),FEsolving_execIP(2); @@ -230,21 +230,21 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) enddo materialpoint_subFrac(i,e) = 0.0_pReal - materialpoint_subStep(i,e) = 1.0_pReal/num%subStepSizeHomog ! <> - materialpoint_converged(i,e) = .false. ! pretend failed step of twice the required size + materialpoint_converged(i,e) = .false. ! pretend failed step ... + materialpoint_subStep(i,e) = 1.0_pReal/num%subStepSizeHomog ! ... larger then the requested calculation materialpoint_requested(i,e) = .true. ! everybody requires calculation if (homogState(material_homogenizationAt(e))%sizeState > 0) & homogState(material_homogenizationAt(e))%subState0(:,material_homogenizationMemberAt(i,e)) = & - homogState(material_homogenizationAt(e))%State0( :,material_homogenizationMemberAt(i,e)) ! ...internal homogenization state + homogState(material_homogenizationAt(e))%State0( :,material_homogenizationMemberAt(i,e)) if (thermalState(material_homogenizationAt(e))%sizeState > 0) & thermalState(material_homogenizationAt(e))%subState0(:,material_homogenizationMemberAt(i,e)) = & - thermalState(material_homogenizationAt(e))%State0( :,material_homogenizationMemberAt(i,e)) ! ...internal thermal state + thermalState(material_homogenizationAt(e))%State0( :,material_homogenizationMemberAt(i,e)) if (damageState(material_homogenizationAt(e))%sizeState > 0) & damageState(material_homogenizationAt(e))%subState0(:,material_homogenizationMemberAt(i,e)) = & - damageState(material_homogenizationAt(e))%State0( :,material_homogenizationMemberAt(i,e)) ! ...internal damage state + damageState(material_homogenizationAt(e))%State0( :,material_homogenizationMemberAt(i,e)) enddo enddo @@ -277,24 +277,13 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) steppingNeeded: if (materialpoint_subStep(i,e) > num%subStepMinHomog) then - ! wind forward grain starting point of... - crystallite_partionedF0 (1:3,1:3,1:myNgrains,i,e) = & - crystallite_partionedF(1:3,1:3,1:myNgrains,i,e) - - crystallite_partionedFp0 (1:3,1:3,1:myNgrains,i,e) = & - crystallite_Fp (1:3,1:3,1:myNgrains,i,e) - - crystallite_partionedLp0 (1:3,1:3,1:myNgrains,i,e) = & - crystallite_Lp (1:3,1:3,1:myNgrains,i,e) - - crystallite_partionedFi0 (1:3,1:3,1:myNgrains,i,e) = & - crystallite_Fi (1:3,1:3,1:myNgrains,i,e) - - crystallite_partionedLi0 (1:3,1:3,1:myNgrains,i,e) = & - crystallite_Li (1:3,1:3,1:myNgrains,i,e) - - crystallite_partionedS0 (1:3,1:3,1:myNgrains,i,e) = & - crystallite_S (1:3,1:3,1:myNgrains,i,e) + ! wind forward grain starting point + crystallite_partionedF0 (1:3,1:3,1:myNgrains,i,e) = crystallite_partionedF(1:3,1:3,1:myNgrains,i,e) + crystallite_partionedFp0(1:3,1:3,1:myNgrains,i,e) = crystallite_Fp (1:3,1:3,1:myNgrains,i,e) + crystallite_partionedLp0(1:3,1:3,1:myNgrains,i,e) = crystallite_Lp (1:3,1:3,1:myNgrains,i,e) + crystallite_partionedFi0(1:3,1:3,1:myNgrains,i,e) = crystallite_Fi (1:3,1:3,1:myNgrains,i,e) + crystallite_partionedLi0(1:3,1:3,1:myNgrains,i,e) = crystallite_Li (1:3,1:3,1:myNgrains,i,e) + crystallite_partionedS0 (1:3,1:3,1:myNgrains,i,e) = crystallite_S (1:3,1:3,1:myNgrains,i,e) do g = 1,myNgrains plasticState (material_phaseAt(g,e))%partionedState0(:,material_phasememberAt(g,i,e)) = & @@ -341,19 +330,14 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) #endif !-------------------------------------------------------------------------------------------------- -! restore... +! restore if (materialpoint_subStep(i,e) < 1.0_pReal) then ! protect against fake cutback from \Delta t = 2 to 1. Maybe that "trick" is not necessary anymore at all? I.e. start with \Delta t = 1 - crystallite_Lp(1:3,1:3,1:myNgrains,i,e) = & - crystallite_partionedLp0(1:3,1:3,1:myNgrains,i,e) - crystallite_Li(1:3,1:3,1:myNgrains,i,e) = & - crystallite_partionedLi0(1:3,1:3,1:myNgrains,i,e) + crystallite_Lp(1:3,1:3,1:myNgrains,i,e) = crystallite_partionedLp0(1:3,1:3,1:myNgrains,i,e) + crystallite_Li(1:3,1:3,1:myNgrains,i,e) = crystallite_partionedLi0(1:3,1:3,1:myNgrains,i,e) endif ! maybe protecting everything from overwriting (not only L) makes even more sense - crystallite_Fp(1:3,1:3,1:myNgrains,i,e) = & - crystallite_partionedFp0(1:3,1:3,1:myNgrains,i,e) - crystallite_Fi(1:3,1:3,1:myNgrains,i,e) = & - crystallite_partionedFi0(1:3,1:3,1:myNgrains,i,e) - crystallite_S(1:3,1:3,1:myNgrains,i,e) = & - crystallite_partionedS0(1:3,1:3,1:myNgrains,i,e) + crystallite_Fp(1:3,1:3,1:myNgrains,i,e) = crystallite_partionedFp0(1:3,1:3,1:myNgrains,i,e) + crystallite_Fi(1:3,1:3,1:myNgrains,i,e) = crystallite_partionedFi0(1:3,1:3,1:myNgrains,i,e) + crystallite_S (1:3,1:3,1:myNgrains,i,e) = crystallite_partionedS0 (1:3,1:3,1:myNgrains,i,e) do g = 1, myNgrains plasticState (material_phaseAt(g,e))%state( :,material_phasememberAt(g,i,e)) = & plasticState (material_phaseAt(g,e))%partionedState0(:,material_phasememberAt(g,i,e)) From 6e48585de1bd6a84851cdea20ba490965cd47ff5 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 15 Apr 2020 13:09:05 +0200 Subject: [PATCH 22/27] prefix for local variables not needed --- src/homogenization.f90 | 85 +++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 2d3807d18..8b6d80089 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -187,13 +187,13 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) real(pReal), dimension(3,3) :: & subF real(pReal), dimension(discretization_nIP,discretization_nElem) :: & - materialpoint_subFrac, & - materialpoint_subStep + subFrac, & + subStep logical, dimension(discretization_nIP,discretization_nElem) :: & - materialpoint_requested, & - materialpoint_converged + requested, & + converged logical, dimension(2,discretization_nIP,discretization_nElem) :: & - materialpoint_doneAndHappy + doneAndHappy #ifdef DEBUG if (iand(debug_level(debug_homogenization), debug_levelBasic) /= 0) then @@ -229,10 +229,10 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) enddo - materialpoint_subFrac(i,e) = 0.0_pReal - materialpoint_converged(i,e) = .false. ! pretend failed step ... - materialpoint_subStep(i,e) = 1.0_pReal/num%subStepSizeHomog ! ... larger then the requested calculation - materialpoint_requested(i,e) = .true. ! everybody requires calculation + subFrac(i,e) = 0.0_pReal + converged(i,e) = .false. ! pretend failed step ... + subStep(i,e) = 1.0_pReal/num%subStepSizeHomog ! ... larger then the requested calculation + requested(i,e) = .true. ! everybody requires calculation if (homogState(material_homogenizationAt(e))%sizeState > 0) & homogState(material_homogenizationAt(e))%subState0(:,material_homogenizationMemberAt(i,e)) = & @@ -251,31 +251,30 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) NiterationHomog = 0 cutBackLooping: do while (.not. terminallyIll .and. & - any(materialpoint_subStep(:,FEsolving_execELem(1):FEsolving_execElem(2)) > num%subStepMinHomog)) + any(subStep(:,FEsolving_execELem(1):FEsolving_execElem(2)) > num%subStepMinHomog)) !$OMP PARALLEL DO PRIVATE(myNgrains) elementLooping1: do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) IpLooping1: do i = FEsolving_execIP(1),FEsolving_execIP(2) - converged: if (materialpoint_converged(i,e)) then + if (converged(i,e)) then #ifdef DEBUG if (iand(debug_level(debug_homogenization), debug_levelExtensive) /= 0 & .and. ((e == debug_e .and. i == debug_i) & .or. .not. iand(debug_level(debug_homogenization),debug_levelSelective) /= 0)) then write(6,'(a,1x,f12.8,1x,a,1x,f12.8,1x,a,i8,1x,i2/)') '<< HOMOG >> winding forward from', & - materialpoint_subFrac(i,e), 'to current materialpoint_subFrac', & - materialpoint_subFrac(i,e)+materialpoint_subStep(i,e),'in materialpoint_stressAndItsTangent at el ip',e,i + subFrac(i,e), 'to current subFrac', & + subFrac(i,e)+subStep(i,e),'in materialpoint_stressAndItsTangent at el ip',e,i endif #endif !--------------------------------------------------------------------------------------------------- ! calculate new subStep and new subFrac - materialpoint_subFrac(i,e) = materialpoint_subFrac(i,e) + materialpoint_subStep(i,e) - materialpoint_subStep(i,e) = min(1.0_pReal-materialpoint_subFrac(i,e), & - num%stepIncreaseHomog*materialpoint_subStep(i,e)) ! introduce flexibility for step increase/acceleration + subFrac(i,e) = subFrac(i,e) + subStep(i,e) + subStep(i,e) = min(1.0_pReal-subFrac(i,e),num%stepIncreaseHomog*subStep(i,e)) ! introduce flexibility for step increase/acceleration - steppingNeeded: if (materialpoint_subStep(i,e) > num%subStepMinHomog) then + steppingNeeded: if (subStep(i,e) > num%subStepMinHomog) then ! wind forward grain starting point crystallite_partionedF0 (1:3,1:3,1:myNgrains,i,e) = crystallite_partionedF(1:3,1:3,1:myNgrains,i,e) @@ -306,9 +305,9 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) endif steppingNeeded - else converged - if ( (myNgrains == 1 .and. materialpoint_subStep(i,e) <= 1.0 ) .or. & ! single grain already tried internal subStepping in crystallite - num%subStepSizeHomog * materialpoint_subStep(i,e) <= num%subStepMinHomog ) then ! would require too small subStep + else + if ( (myNgrains == 1 .and. subStep(i,e) <= 1.0 ) .or. & ! single grain already tried internal subStepping in crystallite + num%subStepSizeHomog * subStep(i,e) <= num%subStepMinHomog ) then ! would require too small subStep ! cutback makes no sense if (.not. terminallyIll) then ! so first signals terminally ill... !$OMP CRITICAL (write2out) @@ -317,21 +316,21 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) endif terminallyIll = .true. ! ...and kills all others else ! cutback makes sense - materialpoint_subStep(i,e) = num%subStepSizeHomog * materialpoint_subStep(i,e) ! crystallite had severe trouble, so do a significant cutback + subStep(i,e) = num%subStepSizeHomog * subStep(i,e) ! crystallite had severe trouble, so do a significant cutback #ifdef DEBUG if (iand(debug_level(debug_homogenization), debug_levelExtensive) /= 0 & .and. ((e == debug_e .and. i == debug_i) & .or. .not. iand(debug_level(debug_homogenization), debug_levelSelective) /= 0)) then write(6,'(a,1x,f12.8,a,i8,1x,i2/)') & - '<< HOMOG >> cutback step in materialpoint_stressAndItsTangent with new materialpoint_subStep:',& - materialpoint_subStep(i,e),' at el ip',e,i + '<< HOMOG >> cutback step in materialpoint_stressAndItsTangent with new subStep:',& + subStep(i,e),' at el ip',e,i endif #endif !-------------------------------------------------------------------------------------------------- ! restore - if (materialpoint_subStep(i,e) < 1.0_pReal) then ! protect against fake cutback from \Delta t = 2 to 1. Maybe that "trick" is not necessary anymore at all? I.e. start with \Delta t = 1 + if (subStep(i,e) < 1.0_pReal) then ! protect against fake cutback from \Delta t = 2 to 1. Maybe that "trick" is not necessary anymore at all? I.e. start with \Delta t = 1 crystallite_Lp(1:3,1:3,1:myNgrains,i,e) = crystallite_partionedLp0(1:3,1:3,1:myNgrains,i,e) crystallite_Li(1:3,1:3,1:myNgrains,i,e) = crystallite_partionedLi0(1:3,1:3,1:myNgrains,i,e) endif ! maybe protecting everything from overwriting (not only L) makes even more sense @@ -356,11 +355,11 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) damageState(material_homogenizationAt(e))%State( :,material_homogenizationMemberAt(i,e)) = & damageState(material_homogenizationAt(e))%subState0(:,material_homogenizationMemberAt(i,e)) endif - endif converged + endif - if (materialpoint_subStep(i,e) > num%subStepMinHomog) then - materialpoint_requested(i,e) = .true. - materialpoint_doneAndHappy(1:2,i,e) = [.false.,.true.] + if (subStep(i,e) > num%subStepMinHomog) then + requested(i,e) = .true. + doneAndHappy(1:2,i,e) = [.false.,.true.] endif enddo IpLooping1 enddo elementLooping1 @@ -369,8 +368,8 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) NiterationMPstate = 0 convergenceLooping: do while (.not. terminallyIll .and. & - any( materialpoint_requested(:,FEsolving_execELem(1):FEsolving_execElem(2)) & - .and. .not. materialpoint_doneAndHappy(1,:,FEsolving_execELem(1):FEsolving_execElem(2)) & + any( requested(:,FEsolving_execELem(1):FEsolving_execElem(2)) & + .and. .not. doneAndHappy(1,:,FEsolving_execELem(1):FEsolving_execElem(2)) & ) .and. & NiterationMPstate < num%nMPstate) NiterationMPstate = NiterationMPstate + 1 @@ -383,13 +382,11 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) elementLooping2: do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) IpLooping2: do i = FEsolving_execIP(1),FEsolving_execIP(2) - if ( materialpoint_requested(i,e) .and. & ! process requested but... - .not. materialpoint_doneAndHappy(1,i,e)) then ! ...not yet done material points + if(requested(i,e) .and. .not. doneAndHappy(1,i,e)) then ! requested but not yet done subF = materialpoint_F0(1:3,1:3,i,e) & - + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & - * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) + + (materialpoint_F(1:3,1:3,i,e)-materialpoint_F0(1:3,1:3,i,e))*(subStep(i,e)+subFrac(i,e)) call partitionDeformation(subF,i,e) ! partition deformation onto constituents - crystallite_dt(1:myNgrains,i,e) = dt*materialpoint_subStep(i,e) ! propagate materialpoint dt to grains + crystallite_dt(1:myNgrains,i,e) = dt*subStep(i,e) ! propagate materialpoint dt to grains crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents else crystallite_requested(1:myNgrains,i,e) = .false. ! calculation for constituents not required anymore @@ -403,25 +400,21 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) ! based on crystallite_partionedF0,.._partionedF ! incrementing by crystallite_dt - materialpoint_converged = crystallite_stress() !ToDo: MD not sure if that is the best logic + converged = crystallite_stress() !ToDo: MD not sure if that is the best logic !-------------------------------------------------------------------------------------------------- ! state update !$OMP PARALLEL DO PRIVATE(subF) elementLooping3: do e = FEsolving_execElem(1),FEsolving_execElem(2) IpLooping3: do i = FEsolving_execIP(1),FEsolving_execIP(2) - if ( materialpoint_requested(i,e) .and. & - .not. materialpoint_doneAndHappy(1,i,e)) then - if (.not. materialpoint_converged(i,e)) then - materialpoint_doneAndHappy(1:2,i,e) = [.true.,.false.] + if (requested(i,e) .and. .not. doneAndHappy(1,i,e)) then + if (.not. converged(i,e)) then + doneAndHappy(1:2,i,e) = [.true.,.false.] else subF = materialpoint_F0(1:3,1:3,i,e) & - + (materialpoint_F(1:3,1:3,i,e) - materialpoint_F0(1:3,1:3,i,e)) & - * (materialpoint_subStep(i,e)+materialpoint_subFrac(i,e)) - materialpoint_doneAndHappy(1:2,i,e) = updateState(dt*materialpoint_subStep(i,e), & - subF, & - i,e) - materialpoint_converged(i,e) = all(materialpoint_doneAndHappy(1:2,i,e)) ! converged if done and happy + + (materialpoint_F(1:3,1:3,i,e)-materialpoint_F0(1:3,1:3,i,e))*(subStep(i,e)+subFrac(i,e)) + doneAndHappy(1:2,i,e) = updateState(dt*subStep(i,e),subF,i,e) + converged(i,e) = all(doneAndHappy(1:2,i,e)) ! converged if done and happy endif endif enddo IpLooping3 From 875b3b632165c6db9fc89aeb238774ca0fdbe9b4 Mon Sep 17 00:00:00 2001 From: Test User Date: Wed, 15 Apr 2020 19:00:06 +0200 Subject: [PATCH 23/27] [skip ci] updated version information after successful test of v2.0.3-2303-g2a6132b7 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 458484abe..7be7a7f6c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.0.3-2291-g03aa6f9c +v2.0.3-2303-g2a6132b7 From a4c52ec1fad29359a1faa889f6cb7456e676b2b7 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 15 Apr 2020 21:56:20 +0200 Subject: [PATCH 24/27] extra variable not needed --- src/homogenization.f90 | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/homogenization.f90 b/src/homogenization.f90 index 8b6d80089..62150899e 100644 --- a/src/homogenization.f90 +++ b/src/homogenization.f90 @@ -184,8 +184,6 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) e, & !< element number mySource, & myNgrains - real(pReal), dimension(3,3) :: & - subF real(pReal), dimension(discretization_nIP,discretization_nElem) :: & subFrac, & subStep @@ -376,16 +374,15 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) !-------------------------------------------------------------------------------------------------- ! deformation partitioning -! based on materialpoint_subF0,.._subF,crystallite_partionedF0, and homogenization_state, -! results in crystallite_partionedF - !$OMP PARALLEL DO PRIVATE(myNgrains,subF) + !$OMP PARALLEL DO PRIVATE(myNgrains) elementLooping2: do e = FEsolving_execElem(1),FEsolving_execElem(2) myNgrains = homogenization_Ngrains(material_homogenizationAt(e)) IpLooping2: do i = FEsolving_execIP(1),FEsolving_execIP(2) if(requested(i,e) .and. .not. doneAndHappy(1,i,e)) then ! requested but not yet done - subF = materialpoint_F0(1:3,1:3,i,e) & - + (materialpoint_F(1:3,1:3,i,e)-materialpoint_F0(1:3,1:3,i,e))*(subStep(i,e)+subFrac(i,e)) - call partitionDeformation(subF,i,e) ! partition deformation onto constituents + call partitionDeformation(materialpoint_F0(1:3,1:3,i,e) & + + (materialpoint_F(1:3,1:3,i,e)-materialpoint_F0(1:3,1:3,i,e))& + *(subStep(i,e)+subFrac(i,e)), & + i,e) crystallite_dt(1:myNgrains,i,e) = dt*subStep(i,e) ! propagate materialpoint dt to grains crystallite_requested(1:myNgrains,i,e) = .true. ! request calculation for constituents else @@ -397,23 +394,22 @@ subroutine materialpoint_stressAndItsTangent(updateJaco,dt) !-------------------------------------------------------------------------------------------------- ! crystallite integration -! based on crystallite_partionedF0,.._partionedF -! incrementing by crystallite_dt - converged = crystallite_stress() !ToDo: MD not sure if that is the best logic !-------------------------------------------------------------------------------------------------- ! state update - !$OMP PARALLEL DO PRIVATE(subF) + !$OMP PARALLEL DO elementLooping3: do e = FEsolving_execElem(1),FEsolving_execElem(2) IpLooping3: do i = FEsolving_execIP(1),FEsolving_execIP(2) if (requested(i,e) .and. .not. doneAndHappy(1,i,e)) then if (.not. converged(i,e)) then doneAndHappy(1:2,i,e) = [.true.,.false.] else - subF = materialpoint_F0(1:3,1:3,i,e) & - + (materialpoint_F(1:3,1:3,i,e)-materialpoint_F0(1:3,1:3,i,e))*(subStep(i,e)+subFrac(i,e)) - doneAndHappy(1:2,i,e) = updateState(dt*subStep(i,e),subF,i,e) + doneAndHappy(1:2,i,e) = updateState(dt*subStep(i,e), & + materialpoint_F0(1:3,1:3,i,e) & + + (materialpoint_F(1:3,1:3,i,e)-materialpoint_F0(1:3,1:3,i,e)) & + *(subStep(i,e)+subFrac(i,e)), & + i,e) converged(i,e) = all(doneAndHappy(1:2,i,e)) ! converged if done and happy endif endif From e06251e53eb48986d53db06f95412557398c9308 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Sun, 19 Apr 2020 14:20:34 +0200 Subject: [PATCH 25/27] proper doxygen style --- src/quaternions.f90 | 76 ++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/quaternions.f90 b/src/quaternions.f90 index 8d62fe6aa..991f970ab 100644 --- a/src/quaternions.f90 +++ b/src/quaternions.f90 @@ -63,27 +63,27 @@ module quaternions module procedure assign_quat__ module procedure assign_vec__ end interface assignment (=) - + interface quaternion module procedure init__ end interface quaternion - + interface abs procedure abs__ end interface abs - + interface dot_product procedure dot_product__ end interface dot_product - + interface conjg module procedure conjg__ end interface conjg - + interface exp module procedure exp__ end interface exp - + interface log module procedure log__ end interface log @@ -95,7 +95,7 @@ module quaternions interface aimag module procedure aimag__ end interface aimag - + public :: & quaternions_init, & assignment(=), & @@ -118,7 +118,7 @@ end subroutine quaternions_init !--------------------------------------------------------------------------------------------------- -!> construct a quaternion from a 4-vector +!> @brief construct a quaternion from a 4-vector !--------------------------------------------------------------------------------------------------- type(quaternion) pure function init__(array) @@ -133,7 +133,7 @@ end function init__ !--------------------------------------------------------------------------------------------------- -!> assign a quaternion +!> @brief assign a quaternion !--------------------------------------------------------------------------------------------------- elemental pure subroutine assign_quat__(self,other) @@ -141,12 +141,12 @@ elemental pure subroutine assign_quat__(self,other) type(quaternion), intent(in) :: other self = [other%w,other%x,other%y,other%z] - + end subroutine assign_quat__ !--------------------------------------------------------------------------------------------------- -!> assign a 4-vector +!> @brief assign a 4-vector !--------------------------------------------------------------------------------------------------- pure subroutine assign_vec__(self,other) @@ -162,7 +162,7 @@ end subroutine assign_vec__ !--------------------------------------------------------------------------------------------------- -!> add a quaternion +!> @brief add a quaternion !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function add__(self,other) @@ -170,24 +170,24 @@ type(quaternion) elemental pure function add__(self,other) add__ = [ self%w, self%x, self%y ,self%z] & + [other%w, other%x, other%y,other%z] - + end function add__ !--------------------------------------------------------------------------------------------------- -!> return (unary positive operator) +!> @brief return (unary positive operator) !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function pos__(self) class(quaternion), intent(in) :: self pos__ = self * (+1.0_pReal) - + end function pos__ !--------------------------------------------------------------------------------------------------- -!> subtract a quaternion +!> @brief subtract a quaternion !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function sub__(self,other) @@ -195,24 +195,24 @@ type(quaternion) elemental pure function sub__(self,other) sub__ = [ self%w, self%x, self%y ,self%z] & - [other%w, other%x, other%y,other%z] - + end function sub__ !--------------------------------------------------------------------------------------------------- -!> negate (unary negative operator) +!> @brief negate (unary negative operator) !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function neg__(self) class(quaternion), intent(in) :: self neg__ = self * (-1.0_pReal) - + end function neg__ !--------------------------------------------------------------------------------------------------- -!> multiply with a quaternion +!> @brief multiply with a quaternion !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function mul_quat__(self,other) @@ -227,7 +227,7 @@ end function mul_quat__ !--------------------------------------------------------------------------------------------------- -!> multiply with a scalar +!> @brief multiply with a scalar !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function mul_scal__(self,scal) @@ -235,12 +235,12 @@ type(quaternion) elemental pure function mul_scal__(self,scal) real(pReal), intent(in) :: scal mul_scal__ = [self%w,self%x,self%y,self%z]*scal - + end function mul_scal__ !--------------------------------------------------------------------------------------------------- -!> divide by a quaternion +!> @brief divide by a quaternion !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function div_quat__(self,other) @@ -252,7 +252,7 @@ end function div_quat__ !--------------------------------------------------------------------------------------------------- -!> divide by a scalar +!> @brief divide by a scalar !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function div_scal__(self,scal) @@ -265,7 +265,7 @@ end function div_scal__ !--------------------------------------------------------------------------------------------------- -!> test equality +!> @brief test equality !--------------------------------------------------------------------------------------------------- logical elemental pure function eq__(self,other) @@ -278,7 +278,7 @@ end function eq__ !--------------------------------------------------------------------------------------------------- -!> test inequality +!> @brief test inequality !--------------------------------------------------------------------------------------------------- logical elemental pure function neq__(self,other) @@ -290,7 +290,7 @@ end function neq__ !--------------------------------------------------------------------------------------------------- -!> raise to the power of a quaternion +!> @brief raise to the power of a quaternion !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function pow_quat__(self,expon) @@ -303,7 +303,7 @@ end function pow_quat__ !--------------------------------------------------------------------------------------------------- -!> raise to the power of a scalar +!> @brief raise to the power of a scalar !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function pow_scal__(self,expon) @@ -316,7 +316,7 @@ end function pow_scal__ !--------------------------------------------------------------------------------------------------- -!> take exponential +!> @brief take exponential !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function exp__(a) @@ -336,7 +336,7 @@ end function exp__ !--------------------------------------------------------------------------------------------------- -!> take logarithm +!> @brief take logarithm !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function log__(a) @@ -356,7 +356,7 @@ end function log__ !--------------------------------------------------------------------------------------------------- -!> return norm +!> @brief return norm !--------------------------------------------------------------------------------------------------- real(pReal) elemental pure function abs__(self) @@ -368,7 +368,7 @@ end function abs__ !--------------------------------------------------------------------------------------------------- -!> calculate dot product +!> @brief calculate dot product !--------------------------------------------------------------------------------------------------- real(pReal) elemental pure function dot_product__(a,b) @@ -380,7 +380,7 @@ end function dot_product__ !--------------------------------------------------------------------------------------------------- -!> take conjugate complex +!> @brief take conjugate complex !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function conjg__(self) @@ -392,7 +392,7 @@ end function conjg__ !--------------------------------------------------------------------------------------------------- -!> homomorph +!> @brief homomorph !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function homomorphed(self) @@ -404,7 +404,7 @@ end function homomorphed !--------------------------------------------------------------------------------------------------- -!> return as plain array +!> @brief return as plain array !--------------------------------------------------------------------------------------------------- pure function asArray(self) @@ -417,7 +417,7 @@ end function asArray !--------------------------------------------------------------------------------------------------- -!> real part (scalar) +!> @brief real part (scalar) !--------------------------------------------------------------------------------------------------- pure function real__(self) @@ -430,7 +430,7 @@ end function real__ !--------------------------------------------------------------------------------------------------- -!> imaginary part (3-vector) +!> @brief imaginary part (3-vector) !--------------------------------------------------------------------------------------------------- pure function aimag__(self) @@ -443,7 +443,7 @@ end function aimag__ !--------------------------------------------------------------------------------------------------- -!> inverse +!> @brief inverse !--------------------------------------------------------------------------------------------------- type(quaternion) elemental pure function inverse(self) From bce5ed62d5813cee8e112940ca434d61aad90cda Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Mon, 20 Apr 2020 10:13:15 +0200 Subject: [PATCH 26/27] polishing --- python/damask/grid_filters.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/damask/grid_filters.py b/python/damask/grid_filters.py index 5134fd15e..d8b136a6b 100644 --- a/python/damask/grid_filters.py +++ b/python/damask/grid_filters.py @@ -146,7 +146,7 @@ def cell_displacement_avg(size,F): """ F_avg = _np.average(F,axis=(0,1,2)) - return _np.einsum('ml,ijkl->ijkm',F_avg-_np.eye(3),cell_coord0(F.shape[:3][::-1],size)) + return _np.einsum('ml,ijkl->ijkm',F_avg - _np.eye(3),cell_coord0(F.shape[:3][::-1],size)) def cell_displacement(size,F): @@ -250,8 +250,8 @@ def node_coord0(grid,size,origin=_np.zeros(3)): """ return _np.mgrid[origin[0]:size[0]+origin[0]:(grid[0]+1)*1j, - origin[1]:size[1]+origin[1]:(grid[1]+1)*1j, - origin[2]:size[2]+origin[2]:(grid[2]+1)*1j].T + origin[1]:size[1]+origin[1]:(grid[1]+1)*1j, + origin[2]:size[2]+origin[2]:(grid[2]+1)*1j].T def node_displacement_fluct(size,F): @@ -282,7 +282,7 @@ def node_displacement_avg(size,F): """ F_avg = _np.average(F,axis=(0,1,2)) - return _np.einsum('ml,ijkl->ijkm',F_avg-_np.eye(3),node_coord0(F.shape[:3][::-1],size)) + return _np.einsum('ml,ijkl->ijkm',F_avg - _np.eye(3),node_coord0(F.shape[:3][::-1],size)) def node_displacement(size,F): From ac75b9e4cac2d10f04a80f9a63c9d4799e4fbf1f Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Tue, 21 Apr 2020 11:17:15 +0200 Subject: [PATCH 27/27] improved reporting + test --- python/damask/_result.py | 18 ++++++++++++------ python/tests/test_Result.py | 4 ++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/python/damask/_result.py b/python/damask/_result.py index ee7d696a9..0d84847fb 100644 --- a/python/damask/_result.py +++ b/python/damask/_result.py @@ -68,12 +68,12 @@ class Result: self.con_physics = [] for c in self.constituents: self.con_physics += f['/'.join([self.increments[0],'constituent',c])].keys() - self.con_physics = list(set(self.con_physics)) # make unique + self.con_physics = list(set(self.con_physics)) # make unique self.mat_physics = [] for m in self.materialpoints: self.mat_physics += f['/'.join([self.increments[0],'materialpoint',m])].keys() - self.mat_physics = list(set(self.mat_physics)) # make unique + self.mat_physics = list(set(self.mat_physics)) # make unique self.selection = {'increments': self.increments, 'constituents': self.constituents,'materialpoints': self.materialpoints, @@ -86,13 +86,19 @@ class Result: def __repr__(self): """Show selected data.""" all_selected_increments = self.selection['increments'] + self.pick('increments',all_selected_increments[0:1]) first = self.list_data() + self.pick('increments',all_selected_increments[-1:]) - last = self.list_data() + last = '' if len(all_selected_increments) < 2 else self.list_data() + self.pick('increments',all_selected_increments) - in_between = ''.join(['\n{}\n ...\n'.format(inc) for inc in all_selected_increments[1:-2]]) - return util.srepr(first+ in_between + last) + + in_between = '' if len(all_selected_increments) < 3 else \ + ''.join(['\n{}\n ...\n'.format(inc) for inc in all_selected_increments[1:-2]]) + + return util.srepr(first + in_between + last) def _manage_selection(self,action,what,datasets): @@ -1009,7 +1015,7 @@ class Result: continue lock.acquire() with h5py.File(self.fname, 'a') as f: - try: + try: # ToDo: Replace if exists? dataset = f[result[0]].create_dataset(result[1]['label'],data=result[1]['data']) for l,v in result[1]['meta'].items(): dataset.attrs[l]=v.encode() diff --git a/python/tests/test_Result.py b/python/tests/test_Result.py index a90430096..c117f33f7 100644 --- a/python/tests/test_Result.py +++ b/python/tests/test_Result.py @@ -24,6 +24,10 @@ def reference_dir(reference_dir_base): class TestResult: + def test_self_report(self,default): + print(default) + + def test_time_increments(self,default): shape = default.read_dataset(default.get_dataset_location('F'),0).shape default.set_by_time(0.0,20.0)