# ao_two_e_erf_ints

Here, all two-electron integrals (\(erf(\mu r_{12})/r_{12}\)) are computed. As they have 4 indices and many are zero, they are stored in a map, as defined in `utils/map_module.f90`.

The main parameter of this module is `ao_two_e_erf_ints mu_erf` which is the range-separation parameter.

To fetch an AO integral, use the `get_ao_two_e_integral_erf(i,j,k,l,ao_integrals_erf_map)` function.

The conventions are: * For AO integrals : (ij|kl) = (11|22) = <ik|jl> = <12|12>

## EZFIO parameters

`io_ao_two_e_integrals_erf```

  Read/Write AO integrals with the long range interaction from/to disk [ Write | Read | None ]

  Default: None

`mu_erf```

  cutting of the interaction in the range separated model

  Default: 0.5

## Providers

`ao_integrals_erf_cache`

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      double precision, allocatable   :: ao_integrals_erf_cache       (0:64*64*64*64)

  Cache of AO integrals for fast access

  Needs:

  `ao_integrals_erf_cache_min` | `ao_integrals_erf_map` | `ao_two_e_integrals_erf_in_map`

`ao_integrals_erf_cache_max`

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      integer :: ao_integrals_erf_cache_min
      integer :: ao_integrals_erf_cache_max

  Min and max values of the AOs for which the integrals are in the cache

  Needs:

  `ao_num` |  |

  Needed by:

  `ao_integrals_erf_cache` |  |

`ao_integrals_erf_cache_min`

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      integer :: ao_integrals_erf_cache_min
      integer :: ao_integrals_erf_cache_max

  Min and max values of the AOs for which the integrals are in the cache

  Needs:

  `ao_num` |  |

  Needed by:

  `ao_integrals_erf_cache` |  |

`ao_integrals_erf_map`

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      type(map_type)  :: ao_integrals_erf_map

  AO integrals

  Needs:

  `ao_num` |  |

  Needed by:

  `ao_integrals_erf_cache` | `ao_two_e_integrals_erf_in_map` | `mo_two_e_int_erf_jj_from_ao`

`ao_two_e_integral_erf_schwartz`

  File : `ao_two_e_erf_ints/providers_ao_erf.irp.f`

      double precision, allocatable   :: ao_two_e_integral_erf_schwartz       (ao_num,ao_num)

  Needed to compute Schwartz inequalities

  Needs:

  `ao_coef_normalized_ordered_transp` `ao_expo_ordered_transp` `ao_nucl` | `ao_num` `ao_power` `ao_prim_num` | `n_pt_max_integrals` `nucl_coord`

  Needed by:

  `mo_two_e_int_erf_jj_from_ao` |  |

`ao_two_e_integrals_erf_in_map`

  File : `ao_two_e_erf_ints/providers_ao_erf.irp.f`

      logical :: ao_two_e_integrals_erf_in_map

  Map of Atomic integrals
    i(r1) j(r2) 1/r12 k(r1) l(r2)

  Needs:

  `ao_coef_normalized_ordered_transp` `ao_expo_ordered_transp` `ao_integrals_erf_map` `ao_nucl` `ao_num` `ao_power` | `ao_prim_num` `ezfio_filename` `io_ao_two_e_integrals_erf` `n_pt_max_integrals` `nproc` | `nucl_coord` `read_ao_two_e_integrals_erf` `zmq_context` `zmq_socket_pull_tcp_address` `zmq_state`

  Needed by:

  `ao_integrals_erf_cache` | `mo_two_e_int_erf_jj_from_ao` | `mo_two_e_integrals_erf_in_map`

`general_primitive_integral_erf:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

        double precision function general_primitive_integral_erf(dim,            &
      P_new,P_center,fact_p,p,p_inv,iorder_p,                        &
      Q_new,Q_center,fact_q,q,q_inv,iorder_q)

  Computes the integral <pq|rs> where p,q,r,s are Gaussian primitives

  Needs:

  `mu_erf` |  |

  Calls:

  `add_poly_multiply()` | `give_polynom_mult_center_x()` | `multiply_poly()`

## Subroutines / functions

`ao_two_e_integral_erf:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

      double precision function ao_two_e_integral_erf(i,j,k,l)

  integral of the AO basis <ik|jl> or (ij|kl)
    i(r1) j(r1) 1/r12 k(r2) l(r2)

  Needs:

  `n_pt_max_integrals` `ao_coef_normalized_ordered_transp` `ao_power` | `ao_expo_ordered_transp` `ao_prim_num` | `ao_nucl` `nucl_coord`

  Calls:

  `give_explicit_poly_and_gaussian()` |  |

