CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Post-Processing (https://www.cfd-online.com/Forums/openfoam-post-processing/)
-   -   How to plot a forces.dat file (with all the brackets)? (https://www.cfd-online.com/Forums/openfoam-post-processing/79474-how-plot-forces-dat-file-all-brackets.html)

CapSizer August 25, 2010 03:46

How to plot a forces.dat file (with all the brackets)?
 
The wall forces calculation method in the recent versions of OF work very nicely, but produce a file (by default called forces.dat) with a lot of brackets (or parentheses, if you speak that variant of English). A typical line in the file looks like this:


(((6.57 128.05 364.35) (34.46 2.43 4.29)) (( etc .....) (......) (......)))


Now I really like to plot the force history as a means of judging convergence, but this format is not amenable to easy plotting with Gnuplot. One can obviously import into a spreadsheet, but that is mighty tedious. The question is this: Is there an easy way of telling Gnuplot to ignore the brackets, or is there another plotting program that can do it easily? I'm sure that one can give Gnuplot a "plot using " command that can deal with the format .... I just don't seem to get it right! Any advice?

rieuk August 25, 2010 23:26

I plotted my stuff in Excel but only after I'd extracted and compiled all the data into one tab delimited file using a bash script. It's not too difficult. A few hours reading of bash scripting if you have no experience should be good enough.

sinusmontis August 26, 2010 09:05

Hello,

you could use "sed" to filter your gunplot input. Use following line in gnuplot (the input for gnuplot will be the output of sed):

plot "< sed s/[\\(\\)]//g input.dat" using 1:2


Regards,

Malte

CapSizer August 26, 2010 09:24

Thanks!
 
Great, thanks for that, it has got me going along the right lines!

egp August 27, 2010 07:34

Another solution is to use python to parse and plot, e.g.,

Code:

import re
forceRegex=r"([0-9.Ee\-+]+)\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\)\s\(([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9
.Ee\-+]+)\)+\s\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\)\s\(([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\)
+"
t = []
fpx = []; fpy = []; fpz = []
fvx = []; fvy = []; fvz = []
mpx = []; mpy = []; mpz = []
mvx = []; mvy = []; mvz = []
pipefile=open('forces.dat','r')
lines = pipefile.readlines()
for line in lines:
        match=re.search(forceRegex,line)
                if match:
                        t.append(float(match.group(1)))
                        fpx.append(float(match.group(2)))
                        fpy.append(float(match.group(3)))
                        fpz.append(float(match.group(4)))
                        fvx.append(float(match.group(5)))
                        fvy.append(float(match.group(6)))
                        fvz.append(float(match.group(7)))
                        mpx.append(float(match.group(8)))
                        mpy.append(float(match.group(9)))
                        mpz.append(float(match.group(10)))
                        mvx.append(float(match.group(11)))
                        mpy.append(float(match.group(12)))
                        mpz.append(float(match.group(13)))
xlabel('time (sec)')
ylabel('force (N)')
grid()
title('Example of using python to parse the force/moment tuples')
plot(t,fpx,'o-')

---

Of course, you need numpy and matplotlib loaded for the above example to work. I would also recommend using ipython as it permits an improved interactive environment.

If you haven't studied regular-expressions (regex), I would recommend the python regex howto and the book by H.P. Langtangen, "Python Scripting for Computational Science."

protarius February 22, 2012 15:32

typos
 
I found some typos in the python code. The corrected code should be:

Code:

#!/usr/bin/python

import pylab

import re
forceRegex=r"([0-9.Ee\-+]+)\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\)\s\(([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9 .Ee\-+]+)\)+\s\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\)\s\(([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\)+"
t = []
fpx = []; fpy = []; fpz = []
fvx = []; fvy = []; fvz = []
mpx = []; mpy = []; mpz = []
mvx = []; mvy = []; mvz = []
pipefile=open('forces.dat','r')
lines = pipefile.readlines()
for line in lines:
        match=re.search(forceRegex,line)
        if match:
                t.append(float(match.group(1)))
                fpx.append(float(match.group(2)))
                fpy.append(float(match.group(3)))
                fpz.append(float(match.group(4)))
                fvx.append(float(match.group(5)))
                fvy.append(float(match.group(6)))
                fvz.append(float(match.group(7)))
                mpx.append(float(match.group(8)))
                mpy.append(float(match.group(9)))
                mpz.append(float(match.group(10)))
                mvx.append(float(match.group(11)))
                mvy.append(float(match.group(12)))
                mvz.append(float(match.group(13)))

pylab.xlabel('time (sec)')
pylab.ylabel('force (N)')
pylab.grid(True)
##title('Example of using python to parse the force/moment tuples')
pylab.plot(t,fpx,'o-')
pylab.show()

Regards

jferrari February 23, 2012 14:06

Quote:

Originally Posted by CapSizer (Post 272628)
The wall forces calculation method in the recent versions of OF work very nicely, but produce a file (by default called forces.dat) with a lot of brackets (or parentheses, if you speak that variant of English). A typical line in the file looks like this:


(((6.57 128.05 364.35) (34.46 2.43 4.29)) (( etc .....) (......) (......)))


Now I really like to plot the force history as a means of judging convergence, but this format is not amenable to easy plotting with Gnuplot. One can obviously import into a spreadsheet, but that is mighty tedious. The question is this: Is there an easy way of telling Gnuplot to ignore the brackets, or is there another plotting program that can do it easily? I'm sure that one can give Gnuplot a "plot using " command that can deal with the format .... I just don't seem to get it right! Any advice?

If you're able to get the forces.dat file you should also be able to get the force coefficients. The forceCoeffs.dat file is formatted differently and is easier to use gnuplot to check the convergence.

hewei July 27, 2013 14:00

Thank you very much Malte!! you freed me from huge excel working,
is there some command to read the last row data in one column? because I want to plot the residuals vs time. like
plot 'file.dat' using 1:($2-last_data_in_column_2), or write command "value=last_data_in_column_2, file.dat"
in a script file?
every time I have to write "last_data_in_column_2" by hand, this is really boring.
thanks you again.
Wei
Quote:

Originally Posted by sinusmontis (Post 272878)
Hello,

you could use "sed" to filter your gunplot input. Use following line in gnuplot (the input for gnuplot will be the output of sed):

plot "< sed s/[\\(\\)]//g input.dat" using 1:2


Regards,

Malte


isabel February 15, 2014 15:00

Dear everybody,

I need to represent pressure and viscous forces using gnuplot. This is my forces.dat file:

# CofR : (0 0 0)
# Time forces(pressure,viscous,porous) moment(pressure,viscous,porous)
1 ((824.789 2197.69 5.61904e-13),(0.00474683 0.000806522 -8.08238e-18),(0 0 0)) ((-54.9423 20.6197 -3230.49),(-2.01631e-05 0.000118671 -0.00011563),(0 0 0))
2 ((570.161 1591.88 4.32564e-13),(0.0134802 0.00160194 2.91544e-18),(0 0 0)) ((-39.797 14.254 -3401.42),(-4.00486e-05 0.000337004 0.0229561),(0 0 0))
3 ((-70.8628 -24.5796 5.61076e-14),(0.0221518 0.0019545 2.31609e-18),(0 0 0)) ((0.61449 -1.77157 -2873.97),(-4.88625e-05 0.000553795 0.0440349),(0 0 0))
4 ((-436.165 -814.382 -2.1011e-13),(0.0287956 0.00371196 -3.41893e-18),(0 0 0)) ((20.3595 -10.9041 -1779.13),(-9.27991e-05 0.00071989 0.0575702),(0 0 0))
5 ((-337.19 -416.93 -2.2233e-13),(0.0389092 0.00995635 -2.12376e-17),(0 0 0)) ((10.4233 -8.42976 -445.623),(-0.000248909 0.00097273 0.073619),(0 0 0))

.... etcetera (many lines)



In order to plot this, I type:

plot "./postProcessing/forces/0/forces.dat" using 1:3 with lines title "pressure",\
"./postProcessing/forces/0/forces.dat" using 1:4 with lines title "viscous"


And I have this error:

plot "./postProcessing/forces/0/forces.dat" using 1:2 with lines title "pressure", "./postProcessing/forces/0/forces.dat" using 1:3 with lines title "viscous"
"forces", line 10: warning: Skipping data file with no valid points


Nevertheless, if I try using columns 1:3 and 1:4 everything is fine, żis pressure force column 3 and viscous force column 4 or am I wrong?

balkrishna July 8, 2015 09:21

Hi Protarius,

The regexp gives empty arrays for my forces.dat file. Is there anyone where I can understand the breakup of the pattern.

Thanks,
Balkrishna.

balkrishna July 9, 2015 03:56

With the way the forces.dat is outputted currently the following code works perfectly for me.

Code:

#!/usr/bin/python                                                                                                                                                                                                                   
import pylab

import re

#Current Input
#1.000000e+00    ((1.460676e+04 -1.948520e+02 9.535164e+02) (2.508036e-02 -6.720399e-05 -3.082446e-04) (0.000000e+00 0.000000e+00 0.000000e+00)) ((1.140514e+04 1.153182e+05 -1.730316e+05) (-3.153913e-03 1.658614e-01 -2.916495e-01\
) (0.000000e+00 0.000000e+00 0.000000e+00)                                                                                                                                                                                           

forceRegex=r"([0-9.Ee\-+]+)\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)+\)+\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)+\)+\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)+\)+\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]\
+)\s([0-9.Ee\-+]+)+\)+\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)+\)+\s+\(+([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)\s([0-9.Ee\-+]+)+\)"


t = []
fpx = []; fpy = []; fpz = []; #Pressure                                                                                                                                                                                             
fvx = []; fvy = []; fvz = []; #Viscous                                                                                                                                                                                               
fpox = []; fpoy = []; fpoz=[];#Porous                                                                                                                                                                                               
mpx = []; mpy = []; mpz = []; #Moment Pressure                                                                                                                                                                                       
mvx = []; mvy = []; mvz = []; #Moment Viscous                                                                                                                                                                                       
mpox= []; mpoy = [];mpoz = [];#Moment Porous                                                                                                                                                                                         

pipefile=open('forces.dat','r')

lines = pipefile.readlines()

lth=len(lines);print(lth)

for line in lines:

        match=re.search(forceRegex,line)

        if match:
                t.append(float(match.group(1)))
                fpx.append(float(match.group(2)))
                fpy.append(float(match.group(3)))
                fpz.append(float(match.group(4)))
                fvx.append(float(match.group(5)))
                fvy.append(float(match.group(6)))
                fvz.append(float(match.group(7)))
                fpox.append(float(match.group(8)))
                fpoy.append(float(match.group(9)))
                fpoz.append(float(match.group(10)))
                mpx.append(float(match.group(11)))
                mpy.append(float(match.group(12)))
                mpz.append(float(match.group(13)))
                mvx.append(float(match.group(14)))
                mvy.append(float(match.group(15)))
                mvz.append(float(match.group(16)))
                mpox.append(float(match.group(17)))
                mpoy.append(float(match.group(18)))
                mpoz.append(float(match.group(19)))




pylab.xlabel('time (sec)')
pylab.ylabel('force (N)')
pylab.grid(True)

#title('Example of using python to parse the force/moment tuples')                                                                                                                                                                   

pylab.plot(t,fpx,'o-')
pylab.show()


stephie August 20, 2015 07:23

Helle everyone,

first thank you for the skripts! For me the skript of Gabriele worked wonderful :) thank you so much!

