From 20c00288b8d3d6fd71386e3f82b815df08a3424d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 5 Jan 2011 14:53:31 +0000 Subject: [PATCH] ---had some problems with svn, hope everything is ok now--- added new tools to generate colormaps for paraview and gmsh, written in python removed old fortran colormap generator. removed test.py (not longer needed) and the python module reconstruct.pyd (not running under linux) --- processing/post/colormap.f90 | 69 ------ processing/post/gmsh_colormapConstantHue.py | 65 +++++ .../post/gmsh_colormapOppositeColors.py | 87 +++++++ .../post/paraview_colormapConstantHue.py | 50 ++++ .../post/paraview_colormapOppositeColors.py | 73 ++++++ processing/post/reconstruct.pyd | Bin 49328 -> 0 bytes processing/post/spectral_post.py | 226 +++++++++--------- processing/post/test.py | 21 -- 8 files changed, 389 insertions(+), 202 deletions(-) delete mode 100644 processing/post/colormap.f90 create mode 100644 processing/post/gmsh_colormapConstantHue.py create mode 100644 processing/post/gmsh_colormapOppositeColors.py create mode 100644 processing/post/paraview_colormapConstantHue.py create mode 100644 processing/post/paraview_colormapOppositeColors.py delete mode 100644 processing/post/reconstruct.pyd delete mode 100644 processing/post/test.py diff --git a/processing/post/colormap.f90 b/processing/post/colormap.f90 deleted file mode 100644 index 17a9ebc38..000000000 --- a/processing/post/colormap.f90 +++ /dev/null @@ -1,69 +0,0 @@ -program colormap - -implicit none - real startH, endH, startS, endS, startL, endL, h_strich,x,c,m - integer steps,i,j - character(len=100) name - print*, '******************************************************************************' - print*, ' write colormap for gmsh' - print*, '******************************************************************************' - print*, '' - write(*, '(A)', advance = 'NO') 'Please enter startvalue for L: ' - read(*, *), startL - write(*, '(A)', advance = 'NO') 'Please enter endvalue for L: ' - read(*, *), endL - write(*, '(A)', advance = 'NO') 'Please enter startvalue for S: ' - read(*, *), startS - write(*, '(A)', advance = 'NO') 'Please enter endvalue for S: ' - read(*, *), endS - write(*, '(A)', advance = 'NO') 'Please enter steps: ' - read(*, *), steps - do j=0,360 - write(name, *) j - name=adjustl(name) - startH = real(j) - endH =real(j) - open(20, file = ('colormap_')//trim(name)//('.map')) - write(20,*),'View.ColorTable = {' - if(endH6.0) h_strich = h_strich-6.0 - c = (1- abs(2*(startL + real(i)*(endL-startL)/real(steps))-1))*sqrt(startS + real(i)*(endS-startS)/real(steps)) - x = c*(1- abs(mod(h_strich, real(2))-1)) - m = (startL + real(i)*(endL-startL)/real(steps)) -.5*c - if ((0.0 <= h_strich).and.(h_strich<1.0)) then - write(20,*),'{',(c+m)*255,',',(x+m)*255,',',(0.0+m)*255,'},' - else if ((1.0 <= h_strich).and.(h_strich<2.0)) then - write(20,*),'{',(x+m)*255,',',(c+m)*255,',',(0.0+m)*255,'},' - else if ((2.0 <= h_strich).and.(h_strich<3.0)) then - write(20,*),'{',(0.0+m)*255,',',(c+m)*255,',',(x+m)*255,'},' - else if ((3.0 <= h_strich).and.(h_strich<4.0)) then - write(20,*),'{',(0.0+m)*255,',',(x+m)*255,',',(c+m)*255,'},' - else if ((4.0 <= h_strich).and.(h_strich<5.0)) then - write(20,*),'{',(x+m)*255,',',(0.0+m)*255,',',(c+m)*255,'},' - else if ((5.0 <= h_strich).and.(h_strich<=6.0)) then - write(20,*),'{',(c+m)*255,',',(0.0+m)*255,',',(x+m)*255,'},' - endif - enddo - H_strich = (startH + real(i)*(endH-startH)/real(steps))/60 - if(h_strich>6.0) h_strich = h_strich-6.0 - c = (1- abs(2*(startL + real(i)*(endL-startL)/real(steps))-1))*(startS + real(i)*(endS-startS)/real(steps)) - x = c*(1- abs(mod(h_strich, real(2))-1)) - m = (startL + real(i)*(endL-startL)/real(steps)) -.5*c - if ((0.0 <= h_strich).and.(h_strich<1.0)) then - write(20,*),'{',(c+m)*255,',',(x+m)*255,',',(0.0+m)*255,'}' - else if ((1.0 <= h_strich).and.(h_strich<2.0)) then - write(20,*),'{',(x+m)*255,',',(c+m)*255,',',(0.0+m)*255,'}' - else if ((2.0 <= h_strich).and.(h_strich<3.0)) then - write(20,*),'{',(0.0+m)*255,',',(c+m)*255,',',(x+m)*255,'}' - else if ((3.0 <= h_strich).and.(h_strich<4.0)) then - write(20,*),'{',(0.0+m)*255,',',(x+m)*255,',',c+m,'}' - else if ((4.0 <= h_strich).and.(h_strich<5.0)) then - write(20,*),'{',(x+m)*255,',',(0.0+m)*255,',',(c+m)*255,'}' - else if ((5.0 <= h_strich).and.(h_strich<=6.0)) then - write(20,*),'{',(c+m)*255,',',(0.0+m)*255,',',(x+m)*255,'}' - endif - write(20,*),'};' - enddo -end program \ No newline at end of file diff --git a/processing/post/gmsh_colormapConstantHue.py b/processing/post/gmsh_colormapConstantHue.py new file mode 100644 index 000000000..27760bc05 --- /dev/null +++ b/processing/post/gmsh_colormapConstantHue.py @@ -0,0 +1,65 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- + +# This script is used to generate colormaps for gmsh (http://geuz.org/gmsh/) +# The script writes 360 files. Each file contains one colormap. +# More information on the used colors space can be found at http://en.wikipedia.org/wiki/HSL_and_HSV +# written by M. Diehl, m.diehl@mpie.de + +import math + +print '******************************************************************************' +print ' Write colormaps for gmsh' +print '' +print 'Suitable for datasets that have only positive/negative values' +print 'The colors are described using the HSL model.' +print 'Each of the 360 generated colormaps uses one value of (H)ue.' +print 'The colormaps runs at constant H from given (L)ightness and (S)aturation' +print 'to given L and S' +print 'L is distribute linearly, S changes as the square root of a linear list.' +print 'Suitable values: L_start = S_start = 1 , L_end = S_end = 0.' +print '******************************************************************************' +print '' +startL = float(raw_input('Please enter start value for (L)ightness: ')) +endL = float(raw_input('Please enter end value for L: ')) +startS = float(raw_input('Please enter start value for (S)aturation: ')) +endS = float(raw_input('Please enter end value for S: ')) +steps = int(raw_input('Please enter steps/resolution: ')) +for h in range(0,360): + colormap = open('colormap_' + str(h).zfill(3) + '.map',"w") + colormap.write('View.ColorTable = {\n') + for i in range(0,steps): + h_strich = h/60.0 + if(h_strich>6.0): + h_strich = h_strich-6.0 + c = (1- abs(2*(startL + i*(endL-startL)/steps)-1))*math.sqrt(startS + i*(endS-startS)/steps) + x = c*(1- abs(h_strich%2-1)) + m = (startL + i*(endL-startL)/steps) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('{'+str((c+m)*255.0)+','+str((x+m)*255.0)+','+str((0.0+m)*255.0)+'},\n') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('{'+str((x+m)*255.0)+','+str((c+m)*255.0)+','+str((0.0+m)*255.0)+'},\n') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((c+m)*255.0)+','+str((x+m)*255.0)+'},\n') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((x+m)*255.0)+','+str((c+m)*255.0)+'},\n') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('{'+str((x+m)*255.0)+','+str((0.0+m)*255.0)+','+str((c+m)*255.0)+'},\n') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('{'+str((c+m)*255.0)+','+str((0.0+m)*255.0)+','+str((x+m)*255.0)+'},\n') + c = (1- abs(2*(startL)-1))*(startS) + x = c*(1- abs(h_strich%2-1)) + m = (startL) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('{'+str((c+m)*255.0)+','+str((x+m)*255.0)+','+str((0.0+m)*255.0)+'}};') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('{'+str((x+m)*255.0)+','+str((c+m)*255.0)+','+str((0.0+m)*255.0)+'}};') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((c+m)*255.0)+','+str((x+m)*255.0)+'}};') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((x+m)*255.0)+','+str((c+m)*255.0)+'}};') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('{'+str((x+m)*255.0)+','+str((0.0+m)*255.0)+','+str((c+m)*255.0)+'}};') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('{'+str((c+m)*255.0)+','+str((0.0+m)*255.0)+','+str((x+m)*255.0)+'}};') + \ No newline at end of file diff --git a/processing/post/gmsh_colormapOppositeColors.py b/processing/post/gmsh_colormapOppositeColors.py new file mode 100644 index 000000000..28d121040 --- /dev/null +++ b/processing/post/gmsh_colormapOppositeColors.py @@ -0,0 +1,87 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- + +# This script is used to generate colormaps for gmsh (http://geuz.org/gmsh/) +# The script writes 360 files. Each file contains one colormap. +# More information on the used colors space can be found at http://en.wikipedia.org/wiki/HSL_and_HSV +# written by M. Diehl, m.diehl@mpie.de + +import math + +print '******************************************************************************' +print ' Write colormaps for gmsh' +print '' +print 'Suitable for datasets running from negative to positive values.' +print 'The colors are described using the HSL model.' +print 'Each of the 360 generated colormaps uses two values of (H)ue.' +print 'The colormaps runs at constant H from given (L)ightness and (S)aturation' +print 'to given L_min and S_min and goes to H+180° (with given L and S)' +print 'Suitable values: L = L_min =.5, S = 1, and S_min=0,' +print '******************************************************************************' +print '' +startL = float(raw_input('Please enter start value for (L)ightness: ')) +endL = float(raw_input('Please enter minimum value for L: ')) +startS = float(raw_input('Please enter start value for (S)aturation: ')) +endS = float(raw_input('Please enter minimum value for S: ')) +steps = int(raw_input('Please enter steps/resolution: ')) +steps = steps/2 +for h in range(0,360): + colormap = open('colormap_' + str(h).zfill(3) + '.map',"w") + colormap.write('View.ColorTable = {\n') + i=0 + h_strich = h/60.0 + if(h_strich>6.0): + h_strich = h_strich-6.0 + for j in range(0,steps+1): + # let L run linearly from 0 to 1, let S be the square root of a linear list from 0 to 1 + c = (1- abs(2*(startL - j*(startL-endL)/steps)-1))*(startS - j*(startS-endS)/steps) + x = c*(1- abs(h_strich%2-1)) + m = (startL - j*(startL-endL)/steps) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('{'+str((c+m)*255.0)+','+str((x+m)*255.0)+','+str((0.0+m)*255.0)+'},\n') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('{'+str((x+m)*255.0)+','+str((c+m)*255.0)+','+str((0.0+m)*255.0)+'},\n') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((c+m)*255.0)+','+str((x+m)*255.0)+'},\n') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((x+m)*255.0)+','+str((c+m)*255.0)+'},\n') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('{'+str((x+m)*255.0)+','+str((0.0+m)*255.0)+','+str((c+m)*255.0)+'},\n') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('{'+str((c+m)*255.0)+','+str((0.0+m)*255.0)+','+str((x+m)*255.0)+'},\n') + i = i+1 + h_strich = (h+180.0)/60.0 + if(h_strich>6.0): + h_strich = h_strich-6.0 + for j in range(1,steps): + c = (1- abs(2*(endL+j*(startL-endL)/steps)-1))*(endS+j*(startS-endS)/steps) + x = c*(1- abs(h_strich%2-1)) + m = (endL+j*(startL-endL)/steps) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('{'+str((c+m)*255.0)+','+str((x+m)*255.0)+','+str((0.0+m)*255.0)+'},\n') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('{'+str((x+m)*255.0)+','+str((c+m)*255.0)+','+str((0.0+m)*255.0)+'},\n') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((c+m)*255.0)+','+str((x+m)*255.0)+'},\n') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((x+m)*255.0)+','+str((c+m)*255.0)+'},\n') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('{'+str((x+m)*255.0)+','+str((0.0+m)*255.0)+','+str((c+m)*255.0)+'},\n') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('{'+str((c+m)*255.0)+','+str((0.0+m)*255.0)+','+str((x+m)*255.0)+'},\n') + i=i+1 + c = (1- abs(2*(startL)-1))*(startS) + x = c*(1- abs(h_strich%2-1)) + m = (startL) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('{'+str((c+m)*255.0)+','+str((x+m)*255.0)+','+str((0.0+m)*255.0)+'}};') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('{'+str((x+m)*255.0)+','+str((c+m)*255.0)+','+str((0.0+m)*255.0)+'}};') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((c+m)*255.0)+','+str((x+m)*255.0)+'}};') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('{'+str((0.0+m)*255.0)+','+str((x+m)*255.0)+','+str((c+m)*255.0)+'}};') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('{'+str((x+m)*255.0)+','+str((0.0+m)*255.0)+','+str((c+m)*255.0)+'}};') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('{'+str((c+m)*255.0)+','+str((0.0+m)*255.0)+','+str((x+m)*255.0)+'}};') \ No newline at end of file diff --git a/processing/post/paraview_colormapConstantHue.py b/processing/post/paraview_colormapConstantHue.py new file mode 100644 index 000000000..0488075b2 --- /dev/null +++ b/processing/post/paraview_colormapConstantHue.py @@ -0,0 +1,50 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- + +# This script is used to generate colormaps for paraview (www.paraview.org) +# The script writes 360 files. Each file contains one colormap. +# More information on the used colors space can be found at http://en.wikipedia.org/wiki/HSL_and_HSV +# written by M. Diehl, m.diehl@mpie.de + +import math + +print '******************************************************************************' +print ' Write colormaps for paraview' +print '' +print 'Suitable for datasets that have only positive/negative values' +print 'The colors are described using the HSL model.' +print 'Each of the 360 generated colormaps uses one value of (H)ue.' +print 'The colormaps runs at constant H from given (L)ightness and (S)aturation' +print 'to given L and S' +print 'L is distribute linearly, S changes as the square root of a linear list.' +print 'Suitable values: L_start = S_start = 1 , L_end = S_end = 0.' +print '******************************************************************************' +print '' +startL = float(raw_input('Please enter start value for (L)ightness: ')) +endL = float(raw_input('Please enter end value for L: ')) +startS = float(raw_input('Please enter start value for (S)aturation: ')) +endS = float(raw_input('Please enter end value for S: ')) +steps = int(raw_input('Please enter steps/resolution: ')) +for h in range(0,360): + colormap = open('colormap_' + str(h) + '.xml',"w") + colormap.write('\n') + for i in range(0,steps+1): + h_strich = h/60.0 + if(h_strich>6.0): + h_strich = h_strich-6.0 + c = (1- abs(2*(startL + i*(endL-startL)/steps)-1))*math.sqrt(startS + i*(endS-startS)/steps) + x = c*(1- abs(h_strich%2-1)) + m = (startL + i*(endL-startL)/steps) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('\n') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('\n') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('\n') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('\n') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('\n') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('\n') + colormap.write('') \ No newline at end of file diff --git a/processing/post/paraview_colormapOppositeColors.py b/processing/post/paraview_colormapOppositeColors.py new file mode 100644 index 000000000..5a6aab3d3 --- /dev/null +++ b/processing/post/paraview_colormapOppositeColors.py @@ -0,0 +1,73 @@ +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- + +# This script is used to generate colormaps for paraview (www.paraview.org) +# The script writes 360 files. Each file contains one colormap. +# More information on the used colors space can be found at http://en.wikipedia.org/wiki/HSL_and_HSV +# written by M. Diehl, m.diehl@mpie.de + +import math + +print '******************************************************************************' +print ' Write colormaps for paraview' +print '' +print 'Suitable for datasets running from negative to positive values.' +print 'The colors are described using the HSL model.' +print 'Each of the 360 generated colormaps uses two values of (H)ue.' +print 'The colormaps runs at constant H from given (L)ightness and (S)aturation' +print 'to given L_min and S_min and goes to H+180° (with given L and S)' +print 'Suitable values: L = L_min =.5, S = 1, and S_min=0,' +print '******************************************************************************' +print '' +startL = float(raw_input('Please enter start value for (L)ightness: ')) +endL = float(raw_input('Please enter minimum value for L: ')) +startS = float(raw_input('Please enter start value for (S)aturation: ')) +endS = float(raw_input('Please enter minimum value for S: ')) +steps = int(raw_input('Please enter steps/resolution: ')) +steps = steps/2 +for h in range(0,360): + colormap = open('colormap_' + str(h).zfill(3) + '.xml',"w") + colormap.write('\n') + i=0 + h_strich = h/60.0 + if(h_strich>6.0): + h_strich = h_strich-6.0 + for j in range(0,steps+1): + # let L run linearly from 0 to 1, let S be the square root of a linear list from 0 to 1 + c = (1- abs(2*(startL - j*(startL-endL)/steps)-1))*(startS - j*(startS-endS)/steps) + x = c*(1- abs(h_strich%2-1)) + m = (startL - j*(startL-endL)/steps) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('\n') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('\n') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('\n') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('\n') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('\n') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('\n') + i = i+1 + h_strich = (h+180.0)/60.0 + if(h_strich>6.0): + h_strich = h_strich-6.0 + for j in range(1,steps+1): + c = (1- abs(2*(endL+j*(startL-endL)/steps)-1))*(endS+j*(startS-endS)/steps) + x = c*(1- abs(h_strich%2-1)) + m = (endL+j*(startL-endL)/steps) -.5*c + if (0.0 <= h_strich)and(h_strich<1.0): + colormap.write('\n') + elif (1.0 <= h_strich)and(h_strich<2.0): + colormap.write('\n') + elif (2.0 <= h_strich)and(h_strich<3.0): + colormap.write('\n') + elif (3.0 <= h_strich)and(h_strich<4.0): + colormap.write('\n') + elif (4.0 <= h_strich)and(h_strich<5.0): + colormap.write('\n') + elif (5.0 <= h_strich)and(h_strich<=6.0): + colormap.write('\n') + i=i+1 + colormap.write('') \ No newline at end of file diff --git a/processing/post/reconstruct.pyd b/processing/post/reconstruct.pyd deleted file mode 100644 index 17cf5f745a5c5d132428555e94941858659f8891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49328 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 MPo=;j(X8$N03c;qGXMYp diff --git a/processing/post/spectral_post.py b/processing/post/spectral_post.py index a51e0cb0f..04104a909 100644 --- a/processing/post/spectral_post.py +++ b/processing/post/spectral_post.py @@ -1,112 +1,114 @@ -import array -import struct -#import numpy -print('post processing for mpie_spectral') - -filename ='results.out' -results = open(filename, 'rb') -print('filename:', filename) -position=0 - -#this funtion finds a string value in the given file for a given keyword -def searchNameForKeyword(searchstring, file, maxpos): - results.seek(0,0) - begin = file.read(2048).find(searchstring) + len(searchstring) # function will return -1 if string isnt found - file.seek(begin -len(searchstring) -4) #position of header - header = file.read(4) #store header - file.seek(begin,0) - length = file.read(2048).find(header) - file.seek(begin,0) - name = file.read(length) - return name, max(maxpos,results.tell()) - -#this funtion finds an integer value in the given file for a given keyword -def searchValueForKeyword(searchstring, file, maxpos): - results.seek(0,0) - begin = file.read(2048).find(searchstring) + len(searchstring) # function will return -1 if string isnt found - file.seek(begin,0) - value = array.array('i',[0]) - value = struct.unpack('i',results.read(4))[0] - return value, max(maxpos,results.tell()) - -#finds the value for the three integers followed the given keyword -def searchArrayForKeyword(searchstring, file, maxpos): - values = array.array('i',[0,0,0]) - results.seek(0,0) - begin = results.read(2048).find(searchstring) + len(searchstring) #end position of string "resolution" - pos = results.read(60).find(b'a') - results.seek(begin+pos+2,0) #why two, not 1?? - values[0]=struct.unpack('i',results.read(4))[0] - maxpos=max(maxpos,results.tell()) - results.seek(begin,0) - pos = results.read(60).find(b'b') - results.seek(begin+pos+1,0) - values[1]=struct.unpack('i',results.read(4))[0] - maxpos=max(maxpos,results.tell()) - results.seek(begin,0) - pos = results.read(60).find(b'c') - results.seek(begin+pos+1,0) - values[2]=struct.unpack('i',results.read(4))[0] - maxpos=max(maxpos,results.tell()) - return values, maxpos - -#finds the value for the three doubles followed the given keyword -def searchFarrayForKeyword(searchstring, file, maxpos): - values = array.array('d',[0,0,0]) - results.seek(0,0) - begin = results.read(2048).find(searchstring) + len(searchstring) #end position of string "resolution" - pos = results.read(60).find(b'x') - results.seek(begin+pos+2,0) #why two, not 1?? - values[0]=struct.unpack('d',results.read(8))[0] - maxpos=max(maxpos,results.tell()) - results.seek(begin,0) - pos = results.read(60).find(b'y') - results.seek(begin+pos+1,0) - values[1]=struct.unpack('d',results.read(8))[0] - maxpos=max(maxpos,results.tell()) - results.seek(begin,0) - pos = results.read(60).find(b'z') - results.seek(begin+pos+1,0) - values[2]=struct.unpack('d',results.read(8))[0] - maxpos=max(maxpos,results.tell()) - return values, maxpos - -loadcase, position = searchNameForKeyword(b'Loadcase ', results, position) -workingdir, position = searchNameForKeyword(b'Workingdir ', results, position) -jobname, position = searchNameForKeyword(b'JobName ', results, position) -totalincs, position = searchValueForKeyword(b'totalincs ', results, position) -materialpoint_sizeResults, position = searchValueForKeyword(b'materialpoint_sizeResults ', results, position) -resolution, position = searchArrayForKeyword(b'resolution ', results, position) -geomdimension, position = searchFarrayForKeyword(b'geomdimension ', results, position) -position=position+4 +13*8 -results.seek(position,0) -tnsr = array.array('d',[0,0,0,0,0,0,0,0,0]) -tnsr[0]=struct.unpack('d',results.read(8))[0] -tnsr[1]=struct.unpack('d',results.read(8))[0] -tnsr[2]=struct.unpack('d',results.read(8))[0] -tnsr[3]=struct.unpack('d',results.read(8))[0] -tnsr[4]=struct.unpack('d',results.read(8))[0] -print(tnsr) - - -# ended reading of header. now starting to read information concerning output -#filename = jobname[0:len(jobname)-5]+b'.outputCrystallite' -#outputCrystallite = open(filename, 'r') - -def InCharCount(location, character): - subj = file(location, "r") - body = subj.read() - subj.close() - return body.count(character) - - -def InCharCount(location, character): - subj = file(location, "r") - - nbr_of_char = 0 - for line in subj: - nbr_of_char = nbr_of_char + line.count(character) - - return nbr_of_char - - +#!/usr/bin/python +# -*- coding: iso-8859-1 -*- +import array +import struct +#import numpy +print('post processing for mpie_spectral') + +filename ='results.out' +results = open(filename, 'rb') +print('filename:', filename) +position=0 + +#this funtion finds a string value in the given file for a given keyword +def searchNameForKeyword(searchstring, file, maxpos): + results.seek(0,0) + begin = file.read(2048).find(searchstring) + len(searchstring) # function will return -1 if string isnt found + file.seek(begin -len(searchstring) -4) #position of header + header = file.read(4) #store header + file.seek(begin,0) + length = file.read(2048).find(header) + file.seek(begin,0) + name = file.read(length) + return name, max(maxpos,results.tell()) + +#this funtion finds an integer value in the given file for a given keyword +def searchValueForKeyword(searchstring, file, maxpos): + results.seek(0,0) + begin = file.read(2048).find(searchstring) + len(searchstring) # function will return -1 if string isnt found + file.seek(begin,0) + value = array.array('i',[0]) + value = struct.unpack('i',results.read(4))[0] + return value, max(maxpos,results.tell()) + +#finds the value for the three integers followed the given keyword +def searchArrayForKeyword(searchstring, file, maxpos): + values = array.array('i',[0,0,0]) + results.seek(0,0) + begin = results.read(2048).find(searchstring) + len(searchstring) #end position of string "resolution" + pos = results.read(60).find(b'a') + results.seek(begin+pos+2,0) #why two, not 1?? + values[0]=struct.unpack('i',results.read(4))[0] + maxpos=max(maxpos,results.tell()) + results.seek(begin,0) + pos = results.read(60).find(b'b') + results.seek(begin+pos+1,0) + values[1]=struct.unpack('i',results.read(4))[0] + maxpos=max(maxpos,results.tell()) + results.seek(begin,0) + pos = results.read(60).find(b'c') + results.seek(begin+pos+1,0) + values[2]=struct.unpack('i',results.read(4))[0] + maxpos=max(maxpos,results.tell()) + return values, maxpos + +#finds the value for the three doubles followed the given keyword +def searchFarrayForKeyword(searchstring, file, maxpos): + values = array.array('d',[0,0,0]) + results.seek(0,0) + begin = results.read(2048).find(searchstring) + len(searchstring) #end position of string "resolution" + pos = results.read(60).find(b'x') + results.seek(begin+pos+2,0) #why two, not 1?? + values[0]=struct.unpack('d',results.read(8))[0] + maxpos=max(maxpos,results.tell()) + results.seek(begin,0) + pos = results.read(60).find(b'y') + results.seek(begin+pos+1,0) + values[1]=struct.unpack('d',results.read(8))[0] + maxpos=max(maxpos,results.tell()) + results.seek(begin,0) + pos = results.read(60).find(b'z') + results.seek(begin+pos+1,0) + values[2]=struct.unpack('d',results.read(8))[0] + maxpos=max(maxpos,results.tell()) + return values, maxpos + +loadcase, position = searchNameForKeyword(b'Loadcase ', results, position) +workingdir, position = searchNameForKeyword(b'Workingdir ', results, position) +jobname, position = searchNameForKeyword(b'JobName ', results, position) +totalincs, position = searchValueForKeyword(b'totalincs ', results, position) +materialpoint_sizeResults, position = searchValueForKeyword(b'materialpoint_sizeResults ', results, position) +resolution, position = searchArrayForKeyword(b'resolution ', results, position) +geomdimension, position = searchFarrayForKeyword(b'geomdimension ', results, position) +position=position+4 +13*8 +results.seek(position,0) +tnsr = array.array('d',[0,0,0,0,0,0,0,0,0]) +tnsr[0]=struct.unpack('d',results.read(8))[0] +tnsr[1]=struct.unpack('d',results.read(8))[0] +tnsr[2]=struct.unpack('d',results.read(8))[0] +tnsr[3]=struct.unpack('d',results.read(8))[0] +tnsr[4]=struct.unpack('d',results.read(8))[0] +print(tnsr) + + +# ended reading of header. now starting to read information concerning output +#filename = jobname[0:len(jobname)-5]+b'.outputCrystallite' +#outputCrystallite = open(filename, 'r') + +def InCharCount(location, character): + subj = file(location, "r") + body = subj.read() + subj.close() + return body.count(character) + + +def InCharCount(location, character): + subj = file(location, "r") + + nbr_of_char = 0 + for line in subj: + nbr_of_char = nbr_of_char + line.count(character) + + return nbr_of_char + + diff --git a/processing/post/test.py b/processing/post/test.py deleted file mode 100644 index ca5b8871d..000000000 --- a/processing/post/test.py +++ /dev/null @@ -1,21 +0,0 @@ -import numpy -import reconstruct -# dummy values for resolution and geomdimension (formerly called meshdimension) -resolution=numpy.zeros((3),'i') -resolution[0]=2 -resolution[1]=2 -resolution[2]=2 -geomdimension=numpy.zeros((3),'d') -geomdimension[0]=1.0 -geomdimension[1]=1.0 -geomdimension[2]=1.0 -defgrad=numpy.zeros((resolution[0],resolution[1],resolution[2],3,3),'d') -for i in range (0, resolution[0]): - for j in range (0, resolution[1]): - for k in range (0, resolution[2]): - defgrad[i][j][k][0][0]=1.0 - defgrad[i][j][k][1][1]=1.0 - defgrad[i][j][k][2][2]=1.0 -print defgrad -current_configuration=reconstruct.simple(defgrad,resolution[0],resolution[1],resolution[2],geomdimension) # don't know how to pass arrays for the resolution -print current_configuration \ No newline at end of file