`ao_two_e_integral_schwartz_accel_erf:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

      double precision function ao_two_e_integral_schwartz_accel_erf(i,j,k,l)

  integral of the AO basis <ik|jl> or (ij|kl)
    i(r1) j(r1) 1/r12 k(r2) l(r2)

  Needs:

  `n_pt_max_integrals` `ao_integrals_threshold` `ao_coef_normalized_ordered_transp` | `ao_power` `ao_expo_ordered_transp` `ao_prim_num` | `ao_nucl` `nucl_coord`

  Calls:

  `give_explicit_poly_and_gaussian()` |  |

`ao_two_e_integrals_erf_in_map_collector:`()

  File : `ao_two_e_erf_ints/integrals_erf_in_map_slave.irp.f`

      subroutine ao_two_e_integrals_erf_in_map_collector(zmq_socket_pull)

  Collects results from the AO integral calculation

  Needs:

  `ao_integrals_erf_map` | `ao_num` |

  Called by:

  `ao_two_e_integrals_erf_in_map` |  |

  Calls:

  `end_zmq_to_qp_run_socket()` | `insert_into_ao_integrals_erf_map()` |

`ao_two_e_integrals_erf_in_map_slave:`()

  File : `ao_two_e_erf_ints/integrals_erf_in_map_slave.irp.f`

      subroutine ao_two_e_integrals_erf_in_map_slave(thread,iproc)

  Computes a buffer of integrals

  Needs:

  `ao_num` |  |

  Called by:

  `ao_two_e_integrals_erf_in_map_slave_inproc()` | `ao_two_e_integrals_erf_in_map_slave_tcp()` |

  Calls:

  `compute_ao_integrals_erf_jl()` `end_zmq_push_socket()` | `end_zmq_to_qp_run_socket()` | `push_integrals()`

`ao_two_e_integrals_erf_in_map_slave_inproc:`()

  File : `ao_two_e_erf_ints/integrals_erf_in_map_slave.irp.f`

      subroutine ao_two_e_integrals_erf_in_map_slave_inproc(i)

  Computes a buffer of integrals. i is the ID of the current thread.

  Called by:

  `ao_two_e_integrals_erf_in_map` |  |

  Calls:

  `ao_two_e_integrals_erf_in_map_slave()` |  |

`ao_two_e_integrals_erf_in_map_slave_tcp:`()

  File : `ao_two_e_erf_ints/integrals_erf_in_map_slave.irp.f`

      subroutine ao_two_e_integrals_erf_in_map_slave_tcp(i)

  Computes a buffer of integrals. i is the ID of the current thread.

  Calls:

  `ao_two_e_integrals_erf_in_map_slave()` |  |

`clear_ao_erf_map:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      subroutine clear_ao_erf_map

  Frees the memory of the AO map

  Needs:

  `ao_integrals_erf_map` |  |

  Calls:

  `map_deinit()` |  |

`compute_ao_integrals_erf_jl:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

      subroutine compute_ao_integrals_erf_jl(j,l,n_integrals,buffer_i,buffer_value)

  Parallel client for AO integrals

  Needs:

  `ao_overlap_abs` `ao_num` | `ao_integrals_threshold` | `ao_two_e_integral_erf_schwartz`

  Called by:

  `ao_two_e_integrals_erf_in_map_slave()` |  |

  Calls:

  `two_e_integrals_index()` |  |

`compute_ao_two_e_integrals_erf:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

      subroutine compute_ao_two_e_integrals_erf(j,k,l,sze,buffer_value)

  Compute AO 1/r12 integrals for all i and fixed j,k,l

  Needs:

  `ao_overlap_abs` | `ao_num` | `ao_two_e_integral_erf_schwartz`

  Called by:

  `mo_two_e_int_erf_jj_from_ao` |  |

`dump_ao_integrals_erf:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      subroutine dump_ao_integrals_erf(filename)

  Save to disk the AO erf integrals

  Needs:

  `ao_integrals_erf_map` |  |

  Calls:

  `ezfio_set_work_empty()` |  |

`eri_erf:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

      double precision function ERI_erf(alpha,beta,delta,gama,a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z)

  ATOMIC PRIMTIVE two-electron integral between the 4 primitives ::
    primitive_1 = x1**(a_x) y1**(a_y) z1**(a_z) exp(-alpha * r1**2) primitive_2 = x1**(b_x) y1**(b_y) z1**(b_z) exp(- beta * r1**2) primitive_3 = x2**(c_x) y2**(c_y) z2**(c_z) exp(-delta * r2**2) primitive_4 = x2**(d_x) y2**(d_y) z2**(d_z) exp(- gama * r2**2)

  Needs:

  `mu_erf` |  |

  Calls:

  `integrale_new_erf()` |  |