I have small question - in OF I have a deep of 1cm in real it should be 20cm how can I scale the values of forces.dat according to the real deep? Might anyone please give my a hint how I have to modify the python script? I would be very grateful, cos I have no experience with python.

Thank you and best regads,
Stephie

Carno June 19, 2016 08:23

Just wondering the sign convention in the forces.dat file.
Example: Does +ve sign for moment mean, it is generating moment and vice versa?
That means turbines rotor walls patch will have always +ve moments and compressors will have negative moment?
Or counterclockwise is positive?
Because my fan blades have +ve moment on the relevant axis.

Deltapilot February 2, 2017 06:50

Thanks for the hint of using the sed filter in Gnuplot, it works fine!!

ddcampayo January 11, 2019 04:44

Quote:

Originally Posted by balkrishna (Post 554600)
With the way the forces.dat is outputted currently the following code works perfectly for me...


Funny, that code works perfectly from within a jupyter notebook, but not as a script. It reads four lines (the header), then hangs :/

kandelabr January 16, 2019 06:44

I wrote a few python scripts, if they are of any use to you:
https://damogranlabs.com/2018/09/ope...ing-shortcuts/

bjnieuwboer December 17, 2019 08:26

Python 3.7 working version
 
I was also interested in plotting the forces and came to this tread. For me the method of @balkrishna did not work. It hangs as was mentioned earlier.

