Coulomb divergency cases
Posted: Mon Jun 02, 2025 3:41 pm
Dear Developers,
this will be a very technical question.
I am dealing with 2D materials, so I am always using the RIM and the Coulomb cutoff technique (slab z) for the construction of the Coulomb kernel.
I was looking through the source code, specifically src/coulomb, and carefully reading "rim_integrate_v.F". As I understand it for q = G = 0, you perform an average of the 2D-truncated Coulomb potential within a sphere with an area corresponding to 20% of the area of Monkhorst cells, so to say. For anything outside this area you employ the RIM. In the end, this is all put into a variable called “RIM_qpg”.
Simultaneously, in “cutoff_slab.F”, you create “bare_qpg”, and in this case for q = G = 0, you perform average of the 2D-truncated Coulomb potential within a sphere with an area corresponding to 100% of the area of the Monkhorst cells.
I checked the values of RIM_qpg(0,0,0) and bare_qpg(0,0) and they really are vastly different.
So already I'm a little confused - why do you use 20% of the area to construct RIM_qpg and not 100%, like you do for bare_qpg?
Then, you proceed to construct “gamp_p” in src/wf_and_fft/scatter_Gamp.F, which is used to construct the screened interaction kernel, W. Here there are a few case, and from what I can gather, it seems that:
For G = G’ < G_rim:
gamp_p = RIM_qpg
Else:
gamp_p = bare_qpg
This is just a crude way to write how I understand it, but I think it sums up what is in there quite nicely.
What is the reason behind this? Why are you only using RIM_qpg on the G=G’ entries?
Thanks in advance.
Best,
Franz Fischer
this will be a very technical question.
I am dealing with 2D materials, so I am always using the RIM and the Coulomb cutoff technique (slab z) for the construction of the Coulomb kernel.
I was looking through the source code, specifically src/coulomb, and carefully reading "rim_integrate_v.F". As I understand it for q = G = 0, you perform an average of the 2D-truncated Coulomb potential within a sphere with an area corresponding to 20% of the area of Monkhorst cells, so to say. For anything outside this area you employ the RIM. In the end, this is all put into a variable called “RIM_qpg”.
Simultaneously, in “cutoff_slab.F”, you create “bare_qpg”, and in this case for q = G = 0, you perform average of the 2D-truncated Coulomb potential within a sphere with an area corresponding to 100% of the area of the Monkhorst cells.
I checked the values of RIM_qpg(0,0,0) and bare_qpg(0,0) and they really are vastly different.
So already I'm a little confused - why do you use 20% of the area to construct RIM_qpg and not 100%, like you do for bare_qpg?
Then, you proceed to construct “gamp_p” in src/wf_and_fft/scatter_Gamp.F, which is used to construct the screened interaction kernel, W. Here there are a few case, and from what I can gather, it seems that:
For G = G’ < G_rim:
gamp_p = RIM_qpg
Else:
gamp_p = bare_qpg
This is just a crude way to write how I understand it, but I think it sums up what is in there quite nicely.
What is the reason behind this? Why are you only using RIM_qpg on the G=G’ entries?
Thanks in advance.
Best,
Franz Fischer