Python program to calculate Kirkwood−Buff Integrals

Click For Summary

Discussion Overview

The discussion revolves around writing a Python program to calculate the Kirkwood−Buff Integrals using numerical integration. Participants are sharing code snippets, troubleshooting errors, and clarifying the mathematical approach involved in the integration process.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant presents the integral equation for the Kirkwood−Buff Integrals and requests assistance in writing a Python program to compute it.
  • Another participant suggests using numerical integration methods available in the SciPy library and emphasizes that they cannot write the program but can provide hints.
  • A participant shares their existing code and describes an error encountered when trying to use the integrate.quad function, indicating that the first argument is not callable.
  • Suggestions are made regarding code formatting and indentation, highlighting the importance of proper syntax in Python.
  • One participant questions whether the use of integrate.quad is appropriate given the inputs and the expected output, which should be a single number rather than a list of numbers.
  • Another participant clarifies that the goal is to produce a graph of r versus Gαβ, indicating that multiple values are needed for plotting rather than a single integral result.
  • Further discussion includes observations about the logical structure of the code and the need for proper variable naming to enhance clarity.
  • Participants express uncertainty about the mathematical setup and the relationship between the provided code and the desired output.

Areas of Agreement / Disagreement

There is no consensus on the correctness of the code or the mathematical approach, as multiple participants raise different concerns and suggestions regarding the implementation and expected outcomes.

Contextual Notes

Participants note potential issues with variable scope and the appropriateness of the integration method used. There are also concerns about the expected output format and the relationship between the mathematical formulation and the code implementation.

DHN
Messages
9
Reaction score
0
I want to write a python program to calculate the Kirkwood−Buff Integrals.
The equation is as:
G=4π∫0 r 2 [g(r)-1] dr
I have the g(r) values.

Any suggestions are highly appreciated.

Thank you.
 
Technology news on Phys.org
You will have to use a numerical integration scheme:

https://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html

https://plot.ly/python/numerical-integration/

where you first calculate the values for the G function and then use custom code to integrate it or use the scipy package integrate() function or some variation thereof.

Please be aware that we can't write this program for you but can only provide hints and help along the way if you show us what you have and where you are stuck.
 
I didn't mean to write the code for me @ jedishrfu.
I have the don the following code:
A=open ('abc.dat','r')
C=open('def.dat','r')
D=open('ghi','w+')
f=4*pi
for row, col in izip (C, A):
cols=col.strip().split()
if(float(row)!=0):
x2 = ((float(cols[0])**2)*(float(row)-1))
print(integrate.quad(x2, 0, 4))
D.write(cols[0] + '\t' + (float(f)*(integrate.quad(x2,0,np.inf))))
D.close()
C.close()
A.close()

I get the following error as:
D.write(cols[0] + '\t' + (float(f)*(integrate.quad(x2,0,np.inf))))
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 316, in quad points)
File "/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py", line 383, in _quad return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)
quadpack.error: quad: first argument is not callable
[Finished in 0.1s with exit code 1]

Any suggestions are highly appreciated.

Thank you.
 
You can use code tags to allow indentation in the forum - critical in python. Put
Python:
 before the code and
after and you get:
Python:
A=open ('abc.dat','r')
C=open('def.dat','r')
D=open('ghi','w+')
f=4*pi
for row, col in izip (C, A):
    cols=col.strip().split()
    if(float(row)!=0):   
    x2 = ((float(cols[0])**2)*(float(row)-1))
    print(integrate.quad(x2, 0, 4))
    D.write(cols[0] + '\t' + (float(f)*(integrate.quad(x2,0,np.inf))))
D.close()
C.close()
A.close()
...which won't run because the indentation is invalid. My guess is that the two lines after the if should be further indented because the print of quad ought to fail too and it didn't, so presumably it didn't execute.

Did you read the first link @jedishrfu provided, which tells you what kind of thing the first argument to quad must be? Given the inputs you have, is quad an appropriate approach? Also, what output are you expecting from this? You will get a huge list of numbers, but ##\int_0^\infty 4\pi r^2(g(r)-1)dr## is a definite integral so should be a single number.

Finally, naming things in meaningless ways makes everyone's lives harder. Not correcting your code, just renaming your variables and files, I'd have written
Python:
rfile=open ('r.dat','r')
gfile=open('g.dat','r')
outfile=open('integral','w+')
f=4*pi
for g,r in izip (gfile, rfile):
    rs=r.strip().split()
    if(float(g)!=0):   
    x2 = ((float(rs[0])**2)*(float(g)-1))
    print(integrate.quad(x2, 0, 4))
    outfile.write(rs[0] + '\t' + (float(f)*(integrate.quad(x2,0,np.inf))))
outfile.close()
rfile.close()
gfile.close()
That way I can see at a glance where you are reading your r and g values from, and can more easily relate the code to the maths.
 
@lbix, I apologize for not making the code simpler as you have written.
Actually, i need to get a graph as:
https://imageshack.com/a/img922/2125/rC7rQL.png
The graph is r v/s Gαβ (in the image it is Nαβ). So from the values of r and g it should do the integration and give the values in which i plot the same r(x-axis) and v/s Gαβ on y-axis. It is not a single number.
 
Last edited:
Ibix said:
My guess is that the two lines after the if should be further indented

Assuming you only want that code to execute if the if statement's condition is true, yes. As the code stands now, you have an if statement with nothing after the condition, which is a syntax error; but the interpreter won't see anything wrong syntactically with the indentation of the rest of the statements (logically they probably should be indented, but syntactically they would be correct as they are).
 
PeterDonis said:
Assuming you only want that code to execute if the if statement's condition is true, yes.
I'm simply observing that neither call to integrate.quad should work, so if the error comes from the second one, as reported, the first must not execute for some reason. Thus those two lines must be in a conditional branch that the later code isn't (edit: although I'd need to check the scoping rules to determine if x2 even exists outside the if branch if it's defined there). I agree that I don't know why the program's set up that way.

@DHN - my problem is that the maths you've posted doesn't produce the output you want. And the code you've posted doesn't work. So you are asking me to guess at what you are trying to do, and guess at how you are trying to do it. This isn't going to get far.
 
Last edited:
@PeterDonis - to be clear, the indentation in the code in my #4 is present in DHN's #3, but suppressed by the forum. It's not my interpretation - I just hit reply and added code tags.
 
Last edited:

Similar threads

  • · Replies 10 ·
Replies
10
Views
4K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 9 ·
Replies
9
Views
5K
  • · Replies 5 ·
Replies
5
Views
3K
Replies
55
Views
7K
  • · Replies 43 ·
2
Replies
43
Views
8K
  • · Replies 43 ·
2
Replies
43
Views
5K
  • · Replies 17 ·
Replies
17
Views
2K
  • · Replies 8 ·
Replies
8
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K