I found the work Pete Bechant on github https://gist.github.com/petebachant/6334510 .This was clearly based on this tread, but also did not work for me. However, it was a nice starting point. I distilled the different parts from the code and made a different working regular expression:

Code:

import matplotlib.pyplot as plt
import re
import numpy as np

# make regular expressions
scalarStr = r"([0-9.eE\-+]+)"
vectorStr = r"\(([0-9.eE\-+]+)\s([0-9.eE\-+]+)\s([0-9.eE\-+]+)\)"
space =  r"\s+"
threeVectorStr = r"\({}{}{}{}{}\)".format(vectorStr,space,vectorStr,space,vectorStr)
forceRegex = r"{}{}{}{}{}".format(scalarStr,space,threeVectorStr,space,threeVectorStr)

t = []
fpx = []; fpy = []; fpz = []
fpox = []; fpoy = []; fpoz = []
fvx = []; fvy = []; fvz = []
mpx = []; mpy = []; mpz = []
mpox = []; mpoy = []; mpoz = []
mvx = []; mvy = []; mvz = []

pipefile = open('./forces.dat','r')
lines = pipefile.readlines()

for line in lines:
        match = re.search(forceRegex,line)
        if match:
                t.append(float(match.group(1)))
                fpx.append(float(match.group(2)))
                fpy.append(float(match.group(3)))
                fpz.append(float(match.group(4)))
                fvx.append(float(match.group(5)))
                fvy.append(float(match.group(6)))
                fvz.append(float(match.group(7)))
                fpox.append(float(match.group(8)))
                fpoy.append(float(match.group(9)))
                fpoz.append(float(match.group(10)))
                mpx.append(float(match.group(11)))
                mpy.append(float(match.group(12)))
                mpz.append(float(match.group(13)))
                mvx.append(float(match.group(14)))
                mvy.append(float(match.group(15)))
                mvz.append(float(match.group(16)))
                mpox.append(float(match.group(17)))
                mpoy.append(float(match.group(18)))
                mpoz.append(float(match.group(19)))

plt.plot(t,fpz)



All times are GMT -4. The time now is 11:27.