Symmetrize X0(q->0)#228
Conversation
|
Extra note. With Riccardo we went on discussing the average procedure also in other systems. The improved implementation does two extra things: b) instead of averaging over the Cartesian direction, the average is now done over the reciprocal lattice directions (1 0 0), (0 1 0) and (0 0 1) in reciprocal lattice units. Not sure if this helps with your issue, or if the alternative average you propose would be needed anyway. Now I'm in a call. As soon as I have some time, I'll think about this as well. Meanwhile, please let me know you opinion on points a) and b) above. |
| @@ -78,18 +80,6 @@ subroutine K_driver_init(what,iq,Ken,Xk) | |||
| call warning('Coulomb cutoff at q=0. Default/Suggested Lkind= bar') | |||
| if (STRING_match(BSE_L_kind,"default")) BSE_L_kind="default-bar" | |||
There was a problem hiding this comment.
The code would do, by default, Lbar at finite q in 1D and 2D. Is this a good default?
There was a problem hiding this comment.
I did not change any defaults in this PR. The code was simply too strict when I ran the BSE calculation without specifying the Lkind variable. I removed only a redundant block of code. I am also very happy that we were able to get rid of bar for finite q.
There was a problem hiding this comment.
From what I see. The lines above (kept from the original version)
if (l_col_cut.and.what=="init") then
...
if (STRING_match(BSE_L_kind,"default")) BSE_L_kind="default-bar"
...
are imposing Lbare by default for l_col_cut case.
Then I see this PR removes the subsequent lines
if (iq/=1) then
...
if (STRING_match(BSE_L_kind,"default")) BSE_L_kind="default-full"
...
endif
Accordingly, with coulomb cutoff, i.e. in D<3 L-bar is used at any q.
There was a problem hiding this comment.
Note. Check this in the "files changed section". It should be easier to read it.
There was a problem hiding this comment.
There is this block right above
if (iq/=1) then
! For finite momentum Lbar is NOT defined and gives WRONG results
! BSE Hamiltonian is fully symmetric with Lfull
if (.not. STRING_match(BSE_L_kind, "full")) then
call warning('Lbar is defined only for q = 0. For q /= 0, it is always set to "full".')
BSE_L_kind="default-full"
endif
endif
so this part is not needed
if (iq/=1) then
...
if (STRING_match(BSE_L_kind,"default")) BSE_L_kind="default-full"
...
endif
There was a problem hiding this comment.
Yeah, but then also this part needs to be removed, otherwise it overwirtes the above block (?)
if (l_col_cut.and.what=="init") then
...
if (STRING_match(BSE_L_kind,"default")) BSE_L_kind="default-bar"
...
endif
|
Hi Davide, Thanks for the comments :)
|
Clear. If a better option is available, it is welcome.
In 3D the average is done with (without inversion) over 3 (6) directions, in 2D over 2 (4), in 1D over 1 (2).
Yes, the phylosophy is similar to the RIM (random integration methon), but I'd rather call it SIM (Selected-points integration method. :-) Thinking loud here. The starting idea (averaging over xyz) was thought for system with cubic/rectangular unit cell. The average over the rlu direction was meant as an improvement, thinking to hexagonal cells in 2D as an example. Re-thinking the hexagonal case, one would instead need to average over 3 (6) directions (1 0 0), (0 1 0) (-1 1 0) (plus same with -1). To define the number we could count the number of G vectors with the same modulus as (1 0 0), (0 1 0) in 2D, also considering (0 0 1) in 3D. That might imply something even larger than 6. |
|
Hi Murali, |
|
Hi Daniele, I am using the cutoff, and the results do not change with or without it, which is actually quite surprising. Maybe I am doing something wrong. I agree that when using a spherical cutoff, Nevertheless, this issue affects all single-point calculations and is not limited to molecules. Here is the input files (I changed few values like scisor and can be run on a laptop) here is the updated plot with the input files given
|
|
Hi Murali,
These two issues actually could be hard-coded to make the user's life easier. |
|
Ok, nice that we confirm no average is needed in 0D. Also my bad I suggested to try it in the past for the 0D case. I agree, the new implementation is useful for 2D/3D (even 1D in some cases) |
|
Hi, |


The code gives incorrect results when performing BSE calculations on systems with only a single Gamma point (e.g. molecules). The issue arises because, when computing$W(q \to 0)$ , we choose a specific direction, which is no longer symmetric with respect to the point group. Therefore, this contribution should be symmetrized. The proper fix would be to perform a RIM treatment for W over several q-points, but that is considerably more demanding.
In this PR, I implement an alternative workaround for cases where the user enables symmetries (this should be a robust fix as long as symmetries are used). The idea is to rotate$\epsilon$ over all symmetry operations and average the result. In this approach, we explicitly avoid computing $\chi_0$ for more than a single $q \to 0$ point.
In addition, I slightly adjusted the
Lkinddefaults. With the current implementation, the fix can break down easily ifLbaris not specified correctly, and I think the existing way is too aggressive.I also have one question:
Is this the correct approach, or should I instead use a different communicator / reduction routine here?
Tested on SiH4
old BSE energies at Q=0
new
the first three excitons must be degenerate