diff --git a/DAMASK_env.sh b/DAMASK_env.sh index bfb5c12df..16850d6b4 100644 --- a/DAMASK_env.sh +++ b/DAMASK_env.sh @@ -53,7 +53,10 @@ if [ ! -z "$PS1" ]; then [[ "x$SOLVER" != "x" ]] && echo "Spectral Solver $SOLVER" [[ "x$PROCESSING" != "x" ]] && echo "Post Processing $PROCESSING" echo "Multithreading DAMASK_NUM_THREADS=$DAMASK_NUM_THREADS" - [[ "x$PETSC_DIR" != "x" ]] && echo "PETSc location $PETSC_DIR" + if [ "x$PETSC_DIR" != "x" ]; then + echo "PETSc location $PETSC_DIR" + [[ `readlink -f $PETSC_DIR` == $PETSC_DIR ]] || echo " ~~> "`readlink -f $PETSC_DIR` + fi [[ "x$PETSC_ARCH" != "x" ]] && echo "PETSc architecture $PETSC_ARCH" echo "MSC.Marc/Mentat $MSC_ROOT" echo diff --git a/DAMASK_env.zsh b/DAMASK_env.zsh index 521bfe8e1..b4b2d6953 100644 --- a/DAMASK_env.zsh +++ b/DAMASK_env.zsh @@ -51,7 +51,10 @@ if [ ! -z "$PS1" ]; then [[ "x$SOLVER" != "x" ]] && echo "Spectral Solver $SOLVER" [[ "x$PROCESSING" != "x" ]] && echo "Post Processing $PROCESSING" echo "Multithreading DAMASK_NUM_THREADS=$DAMASK_NUM_THREADS" - [[ "x$PETSC_DIR" != "x" ]] && echo "PETSc location $PETSC_DIR" + if [ "x$PETSC_DIR" != "x" ]; then + echo "PETSc location $PETSC_DIR" + [[ `readlink -f $PETSC_DIR` == $PETSC_DIR ]] || echo " ~~> "`readlink -f $PETSC_DIR` + fi [[ "x$PETSC_ARCH" != "x" ]] && echo "PETSc architecture $PETSC_ARCH" echo "MSC.Marc/Mentat $MSC_ROOT" echo diff --git a/VERSION b/VERSION index e8f9f40c8..99c96eda6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -revision3813-1036-g5233236 +v2.0.0-15-g3898fb2 diff --git a/code/.gitignore b/code/.gitignore index 9467b3147..6184a3d0a 100644 --- a/code/.gitignore +++ b/code/.gitignore @@ -1 +1,2 @@ DAMASK_marc*.f90 +quit__genmod.f90 diff --git a/code/DAMASK_spectral.f90 b/code/DAMASK_spectral.f90 index 728b0fd6c..3f4d6764e 100644 --- a/code/DAMASK_spectral.f90 +++ b/code/DAMASK_spectral.f90 @@ -329,7 +329,7 @@ program DAMASK_spectral errorID = 838_pInt ! no rotation is allowed by stress BC write(6,'(2x,a)') 'stress / GPa:' do i = 1_pInt, 3_pInt; do j = 1_pInt, 3_pInt - if(loadCases(currentLoadCase)%deformation%maskLogical(i,j)) then + if(loadCases(currentLoadCase)%P%maskLogical(i,j)) then write(6,'(2x,f12.7)',advance='no') loadCases(currentLoadCase)%P%values(i,j)*1e-9_pReal else write(6,'(2x,12a)',advance='no') ' * ' diff --git a/code/plastic_isotropic.f90 b/code/plastic_isotropic.f90 index fe4c7a7f5..da4198007 100644 --- a/code/plastic_isotropic.f90 +++ b/code/plastic_isotropic.f90 @@ -167,7 +167,7 @@ subroutine plastic_isotropic_init(fileUnit) allocate(plastic_isotropic_Noutput(maxNinstance), source=0_pInt) allocate(param(maxNinstance)) ! one container of parameters per instance - + rewind(fileUnit) phase = 0_pInt do while (trim(line) /= IO_EOF .and. IO_lc(IO_getTag(line,'<','>')) /= material_partPhase) ! wind forward to @@ -184,14 +184,13 @@ subroutine plastic_isotropic_init(fileUnit) if (IO_getTag(line,'[',']') /= '') then ! next section phase = phase + 1_pInt ! advance section counter if (phase_plasticity(phase) == PLASTICITY_ISOTROPIC_ID) then - instance = phase_plasticityInstance(phase) - + instance = phase_plasticityInstance(phase) ! count instances of my constitutive law + allocate(param(instance)%outputID(phase_Noutput(phase))) ! allocate space for IDs of every requested output endif cycle ! skip to next line endif if (phase > 0_pInt) then; if (phase_plasticity(phase) == PLASTICITY_ISOTROPIC_ID) then ! one of my phases. Do not short-circuit here (.and. between if-statements), it's not safe in Fortran instance = phase_plasticityInstance(phase) ! which instance of my plasticity is present phase - allocate(param(instance)%outputID(phase_Noutput(phase))) ! allocate space for IDs of every requested output chunkPos = IO_stringPos(line) tag = IO_lc(IO_stringValue(line,chunkPos,1_pInt)) ! extract key extmsg = trim(tag)//' ('//PLASTICITY_ISOTROPIC_label//')' ! prepare error message identifier diff --git a/config/numerics.config b/config/numerics.config index 62adb552f..24241b8c4 100644 --- a/config/numerics.config +++ b/config/numerics.config @@ -54,12 +54,12 @@ discrepancyPower_RGC 5.0 fixed_seed 0 # put any number larger than zero, integer, if you want to have a pseudo random distribution ## spectral parameters ## -err_div_tolAbs 1.0e-3 # relative tolerance for fulfillment of stress equilibrium -err_div_tolRel 5.0e-4 # absolute tolerance for fulfillment of stress equilibrium -err_curl_tolAbs 1.0e-12 # relative tolerance for fulfillment of strain compatibility -err_curl_tolRel 5.0e-4 # absolute tolerance for fulfillment of strain compatibility -err_stress_tolrel 0.01 # relative tolerance for fulfillment of stress BC -err_stress_tolabs 1.0e3 # absolute tolerance for fulfillment of stress BC +err_div_tolAbs 1.0e-3 # absolute tolerance for fulfillment of stress equilibrium +err_div_tolRel 5.0e-4 # relative tolerance for fulfillment of stress equilibrium +err_curl_tolAbs 1.0e-12 # absolute tolerance for fulfillment of strain compatibility +err_curl_tolRel 5.0e-4 # relative tolerance for fulfillment of strain compatibility +err_stress_tolAbs 1.0e3 # absolute tolerance for fulfillment of stress BC +err_stress_tolRel 0.01 # relative tolerance for fulfillment of stress BC fftw_timelimit -1.0 # timelimit of plan creation for FFTW, see manual on www.fftw.org, Default -1.0: disable timelimit rotation_tol 1.0e-12 # tolerance of rotation specified in loadcase, Default 1.0e-12: first guess fftw_plan_mode FFTW_PATIENT # reads the planing-rigor flag, see manual on www.fftw.org, Default FFTW_PATIENT: use patient planner flag diff --git a/processing/post/addGrainID.py b/processing/post/addGrainID.py index 5443d1c70..7eb48f286 100755 --- a/processing/post/addGrainID.py +++ b/processing/post/addGrainID.py @@ -110,7 +110,7 @@ for name in filenames: remarks = [] if table.label_dimension(options.coords) != 3: errors.append('coordinates {} are not a vector.'.format(options.coords)) - if not np.all(table.label_dimension(label) == dim): errors.append('input {} has wrong dimension {}.'.format(label,dim)) + if not np.all(table.label_dimension(label) == dim): errors.append('input {} does not have dimension {}.'.format(label,dim)) else: column = table.label_index(label) if remarks != []: damask.util.croak(remarks) diff --git a/processing/post/addIPFcolor.py b/processing/post/addIPFcolor.py index 24aeb3fa0..2a1a3581a 100755 --- a/processing/post/addIPFcolor.py +++ b/processing/post/addIPFcolor.py @@ -99,7 +99,7 @@ for name in filenames: # ------------------------------------------ sanity checks ---------------------------------------- if not np.all(table.label_dimension(label) == dim): - damask.util.croak('input {} has wrong dimension {}.'.format(label,dim)) + damask.util.croak('input {} does not have dimension {}.'.format(label,dim)) table.close(dismiss = True) # close ASCIItable and remove empty file continue diff --git a/processing/post/addOrientations.py b/processing/post/addOrientations.py index b806a56a0..f7519d92c 100755 --- a/processing/post/addOrientations.py +++ b/processing/post/addOrientations.py @@ -113,7 +113,7 @@ for name in filenames: errors = [] remarks = [] - if not np.all(table.label_dimension(label) == dim): errors.append('input {} has wrong dimension {}.'.format(label,dim)) + if not np.all(table.label_dimension(label) == dim): errors.append('input {} does not have dimension {}.'.format(label,dim)) else: column = table.label_index(label) if remarks != []: damask.util.croak(remarks) diff --git a/processing/post/addPole.py b/processing/post/addPole.py index c8e3991ee..a57fef9eb 100755 --- a/processing/post/addPole.py +++ b/processing/post/addPole.py @@ -101,7 +101,7 @@ for name in filenames: errors = [] remarks = [] - if not np.all(table.label_dimension(label) == dim): errors.append('input {} has wrong dimension {}.'.format(label,dim)) + if not np.all(table.label_dimension(label) == dim): errors.append('input {} does not have dimension {}.'.format(label,dim)) else: column = table.label_index(label) if remarks != []: damask.util.croak(remarks) diff --git a/processing/post/addQuaternions.py b/processing/post/addQuaternions.py deleted file mode 100755 index fe0e3781f..000000000 --- a/processing/post/addQuaternions.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python -# -*- coding: UTF-8 no BOM -*- - -import os,sys,numpy as np -from optparse import OptionParser -import damask - -scriptName = os.path.splitext(os.path.basename(__file__))[0] -scriptID = ' '.join([scriptName,damask.version]) - - -# -------------------------------------------------------------------- -# MAIN -# -------------------------------------------------------------------- - -parser = OptionParser(option_class=damask.extendableOption, usage='%prog options [file[s]]', description = """ -Add Quaternions based on Crystal Frame Coordinates. - -""", version = scriptID) - -parser.add_option('-f','--frame', - dest='frame', nargs=4, type='string', metavar='', - help='heading of columns containing b* vector components and three frame vectors in that order') -parser.add_option('-s','--symmetry', - dest='crysym', nargs=1,type='string',metavar='', - help='crystal symmetry definition') -parser.set_defaults(frame = None) - -(options,filenames) = parser.parse_args() - -if options.frame is None: - parser.error('no data column specified...') - -datainfo = {'len':4, - 'label':[] - } - -if options.frame is not None: datainfo['label'] += options.frame - -# --- loop over input files ------------------------------------------------------------------------- - -if filenames == []: filenames = [None] - -for name in filenames: - try: - table = damask.ASCIItable(name = name, - buffered = False) - except: continue - damask.util.report(scriptName,name) - - table.head_read() # read ASCII header info - -# --------------- figure out columns to process --------------------------------------------------- - active = [] - column = {} - - for label in datainfo['label']: - key = '1_'+label if datainfo['len'] > 1 else label # non-special labels have to start with '1_' - if key in table.labels: - active.append(label) - column[label] = table.labels.index(key) # remember columns of requested data - else: - damask.util.croak('column %s not found...'%label) - -# ------------------------------------------ assemble header --------------------------------------- - - table.info_append(scriptID + '\t' + ' '.join(sys.argv[1:])) - table.labels_append(['Q_%i'%(i+1) for i in xrange(4)]) # extend ASCII header with new labels [1 real, 3 imaginary components] - table.head_write() - -# ------------------------------------------ process data ------------------------------------------ - outputAlive = True - while outputAlive and table.data_read(): # read next data line of ASCII table - vec = np.zeros([4,3]) - for i,label in enumerate(active): - vec[i,:] = np.array(table.data[column[label]: - column[label]+3]) - - if sys.argv[1:][6]=='hexagonal': # Ensure Input matrix is orthogonal - M=np.dot(vec[0,:],vec[2,:]) - vec[1,:]=vec[1,:]/np.linalg.norm(vec[1,:]) - vec[2,:]=M*(vec[0,:]/np.linalg.norm(vec[0,:])) - vec[3,:]=vec[3,:]/np.linalg.norm(vec[3,:]) - else: - vec[1,:]=vec[1,:]/np.linalg.norm(vec[1,:]) - vec[2,:]=vec[2,:]/np.linalg.norm(vec[2,:]) - vec[3,:]=vec[3,:]/np.linalg.norm(vec[3,:]) - - - Ori=damask.Orientation(matrix=vec[1:,:],symmetry=sys.argv[1:][6]) - - table.data_append(np.asarray(Ori.asQuaternion())) - - - outputAlive = table.data_write() # output processed line - -# ------------------------------------------ output result ----------------------------------------- - outputAlive and table.output_flush() # just in case of buffered ASCII table - - table.close() # close ASCII tables diff --git a/processing/post/imageDataRGB.py b/processing/post/imageDataRGB.py index ac51746ca..f706cb100 100755 --- a/processing/post/imageDataRGB.py +++ b/processing/post/imageDataRGB.py @@ -98,7 +98,7 @@ for name in filenames: errors.append('column{} {} not found'.format('s' if len(missing_labels) > 1 else '', ', '.join(missing_labels))) if table.label_dimension(options.label) != 3: - errors.append('column {} has wrong dimension'.format(options.label)) + errors.append('column {} does not have dimension'.format(options.label)) if errors != []: damask.util.croak(errors) diff --git a/processing/pre/geom_fromVoronoiTessellation.py b/processing/pre/geom_fromVoronoiTessellation.py index ee29f4536..c7a860e79 100755 --- a/processing/pre/geom_fromVoronoiTessellation.py +++ b/processing/pre/geom_fromVoronoiTessellation.py @@ -276,29 +276,29 @@ for name in filenames: grid = np.vstack(meshgrid2(x, y, z)).reshape(3,-1).T indices = laguerreTessellation(grid, coords, weights, grains, options.nonperiodic, options.cpus) -# --- write header --------------------------------------------------------------------------------- +# --- write header ------------------------------------------------------------------------ - grainIDs = np.intersect1d(grainIDs,indices) - info['microstructures'] = len(grainIDs) + usedGrainIDs = np.intersect1d(grainIDs,indices) + info['microstructures'] = len(usedGrainIDs) if info['homogenization'] == 0: info['homogenization'] = options.homogenization damask.util.croak(['grid a b c: %s'%(' x '.join(map(str,info['grid']))), - 'size x y z: %s'%(' x '.join(map(str,info['size']))), - 'origin x y z: %s'%(' : '.join(map(str,info['origin']))), - 'homogenization: %i'%info['homogenization'], - 'microstructures: %i%s'%(info['microstructures'], + 'size x y z: %s'%(' x '.join(map(str,info['size']))), + 'origin x y z: %s'%(' : '.join(map(str,info['origin']))), + 'homogenization: %i'%info['homogenization'], + 'microstructures: %i%s'%(info['microstructures'], (' out of %i'%NgrainIDs if NgrainIDs != info['microstructures'] else '')), - ]) + ]) config_header = [] - formatwidth = 1+int(math.log10(info['microstructures'])) + formatwidth = 1+int(math.log10(NgrainIDs)) - phase = options.phase * np.ones(info['microstructures'],'i') + phase = options.phase * np.ones(NgrainIDs,'i') if int(options.secondphase*info['microstructures']) > 0: - phase[0:int(options.secondphase*info['microstructures'])] += 1 - randomSeed = int(os.urandom(4).encode('hex'), 16) if options.randomSeed is None \ - else options.randomSeed # random seed for second phase + phase[0:int(options.secondphase*info['microstructures'])] += 1 # alter fraction 'options.secondphase' of used grainIDs + randomSeed = options.randomSeed if options.randomSeed \ + else int(os.urandom(4).encode('hex'), 16) # random seed for second phase np.random.seed(randomSeed) np.random.shuffle(phase) config_header += ['# random seed (phase shuffling): {}'.format(randomSeed)] @@ -312,7 +312,7 @@ for name in filenames: if hasEulers: config_header += [''] for ID in grainIDs: - eulerID = np.nonzero(grains == ID)[0][0] # find first occurrence of this grain id + eulerID = np.nonzero(grains == ID)[0][0] # find first occurrence of this grain id config_header += ['[Grain%s]'%(str(ID).zfill(formatwidth)), '(gauss)\tphi1 %g\tPhi %g\tphi2 %g\tscatter 0.0\tfraction 1.0'%tuple(eulers[eulerID]) ]