`get_ao_erf_map_size:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      function get_ao_erf_map_size()

  Returns the number of elements in the AO map

  Needs:

  `ao_integrals_erf_map` |  |

`get_ao_two_e_integral_erf:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      double precision function get_ao_two_e_integral_erf(i,j,k,l,map) result(result)

  Gets one AO two-electron integral from the AO map

  Needs:

  `ao_integrals_erf_cache_min` `ao_overlap_abs` | `ao_integrals_threshold` `ao_integrals_erf_cache` | `ao_two_e_integral_erf_schwartz` `ao_two_e_integrals_erf_in_map`

  Calls:

  `map_get()` | `two_e_integrals_index()` |

`get_ao_two_e_integrals_erf:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      subroutine get_ao_two_e_integrals_erf(j,k,l,sze,out_val)

  Gets multiple AO two-electron integral from the AO map . All i are retrieved for j,k,l fixed.

  Needs:

  `ao_integrals_erf_map` `ao_overlap_abs` | `ao_integrals_threshold` | `ao_two_e_integrals_erf_in_map`

  Called by:

  `add_integrals_to_map_erf()` |  |

`get_ao_two_e_integrals_erf_non_zero:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      subroutine get_ao_two_e_integrals_erf_non_zero(j,k,l,sze,out_val,out_val_index,non_zero_int)

  Gets multiple AO two-electron integrals from the AO map . All non-zero i are retrieved for j,k,l fixed.

  Needs:

  `ao_integrals_erf_map` `ao_overlap_abs` | `ao_integrals_threshold` `ao_two_e_integral_erf_schwartz` | `ao_two_e_integrals_erf_in_map`

  Called by:

  `mo_two_e_int_erf_jj_from_ao` |  |

  Calls:

  `map_get()` | `two_e_integrals_index()` |

`insert_into_ao_integrals_erf_map:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      subroutine insert_into_ao_integrals_erf_map(n_integrals,buffer_i, buffer_values)

  Create new entry into AO map

  Needs:

  `ao_integrals_erf_map` |  |

  Called by:

  `ao_two_e_integrals_erf_in_map_collector()` |  |

  Calls:

  `map_append()` |  |

`integrale_new_erf:`()

  File : `ao_two_e_erf_ints/two_e_integrals_erf.irp.f`

      subroutine integrale_new_erf(I_f,a_x,b_x,c_x,d_x,a_y,b_y,c_y,d_y,a_z,b_z,c_z,d_z,p,q,n_pt)

  calculate the integral of the polynom ::
    I_x1(a_x+b_x, c_x+d_x,p,q) * I_x1(a_y+b_y, c_y+d_y,p,q) * I_x1(a_z+b_z, c_z+d_z,p,q)

  between ( 0 ; 1)

  Needs:

  `mu_erf` | `n_pt_max_integrals` | `gauleg_t2`

  Called by:

  `eri_erf()` |  |

  Calls:

  `i_x1_new()` |  |

`load_ao_integrals_erf:`()

  File : `ao_two_e_erf_ints/map_integrals_erf.irp.f`

      integer function load_ao_integrals_erf(filename)

  Read from disk the AO erf integrals

  Needs:

  `ao_integrals_erf_map` |  |

  Calls:

  `cache_map_reallocate()` | `map_deinit()` | `map_sort()`

`save_erf_two_e_integrals_ao:`()

  File : `ao_two_e_erf_ints/routines_save_integrals_erf.irp.f`

      subroutine save_erf_two_e_integrals_ao

  Needs:

  `ao_integrals_erf_map` | `ezfio_filename` | `ao_two_e_integrals_erf_in_map`

  Called by:

  `routine()` |  |

  Calls:

  `ezfio_set_ao_two_e_erf_ints_io_ao_two_e_integrals_erf()` | `ezfio_set_work_empty()` | `map_save_to_disk()`

`save_erf_two_e_ints_ao_into_ints_ao:`()

  File : `ao_two_e_erf_ints/routines_save_integrals_erf.irp.f`

      subroutine save_erf_two_e_ints_ao_into_ints_ao

  Needs:

  `ao_integrals_erf_map` | `ezfio_filename` | `ao_two_e_integrals_erf_in_map`

  Calls:

  `ezfio_set_ao_two_e_ints_io_ao_two_e_integrals()` | `ezfio_set_work_empty()` | `map_save_to_disk()`